summaryrefslogtreecommitdiff
path: root/tests/activity
diff options
context:
space:
mode:
author Mark Renouf <mrenouf@google.com> 2024-03-01 12:37:23 -0500
committer Mark Renouf <mrenouf@google.com> 2024-04-04 00:09:05 -0400
commit9f4e2ece250f07e214231a89c9aa74ab19d35d30 (patch)
tree983088328ff213c10daa42710ec3fdc6cfc99dbe /tests/activity
parenta0691fb844a0edef901e00be9acac68f32dd2a88 (diff)
ResolverActivity Profile integration
* connects ResolverActivity with UserInteractor * replaces all existing references as the source of UserHandles * app continues to explicity use the same profile types as previous * updates Activity tests to use FakeUserRepository * removes ResolverWorkProfilePausedEmptyStateProvider * removes ResolverNoCrossProfileEmptyStateProvider * removes ActivityLogic * removes ResolverActivityLogic * removes TestResolverActivityLogic Bug: 300157408 Bug: 311348033 Test: atest IntentResolver-tests-activity:com.android.intentresolver.v2 Change-Id: Ia4a8bf458ebad12af06b1c6c1f0d8586be452d43
Diffstat (limited to 'tests/activity')
-rw-r--r--tests/activity/src/com/android/intentresolver/ResolverActivityTest.java2
-rw-r--r--tests/activity/src/com/android/intentresolver/v2/ResolverActivityTest.java81
-rw-r--r--tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java63
-rw-r--r--tests/activity/src/com/android/intentresolver/v2/TestResolverActivityLogic.kt22
4 files changed, 46 insertions, 122 deletions
diff --git a/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java b/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java
index 05d397a2..81f6f5a6 100644
--- a/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java
+++ b/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java
@@ -49,9 +49,9 @@ import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
-import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.espresso.Espresso;
import androidx.test.espresso.NoMatchingViewException;
+import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
diff --git a/tests/activity/src/com/android/intentresolver/v2/ResolverActivityTest.java b/tests/activity/src/com/android/intentresolver/v2/ResolverActivityTest.java
index 21fe2904..220a12cc 100644
--- a/tests/activity/src/com/android/intentresolver/v2/ResolverActivityTest.java
+++ b/tests/activity/src/com/android/intentresolver/v2/ResolverActivityTest.java
@@ -25,6 +25,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.android.intentresolver.MatcherUtils.first;
import static com.android.intentresolver.v2.ResolverWrapperActivity.sOverrides;
@@ -55,16 +56,23 @@ import androidx.test.espresso.NoMatchingViewException;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
-import com.android.intentresolver.AnnotatedUserHandles;
import com.android.intentresolver.R;
import com.android.intentresolver.ResolvedComponentInfo;
import com.android.intentresolver.ResolverDataProvider;
+import com.android.intentresolver.inject.ApplicationUser;
+import com.android.intentresolver.inject.ProfileParent;
+import com.android.intentresolver.v2.data.repository.FakeUserRepository;
+import com.android.intentresolver.v2.data.repository.UserRepository;
+import com.android.intentresolver.v2.data.repository.UserRepositoryModule;
+import com.android.intentresolver.v2.shared.model.User;
import com.android.intentresolver.widget.ResolverDrawerLayout;
import com.google.android.collect.Lists;
+import dagger.hilt.android.testing.BindValue;
import dagger.hilt.android.testing.HiltAndroidRule;
import dagger.hilt.android.testing.HiltAndroidTest;
+import dagger.hilt.android.testing.UninstallModules;
import org.junit.Before;
import org.junit.Ignore;
@@ -81,19 +89,15 @@ import java.util.List;
*/
@RunWith(AndroidJUnit4.class)
@HiltAndroidTest
+@UninstallModules(UserRepositoryModule.class)
public class ResolverActivityTest {
- private static final UserHandle PERSONAL_USER_HANDLE = androidx.test.platform.app
- .InstrumentationRegistry.getInstrumentation().getTargetContext().getUser();
+ private static final UserHandle PERSONAL_USER_HANDLE =
+ getInstrumentation().getTargetContext().getUser();
private static final UserHandle WORK_PROFILE_USER_HANDLE = UserHandle.of(10);
private static final UserHandle CLONE_PROFILE_USER_HANDLE = UserHandle.of(11);
-
- protected Intent getConcreteIntentForLaunch(Intent clientIntent) {
- clientIntent.setClass(
- androidx.test.platform.app.InstrumentationRegistry.getInstrumentation().getTargetContext(),
- ResolverWrapperActivity.class);
- return clientIntent;
- }
+ private static final User WORK_PROFILE_USER =
+ new User(WORK_PROFILE_USER_HANDLE.getIdentifier(), User.Role.WORK);
@Rule(order = 0)
public HiltAndroidRule mHiltAndroidRule = new HiltAndroidRule(this);
@@ -106,14 +110,30 @@ public class ResolverActivityTest {
public void setup() {
// TODO: use the other form of `adoptShellPermissionIdentity()` where we explicitly list the
// permissions we require (which we'll read from the manifest at runtime).
- androidx.test.platform.app.InstrumentationRegistry
- .getInstrumentation()
+ getInstrumentation()
.getUiAutomation()
.adoptShellPermissionIdentity();
sOverrides.reset();
}
+ @BindValue
+ @ApplicationUser
+ public final UserHandle mApplicationUser = PERSONAL_USER_HANDLE;
+
+ @BindValue
+ @ProfileParent
+ public final UserHandle mProfileParent = PERSONAL_USER_HANDLE;
+
+ /** For setup of test state, a mutable reference of mUserRepository */
+ private final FakeUserRepository mFakeUserRepo =
+ new FakeUserRepository(List.of(
+ new User(PERSONAL_USER_HANDLE.getIdentifier(), User.Role.PERSONAL)
+ ));
+
+ @BindValue
+ public final UserRepository mUserRepository = mFakeUserRepo;
+
@Test
public void twoOptionsAndUserSelectsOne() throws InterruptedException {
Intent sendIntent = createSendImageIntent();
@@ -404,15 +424,14 @@ public class ResolverActivityTest {
@Test
public void testWorkTab_workTabUsesExpectedAdapter() {
+ markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
List<ResolvedComponentInfo> personalResolvedComponentInfos =
createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10,
PERSONAL_USER_HANDLE);
- markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4,
WORK_PROFILE_USER_HANDLE);
setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
Intent sendIntent = createSendImageIntent();
- markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent);
waitForIdle();
@@ -424,9 +443,9 @@ public class ResolverActivityTest {
@Test
public void testWorkTab_personalTabUsesExpectedAdapter() {
+ markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
List<ResolvedComponentInfo> personalResolvedComponentInfos =
createResolvedComponentsForTestWithOtherProfile(3, PERSONAL_USER_HANDLE);
- markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4,
WORK_PROFILE_USER_HANDLE);
setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
@@ -464,7 +483,8 @@ public class ResolverActivityTest {
public void testWorkTab_selectingWorkTabAppOpensAppInWorkProfile() throws InterruptedException {
markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
List<ResolvedComponentInfo> personalResolvedComponentInfos =
- createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10,
+ createResolvedComponentsForTestWithOtherProfile(3,
+ /* userId */ WORK_PROFILE_USER_HANDLE.getIdentifier(),
PERSONAL_USER_HANDLE);
List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4,
WORK_PROFILE_USER_HANDLE);
@@ -622,7 +642,7 @@ public class ResolverActivityTest {
PERSONAL_USER_HANDLE);
List<ResolvedComponentInfo> workResolvedComponentInfos =
createResolvedComponentsForTest(workProfileTargets, WORK_PROFILE_USER_HANDLE);
- sOverrides.isQuietModeEnabled = true;
+ mFakeUserRepo.updateState(WORK_PROFILE_USER, false);
setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
Intent sendIntent = createSendImageIntent();
sendIntent.setType("TestType");
@@ -670,7 +690,7 @@ public class ResolverActivityTest {
setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
Intent sendIntent = createSendImageIntent();
sendIntent.setType("TestType");
- sOverrides.isQuietModeEnabled = true;
+ mFakeUserRepo.updateState(WORK_PROFILE_USER, false);
sOverrides.hasCrossProfileIntents = false;
mActivityRule.launchActivity(sendIntent);
@@ -740,7 +760,7 @@ public class ResolverActivityTest {
setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
Intent sendIntent = createSendImageIntent();
sendIntent.setType("TestType");
- sOverrides.isQuietModeEnabled = true;
+ mFakeUserRepo.updateState(WORK_PROFILE_USER, false);
mActivityRule.launchActivity(sendIntent);
waitForIdle();
@@ -1068,18 +1088,14 @@ public class ResolverActivityTest {
}
private void markOtherProfileAvailability(boolean workAvailable, boolean cloneAvailable) {
- AnnotatedUserHandles.Builder handles = AnnotatedUserHandles.newBuilder();
- handles
- .setUserIdOfCallingApp(1234) // Must be non-negative.
- .setUserHandleSharesheetLaunchedAs(PERSONAL_USER_HANDLE)
- .setPersonalProfileUserHandle(PERSONAL_USER_HANDLE);
if (workAvailable) {
- handles.setWorkProfileUserHandle(WORK_PROFILE_USER_HANDLE);
+ mFakeUserRepo.addUser(
+ new User(WORK_PROFILE_USER_HANDLE.getIdentifier(), User.Role.WORK), true);
}
if (cloneAvailable) {
- handles.setCloneProfileUserHandle(CLONE_PROFILE_USER_HANDLE);
+ mFakeUserRepo.addUser(
+ new User(CLONE_PROFILE_USER_HANDLE.getIdentifier(), User.Role.CLONE), true);
}
- sOverrides.annotatedUserHandles = handles.build();
}
private void setupResolverControllers(
@@ -1095,21 +1111,14 @@ public class ResolverActivityTest {
Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.isA(List.class),
- eq(UserHandle.SYSTEM)))
- .thenReturn(new ArrayList<>(personalResolvedComponentInfos));
- when(sOverrides.workResolverListController.getResolversForIntentAsUser(
- Mockito.anyBoolean(),
- Mockito.anyBoolean(),
- Mockito.anyBoolean(),
- Mockito.isA(List.class),
- eq(UserHandle.SYSTEM)))
+ eq(PERSONAL_USER_HANDLE)))
.thenReturn(new ArrayList<>(personalResolvedComponentInfos));
when(sOverrides.workResolverListController.getResolversForIntentAsUser(
Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.isA(List.class),
- eq(UserHandle.of(10))))
+ eq(WORK_PROFILE_USER_HANDLE)))
.thenReturn(new ArrayList<>(workResolvedComponentInfos));
}
}
diff --git a/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java b/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java
index 2e29be11..e3d2edbb 100644
--- a/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java
+++ b/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java
@@ -24,7 +24,6 @@ import static org.mockito.Mockito.when;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -34,10 +33,8 @@ import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.test.espresso.idling.CountingIdlingResource;
-import com.android.intentresolver.AnnotatedUserHandles;
import com.android.intentresolver.ResolverListAdapter;
import com.android.intentresolver.ResolverListController;
-import com.android.intentresolver.WorkProfileAvailabilityManager;
import com.android.intentresolver.chooser.DisplayResolveInfo;
import com.android.intentresolver.chooser.SelectableTargetInfo;
import com.android.intentresolver.chooser.TargetInfo;
@@ -45,8 +42,6 @@ import com.android.intentresolver.emptystate.CrossProfileIntentsChecker;
import com.android.intentresolver.icons.LabelInfo;
import com.android.intentresolver.icons.TargetDataLoader;
-import kotlin.Unit;
-
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -60,19 +55,6 @@ public class ResolverWrapperActivity extends ResolverActivity {
private final CountingIdlingResource mLabelIdlingResource =
new CountingIdlingResource("LoadLabelTask");
- @Override
- protected final ResolverActivityLogic createActivityLogic() {
- return new TestResolverActivityLogic(
- "ResolverWrapper",
- this,
- () -> {
- onWorkProfileStatusUpdated();
- return Unit.INSTANCE;
- },
- sOverrides
- );
- }
-
public CountingIdlingResource getLabelIdlingResource() {
return mLabelIdlingResource;
}
@@ -154,12 +136,6 @@ public class ResolverWrapperActivity extends ResolverActivity {
super.startActivityAsUser(intent, options, user);
}
- @Override
- protected List<UserHandle> getResolverRankerServiceUserHandleListInternal(UserHandle
- userHandle) {
- return super.getResolverRankerServiceUserHandleListInternal(userHandle);
- }
-
/**
* We cannot directly mock the activity created since instrumentation creates it.
* <p>
@@ -167,58 +143,19 @@ public class ResolverWrapperActivity extends ResolverActivity {
*/
public static class OverrideData {
@SuppressWarnings("Since15")
- public Function<PackageManager, PackageManager> createPackageManager;
public Function<Pair<TargetInfo, UserHandle>, Boolean> onSafelyStartInternalCallback;
public ResolverListController resolverListController;
public ResolverListController workResolverListController;
public Boolean isVoiceInteraction;
- public AnnotatedUserHandles annotatedUserHandles;
- public Integer myUserId;
public boolean hasCrossProfileIntents;
- public boolean isQuietModeEnabled;
- public WorkProfileAvailabilityManager mWorkProfileAvailability;
public CrossProfileIntentsChecker mCrossProfileIntentsChecker;
public void reset() {
onSafelyStartInternalCallback = null;
isVoiceInteraction = null;
- createPackageManager = null;
resolverListController = mock(ResolverListController.class);
workResolverListController = mock(ResolverListController.class);
- annotatedUserHandles = AnnotatedUserHandles.newBuilder()
- .setUserIdOfCallingApp(1234) // Must be non-negative.
- .setUserHandleSharesheetLaunchedAs(UserHandle.SYSTEM)
- .setPersonalProfileUserHandle(UserHandle.SYSTEM)
- .build();
- myUserId = null;
hasCrossProfileIntents = true;
- isQuietModeEnabled = false;
-
- mWorkProfileAvailability = new WorkProfileAvailabilityManager(null, null, null) {
- @Override
- public boolean isQuietModeEnabled() {
- return isQuietModeEnabled;
- }
-
- @Override
- public boolean isWorkProfileUserUnlocked() {
- return true;
- }
-
- @Override
- public void requestQuietModeEnabled(boolean enabled) {
- isQuietModeEnabled = enabled;
- }
-
- @Override
- public void markWorkProfileEnabledBroadcastReceived() {}
-
- @Override
- public boolean isWaitingToEnableWorkProfile() {
- return false;
- }
- };
-
mCrossProfileIntentsChecker = mock(CrossProfileIntentsChecker.class);
when(mCrossProfileIntentsChecker.hasCrossProfileIntents(any(), anyInt(), anyInt()))
.thenAnswer(invocation -> hasCrossProfileIntents);
diff --git a/tests/activity/src/com/android/intentresolver/v2/TestResolverActivityLogic.kt b/tests/activity/src/com/android/intentresolver/v2/TestResolverActivityLogic.kt
deleted file mode 100644
index 6826f23d..00000000
--- a/tests/activity/src/com/android/intentresolver/v2/TestResolverActivityLogic.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.android.intentresolver.v2
-
-import androidx.activity.ComponentActivity
-import com.android.intentresolver.AnnotatedUserHandles
-import com.android.intentresolver.WorkProfileAvailabilityManager
-
-/** Activity logic for use when testing [ResolverActivity]. */
-class TestResolverActivityLogic(
- tag: String,
- activity: ComponentActivity,
- onWorkProfileStatusUpdated: () -> Unit,
- private val overrideData: ResolverWrapperActivity.OverrideData,
-) : ResolverActivityLogic(tag, activity, onWorkProfileStatusUpdated) {
-
- override val annotatedUserHandles: AnnotatedUserHandles? by lazy {
- overrideData.annotatedUserHandles
- }
-
- override val workProfileAvailabilityManager: WorkProfileAvailabilityManager by lazy {
- overrideData.mWorkProfileAvailability ?: super.workProfileAvailabilityManager
- }
-}