From 97e6c3afb00c04d3c5708c3b1f88e84bb137e160 Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Wed, 15 May 2019 17:15:18 +0100 Subject: [PATCH] SettingsLib: Add an API method to query whether a package is a system module. Modules may not necessarily be hidden, but we would still like to prevent them from being disabled as they may contain critical system functionality. Bug: 131927465 Test: atest ApplicationsStateTest Change-Id: I38995ecce7f517642c51a1145b1fd294638cb786 --- .../settingslib/applications/AppUtils.java | 8 +++++++ .../applications/ApplicationsState.java | 23 ++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java index 42afb69a27f48..c4ff71940d200 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java @@ -132,4 +132,12 @@ public class AppUtils { .isHiddenModule(packageName); } + /** + * Returns a boolean indicating whether a given package is a system module. + */ + public static boolean isSystemModule(Context context, String packageName) { + return ApplicationsState.getInstance((Application) context.getApplicationContext()) + .isSystemModule(packageName); + } + } diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index 5eaa163db6395..f9df5a3eef28d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -139,7 +139,8 @@ public class ApplicationsState { String mCurComputingSizePkg; int mCurComputingSizeUserId; boolean mSessionsChanged; - final HashSet mHiddenModules = new HashSet<>(); + // Maps all installed modules on the system to whether they're hidden or not. + final HashMap mSystemModules = new HashMap<>(); // Temporary for dispatching session callbacks. Only touched by main thread. final ArrayList> mActiveSessions = new ArrayList<>(); @@ -212,9 +213,7 @@ public class ApplicationsState { final List moduleInfos = mPm.getInstalledModules(0 /* flags */); for (ModuleInfo info : moduleInfos) { - if (info.isHidden()) { - mHiddenModules.add(info.getPackageName()); - } + mSystemModules.put(info.getPackageName(), info.isHidden()); } /** @@ -426,7 +425,16 @@ public class ApplicationsState { } boolean isHiddenModule(String packageName) { - return mHiddenModules.contains(packageName); + Boolean isHidden = mSystemModules.get(packageName); + if (isHidden == null) { + return false; + } + + return isHidden; + } + + boolean isSystemModule(String packageName) { + return mSystemModules.containsKey(packageName); } void doPauseIfNeededLocked() { @@ -688,7 +696,10 @@ public class ApplicationsState { Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry); } if (entry == null) { - if (mHiddenModules.contains(info.packageName)) { + if (isHiddenModule(info.packageName)) { + if (DEBUG) { + Log.i(TAG, "No AppEntry for " + info.packageName + " (hidden module)"); + } return null; } if (DEBUG) {