From 7cbff193529acbfbccce1d270127cd889c65b68c Mon Sep 17 00:00:00 2001 From: Joshua Trask Date: Wed, 7 Jun 2023 16:50:57 +0000 Subject: Move two params to ResolverActivity.onCreate() Namely, this is the data that subclasses previously configured by calling up to `ResolverActivity.setSafeForwardingMode()` and `ResolverActivity.setAdditionalTargets()`. Both parameters are constant within a session (even though we still don't have a great place to hold them as `final`) -- and both can affect the behavior of `ResolverActivity.onCreate()`, so it's important that we have the data prepared for that call (and, especially in the case of "additional targets" it's not necessarily clear what would happen if we made additional changes afterward). Chooser was already setting these at the right time, but this makes the dependency explicit and prevents accidental misuse. This is a pure refactoring that trivially has no side effects in the IntentResolver codebase. The API change in ResolverActivity would break other subclasses (if they were depending on the IntentResolver fork instead of the framework version), but that's not relevant right now, and besides, the only client that would seem to be broken is CarResolverActivity, which currently uses these APIs incorrectly. Test: IntentResolverUnitTests, CtsSharesheetDeviceTest Bug: 286249609 Change-Id: I7309a4fb33244cfac20c8dffc81e738a91381904 --- .../android/intentresolver/ChooserActivity.java | 12 ++- .../android/intentresolver/ResolverActivity.java | 98 ++++++++++++---------- 2 files changed, 57 insertions(+), 53 deletions(-) (limited to 'java') diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index a2dff970..f5558a00 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -286,10 +286,6 @@ public class ChooserActivity extends ResolverActivity implements mEnterTransitionAnimationDelegate, new HeadlineGeneratorImpl(this)); - setAdditionalTargets(mChooserRequest.getAdditionalTargets()); - - setSafeForwardingMode(true); - mPinnedSharedPrefs = getPinnedSharedPrefs(this); mMaxTargetsPerRow = getResources().getInteger(R.integer.config_chooser_max_targets_per_row); @@ -307,12 +303,14 @@ public class ChooserActivity extends ResolverActivity implements super.onCreate( savedInstanceState, mChooserRequest.getTargetIntent(), + mChooserRequest.getAdditionalTargets(), mChooserRequest.getTitle(), mChooserRequest.getDefaultTitleResource(), mChooserRequest.getInitialIntents(), - /* rList: List = */ null, - /* supportsAlwaysUseOption = */ false, - new DefaultTargetDataLoader(this, getLifecycle(), false)); + /* resolutionList= */ null, + /* supportsAlwaysUseOption= */ false, + new DefaultTargetDataLoader(this, getLifecycle(), false), + /* safeForwardingMode= */ true); mChooserShownTime = System.currentTimeMillis(); final long systemCost = mChooserShownTime - intentReceivedTime; diff --git a/java/src/com/android/intentresolver/ResolverActivity.java b/java/src/com/android/intentresolver/ResolverActivity.java index 57871532..f6637d0f 100644 --- a/java/src/com/android/intentresolver/ResolverActivity.java +++ b/java/src/com/android/intentresolver/ResolverActivity.java @@ -119,6 +119,7 @@ import com.android.internal.util.LatencyTracker; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -143,7 +144,14 @@ public class ResolverActivity extends FragmentActivity implements mIsIntentPicker = isIntentPicker; } + /** + * Whether to enable a launch mode that is safe to use when forwarding intents received from + * applications and running in system processes. This mode uses Activity.startActivityAsCaller + * instead of the normal Activity.startActivity for launching the activity selected + * by the user. + */ private boolean mSafeForwardingMode; + private Button mAlwaysButton; private Button mOnceButton; protected View mProfileView; @@ -332,38 +340,55 @@ public class ResolverActivity extends FragmentActivity implements mResolvingHome = true; } - setSafeForwardingMode(true); - - onCreate(savedInstanceState, intent, null, 0, null, null, true, createIconLoader()); + onCreate( + savedInstanceState, + intent, + /* additionalTargets= */ null, + /* title= */ null, + /* defaultTitleRes= */ 0, + /* initialIntents= */ null, + /* resolutionList= */ null, + /* supportsAlwaysUseOption= */ true, + createIconLoader(), + /* safeForwardingMode= */ true); } /** * Compatibility version for other bundled services that use this overload without * a default title resource */ - protected void onCreate(Bundle savedInstanceState, Intent intent, - CharSequence title, Intent[] initialIntents, - List rList, boolean supportsAlwaysUseOption) { + protected void onCreate( + Bundle savedInstanceState, + Intent intent, + CharSequence title, + Intent[] initialIntents, + List resolutionList, + boolean supportsAlwaysUseOption, + boolean safeForwardingMode) { onCreate( savedInstanceState, intent, + null, title, 0, initialIntents, - rList, + resolutionList, supportsAlwaysUseOption, - createIconLoader()); + createIconLoader(), + safeForwardingMode); } protected void onCreate( Bundle savedInstanceState, Intent intent, + Intent[] additionalTargets, CharSequence title, int defaultTitleRes, Intent[] initialIntents, - List rList, + List resolutionList, boolean supportsAlwaysUseOption, - TargetDataLoader targetDataLoader) { + TargetDataLoader targetDataLoader, + boolean safeForwardingMode) { setTheme(appliedThemeResId()); super.onCreate(savedInstanceState); @@ -381,12 +406,17 @@ public class ResolverActivity extends FragmentActivity implements mReferrerPackage = getReferrerPackageName(); - // Add our initial intent as the first item, regardless of what else has already been added. + // The initial intent must come before any other targets that are to be added. mIntents.add(0, new Intent(intent)); + if (additionalTargets != null) { + Collections.addAll(mIntents, additionalTargets); + } + mTitle = title; mDefaultTitleResId = defaultTitleRes; mSupportsAlwaysUseOption = supportsAlwaysUseOption; + mSafeForwardingMode = safeForwardingMode; // The last argument of createResolverListAdapter is whether to do special handling // of the last used choice to highlight it in the list. We need to always @@ -399,7 +429,7 @@ public class ResolverActivity extends FragmentActivity implements boolean filterLastUsed = mSupportsAlwaysUseOption && !isVoiceInteraction() && !shouldShowTabs() && !hasCloneProfile(); mMultiProfilePagerAdapter = createMultiProfilePagerAdapter( - initialIntents, rList, filterLastUsed, targetDataLoader); + initialIntents, resolutionList, filterLastUsed, targetDataLoader); if (configureContentView(targetDataLoader)) { return; } @@ -455,17 +485,17 @@ public class ResolverActivity extends FragmentActivity implements protected AbstractMultiProfilePagerAdapter createMultiProfilePagerAdapter( Intent[] initialIntents, - List rList, + List resolutionList, boolean filterLastUsed, TargetDataLoader targetDataLoader) { AbstractMultiProfilePagerAdapter resolverMultiProfilePagerAdapter = null; if (shouldShowTabs()) { resolverMultiProfilePagerAdapter = createResolverMultiProfilePagerAdapterForTwoProfiles( - initialIntents, rList, filterLastUsed, targetDataLoader); + initialIntents, resolutionList, filterLastUsed, targetDataLoader); } else { resolverMultiProfilePagerAdapter = createResolverMultiProfilePagerAdapterForOneProfile( - initialIntents, rList, filterLastUsed, targetDataLoader); + initialIntents, resolutionList, filterLastUsed, targetDataLoader); } return resolverMultiProfilePagerAdapter; } @@ -1043,7 +1073,7 @@ public class ResolverActivity extends FragmentActivity implements Context context, List payloadIntents, Intent[] initialIntents, - List rList, + List resolutionList, boolean filterLastUsed, UserHandle userHandle, TargetDataLoader targetDataLoader) { @@ -1054,7 +1084,7 @@ public class ResolverActivity extends FragmentActivity implements context, payloadIntents, initialIntents, - rList, + resolutionList, filterLastUsed, createListController(userHandle), userHandle, @@ -1142,14 +1172,14 @@ public class ResolverActivity extends FragmentActivity implements private ResolverMultiProfilePagerAdapter createResolverMultiProfilePagerAdapterForOneProfile( Intent[] initialIntents, - List rList, + List resolutionList, boolean filterLastUsed, TargetDataLoader targetDataLoader) { ResolverListAdapter adapter = createResolverListAdapter( /* context */ this, /* payloadIntents */ mIntents, initialIntents, - rList, + resolutionList, filterLastUsed, /* userHandle */ getPersonalProfileUserHandle(), targetDataLoader); @@ -1170,7 +1200,7 @@ public class ResolverActivity extends FragmentActivity implements private ResolverMultiProfilePagerAdapter createResolverMultiProfilePagerAdapterForTwoProfiles( Intent[] initialIntents, - List rList, + List resolutionList, boolean filterLastUsed, TargetDataLoader targetDataLoader) { // In the edge case when we have 0 apps in the current profile and >1 apps in the other, @@ -1197,7 +1227,7 @@ public class ResolverActivity extends FragmentActivity implements /* context */ this, /* payloadIntents */ mIntents, selectedProfile == PROFILE_PERSONAL ? initialIntents : null, - rList, + resolutionList, (filterLastUsed && UserHandle.myUserId() == getPersonalProfileUserHandle().getIdentifier()), /* userHandle */ getPersonalProfileUserHandle(), @@ -1207,7 +1237,7 @@ public class ResolverActivity extends FragmentActivity implements /* context */ this, /* payloadIntents */ mIntents, selectedProfile == PROFILE_WORK ? initialIntents : null, - rList, + resolutionList, (filterLastUsed && UserHandle.myUserId() == workProfileUserHandle.getIdentifier()), /* userHandle */ workProfileUserHandle, @@ -1365,14 +1395,6 @@ public class ResolverActivity extends FragmentActivity implements return new Option(target.getDisplayLabel(), index); } - protected final void setAdditionalTargets(Intent[] intents) { - if (intents != null) { - for (Intent intent : intents) { - mIntents.add(intent); - } - } - } - public final Intent getTargetIntent() { return mIntents.isEmpty() ? null : mIntents.get(0); } @@ -1433,22 +1455,6 @@ public class ResolverActivity extends FragmentActivity implements () -> getString(R.string.forward_intent_to_work)); } - /** - * Turn on launch mode that is safe to use when forwarding intents received from - * applications and running in system processes. This mode uses Activity.startActivityAsCaller - * instead of the normal Activity.startActivity for launching the activity selected - * by the user. - * - *

This mode is set to true by default if the activity is initialized through - * {@link #onCreate(android.os.Bundle)}. If a subclass calls one of the other onCreate - * methods, it is set to false by default. You must set it before calling one of the - * more detailed onCreate methods, so that it will be set correctly in the case where - * there is only one intent to resolve and it is thus started immediately.

- */ - public final void setSafeForwardingMode(boolean safeForwarding) { - mSafeForwardingMode = safeForwarding; - } - protected final CharSequence getTitleForAction(Intent intent, int defaultTitleRes) { final ActionTitle title = mResolvingHome ? ActionTitle.HOME -- cgit v1.2.3-59-g8ed1b