Add mechanism for determining if apps are system apps

This is being added to help identify system apps so that
the UI can filter on that type.

BUG: 24955055
Change-Id: I8d843bae2d81329009c8cda8c25355d08ab9d1d7
diff --git a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
index 3604cd7..810ae8e 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
@@ -69,11 +69,14 @@
 
             List<String> appsList = new ArrayList<>();
             List<CharSequence> appLabelsList = new ArrayList<>();
-            if (getAppsWithRuntimePermissions(context, appsList, appLabelsList)) {
+            List<Boolean> isSystemAppList = new ArrayList<>();
+            if (getAppsWithRuntimePermissions(context, appsList, appLabelsList, isSystemAppList)) {
                 responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LIST_RESULT,
                         appsList.toArray(new String[appsList.size()]));
                 responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT,
                         appLabelsList.toArray(new String[appLabelsList.size()]));
+                responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT,
+                        toPrimitiveBoolArray(isSystemAppList));
             }
             context.sendBroadcast(responseIntent);
         }
@@ -122,13 +125,14 @@
     }
 
     public boolean getAppsWithRuntimePermissions(Context context, List<String> appsList,
-            List<CharSequence> appLabelsList) {
+            List<CharSequence> appLabelsList, List<Boolean> isSystemAppList) {
         final List<ApplicationInfo> appInfos = Utils.getAllInstalledApplications(context);
         if (appInfos == null) {
             return false;
         }
         final int appInfosSize = appInfos.size();
         try {
+            ArraySet<String> launcherPackages = Utils.getLauncherPackages(context);
             for (int i = 0; i < appInfosSize; ++i) {
                 final String packageName = appInfos.get(i).packageName;
                 PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
@@ -146,6 +150,7 @@
                 if (shouldShow) {
                     appsList.add(packageName);
                     appLabelsList.add(appPermissions.getAppLabel());
+                    isSystemAppList.add(Utils.isSystem(appPermissions, launcherPackages));
                 }
             }
         } catch (NameNotFoundException e) {
@@ -180,4 +185,14 @@
         counts[1] = allApps.size();
         return true;
     }
+
+    private boolean[] toPrimitiveBoolArray(final List<Boolean> list) {
+        final int count = list.size();
+        final boolean[] result = new boolean[count];
+        for (int i = 0; i < count; ++i) {
+            result[i] = list.get(i);
+        }
+
+        return result;
+    }
 }
diff --git a/src/com/android/packageinstaller/permission/utils/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java
index 2cc5d8a..2183037 100644
--- a/src/com/android/packageinstaller/permission/utils/Utils.java
+++ b/src/com/android/packageinstaller/permission/utils/Utils.java
@@ -31,6 +31,7 @@
 import android.util.TypedValue;
 
 import com.android.packageinstaller.permission.model.AppPermissionGroup;
+import com.android.packageinstaller.permission.model.AppPermissions;
 import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp;
 
 import java.util.List;
@@ -134,7 +135,14 @@
     }
 
     public static boolean isSystem(PermissionApp app, ArraySet<String> launcherPkgs) {
-        ApplicationInfo info = app.getAppInfo();
+        return isSystem(app.getAppInfo(), launcherPkgs);
+    }
+
+    public static boolean isSystem(AppPermissions app, ArraySet<String> launcherPkgs) {
+        return isSystem(app.getPackageInfo().applicationInfo, launcherPkgs);
+    }
+
+    public static boolean isSystem(ApplicationInfo info, ArraySet<String> launcherPkgs) {
         return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0
                 && !launcherPkgs.contains(info.packageName);
     }