Load work apps in RecentAppStatsMixin

This change will show work apps and personal apps together in the
recent apps settings page, sorted by decreasing last usage time.

Test: see both work and personal apps in the recent apps page in the
correct order.
Fix: 146921442

Change-Id: I174a556010529bc39c085cc006722bc2947535bd
This commit is contained in:
Liahav Eitan
2022-05-20 11:53:11 +00:00
parent 7cebb74e17
commit 82e81e23e0
4 changed files with 214 additions and 65 deletions

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -53,6 +54,7 @@ import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@RunWith(RobolectricTestRunner.class)
public class RecentAppStatsMixinTest {
@@ -60,6 +62,8 @@ public class RecentAppStatsMixinTest {
@Mock
private UsageStatsManager mUsageStatsManager;
@Mock
private UsageStatsManager mWorkUsageStatsManager;
@Mock
private UserManager mUserManager;
@Mock
private ApplicationsState mAppState;
@@ -87,6 +91,8 @@ public class RecentAppStatsMixinTest {
when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
mRecentAppStatsMixin = new RecentAppStatsMixin(context, 3 /* maximumApps */);
ReflectionHelpers.setField(mRecentAppStatsMixin, "mWorkUsageStatsManager",
Optional.of(mWorkUsageStatsManager));
}
@Test
@@ -99,7 +105,7 @@ public class RecentAppStatsMixinTest {
// stat1 is valid app.
when(mAppState.getEntry(stat1.mPackageName, UserHandle.myUserId()))
.thenReturn(mAppEntry);
when(mPackageManager.resolveActivity(any(Intent.class), anyInt()))
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(stats);
@@ -134,7 +140,7 @@ public class RecentAppStatsMixinTest {
.thenReturn(mAppEntry);
when(mAppState.getEntry(stat3.mPackageName, UserHandle.myUserId()))
.thenReturn(mAppEntry);
when(mPackageManager.resolveActivity(any(Intent.class), anyInt()))
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(stats);
@@ -170,7 +176,7 @@ public class RecentAppStatsMixinTest {
.thenReturn(mAppEntry);
when(mAppState.getEntry(stat3.mPackageName, UserHandle.myUserId()))
.thenReturn(null);
when(mPackageManager.resolveActivity(any(Intent.class), anyInt()))
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(stats);
@@ -272,7 +278,7 @@ public class RecentAppStatsMixinTest {
when(mPackageManager.getInstalledModules(anyInt() /* flags */))
.thenReturn(modules);
when(mPackageManager.resolveActivity(any(Intent.class), anyInt()))
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(stats);
@@ -296,7 +302,7 @@ public class RecentAppStatsMixinTest {
// stat1, stat2 are valid apps. stat3 is invalid.
when(mAppState.getEntry(stat1.mPackageName, UserHandle.myUserId()))
.thenReturn(mAppEntry);
when(mPackageManager.resolveActivity(any(Intent.class), anyInt()))
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(stats);
@@ -306,4 +312,97 @@ public class RecentAppStatsMixinTest {
assertThat(mRecentAppStatsMixin.mRecentApps).isEmpty();
}
@Test
public void loadDisplayableRecentApps_usePersonalAndWorkApps_shouldBeSortedByLastTimeUse() {
final List<UsageStats> personalStats = new ArrayList<>();
final UsageStats stats1 = new UsageStats();
final UsageStats stats2 = new UsageStats();
stats1.mLastTimeUsed = System.currentTimeMillis();
stats1.mPackageName = "personal.pkg.class";
personalStats.add(stats1);
stats2.mLastTimeUsed = System.currentTimeMillis() - 5000;
stats2.mPackageName = "personal.pkg.class2";
personalStats.add(stats2);
final List<UsageStats> workStats = new ArrayList<>();
final UsageStats stat3 = new UsageStats();
stat3.mLastTimeUsed = System.currentTimeMillis() - 2000;
stat3.mPackageName = "work.pkg.class3";
workStats.add(stat3);
when(mAppState.getEntry(anyString(), anyInt()))
.thenReturn(mAppEntry);
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
// personal app stats
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(personalStats);
// work app stats
when(mWorkUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(workStats);
mAppEntry.info = mApplicationInfo;
mRecentAppStatsMixin.loadDisplayableRecentApps(3);
assertThat(mRecentAppStatsMixin.mRecentApps.size()).isEqualTo(3);
assertThat(mRecentAppStatsMixin.mRecentApps.get(0).mUsageStats.mPackageName).isEqualTo(
"personal.pkg.class");
assertThat(mRecentAppStatsMixin.mRecentApps.get(1).mUsageStats.mPackageName).isEqualTo(
"work.pkg.class3");
assertThat(mRecentAppStatsMixin.mRecentApps.get(2).mUsageStats.mPackageName).isEqualTo(
"personal.pkg.class2");
}
@Test
public void loadDisplayableRecentApps_usePersonalAndWorkApps_shouldBeUniquePerProfile() {
final String firstAppPackageName = "app1.pkg.class";
final String secondAppPackageName = "app2.pkg.class";
final List<UsageStats> personalStats = new ArrayList<>();
final UsageStats personalStatsFirstApp = new UsageStats();
final UsageStats personalStatsFirstAppOlderUse = new UsageStats();
final UsageStats personalStatsSecondApp = new UsageStats();
personalStatsFirstApp.mLastTimeUsed = System.currentTimeMillis();
personalStatsFirstApp.mPackageName = firstAppPackageName;
personalStats.add(personalStatsFirstApp);
personalStatsFirstAppOlderUse.mLastTimeUsed = System.currentTimeMillis() - 5000;
personalStatsFirstAppOlderUse.mPackageName = firstAppPackageName;
personalStats.add(personalStatsFirstAppOlderUse);
personalStatsSecondApp.mLastTimeUsed = System.currentTimeMillis() - 2000;
personalStatsSecondApp.mPackageName = secondAppPackageName;
personalStats.add(personalStatsSecondApp);
final List<UsageStats> workStats = new ArrayList<>();
final UsageStats workStatsSecondApp = new UsageStats();
workStatsSecondApp.mLastTimeUsed = System.currentTimeMillis() - 1000;
workStatsSecondApp.mPackageName = secondAppPackageName;
workStats.add(workStatsSecondApp);
when(mAppState.getEntry(anyString(), anyInt()))
.thenReturn(mAppEntry);
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(new ResolveInfo());
// personal app stats
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(personalStats);
// work app stats
when(mWorkUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(workStats);
mAppEntry.info = mApplicationInfo;
mRecentAppStatsMixin.loadDisplayableRecentApps(3);
// The output should have the first app once since the duplicate use in the personal profile
// is filtered out, and the second app twice - once for each profile.
assertThat(mRecentAppStatsMixin.mRecentApps.size()).isEqualTo(3);
assertThat(mRecentAppStatsMixin.mRecentApps.get(0).mUsageStats.mPackageName).isEqualTo(
firstAppPackageName);
assertThat(mRecentAppStatsMixin.mRecentApps.get(1).mUsageStats.mPackageName).isEqualTo(
secondAppPackageName);
assertThat(mRecentAppStatsMixin.mRecentApps.get(2).mUsageStats.mPackageName).isEqualTo(
secondAppPackageName);
}
}