Return archived apps for AllAppListPage when "android.content.pm.archiving" flag is enabled
Test: AppListRepositoryTest
#AndroidArchiving
Bug: 304255511
Change-Id: Ic3f11cfe5979ad5e4bb1e0dc742a6923e14558b4
diff --git a/packages/SettingsLib/SpaPrivileged/Android.bp b/packages/SettingsLib/SpaPrivileged/Android.bp
index eaeda3c..009407a 100644
--- a/packages/SettingsLib/SpaPrivileged/Android.bp
+++ b/packages/SettingsLib/SpaPrivileged/Android.bp
@@ -38,6 +38,7 @@
static_libs: [
"androidx.compose.runtime_runtime",
"SpaPrivilegedLib",
+ "android.content.pm.flags-aconfig-java",
],
kotlincflags: ["-Xjvm-default=all"],
}
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt
index a428142..d95dd8c 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt
@@ -17,6 +17,8 @@
package com.android.settingslib.spaprivileged.model.app
import android.content.Context
+import android.content.pm.FeatureFlags
+import android.content.pm.FeatureFlagsImpl
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
@@ -65,10 +67,15 @@
AppListRepositoryImpl(context).getSystemPackageNamesBlocking(userId)
}
-class AppListRepositoryImpl(private val context: Context) : AppListRepository {
+class AppListRepositoryImpl(
+ private val context: Context,
+ private val featureFlags: FeatureFlags
+) : AppListRepository {
private val packageManager = context.packageManager
private val userManager = context.userManager
+ constructor(context: Context) : this(context, FeatureFlagsImpl())
+
override suspend fun loadApps(
userId: Int,
loadInstantApps: Boolean,
@@ -98,9 +105,13 @@
userId: Int,
matchAnyUserForAdmin: Boolean,
): List<ApplicationInfo> {
+ val disabledComponentsFlag = (PackageManager.MATCH_DISABLED_COMPONENTS or
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS).toLong()
+ val archivedPackagesFlag: Long = if (featureFlags.archiving())
+ PackageManager.MATCH_ARCHIVED_PACKAGES else 0L
val regularFlags = ApplicationInfoFlags.of(
- (PackageManager.MATCH_DISABLED_COMPONENTS or
- PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS).toLong()
+ disabledComponentsFlag or
+ archivedPackagesFlag
)
return if (!matchAnyUserForAdmin || !userManager.getUserInfo(userId).isAdmin) {
packageManager.getInstalledApplicationsAsUser(regularFlags, userId)
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
index 517f67e..840bca8 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
@@ -47,6 +47,8 @@
import org.mockito.kotlin.eq
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
+import android.content.pm.FakeFeatureFlagsImpl
+import android.content.pm.Flags
@RunWith(AndroidJUnit4::class)
class AppListRepositoryTest {
@@ -268,6 +270,40 @@
}
@Test
+ fun loadApps_archivedAppsEnabled() = runTest {
+ val fakeFlags = FakeFeatureFlagsImpl()
+ fakeFlags.setFlag(Flags.FLAG_ARCHIVING, true)
+ mockInstalledApplications(listOf(NORMAL_APP, ARCHIVED_APP), ADMIN_USER_ID)
+ val repository = AppListRepositoryImpl(context, fakeFlags)
+ val appList = repository.loadApps(userId = ADMIN_USER_ID)
+
+ assertThat(appList).containsExactly(NORMAL_APP, ARCHIVED_APP)
+ argumentCaptor<ApplicationInfoFlags> {
+ verify(packageManager).getInstalledApplicationsAsUser(capture(), eq(ADMIN_USER_ID))
+ assertThat(firstValue.value).isEqualTo(
+ (PackageManager.MATCH_DISABLED_COMPONENTS or
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS).toLong() or
+ PackageManager.MATCH_ARCHIVED_PACKAGES
+ )
+ }
+ }
+
+ @Test
+ fun loadApps_archivedAppsDisabled() = runTest {
+ mockInstalledApplications(listOf(NORMAL_APP), ADMIN_USER_ID)
+ val appList = repository.loadApps(userId = ADMIN_USER_ID)
+
+ assertThat(appList).containsExactly(NORMAL_APP)
+ argumentCaptor<ApplicationInfoFlags> {
+ verify(packageManager).getInstalledApplicationsAsUser(capture(), eq(ADMIN_USER_ID))
+ assertThat(firstValue.value).isEqualTo(
+ PackageManager.MATCH_DISABLED_COMPONENTS or
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
+ )
+ }
+ }
+
+ @Test
fun showSystemPredicate_showSystem() = runTest {
val app = SYSTEM_APP
@@ -391,6 +427,12 @@
flags = ApplicationInfo.FLAG_SYSTEM
}
+ val ARCHIVED_APP = ApplicationInfo().apply {
+ packageName = "archived.app"
+ flags = ApplicationInfo.FLAG_SYSTEM
+ isArchived = true
+ }
+
fun resolveInfoOf(packageName: String) = ResolveInfo().apply {
activityInfo = ActivityInfo().apply {
this.packageName = packageName