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
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
index 42afb69..c4ff719 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 @@
             .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 5eaa163..f9df5a3 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 @@
     String mCurComputingSizePkg;
     int mCurComputingSizeUserId;
     boolean mSessionsChanged;
-    final HashSet<String> mHiddenModules = new HashSet<>();
+    // Maps all installed modules on the system to whether they're hidden or not.
+    final HashMap<String, Boolean> mSystemModules = new HashMap<>();
 
     // Temporary for dispatching session callbacks.  Only touched by main thread.
     final ArrayList<WeakReference<Session>> mActiveSessions = new ArrayList<>();
@@ -212,9 +213,7 @@
 
         final List<ModuleInfo> 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 @@
     }
 
     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 @@
             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) {