diff options
| author | 2023-05-12 13:36:02 +0000 | |
|---|---|---|
| committer | 2023-05-12 13:36:02 +0000 | |
| commit | 096bfe59f88fa44a1d1ba1dfc49b4b6ddb63c33d (patch) | |
| tree | f4813b43a216df4acb5cd52d414c10087bc7cc19 | |
| parent | a3542a9c05baa73f351eb22aed59213e1f54425b (diff) | |
| parent | 39e62e94400459809f33e9d51524039e4daf4667 (diff) | |
Merge "Use mini-resolver instead of alert dialog for dialer work telephony" into udc-dev
9 files changed, 244 insertions, 16 deletions
diff --git a/core/java/android/app/admin/DevicePolicyResources.java b/core/java/android/app/admin/DevicePolicyResources.java index 0512c7511ec6..456c6af134cf 100644 --- a/core/java/android/app/admin/DevicePolicyResources.java +++ b/core/java/android/app/admin/DevicePolicyResources.java @@ -1864,9 +1864,54 @@ public final class DevicePolicyResources { public static final String WORK_PROFILE_TELEPHONY_PAUSED_TURN_ON_BUTTON = PREFIX + "TURN_ON_WORK_PROFILE_BUTTON_TEXT"; + /** + * Information section shown on a dialog when the user is unable to place a call in + * the personal profile due to admin restrictions, and must choose whether to place + * the call from the work profile or cancel. + */ + public static final String MINIRESOLVER_WORK_TELEPHONY_CALL_BLOCKED_INFORMATION = + PREFIX + "MINIRESOLVER_WORK_TELEPHONY_INFORMATION"; + + /** + * Information section shown on a dialog when the user is unable to send a text in + * the personal profile due to admin restrictions, and must choose whether to place + * the call from the work profile or cancel. + */ + public static final String MINIRESOLVER_WORK_TELEPHONY_TEXT_BLOCKED_INFORMATION = + PREFIX + "MINIRESOLVER_WORK_TELEPHONY_INFORMATION"; + + + /** + * Button for a dialog shown when the user is unable to place a call in the personal + * profile due to admin restrictions, and must choose whether to place the call from + * the work profile or cancel. + */ + public static final String MINIRESOLVER_CALL_FROM_WORK = + PREFIX + "MINIRESOLVER_CALL_FROM_WORK"; + + /** + * Button for a dialog shown when the user has no apps capable of handling an intent + * in the personal profile, and must choose whether to open the intent in a + * cross-profile app in the work profile, or cancel. + */ + public static final String MINIRESOLVER_SWITCH_TO_WORK = + PREFIX + "MINIRESOLVER_SWITCH_TO_WORK"; + + /** + * Title for a dialog shown when the user has no apps capable of handling an intent + * in the personal profile, and must choose whether to open the intent in a + * cross-profile app in the work profile, or open in the same profile browser. Accepts + * the app name as a param. + */ public static final String MINIRESOLVER_OPEN_IN_WORK = PREFIX + "MINIRESOLVER_OPEN_IN_WORK"; + /** + * Title for a dialog shown when the user has no apps capable of handling an intent + * in the personal profile, and must choose whether to open the intent in a + * cross-profile app in the personal profile, or open in the same profile browser. + * Accepts the app name as a param. + */ public static final String MINIRESOLVER_OPEN_IN_PERSONAL = PREFIX + "MINIRESOLVER_OPEN_IN_PERSONAL"; diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java index 904fb665335b..db65cb37234b 100644 --- a/core/java/com/android/internal/app/IntentForwarderActivity.java +++ b/core/java/com/android/internal/app/IntentForwarderActivity.java @@ -19,7 +19,11 @@ package com.android.internal.app; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_PERSONAL; import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_WORK; +import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_CALL_FROM_WORK; import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_OPEN_WORK; +import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_SWITCH_TO_WORK; +import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_WORK_TELEPHONY_CALL_BLOCKED_INFORMATION; +import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_WORK_TELEPHONY_TEXT_BLOCKED_INFORMATION; import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; import static android.content.pm.PackageManager.PERMISSION_GRANTED; @@ -32,6 +36,7 @@ import android.app.Activity; import android.app.ActivityThread; import android.app.AppGlobals; import android.app.admin.DevicePolicyManager; +import android.app.admin.ManagedSubscriptionsPolicy; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.ContentResolver; @@ -41,6 +46,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; +import android.graphics.drawable.Drawable; import android.metrics.LogMaker; import android.os.Build; import android.os.Bundle; @@ -48,6 +54,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.telecom.TelecomManager; import android.util.Slog; import android.view.View; import android.widget.Button; @@ -203,35 +210,116 @@ public class IntentForwarderActivity extends Activity { findViewById(R.id.title_container).setElevation(0); - ImageView icon = findViewById(R.id.icon); PackageManager packageManagerForTargetUser = createContextAsUser(UserHandle.of(targetUserId), /* flags= */ 0) .getPackageManager(); - icon.setImageDrawable(target.loadIcon(packageManagerForTargetUser)); + + ImageView icon = findViewById(R.id.icon); + icon.setImageDrawable( + getAppIcon(target, launchIntent, targetUserId, packageManagerForTargetUser)); View buttonContainer = findViewById(R.id.button_bar_container); buttonContainer.setPadding(0, 0, 0, buttonContainer.getPaddingBottom()); ((TextView) findViewById(R.id.open_cross_profile)).setText( - getOpenInWorkMessage(target.loadLabel(packageManagerForTargetUser))); + getOpenInWorkMessage(launchIntent, target.loadLabel(packageManagerForTargetUser))); // The mini-resolver's negative button is reused in this flow to cancel the intent ((Button) findViewById(R.id.use_same_profile_browser)).setText(R.string.cancel); findViewById(R.id.use_same_profile_browser).setOnClickListener(v -> finish()); + ((Button) findViewById(R.id.button_open)).setText(getOpenInWorkButtonString(launchIntent)); findViewById(R.id.button_open).setOnClickListener(v -> { startActivityAsCaller(launchIntent, targetUserId); finish(); }); + + + View telephonyInfo = findViewById(R.id.miniresolver_info_section); + DevicePolicyManager devicePolicyManager = + getSystemService(DevicePolicyManager.class); + // Additional information section is work telephony specific. Therefore, it is only shown + // for telephony related intents, when all sim subscriptions are in the work profile. + if ((isDialerIntent(launchIntent) || isTextMessageIntent(launchIntent)) + && devicePolicyManager.getManagedSubscriptionsPolicy().getPolicyType() + == ManagedSubscriptionsPolicy.TYPE_ALL_MANAGED_SUBSCRIPTIONS) { + telephonyInfo.setVisibility(View.VISIBLE); + ((TextView) findViewById(R.id.miniresolver_info_section_text)) + .setText(getWorkTelephonyInfoSectionMessage(launchIntent)); + } else { + telephonyInfo.setVisibility(View.GONE); + } + } + + private Drawable getAppIcon( + ResolveInfo target, + Intent launchIntent, + int targetUserId, + PackageManager packageManagerForTargetUser) { + if (isDialerIntent(launchIntent)) { + // The icon for the call intent will be a generic phone icon as the target will be + // the telecom call handler. From the user's perspective, they are being directed + // to the dialer app, so use the icon from that app instead. + TelecomManager telecomManager = + getApplicationContext().getSystemService(TelecomManager.class); + String defaultDialerPackageName = + telecomManager.getDefaultDialerPackage(UserHandle.of(targetUserId)); + try { + return packageManagerForTargetUser + .getApplicationInfo(defaultDialerPackageName, /* flags= */ 0) + .loadIcon(packageManagerForTargetUser); + } catch (PackageManager.NameNotFoundException e) { + // Allow to fall-through to the icon from the target if we can't find the default + // dialer icon. + Slog.w(TAG, "Cannot load icon for default dialer package"); + } + } + return target.loadIcon(packageManagerForTargetUser); } - private String getOpenInWorkMessage(CharSequence targetLabel) { + private int getOpenInWorkButtonString(Intent launchIntent) { + if (isDialerIntent(launchIntent)) { + return R.string.miniresolver_call; + } + if (isTextMessageIntent(launchIntent)) { + return R.string.miniresolver_switch; + } + return R.string.whichViewApplicationLabel; + } + + private String getOpenInWorkMessage(Intent launchIntent, CharSequence targetLabel) { + if (isDialerIntent(launchIntent)) { + return getSystemService(DevicePolicyManager.class).getResources().getString( + MINIRESOLVER_CALL_FROM_WORK, + () -> getString(R.string.miniresolver_call_in_work)); + } + if (isTextMessageIntent(launchIntent)) { + return getSystemService(DevicePolicyManager.class).getResources().getString( + MINIRESOLVER_SWITCH_TO_WORK, + () -> getString(R.string.miniresolver_switch_to_work)); + } return getSystemService(DevicePolicyManager.class).getResources().getString( MINIRESOLVER_OPEN_WORK, () -> getString(R.string.miniresolver_open_work, targetLabel), targetLabel); } + private String getWorkTelephonyInfoSectionMessage(Intent launchIntent) { + if (isDialerIntent(launchIntent)) { + return getSystemService(DevicePolicyManager.class).getResources().getString( + MINIRESOLVER_WORK_TELEPHONY_CALL_BLOCKED_INFORMATION, + () -> getString(R.string.miniresolver_call_information)); + } + if (isTextMessageIntent(launchIntent)) { + return getSystemService(DevicePolicyManager.class).getResources().getString( + MINIRESOLVER_WORK_TELEPHONY_TEXT_BLOCKED_INFORMATION, + () -> getString(R.string.miniresolver_sms_information)); + } + return ""; + } + + + private String getForwardToPersonalMessage() { return getSystemService(DevicePolicyManager.class).getResources().getString( FORWARD_INTENT_TO_PERSONAL, diff --git a/core/res/res/layout/miniresolver.xml b/core/res/res/layout/miniresolver.xml index 1ad3acd7a3ea..db0ea547fbd5 100644 --- a/core/res/res/layout/miniresolver.xml +++ b/core/res/res/layout/miniresolver.xml @@ -63,6 +63,37 @@ android:textColor="?android:textColorPrimary" /> </RelativeLayout> + <!-- Additional information section, currently only shown when redirecting to Telephony apps --> + <LinearLayout + android:id="@+id/miniresolver_info_section" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingHorizontal="24dp" + android:paddingBottom="48dp" + android:visibility="gone" + android:background="?attr/colorBackground" + android:orientation="horizontal"> + + <ImageView + android:id="@+id/miniresolver_info_section_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingEnd="8dp" + android:src="@drawable/ic_info_outline_24" + android:tint="?android:textColorSecondary" + /> + + <TextView + android:id="@+id/miniresolver_info_section_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:paddingEnd="8dp" + android:textSize="14sp" + android:textAllCaps="false" + android:textColor="?android:textColorSecondary" + /> + </LinearLayout> <LinearLayout android:id="@+id/button_bar_container" @@ -83,7 +114,7 @@ android:orientation="horizontal" android:layoutDirection="locale" android:measureWithLargestChild="true" - android:paddingHorizontal="16dp" + android:layout_marginHorizontal="24dp" android:paddingBottom="2dp" android:elevation="@dimen/resolver_elevation"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index d4807482f8a5..91fbf6bb9f06 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -861,10 +861,10 @@ <!-- "Switch" is a verb; it means to change user profile by tapping another user profile name. --> <string name="managed_profile_label">Switch to work profile</string> - <!-- "Switch" is a verb; it means to change user profile by tapping another user profile name. --> + <!-- "Switch" is a verb; it means to change user profile by switching to an app in the personal profile. --> <string name="user_owner_app_label">Switch to personal <xliff:g id="app_name" example="Gmail">%1$s</xliff:g></string> - <!-- "Switch" is a verb; it means to change user profile by tapping another user profile name. --> + <!-- "Switch" is a verb; it means to change user profile by switching to an app in the work profile. --> <string name="managed_profile_app_label">Switch to work <xliff:g id="app_name" example="Gmail">%1$s</xliff:g></string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> @@ -5907,10 +5907,24 @@ <string name="miniresolver_open_in_personal">Open in personal <xliff:g id="app" example="YouTube">%s</xliff:g>?</string> <!-- Dialog title. User must choose between opening content in a cross-profile app or same-profile browser. [CHAR LIMIT=NONE] --> <string name="miniresolver_open_in_work">Open in work <xliff:g id="app" example="YouTube">%s</xliff:g>?</string> + <!-- Dialog title. User must place the phone call in the other profile, or cancel. [CHAR LIMIT=NONE] --> + <string name="miniresolver_call_in_work">Call from work app?</string> + <!-- Dialog title. User much choose between opening content in a cross-profile app or cancelling. [CHAR LIMIT=NONE] --> + <string name="miniresolver_switch_to_work">Switch to work app?</string> + <!-- Dialog text. Shown when the user is unable to make a phone call from a personal app due to restrictions set + by their organization, and so must switch to a work app or cancel. [CHAR LIMIT=NONE] --> + <string name="miniresolver_call_information">Your organization only allows you to make calls from work apps</string> + <!-- Dialog text. Shown when the user is unable to send a text message from a personal app due to restrictions set + by their organization, and so must switch to a work app or cancel. [CHAR LIMIT=NONE] --> + <string name="miniresolver_sms_information">Your organization only allows you to send messages from work apps</string> <!-- Button option. Open the link in the personal browser. [CHAR LIMIT=NONE] --> <string name="miniresolver_use_personal_browser">Use personal browser</string> <!-- Button option. Open the link in the work browser. [CHAR LIMIT=NONE] --> <string name="miniresolver_use_work_browser">Use work browser</string> + <!-- Button option. Action to place a phone call. [CHAR LIMIT=NONE] --> + <string name="miniresolver_call">Call</string> + <!-- Button option. Action to open an app in the work profile. [CHAR LIMIT=NONE] --> + <string name="miniresolver_switch">Switch</string> <!-- Icc depersonalization related strings --> <!-- Label text for PIN entry widget on SIM Network Depersonalization panel [CHAR LIMIT=none] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e08f08519eed..1e9e8ddbf63f 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1577,6 +1577,14 @@ <java-symbol type="string" name="miniresolver_open_work" /> <java-symbol type="string" name="miniresolver_use_personal_browser" /> <java-symbol type="string" name="miniresolver_use_work_browser" /> + <java-symbol type="string" name="miniresolver_call_in_work" /> + <java-symbol type="string" name="miniresolver_switch_to_work" /> + <java-symbol type="string" name="miniresolver_call" /> + <java-symbol type="string" name="miniresolver_switch" /> + <java-symbol type="string" name="miniresolver_call_information" /> + <java-symbol type="string" name="miniresolver_sms_information" /> + <java-symbol type="id" name="miniresolver_info_section" /> + <java-symbol type="id" name="miniresolver_info_section_text" /> <java-symbol type="id" name="button_open" /> <java-symbol type="id" name="use_same_profile_browser" /> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index cbc73faa46af..5795e4facad4 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3101,17 +3101,20 @@ <!-- Switch to work profile dialer app for placing a call dialog. --> <!-- Text for Switch to work profile dialog's Title. Switch to work profile dialog guide users to make call from work profile dialer app as it's not possible to make call from current profile due to an admin policy. [CHAR LIMIT=60] --> - <string name="call_from_work_profile_title">Can\'t call from this profile</string> + <string name="call_from_work_profile_title">Can\'t call from a personal app</string> <!-- Text for switch to work profile for call dialog to guide users to make call from work profile dialer app as it's not possible to make call from current profile due to an admin policy. [CHAR LIMIT=NONE] --> - <string name="call_from_work_profile_text">Your work policy allows you to make phone calls only from the work profile</string> + <string name="call_from_work_profile_text">Your organization only allows you to make calls from work apps</string> <!-- Label for the button to switch to work profile for placing call. Switch to work profile dialog guide users to make call from work profile dialer app as it's not possible to make call from current profile due to an admin policy.[CHAR LIMIT=60] --> <string name="call_from_work_profile_action">Switch to work profile</string> + <!-- Label for the button to switch to work profile for placing call. Switch to work profile dialog guide users to make call from work + profile dialer app as it's not possible to make call from current profile due to an admin policy.[CHAR LIMIT=60] --> + <string name="install_dialer_on_work_profile_action">Install a work phone app</string> <!-- Label for the close button on switch to work profile dialog. Switch to work profile dialog guide users to make call from work profile dialer app as it's not possible to make call from current profile due to an admin policy.[CHAR LIMIT=60] --> - <string name="call_from_work_profile_close">Close</string> + <string name="call_from_work_profile_close">Cancel</string> <!-- Label for a menu item in a menu that is shown when the user wishes to customize the lock screen. diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java index dba353b0d70e..8d5a2dd8df25 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java @@ -32,6 +32,7 @@ import com.android.systemui.sensorprivacy.television.TvSensorPrivacyChangedActiv import com.android.systemui.sensorprivacy.television.TvUnblockSensorActivity; import com.android.systemui.settings.brightness.BrightnessDialog; import com.android.systemui.statusbar.tv.notifications.TvNotificationPanelActivity; +import com.android.systemui.telephony.ui.activity.SwitchToManagedProfileForCallActivity; import com.android.systemui.tuner.TunerActivity; import com.android.systemui.usb.UsbAccessoryUriActivity; import com.android.systemui.usb.UsbConfirmActivity; @@ -178,4 +179,11 @@ public abstract class DefaultActivityBinder { @ClassKey(TvSensorPrivacyChangedActivity.class) public abstract Activity bindTvSensorPrivacyChangedActivity( TvSensorPrivacyChangedActivity activity); + + /** Inject into SwitchToManagedProfileForCallActivity. */ + @Binds + @IntoMap + @ClassKey(SwitchToManagedProfileForCallActivity.class) + public abstract Activity bindSwitchToManagedProfileForCallActivity( + SwitchToManagedProfileForCallActivity activity); } diff --git a/packages/SystemUI/src/com/android/systemui/telephony/ui/activity/SwitchToManagedProfileForCallActivity.kt b/packages/SystemUI/src/com/android/systemui/telephony/ui/activity/SwitchToManagedProfileForCallActivity.kt index 8e2b05cd9526..b9c24871eac8 100644 --- a/packages/SystemUI/src/com/android/systemui/telephony/ui/activity/SwitchToManagedProfileForCallActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/telephony/ui/activity/SwitchToManagedProfileForCallActivity.kt @@ -22,14 +22,21 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.os.UserHandle +import android.telecom.TelecomManager import android.util.Log import android.view.WindowManager import com.android.internal.app.AlertActivity import com.android.systemui.R +import javax.inject.Inject /** Dialog shown to the user to switch to managed profile for making a call using work SIM. */ -class SwitchToManagedProfileForCallActivity : AlertActivity(), DialogInterface.OnClickListener { +class SwitchToManagedProfileForCallActivity +@Inject +constructor( + private val telecomManager: TelecomManager?, +) : AlertActivity(), DialogInterface.OnClickListener { private lateinit var phoneNumber: Uri + private lateinit var positiveActionIntent: Intent private var managedProfileUserId = UserHandle.USER_NULL override fun onCreate(savedInstanceState: Bundle?) { @@ -37,8 +44,7 @@ class SwitchToManagedProfileForCallActivity : AlertActivity(), DialogInterface.O WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS ) super.onCreate(savedInstanceState) - - phoneNumber = intent.getData() + phoneNumber = intent.data ?: Uri.EMPTY managedProfileUserId = intent.getIntExtra( "android.telecom.extra.MANAGED_PROFILE_USER_ID", @@ -48,11 +54,31 @@ class SwitchToManagedProfileForCallActivity : AlertActivity(), DialogInterface.O mAlertParams.apply { mTitle = getString(R.string.call_from_work_profile_title) mMessage = getString(R.string.call_from_work_profile_text) - mPositiveButtonText = getString(R.string.call_from_work_profile_action) mNegativeButtonText = getString(R.string.call_from_work_profile_close) mPositiveButtonListener = this@SwitchToManagedProfileForCallActivity mNegativeButtonListener = this@SwitchToManagedProfileForCallActivity } + + // A dialer app may not be available in the managed profile. We try to handle that + // gracefully by redirecting the user to the app market to install a suitable app. + val defaultDialerPackageName: String? = + telecomManager?.getDefaultDialerPackage(UserHandle.of(managedProfileUserId)) + + val (intent, positiveButtonText) = + defaultDialerPackageName?.let { + Intent( + Intent.ACTION_CALL, + phoneNumber, + ) to R.string.call_from_work_profile_action + } + ?: Intent( + Intent.ACTION_VIEW, + Uri.parse(APP_STORE_DIALER_QUERY), + ) to R.string.install_dialer_on_work_profile_action + + positiveActionIntent = intent + mAlertParams.apply { mPositiveButtonText = getString(positiveButtonText) } + setupAlert() } @@ -66,7 +92,7 @@ class SwitchToManagedProfileForCallActivity : AlertActivity(), DialogInterface.O private fun switchToManagedProfile() { try { applicationContext.startActivityAsUser( - Intent(Intent.ACTION_CALL, phoneNumber), + positiveActionIntent, ActivityOptions.makeOpenCrossProfileAppsAnimation().toBundle(), UserHandle.of(managedProfileUserId) ) @@ -77,5 +103,6 @@ class SwitchToManagedProfileForCallActivity : AlertActivity(), DialogInterface.O companion object { private const val TAG = "SwitchToManagedProfileForCallActivity" + private const val APP_STORE_DIALER_QUERY = "market://search?q=dialer" } } diff --git a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java index 8a2888881e59..5b3f7a58e653 100644 --- a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java +++ b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java @@ -382,7 +382,11 @@ public class DefaultCrossProfileIntentFiltersUtils { return filters; } - /** Call intent with tel scheme exclusively handled my managed profile. */ + /** Call intent with tel scheme exclusively handled my managed profile. + * Note that work profile telephony relies on this intent filter to redirect intents to + * the IntentForwarderActivity. Work profile telephony error handling must be updated in + * the Telecomm package CallsManager if this filter is changed. + */ private static final DefaultCrossProfileIntentFilter CALL_MANAGED_PROFILE = new DefaultCrossProfileIntentFilter.Builder( DefaultCrossProfileIntentFilter.Direction.TO_PROFILE, |