diff options
| author | 2023-10-31 14:19:26 -0400 | |
|---|---|---|
| committer | 2023-11-01 15:17:05 -0400 | |
| commit | 0842d845019153cc7138b0208a9eca0b5ac73784 (patch) | |
| tree | 5db1371388560156c1a3399f931ee8c0b2e72a68 /java/src/com | |
| parent | 29f2a6eaec0c37ac4d92bdb0b049447d0d00b70d (diff) | |
Moves AnnotatedUserHandles to ActivityLogic
Also creates test activity logic for wrapper activities to be compatible
with the ActivityLogic structure.
Test: atest com.android.intentresolver.v2
BUG: 302113519
Change-Id: If064e76015e90fa98d9e41fb3c8f38b93ccae789
Diffstat (limited to 'java/src/com')
5 files changed, 158 insertions, 126 deletions
diff --git a/java/src/com/android/intentresolver/v2/ActivityLogic.kt b/java/src/com/android/intentresolver/v2/ActivityLogic.kt index a3e90033..e5b89dfa 100644 --- a/java/src/com/android/intentresolver/v2/ActivityLogic.kt +++ b/java/src/com/android/intentresolver/v2/ActivityLogic.kt @@ -9,7 +9,9 @@ import android.content.Intent import android.net.Uri import android.os.UserHandle import android.os.UserManager +import android.util.Log import androidx.activity.ComponentActivity +import com.android.intentresolver.AnnotatedUserHandles import com.android.intentresolver.R import com.android.intentresolver.icons.TargetDataLoader @@ -57,6 +59,8 @@ interface ActivityLogic : CommonActivityLogic { * activities (including test activities), should live here. */ interface CommonActivityLogic { + /** The tag to use when logging. */ + val tag: String /** A reference to the activity owning, and used by, this logic. */ val activity: ComponentActivity /** The name of the referring package. */ @@ -65,6 +69,8 @@ interface CommonActivityLogic { val userManager: UserManager /** Device policy manager system service. */ val devicePolicyManager: DevicePolicyManager + /** Current [UserHandle]s retrievable by type. */ + val annotatedUserHandles: AnnotatedUserHandles? /** Returns display message indicating intent forwarding or null if not intent forwarding. */ fun forwardMessageFor(intent: Intent): String? @@ -82,7 +88,10 @@ interface CommonActivityLogic { * [ActivityLogic] implementations. Test implementations of [ActivityLogic] may need to create their * own [CommonActivityLogic] implementation. */ -class CommonActivityLogicImpl(activityProvider: () -> ComponentActivity) : CommonActivityLogic { +class CommonActivityLogicImpl( + override val tag: String, + activityProvider: () -> ComponentActivity, +) : CommonActivityLogic { override val activity: ComponentActivity by lazy { activityProvider() } @@ -104,6 +113,15 @@ class CommonActivityLogicImpl(activityProvider: () -> ComponentActivity) : Commo activity.context.getSystemService(DevicePolicyManager::class.java)!! } + override val annotatedUserHandles: AnnotatedUserHandles? by lazy { + try { + AnnotatedUserHandles.forShareActivity(activity) + } catch (e: SecurityException) { + Log.e(tag, "Request from UID without necessary permissions", e) + null + } + } + private val forwardToPersonalMessage: String? by lazy { devicePolicyManager.resources.getString(FORWARD_INTENT_TO_PERSONAL) { activity.context.getString(R.string.forward_intent_to_owner) diff --git a/java/src/com/android/intentresolver/v2/ChooserActivity.java b/java/src/com/android/intentresolver/v2/ChooserActivity.java index ef2d68bc..36e0cad1 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivity.java +++ b/java/src/com/android/intentresolver/v2/ChooserActivity.java @@ -76,6 +76,7 @@ import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; +import com.android.intentresolver.AnnotatedUserHandles; import com.android.intentresolver.ChooserGridLayoutManager; import com.android.intentresolver.ChooserListAdapter; import com.android.intentresolver.ChooserRefinementManager; @@ -244,43 +245,21 @@ public class ChooserActivity extends Hilt_ChooserActivity implements */ private boolean mFinishWhenStopped = false; - @Override - protected void onCreate(Bundle savedInstanceState) { - Tracer.INSTANCE.markLaunched(); - AtomicLong intentReceivedTime = new AtomicLong(-1); + private final AtomicLong mIntentReceivedTime = new AtomicLong(-1); + + ChooserActivity() { + super(); mLogic = new ChooserActivityLogic( TAG, () -> this, () -> mTargetDataLoader, - () -> { - intentReceivedTime.set(System.currentTimeMillis()); - mLatencyTracker.onActionStart(ACTION_LOAD_SHARE_SHEET); - - mPinnedSharedPrefs = getPinnedSharedPrefs(this); - mMaxTargetsPerRow = - getResources().getInteger(R.integer.config_chooser_max_targets_per_row); - mShouldDisplayLandscape = - shouldDisplayLandscape(getResources().getConfiguration().orientation); - - - ChooserRequestParameters chooserRequest = - ((ChooserActivityLogic) mLogic).getChooserRequestParameters(); - if (chooserRequest == null) { - return Unit.INSTANCE; - } - setRetainInOnStop(chooserRequest.shouldRetainInOnStop()); - - createProfileRecords( - new AppPredictorFactory( - this, - chooserRequest.getSharedText(), - chooserRequest.getTargetIntentFilter() - ), - chooserRequest.getTargetIntentFilter() - ); - return Unit.INSTANCE; - } + this::onPreinitialization ); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + Tracer.INSTANCE.markLaunched(); super.onCreate(savedInstanceState); if (getChooserRequest() == null) { finish(); @@ -337,7 +316,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements } mChooserShownTime = System.currentTimeMillis(); - final long systemCost = mChooserShownTime - intentReceivedTime.get(); + final long systemCost = mChooserShownTime - mIntentReceivedTime.get(); getEventLog().logChooserActivityShown( isWorkProfile(), chooserRequest.getTargetType(), systemCost); @@ -371,6 +350,34 @@ public class ChooserActivity extends Hilt_ChooserActivity implements mEnterTransitionAnimationDelegate.postponeTransition(); } + protected final Unit onPreinitialization() { + mIntentReceivedTime.set(System.currentTimeMillis()); + mLatencyTracker.onActionStart(ACTION_LOAD_SHARE_SHEET); + + mPinnedSharedPrefs = getPinnedSharedPrefs(this); + mMaxTargetsPerRow = + getResources().getInteger(R.integer.config_chooser_max_targets_per_row); + mShouldDisplayLandscape = + shouldDisplayLandscape(getResources().getConfiguration().orientation); + + + ChooserRequestParameters chooserRequest = getChooserRequest(); + if (chooserRequest == null) { + return Unit.INSTANCE; + } + setRetainInOnStop(chooserRequest.shouldRetainInOnStop()); + + createProfileRecords( + new AppPredictorFactory( + this, + chooserRequest.getSharedText(), + chooserRequest.getTargetIntentFilter() + ), + chooserRequest.getTargetIntentFilter() + ); + return Unit.INSTANCE; + } + @Nullable private ChooserRequestParameters getChooserRequest() { return ((ChooserActivityLogic) mLogic).getChooserRequestParameters(); @@ -380,15 +387,19 @@ public class ChooserActivity extends Hilt_ChooserActivity implements return requireNonNull(getChooserRequest()); } + private AnnotatedUserHandles requireAnnotatedUserHandles() { + return requireNonNull(mLogic.getAnnotatedUserHandles()); + } + private void createProfileRecords( AppPredictorFactory factory, IntentFilter targetIntentFilter) { - UserHandle mainUserHandle = getAnnotatedUserHandles().personalProfileUserHandle; + UserHandle mainUserHandle = requireAnnotatedUserHandles().personalProfileUserHandle; ProfileRecord record = createProfileRecord(mainUserHandle, targetIntentFilter, factory); if (record.shortcutLoader == null) { Tracer.INSTANCE.endLaunchToShortcutTrace(); } - UserHandle workUserHandle = getAnnotatedUserHandles().workProfileUserHandle; + UserHandle workUserHandle = requireAnnotatedUserHandles().workProfileUserHandle; if (workUserHandle != null) { createProfileRecord(workUserHandle, targetIntentFilter, factory); } @@ -482,11 +493,11 @@ public class ChooserActivity extends Hilt_ChooserActivity implements /* devicePolicyEventCategory= */ ResolverActivity.METRICS_CATEGORY_CHOOSER); return new NoCrossProfileEmptyStateProvider( - getAnnotatedUserHandles().personalProfileUserHandle, + requireAnnotatedUserHandles().personalProfileUserHandle, noWorkToPersonalEmptyState, noPersonalToWorkEmptyState, createCrossProfileIntentsChecker(), - getAnnotatedUserHandles().tabOwnerUserHandleForLaunch); + requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch); } private ChooserMultiProfilePagerAdapter createChooserMultiProfilePagerAdapterForOneProfile( @@ -500,7 +511,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements initialIntents, rList, filterLastUsed, - /* userHandle */ getAnnotatedUserHandles().personalProfileUserHandle, + /* userHandle */ requireAnnotatedUserHandles().personalProfileUserHandle, targetDataLoader); return new ChooserMultiProfilePagerAdapter( /* context */ this, @@ -508,7 +519,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements createEmptyStateProvider(/* workProfileUserHandle= */ null), /* workProfileQuietModeChecker= */ () -> false, /* workProfileUserHandle= */ null, - getAnnotatedUserHandles().cloneProfileUserHandle, + requireAnnotatedUserHandles().cloneProfileUserHandle, mMaxTargetsPerRow, mFeatureFlags); } @@ -525,7 +536,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements selectedProfile == PROFILE_PERSONAL ? initialIntents : null, rList, filterLastUsed, - /* userHandle */ getAnnotatedUserHandles().personalProfileUserHandle, + /* userHandle */ requireAnnotatedUserHandles().personalProfileUserHandle, targetDataLoader); ChooserGridAdapter workAdapter = createChooserGridAdapter( /* context */ this, @@ -533,17 +544,17 @@ public class ChooserActivity extends Hilt_ChooserActivity implements selectedProfile == PROFILE_WORK ? initialIntents : null, rList, filterLastUsed, - /* userHandle */ getAnnotatedUserHandles().workProfileUserHandle, + /* userHandle */ requireAnnotatedUserHandles().workProfileUserHandle, targetDataLoader); return new ChooserMultiProfilePagerAdapter( /* context */ this, personalAdapter, workAdapter, - createEmptyStateProvider(getAnnotatedUserHandles().workProfileUserHandle), + createEmptyStateProvider(requireAnnotatedUserHandles().workProfileUserHandle), () -> mWorkProfileAvailability.isQuietModeEnabled(), selectedProfile, - getAnnotatedUserHandles().workProfileUserHandle, - getAnnotatedUserHandles().cloneProfileUserHandle, + requireAnnotatedUserHandles().workProfileUserHandle, + requireAnnotatedUserHandles().cloneProfileUserHandle, mMaxTargetsPerRow, mFeatureFlags); } @@ -552,7 +563,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements int selectedProfile = getSelectedProfileExtra(); if (selectedProfile == -1) { selectedProfile = getProfileForUser( - getAnnotatedUserHandles().tabOwnerUserHandleForLaunch); + requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch); } return selectedProfile; } @@ -798,8 +809,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements if (!chooserRequest.getCallerChooserTargets().isEmpty()) { // Send the caller's chooser targets only to the default profile. UserHandle defaultUser = (findSelectedProfile() == PROFILE_WORK) - ? getAnnotatedUserHandles().workProfileUserHandle - : getAnnotatedUserHandles().personalProfileUserHandle; + ? requireAnnotatedUserHandles().workProfileUserHandle + : requireAnnotatedUserHandles().personalProfileUserHandle; if (mChooserMultiProfilePagerAdapter.getCurrentUserHandle() == defaultUser) { mChooserMultiProfilePagerAdapter.getActiveListAdapter().addServiceResults( /* origTarget */ null, @@ -1113,7 +1124,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements ProfileRecord record = getProfileRecord(userHandle); // We cannot use APS service when clone profile is present as APS service cannot sort // cross profile targets as of now. - return ((record == null) || (getAnnotatedUserHandles().cloneProfileUserHandle != null)) + return ((record == null) || (requireAnnotatedUserHandles().cloneProfileUserHandle != null)) ? null : record.appPredictor; } @@ -1253,8 +1264,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements int maxTargetsPerRow, TargetDataLoader targetDataLoader) { UserHandle initialIntentsUserSpace = isLaunchedAsCloneProfile() - && userHandle.equals(getAnnotatedUserHandles().personalProfileUserHandle) - ? getAnnotatedUserHandles().cloneProfileUserHandle : userHandle; + && userHandle.equals(requireAnnotatedUserHandles().personalProfileUserHandle) + ? requireAnnotatedUserHandles().cloneProfileUserHandle : userHandle; return new ChooserListAdapter( context, payloadIntents, @@ -1275,7 +1286,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements @Override protected void onWorkProfileStatusUpdated() { - UserHandle workUser = getAnnotatedUserHandles().workProfileUserHandle; + UserHandle workUser = requireAnnotatedUserHandles().workProfileUserHandle; ProfileRecord record = workUser == null ? null : getProfileRecord(workUser); if (record != null && record.shortcutLoader != null) { record.shortcutLoader.reset(); @@ -1309,7 +1320,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements mPm, getTargetIntent(), mLogic.getReferrerPackageName(), - getAnnotatedUserHandles().userIdOfCallingApp, + requireAnnotatedUserHandles().userIdOfCallingApp, resolverComparator, getQueryIntentsUser(userHandle)); } @@ -1331,7 +1342,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements @Override public void safelyStartActivityAsPersonalProfileUser(TargetInfo targetInfo) { safelyStartActivityAsUser( - targetInfo, getAnnotatedUserHandles().personalProfileUserHandle); + targetInfo, + requireAnnotatedUserHandles().personalProfileUserHandle + ); finish(); } @@ -1342,7 +1355,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements ChooserActivity.this, sharedElement, sharedElementName); safelyStartActivityAsUser( targetInfo, - getAnnotatedUserHandles().personalProfileUserHandle, + requireAnnotatedUserHandles().personalProfileUserHandle, options.toBundle()); // Can't finish right away because the shared element transition may not // be ready to start. @@ -1500,7 +1513,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements * Returns {@link #PROFILE_PERSONAL}, otherwise. **/ private int getProfileForUser(UserHandle currentUserHandle) { - if (currentUserHandle.equals(getAnnotatedUserHandles().workProfileUserHandle)) { + if (currentUserHandle.equals(requireAnnotatedUserHandles().workProfileUserHandle)) { return PROFILE_WORK; } // We return personal profile, as it is the default when there is no work profile, personal diff --git a/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt b/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt index da0fa033..838c39e2 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt +++ b/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt @@ -4,18 +4,26 @@ import android.app.Activity import android.content.Intent import android.util.Log import androidx.activity.ComponentActivity +import androidx.annotation.OpenForTesting import com.android.intentresolver.ChooserRequestParameters import com.android.intentresolver.R import com.android.intentresolver.icons.TargetDataLoader import com.android.intentresolver.v2.util.mutableLazy -/** Activity logic for [ChooserActivity]. */ -class ChooserActivityLogic( - private val tag: String, +/** + * Activity logic for [ChooserActivity]. + * + * TODO: Make this class no longer open once [ChooserActivity] no longer needs to cast to access + * [chooserRequestParameters]. For now, this class being open is better than using reflection + * there. + */ +@OpenForTesting +open class ChooserActivityLogic( + tag: String, activityProvider: () -> ComponentActivity, targetDataLoaderProvider: () -> TargetDataLoader, private val onPreInitialization: () -> Unit, -) : ActivityLogic, CommonActivityLogic by CommonActivityLogicImpl(activityProvider) { +) : ActivityLogic, CommonActivityLogic by CommonActivityLogicImpl(tag, activityProvider) { override val targetIntent: Intent by lazy { chooserRequestParameters?.targetIntent ?: Intent() } diff --git a/java/src/com/android/intentresolver/v2/ResolverActivity.java b/java/src/com/android/intentresolver/v2/ResolverActivity.java index 6fdc2df3..b34ce16d 100644 --- a/java/src/com/android/intentresolver/v2/ResolverActivity.java +++ b/java/src/com/android/intentresolver/v2/ResolverActivity.java @@ -33,6 +33,8 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE import static com.android.internal.annotations.VisibleForTesting.Visibility.PROTECTED; +import static java.util.Objects.requireNonNull; + import android.annotation.Nullable; import android.annotation.StringRes; import android.annotation.UiThread; @@ -129,7 +131,6 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.function.Supplier; /** * This is a copy of ResolverActivity to support IntentResolver's ChooserActivity. This code is @@ -141,7 +142,7 @@ import java.util.function.Supplier; public class ResolverActivity extends FragmentActivity implements ResolverListAdapter.ResolverListCommunicator { - protected ActivityLogic mLogic = new ResolverActivityLogic(() -> this); + protected ActivityLogic mLogic = new ResolverActivityLogic(TAG, () -> this); public ResolverActivity() { mIsIntentPicker = getClass().equals(ResolverActivity.class); @@ -221,27 +222,6 @@ public class ResolverActivity extends FragmentActivity implements private UserHandle mHeaderCreatorUser; - // User handle annotations are lazy-initialized to ensure that they're computed exactly once - // (even though they can't be computed prior to activity creation). - // TODO: use a less ad-hoc pattern for lazy initialization (by switching to Dagger or - // introducing a common `LazySingletonSupplier` API, etc), and/or migrate all dependents to a - // new component whose lifecycle is limited to the "created" Activity (so that we can just hold - // the annotations as a `final` ivar, which is a better way to show immutability). - private Supplier<AnnotatedUserHandles> mLazyAnnotatedUserHandles = () -> { - final AnnotatedUserHandles result = computeAnnotatedUserHandles(); - mLazyAnnotatedUserHandles = () -> result; - return result; - }; - - // This method is called exactly once during creation to compute the immutable annotations - // accessible through the lazy supplier {@link mLazyAnnotatedUserHandles}. - // TODO: this is only defined so that tests can provide an override that injects fake - // annotations. Dagger could provide a cleaner model for our testing/injection requirements. - @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) - protected AnnotatedUserHandles computeAnnotatedUserHandles() { - return AnnotatedUserHandles.forShareActivity(this); - } - @Nullable private OnSwitchOnWorkSelectedListener mOnSwitchOnWorkSelectedListener; @@ -352,9 +332,11 @@ public class ResolverActivity extends FragmentActivity implements Intent[] initialIntents, TargetDataLoader targetDataLoader ) { - // Force computation of user handle annotations in order to validate the caller ID. (See the - // associated TODO comment to explain why this is structured as a lazy computation.) - AnnotatedUserHandles unusedReferenceToHandles = mLazyAnnotatedUserHandles.get(); + // Calling UID did not have valid permissions + if (mLogic.getAnnotatedUserHandles() == null) { + finish(); + return; + } mWorkProfileAvailability = createWorkProfileAvailabilityManager(); @@ -389,12 +371,20 @@ public class ResolverActivity extends FragmentActivity implements mPersonalPackageMonitor = createPackageMonitor( mMultiProfilePagerAdapter.getPersonalListAdapter()); mPersonalPackageMonitor.register( - this, getMainLooper(), getAnnotatedUserHandles().personalProfileUserHandle, false); + this, + getMainLooper(), + requireAnnotatedUserHandles().personalProfileUserHandle, + false + ); if (shouldShowTabs()) { mWorkPackageMonitor = createPackageMonitor( mMultiProfilePagerAdapter.getWorkListAdapter()); mWorkPackageMonitor.register( - this, getMainLooper(), getAnnotatedUserHandles().workProfileUserHandle, false); + this, + getMainLooper(), + requireAnnotatedUserHandles().workProfileUserHandle, + false + ); } mRegistered = true; @@ -486,11 +476,11 @@ public class ResolverActivity extends FragmentActivity implements ResolverActivity.METRICS_CATEGORY_RESOLVER); return new NoCrossProfileEmptyStateProvider( - getAnnotatedUserHandles().personalProfileUserHandle, + requireAnnotatedUserHandles().personalProfileUserHandle, noWorkToPersonalEmptyState, noPersonalToWorkEmptyState, createCrossProfileIntentsChecker(), - getAnnotatedUserHandles().tabOwnerUserHandleForLaunch); + requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch); } /** @@ -878,7 +868,7 @@ public class ResolverActivity extends FragmentActivity implements mPm, getTargetIntent(), mLogic.getReferrerPackageName(), - getAnnotatedUserHandles().userIdOfCallingApp, + requireAnnotatedUserHandles().userIdOfCallingApp, resolverComparator, getQueryIntentsUser(userHandle)); } @@ -966,7 +956,8 @@ public class ResolverActivity extends FragmentActivity implements @Override // ResolverListCommunicator public void onHandlePackagesChanged(ResolverListAdapter listAdapter) { if (listAdapter == mMultiProfilePagerAdapter.getActiveListAdapter()) { - if (listAdapter.getUserHandle().equals(getAnnotatedUserHandles().workProfileUserHandle) + if (listAdapter.getUserHandle().equals( + requireAnnotatedUserHandles().workProfileUserHandle) && mWorkProfileAvailability.isWaitingToEnableWorkProfile()) { // We have just turned on the work profile and entered the pass code to start it, // now we are waiting to receive the ACTION_USER_UNLOCKED broadcast. There is no @@ -1006,13 +997,13 @@ public class ResolverActivity extends FragmentActivity implements protected WorkProfileAvailabilityManager createWorkProfileAvailabilityManager() { return new WorkProfileAvailabilityManager( getSystemService(UserManager.class), - getAnnotatedUserHandles().workProfileUserHandle, + requireAnnotatedUserHandles().workProfileUserHandle, this::onWorkProfileStatusUpdated); } protected void onWorkProfileStatusUpdated() { if (mMultiProfilePagerAdapter.getCurrentUserHandle().equals( - getAnnotatedUserHandles().workProfileUserHandle)) { + requireAnnotatedUserHandles().workProfileUserHandle)) { mMultiProfilePagerAdapter.rebuildActiveTab(true); } else { mMultiProfilePagerAdapter.clearInactiveProfileCache(); @@ -1030,8 +1021,8 @@ public class ResolverActivity extends FragmentActivity implements UserHandle userHandle, TargetDataLoader targetDataLoader) { UserHandle initialIntentsUserSpace = isLaunchedAsCloneProfile() - && userHandle.equals(getAnnotatedUserHandles().personalProfileUserHandle) - ? getAnnotatedUserHandles().cloneProfileUserHandle : userHandle; + && userHandle.equals(requireAnnotatedUserHandles().personalProfileUserHandle) + ? requireAnnotatedUserHandles().cloneProfileUserHandle : userHandle; return new ResolverListAdapter( context, payloadIntents, @@ -1080,9 +1071,9 @@ public class ResolverActivity extends FragmentActivity implements final EmptyStateProvider noAppsEmptyStateProvider = new NoAppsAvailableEmptyStateProvider( this, workProfileUserHandle, - getAnnotatedUserHandles().personalProfileUserHandle, + requireAnnotatedUserHandles().personalProfileUserHandle, getMetricsCategory(), - getAnnotatedUserHandles().tabOwnerUserHandleForLaunch + requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch ); // Return composite provider, the order matters (the higher, the more priority) @@ -1105,7 +1096,7 @@ public class ResolverActivity extends FragmentActivity implements initialIntents, resolutionList, filterLastUsed, - /* userHandle */ getAnnotatedUserHandles().personalProfileUserHandle, + /* userHandle */ requireAnnotatedUserHandles().personalProfileUserHandle, targetDataLoader); return new ResolverMultiProfilePagerAdapter( /* context */ this, @@ -1113,13 +1104,13 @@ public class ResolverActivity extends FragmentActivity implements createEmptyStateProvider(/* workProfileUserHandle= */ null), /* workProfileQuietModeChecker= */ () -> false, /* workProfileUserHandle= */ null, - getAnnotatedUserHandles().cloneProfileUserHandle); + requireAnnotatedUserHandles().cloneProfileUserHandle); } private UserHandle getIntentUser() { return getIntent().hasExtra(EXTRA_CALLING_USER) ? getIntent().getParcelableExtra(EXTRA_CALLING_USER) - : getAnnotatedUserHandles().tabOwnerUserHandleForLaunch; + : requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch; } private ResolverMultiProfilePagerAdapter createResolverMultiProfilePagerAdapterForTwoProfiles( @@ -1132,10 +1123,10 @@ public class ResolverActivity extends FragmentActivity implements // this happens, we check for it here and set the current profile's tab. int selectedProfile = getCurrentProfile(); UserHandle intentUser = getIntentUser(); - if (!getAnnotatedUserHandles().tabOwnerUserHandleForLaunch.equals(intentUser)) { - if (getAnnotatedUserHandles().personalProfileUserHandle.equals(intentUser)) { + if (!requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch.equals(intentUser)) { + if (requireAnnotatedUserHandles().personalProfileUserHandle.equals(intentUser)) { selectedProfile = PROFILE_PERSONAL; - } else if (getAnnotatedUserHandles().workProfileUserHandle.equals(intentUser)) { + } else if (requireAnnotatedUserHandles().workProfileUserHandle.equals(intentUser)) { selectedProfile = PROFILE_WORK; } } else { @@ -1153,10 +1144,10 @@ public class ResolverActivity extends FragmentActivity implements selectedProfile == PROFILE_PERSONAL ? initialIntents : null, resolutionList, (filterLastUsed && UserHandle.myUserId() - == getAnnotatedUserHandles().personalProfileUserHandle.getIdentifier()), - /* userHandle */ getAnnotatedUserHandles().personalProfileUserHandle, + == requireAnnotatedUserHandles().personalProfileUserHandle.getIdentifier()), + /* userHandle */ requireAnnotatedUserHandles().personalProfileUserHandle, targetDataLoader); - UserHandle workProfileUserHandle = getAnnotatedUserHandles().workProfileUserHandle; + UserHandle workProfileUserHandle = requireAnnotatedUserHandles().workProfileUserHandle; ResolverListAdapter workAdapter = createResolverListAdapter( /* context */ this, /* payloadIntents */ mIntents, @@ -1174,7 +1165,7 @@ public class ResolverActivity extends FragmentActivity implements () -> mWorkProfileAvailability.isQuietModeEnabled(), selectedProfile, workProfileUserHandle, - getAnnotatedUserHandles().cloneProfileUserHandle); + requireAnnotatedUserHandles().cloneProfileUserHandle); } /** @@ -1197,26 +1188,26 @@ public class ResolverActivity extends FragmentActivity implements } protected final @Profile int getCurrentProfile() { - UserHandle launchUser = getAnnotatedUserHandles().tabOwnerUserHandleForLaunch; - UserHandle personalUser = getAnnotatedUserHandles().personalProfileUserHandle; + UserHandle launchUser = requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch; + UserHandle personalUser = requireAnnotatedUserHandles().personalProfileUserHandle; return launchUser.equals(personalUser) ? PROFILE_PERSONAL : PROFILE_WORK; } - protected final AnnotatedUserHandles getAnnotatedUserHandles() { - return mLazyAnnotatedUserHandles.get(); + private AnnotatedUserHandles requireAnnotatedUserHandles() { + return requireNonNull(mLogic.getAnnotatedUserHandles()); } private boolean hasWorkProfile() { - return getAnnotatedUserHandles().workProfileUserHandle != null; + return requireAnnotatedUserHandles().workProfileUserHandle != null; } private boolean hasCloneProfile() { - return getAnnotatedUserHandles().cloneProfileUserHandle != null; + return requireAnnotatedUserHandles().cloneProfileUserHandle != null; } protected final boolean isLaunchedAsCloneProfile() { - UserHandle launchUser = getAnnotatedUserHandles().userHandleSharesheetLaunchedAs; - UserHandle cloneUser = getAnnotatedUserHandles().cloneProfileUserHandle; + UserHandle launchUser = requireAnnotatedUserHandles().userHandleSharesheetLaunchedAs; + UserHandle cloneUser = requireAnnotatedUserHandles().cloneProfileUserHandle; return hasCloneProfile() && launchUser.equals(cloneUser); } @@ -1261,7 +1252,7 @@ public class ResolverActivity extends FragmentActivity implements .createEvent(DevicePolicyEnums.RESOLVER_CROSS_PROFILE_TARGET_OPENED) .setBoolean( currentUserHandle.equals( - getAnnotatedUserHandles().personalProfileUserHandle)) + requireAnnotatedUserHandles().personalProfileUserHandle)) .setStrings(getMetricsCategory(), cti.isInDirectShareMetricsCategory() ? "direct_share" : "other_target") .write(); @@ -1354,7 +1345,7 @@ public class ResolverActivity extends FragmentActivity implements mPersonalPackageMonitor.register( this, getMainLooper(), - getAnnotatedUserHandles().personalProfileUserHandle, + requireAnnotatedUserHandles().personalProfileUserHandle, false); if (shouldShowTabs()) { if (mWorkPackageMonitor == null) { @@ -1364,7 +1355,7 @@ public class ResolverActivity extends FragmentActivity implements mWorkPackageMonitor.register( this, getMainLooper(), - getAnnotatedUserHandles().workProfileUserHandle, + requireAnnotatedUserHandles().workProfileUserHandle, false); } mRegistered = true; @@ -1583,7 +1574,7 @@ public class ResolverActivity extends FragmentActivity implements } } catch (RuntimeException e) { Slog.wtf(TAG, - "Unable to launch as uid " + getAnnotatedUserHandles().userIdOfCallingApp + "Unable to launch as uid " + requireAnnotatedUserHandles().userIdOfCallingApp + " package " + getLaunchedFromPackage() + ", while running in " + ActivityThread.currentProcessName(), e); } @@ -1834,7 +1825,7 @@ public class ResolverActivity extends FragmentActivity implements DevicePolicyEventLogger .createEvent(DevicePolicyEnums.RESOLVER_AUTOLAUNCH_CROSS_PROFILE_TARGET) .setBoolean(activeListAdapter.getUserHandle() - .equals(getAnnotatedUserHandles().personalProfileUserHandle)) + .equals(requireAnnotatedUserHandles().personalProfileUserHandle)) .setStrings(getMetricsCategory()) .write(); safelyStartActivity(activeProfileTarget); @@ -2118,7 +2109,8 @@ public class ResolverActivity extends FragmentActivity implements // filtered item. We always show the same default app even in the inactive user profile. boolean adapterForCurrentUserHasFilteredItem = mMultiProfilePagerAdapter.getListAdapterForUserHandle( - getAnnotatedUserHandles().tabOwnerUserHandleForLaunch).hasFilteredItem(); + requireAnnotatedUserHandles().tabOwnerUserHandleForLaunch + ).hasFilteredItem(); return mLogic.getSupportsAlwaysUseOption() && adapterForCurrentUserHasFilteredItem; } @@ -2239,7 +2231,7 @@ public class ResolverActivity extends FragmentActivity implements * {@link ResolverListController} configured for the provided {@code userHandle}. */ protected final UserHandle getQueryIntentsUser(UserHandle userHandle) { - return getAnnotatedUserHandles().getQueryIntentsUser(userHandle); + return requireAnnotatedUserHandles().getQueryIntentsUser(userHandle); } /** @@ -2259,9 +2251,9 @@ public class ResolverActivity extends FragmentActivity implements // Add clonedProfileUserHandle to the list only if we are: // a. Building the Personal Tab. // b. CloneProfile exists on the device. - if (userHandle.equals(getAnnotatedUserHandles().personalProfileUserHandle) + if (userHandle.equals(requireAnnotatedUserHandles().personalProfileUserHandle) && hasCloneProfile()) { - userList.add(getAnnotatedUserHandles().cloneProfileUserHandle); + userList.add(requireAnnotatedUserHandles().cloneProfileUserHandle); } return userList; } diff --git a/java/src/com/android/intentresolver/v2/ResolverActivityLogic.kt b/java/src/com/android/intentresolver/v2/ResolverActivityLogic.kt index c8f02885..1b936159 100644 --- a/java/src/com/android/intentresolver/v2/ResolverActivityLogic.kt +++ b/java/src/com/android/intentresolver/v2/ResolverActivityLogic.kt @@ -9,8 +9,9 @@ import com.android.intentresolver.v2.util.mutableLazy /** Activity logic for [ResolverActivity]. */ class ResolverActivityLogic( + tag: String, activityProvider: () -> ComponentActivity, -) : ActivityLogic, CommonActivityLogic by CommonActivityLogicImpl(activityProvider) { +) : ActivityLogic, CommonActivityLogic by CommonActivityLogicImpl(tag, activityProvider) { override val targetIntent: Intent by lazy { val intent = Intent(activity.intent) |