summaryrefslogtreecommitdiff
path: root/java/src/com
diff options
context:
space:
mode:
author Govinda Wasserman <gwasserman@google.com> 2023-10-31 14:19:26 -0400
committer Govinda Wasserman <gwasserman@google.com> 2023-11-01 15:17:05 -0400
commit0842d845019153cc7138b0208a9eca0b5ac73784 (patch)
tree5db1371388560156c1a3399f931ee8c0b2e72a68 /java/src/com
parent29f2a6eaec0c37ac4d92bdb0b049447d0d00b70d (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')
-rw-r--r--java/src/com/android/intentresolver/v2/ActivityLogic.kt20
-rw-r--r--java/src/com/android/intentresolver/v2/ChooserActivity.java123
-rw-r--r--java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt16
-rw-r--r--java/src/com/android/intentresolver/v2/ResolverActivity.java122
-rw-r--r--java/src/com/android/intentresolver/v2/ResolverActivityLogic.kt3
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)