summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alyssa Ketpreechasawat <kalyssa@google.com> 2024-10-04 16:20:34 +0000
committer Alyssa Ketpreechasawat <kalyssa@google.com> 2025-01-07 19:30:54 -0800
commitd97ff4ed7055830e7a05eeeaa242eaa53b4205b8 (patch)
tree75c126bb2d7c3de8b2b0294e2a3eb25a1f4b6899
parenta8eeebd555902c67347508a22552c29fff062b09 (diff)
Remove ModuleInfo#isHidden Usage from the source code.
ModuleInfo#isHidden is used for getting hidden module status from ModuleMetadata package (Mainline). It was set to hide Mainline modules' Apk to show in the Settings UI and this has caused the issue as it disallowed the user to toggle permissions where it was needed. Thus, we decided to deprecate the usage of ModuleInfo#isHidden (see go/aml-hidden-modules-permissions). Bug: 379056868 Test: unittest Test: check behavior before/after enable flags Flag: android.content.pm.remove_hidden_module_usage Change-Id: Ib7710551559552ecf337493e6dbc2aab566105c9
-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 0286f7b0b73d..6af85c95b39c 100644
--- a/services/core/java/com/android/server/BinaryTransparencyService.java
+++ b/services/core/java/com/android/server/BinaryTransparencyService.java
@@ -707,8 +707,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,