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

Commit 9611828d authored by Mark Kim's avatar Mark Kim Committed by Android (Google) Code Review
Browse files

Merge "Return archived apps for AllAppListPage when...

Merge "Return archived apps for AllAppListPage when "android.content.pm.archiving" flag is enabled" into main
parents fda1f883 ee23881b
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