Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee23881b authored by Mark Kim's avatar Mark Kim
Browse files

Return archived apps for AllAppListPage when "android.content.pm.archiving" flag is enabled

Test: AppListRepositoryTest

#AndroidArchiving

Bug: 304255511
Change-Id: Ic3f11cfe5979ad5e4bb1e0dc742a6923e14558b4
parent 41628630
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ java_defaults {
    static_libs: [
        "androidx.compose.runtime_runtime",
        "SpaPrivilegedLib",
        "android.content.pm.flags-aconfig-java",
    ],
    kotlincflags: ["-Xjvm-default=all"],
}
+14 −3
Original line number Diff line number Diff line
@@ -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 @@ object AppListRepositoryUtil {
        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 @@ class AppListRepositoryImpl(private val context: Context) : AppListRepository {
        userId: Int,
        matchAnyUserForAdmin: Boolean,
    ): List<ApplicationInfo> {
        val regularFlags = ApplicationInfoFlags.of(
            (PackageManager.MATCH_DISABLED_COMPONENTS or
        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(
            disabledComponentsFlag or
                archivedPackagesFlag
        )
        return if (!matchAnyUserForAdmin || !userManager.getUserInfo(userId).isAdmin) {
            packageManager.getInstalledApplicationsAsUser(regularFlags, userId)
+42 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ import org.mockito.kotlin.argumentCaptor
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 {
@@ -267,6 +269,40 @@ class AppListRepositoryTest {
        assertThat(appList).isEmpty()
    }

    @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 @@ class AppListRepositoryTest {
            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