summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alyssa Ketpreechasawat <kalyssa@google.com> 2025-01-08 15:34:15 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-08 15:34:15 -0800
commitf4b8122034bd18280c773c74b9a962e7485a56b8 (patch)
tree373bead0728dbd262aa74038c5c75b0045302de0
parent62f7843b5ba77e6fc84922e0607da88e8a15f09d (diff)
parentd97ff4ed7055830e7a05eeeaa242eaa53b4205b8 (diff)
Merge "Remove ModuleInfo#isHidden Usage from the source code." into main
-rw-r--r--packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt6
-rw-r--r--packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt20
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java1
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java21
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java20
-rw-r--r--services/core/java/com/android/server/BinaryTransparencyService.java6
6 files changed, 62 insertions, 12 deletions
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 e1e1ee5a8feb..78d6c31ac783 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
@@ -88,6 +88,7 @@ class AppListRepositoryImpl(
matchAnyUserForAdmin: Boolean,
): List<ApplicationInfo> = try {
coroutineScope {
+ // TODO(b/382016780): to be removed after flag cleanup.
val hiddenSystemModulesDeferred = async { packageManager.getHiddenSystemModules() }
val hideWhenDisabledPackagesDeferred = async {
context.resources.getStringArray(R.array.config_hideWhenDisabled_packageNames)
@@ -95,6 +96,7 @@ class AppListRepositoryImpl(
val installedApplicationsAsUser =
getInstalledApplications(userId, matchAnyUserForAdmin)
+ // TODO(b/382016780): to be removed after flag cleanup.
val hiddenSystemModules = hiddenSystemModulesDeferred.await()
val hideWhenDisabledPackages = hideWhenDisabledPackagesDeferred.await()
installedApplicationsAsUser.filter { app ->
@@ -206,6 +208,7 @@ class AppListRepositoryImpl(
private fun isSystemApp(app: ApplicationInfo, homeOrLauncherPackages: Set<String>): Boolean =
app.isSystemApp && !app.isUpdatedSystemApp && app.packageName !in homeOrLauncherPackages
+ // TODO(b/382016780): to be removed after flag cleanup.
private fun PackageManager.getHiddenSystemModules(): Set<String> {
val moduleInfos = getInstalledModules(0).filter { it.isHidden }
val hiddenApps = moduleInfos.mapNotNull { it.packageName }.toMutableSet()
@@ -218,13 +221,14 @@ class AppListRepositoryImpl(
companion object {
private const val TAG = "AppListRepository"
+ // TODO(b/382016780): to be removed after flag cleanup.
private fun ApplicationInfo.isInAppList(
showInstantApps: Boolean,
hiddenSystemModules: Set<String>,
hideWhenDisabledPackages: Array<String>,
) = when {
!showInstantApps && isInstantApp -> false
- packageName in hiddenSystemModules -> false
+ !Flags.removeHiddenModuleUsage() && (packageName in hiddenSystemModules) -> false
packageName in hideWhenDisabledPackages -> enabled && !isDisabledUntilUsed
enabled -> true
else -> enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
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 b1baa8601f28..fd4b189c51ff 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
@@ -281,6 +281,23 @@ class AppListRepositoryTest {
)
}
+ @EnableFlags(Flags.FLAG_REMOVE_HIDDEN_MODULE_USAGE)
+ @Test
+ fun loadApps_shouldIncludeAllSystemModuleApps() = runTest {
+ packageManager.stub {
+ on { getInstalledModules(any()) } doReturn listOf(HIDDEN_MODULE)
+ }
+ mockInstalledApplications(
+ listOf(NORMAL_APP, HIDDEN_APEX_APP, HIDDEN_MODULE_APP),
+ ADMIN_USER_ID
+ )
+
+ val appList = repository.loadApps(userId = ADMIN_USER_ID)
+
+ assertThat(appList).containsExactly(NORMAL_APP, HIDDEN_APEX_APP, HIDDEN_MODULE_APP)
+ }
+
+ @DisableFlags(Flags.FLAG_REMOVE_HIDDEN_MODULE_USAGE)
@EnableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX)
@Test
fun loadApps_hasApkInApexInfo_shouldNotIncludeAllHiddenApps() = runTest {
@@ -297,7 +314,7 @@ class AppListRepositoryTest {
assertThat(appList).containsExactly(NORMAL_APP)
}
- @DisableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX)
+ @DisableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX, Flags.FLAG_REMOVE_HIDDEN_MODULE_USAGE)
@Test
fun loadApps_noApkInApexInfo_shouldNotIncludeHiddenSystemModule() = runTest {
packageManager.stub {
@@ -456,6 +473,7 @@ class AppListRepositoryTest {
isArchived = true
}
+ // TODO(b/382016780): to be removed after flag cleanup.
val HIDDEN_APEX_APP = ApplicationInfo().apply {
packageName = "hidden.apex.package"
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
index c4829951d61a..3390296ef6fc 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
@@ -137,6 +137,7 @@ public class AppUtils {
/**
* Returns a boolean indicating whether the given package is a hidden system module
+ * TODO(b/382016780): to be removed after flag cleanup.
*/
public static boolean isHiddenSystemModule(Context context, String packageName) {
return ApplicationsState.getInstance((Application) context.getApplicationContext())
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index fd9a008ee078..4110d536da61 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -157,6 +157,7 @@ public class ApplicationsState {
int mCurComputingSizeUserId;
boolean mSessionsChanged;
// Maps all installed modules on the system to whether they're hidden or not.
+ // TODO(b/382016780): to be removed after flag cleanup.
final HashMap<String, Boolean> mSystemModules = new HashMap<>();
// Temporary for dispatching session callbacks. Only touched by main thread.
@@ -226,12 +227,14 @@ public class ApplicationsState {
mRetrieveFlags = PackageManager.MATCH_DISABLED_COMPONENTS |
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
- final List<ModuleInfo> moduleInfos = mPm.getInstalledModules(0 /* flags */);
- for (ModuleInfo info : moduleInfos) {
- mSystemModules.put(info.getPackageName(), info.isHidden());
- if (Flags.provideInfoOfApkInApex()) {
- for (String apkInApexPackageName : info.getApkInApexPackageNames()) {
- mSystemModules.put(apkInApexPackageName, info.isHidden());
+ if (!Flags.removeHiddenModuleUsage()) {
+ final List<ModuleInfo> moduleInfos = mPm.getInstalledModules(0 /* flags */);
+ for (ModuleInfo info : moduleInfos) {
+ mSystemModules.put(info.getPackageName(), info.isHidden());
+ if (Flags.provideInfoOfApkInApex()) {
+ for (String apkInApexPackageName : info.getApkInApexPackageNames()) {
+ mSystemModules.put(apkInApexPackageName, info.isHidden());
+ }
}
}
}
@@ -336,7 +339,7 @@ public class ApplicationsState {
}
mHaveDisabledApps = true;
}
- if (isHiddenModule(info.packageName)) {
+ if (!Flags.removeHiddenModuleUsage() && isHiddenModule(info.packageName)) {
mApplications.remove(i--);
continue;
}
@@ -453,6 +456,7 @@ public class ApplicationsState {
return mHaveInstantApps;
}
+ // TODO(b/382016780): to be removed after flag cleanup.
boolean isHiddenModule(String packageName) {
Boolean isHidden = mSystemModules.get(packageName);
if (isHidden == null) {
@@ -462,6 +466,7 @@ public class ApplicationsState {
return isHidden;
}
+ // TODO(b/382016780): to be removed after flag cleanup.
boolean isSystemModule(String packageName) {
return mSystemModules.containsKey(packageName);
}
@@ -755,7 +760,7 @@ public class ApplicationsState {
Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry);
}
if (entry == null) {
- if (isHiddenModule(info.packageName)) {
+ if (!Flags.removeHiddenModuleUsage() && isHiddenModule(info.packageName)) {
if (DEBUG) {
Log.i(TAG, "No AppEntry for " + info.packageName + " (hidden module)");
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
index 3b18aa310c91..4e821ca50dce 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
@@ -16,6 +16,7 @@
package com.android.settingslib.applications;
+import static android.content.pm.Flags.FLAG_REMOVE_HIDDEN_MODULE_USAGE;
import static android.content.pm.Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX;
import static android.os.UserHandle.MU_ENABLED;
import static android.os.UserHandle.USER_SYSTEM;
@@ -59,6 +60,8 @@ import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.text.TextUtils;
import android.util.IconDrawableFactory;
@@ -204,6 +207,7 @@ public class ApplicationsStateRoboTest {
info.setPackageName(packageName);
info.setApkInApexPackageNames(Collections.singletonList(apexPackageName));
// will treat any app with package name that contains "hidden" as hidden module
+ // TODO(b/382016780): to be removed after flag cleanup.
info.setHidden(!TextUtils.isEmpty(packageName) && packageName.contains("hidden"));
return info;
}
@@ -414,6 +418,7 @@ public class ApplicationsStateRoboTest {
}
@Test
+ @DisableFlags({FLAG_REMOVE_HIDDEN_MODULE_USAGE})
public void onResume_shouldNotIncludeSystemHiddenModule() {
mSession.onResume();
@@ -424,6 +429,18 @@ public class ApplicationsStateRoboTest {
}
@Test
+ @EnableFlags({FLAG_REMOVE_HIDDEN_MODULE_USAGE})
+ public void onResume_shouldIncludeSystemModule() {
+ mSession.onResume();
+
+ final List<ApplicationInfo> mApplications = mApplicationsState.mApplications;
+ assertThat(mApplications).hasSize(3);
+ assertThat(mApplications.get(0).packageName).isEqualTo("test.package.1");
+ assertThat(mApplications.get(1).packageName).isEqualTo("test.hidden.module.2");
+ assertThat(mApplications.get(2).packageName).isEqualTo("test.package.3");
+ }
+
+ @Test
public void removeAndInstall_noWorkprofile_doResumeIfNeededLocked_shouldClearEntries()
throws RemoteException {
// scenario: only owner user
@@ -832,6 +849,7 @@ public class ApplicationsStateRoboTest {
mApplicationsState.mEntriesMap.clear();
ApplicationInfo appInfo = createApplicationInfo(PKG_1, /* uid= */ 0);
mApplicationsState.mApplications.add(appInfo);
+ // TODO(b/382016780): to be removed after flag cleanup.
mApplicationsState.mSystemModules.put(PKG_1, /* value= */ false);
assertThat(mApplicationsState.getEntry(PKG_1, /* userId= */ 0).info.packageName)
@@ -839,6 +857,7 @@ public class ApplicationsStateRoboTest {
}
@Test
+ @DisableFlags({FLAG_REMOVE_HIDDEN_MODULE_USAGE})
public void isHiddenModule_hasApkInApexInfo_shouldSupportHiddenApexPackage() {
mSetFlagsRule.enableFlags(FLAG_PROVIDE_INFO_OF_APK_IN_APEX);
ApplicationsState.sInstance = null;
@@ -853,6 +872,7 @@ public class ApplicationsStateRoboTest {
}
@Test
+ @DisableFlags({FLAG_REMOVE_HIDDEN_MODULE_USAGE})
public void isHiddenModule_noApkInApexInfo_onlySupportHiddenModule() {
mSetFlagsRule.disableFlags(FLAG_PROVIDE_INFO_OF_APK_IN_APEX);
ApplicationsState.sInstance = null;
diff --git a/services/core/java/com/android/server/BinaryTransparencyService.java b/services/core/java/com/android/server/BinaryTransparencyService.java
index 31f6ef9fc062..1d914c89c570 100644
--- a/services/core/java/com/android/server/BinaryTransparencyService.java
+++ b/services/core/java/com/android/server/BinaryTransparencyService.java
@@ -729,8 +729,10 @@ public class BinaryTransparencyService extends SystemService {
private void printModuleDetails(ModuleInfo moduleInfo, final PrintWriter pw) {
pw.println("--- Module Details ---");
pw.println("Module name: " + moduleInfo.getName());
- pw.println("Module visibility: "
- + (moduleInfo.isHidden() ? "hidden" : "visible"));
+ if (!android.content.pm.Flags.removeHiddenModuleUsage()) {
+ pw.println("Module visibility: "
+ + (moduleInfo.isHidden() ? "hidden" : "visible"));
+ }
}
private void printAppDetails(PackageInfo packageInfo,