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 2b38b4cefe3ee..8e0cf894bb28d 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 @@ -34,11 +34,11 @@ import kotlinx.coroutines.runBlocking /** * The repository to load the App List data. */ -internal interface AppListRepository { +interface AppListRepository { /** Loads the list of [ApplicationInfo]. */ suspend fun loadApps( userId: Int, - showInstantApps: Boolean = false, + loadInstantApps: Boolean = false, matchAnyUserForAdmin: Boolean = false, ): List @@ -50,6 +50,9 @@ internal interface AppListRepository { /** Gets the system app package names. */ fun getSystemPackageNamesBlocking(userId: Int): Set + + /** Loads the list of [ApplicationInfo], and filter base on `isSystemApp`. */ + suspend fun loadAndFilterApps(userId: Int, isSystemApp: Boolean): List } /** @@ -62,13 +65,13 @@ object AppListRepositoryUtil { AppListRepositoryImpl(context).getSystemPackageNamesBlocking(userId) } -internal class AppListRepositoryImpl(private val context: Context) : AppListRepository { +class AppListRepositoryImpl(private val context: Context) : AppListRepository { private val packageManager = context.packageManager private val userManager = context.userManager override suspend fun loadApps( userId: Int, - showInstantApps: Boolean, + loadInstantApps: Boolean, matchAnyUserForAdmin: Boolean, ): List = coroutineScope { val hiddenSystemModulesDeferred = async { @@ -86,7 +89,7 @@ internal class AppListRepositoryImpl(private val context: Context) : AppListRepo val hiddenSystemModules = hiddenSystemModulesDeferred.await() val hideWhenDisabledPackages = hideWhenDisabledPackagesDeferred.await() installedApplicationsAsUser.filter { app -> - app.isInAppList(showInstantApps, hiddenSystemModules, hideWhenDisabledPackages) + app.isInAppList(loadInstantApps, hiddenSystemModules, hideWhenDisabledPackages) } } @@ -136,17 +139,17 @@ internal class AppListRepositoryImpl(private val context: Context) : AppListRepo ): Flow<(app: ApplicationInfo) -> Boolean> = userIdFlow.combine(showSystemFlow, ::showSystemPredicate) - override fun getSystemPackageNamesBlocking(userId: Int) = - runBlocking { getSystemPackageNames(userId) } + override fun getSystemPackageNamesBlocking(userId: Int) = runBlocking { + loadAndFilterApps(userId = userId, isSystemApp = true).map { it.packageName }.toSet() + } - private suspend fun getSystemPackageNames(userId: Int): Set = - coroutineScope { - val loadAppsDeferred = async { loadApps(userId) } - val homeOrLauncherPackages = loadHomeOrLauncherPackages(userId) - val showSystemPredicate = - { app: ApplicationInfo -> isSystemApp(app, homeOrLauncherPackages) } - loadAppsDeferred.await().filter(showSystemPredicate).map { it.packageName }.toSet() + override suspend fun loadAndFilterApps(userId: Int, isSystemApp: Boolean) = coroutineScope { + val loadAppsDeferred = async { loadApps(userId) } + val homeOrLauncherPackages = loadHomeOrLauncherPackages(userId) + loadAppsDeferred.await().filter { app -> + isSystemApp(app, homeOrLauncherPackages) == isSystemApp } + } private suspend fun showSystemPredicate( userId: Int, 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 302f780816263..375ed60e17cf6 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 @@ -108,7 +108,7 @@ class AppListRepositoryTest { val appList = repository.loadApps( userId = ADMIN_USER_ID, - showInstantApps = false, + loadInstantApps = false, ) assertThat(appList).containsExactly(NORMAL_APP) @@ -120,7 +120,7 @@ class AppListRepositoryTest { val appList = repository.loadApps( userId = ADMIN_USER_ID, - showInstantApps = true, + loadInstantApps = true, ) assertThat(appList).containsExactly(NORMAL_APP, INSTANT_APP) @@ -325,6 +325,21 @@ class AppListRepositoryTest { assertThat(systemPackageNames).containsExactly(SYSTEM_APP.packageName) } + @Test + fun loadAndFilterApps_loadNonSystemApp_returnExpectedValues() = runTest { + mockInstalledApplications( + apps = listOf( + NORMAL_APP, INSTANT_APP, SYSTEM_APP, UPDATED_SYSTEM_APP, HOME_APP, IN_LAUNCHER_APP + ), + userId = ADMIN_USER_ID, + ) + + val appList = repository.loadAndFilterApps(userId = ADMIN_USER_ID, isSystemApp = false) + + assertThat(appList) + .containsExactly(NORMAL_APP, UPDATED_SYSTEM_APP, HOME_APP, IN_LAUNCHER_APP) + } + private suspend fun getShowSystemPredicate(showSystem: Boolean) = repository.showSystemPredicate( userIdFlow = flowOf(ADMIN_USER_ID), diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListViewModelTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListViewModelTest.kt index 6889e5d21ac09..9b224976e080d 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListViewModelTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListViewModelTest.kt @@ -87,7 +87,7 @@ class AppListViewModelTest { private object FakeAppListRepository : AppListRepository { override suspend fun loadApps( userId: Int, - showInstantApps: Boolean, + loadInstantApps: Boolean, matchAnyUserForAdmin: Boolean, ) = listOf(APP) @@ -97,6 +97,9 @@ class AppListViewModelTest { ): Flow<(app: ApplicationInfo) -> Boolean> = flowOf { true } override fun getSystemPackageNamesBlocking(userId: Int): Set = emptySet() + + override suspend fun loadAndFilterApps(userId: Int, isSystemApp: Boolean) = + emptyList() } private object FakeAppRepository : AppRepository {