Collect permission type field

Bug: 159808141
Test: Build ongoing to confirm
Signed-off-by: Tom Bell <bellthomas@google.com>
Change-Id: Ie43b0db5f174b786d6d581cacb4309b9f97a9758
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/PackageDeviceInfo.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/PackageDeviceInfo.java
index 10364af..735b805 100644
--- a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/PackageDeviceInfo.java
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/PackageDeviceInfo.java
@@ -41,6 +41,9 @@
 @TargetApi(Build.VERSION_CODES.N)
 public class PackageDeviceInfo extends DeviceInfo {
 
+    private static final String PLATFORM = "android";
+    private static final String PLATFORM_PERMISSION_PREFIX = "android.";
+
     private static final String PACKAGE = "package";
     private static final String NAME = "name";
     private static final String VERSION_NAME = "version_name";
@@ -56,6 +59,11 @@
     private static final String PERMISSION_PROTECTION = "protection_level";
     private static final String PERMISSION_PROTECTION_FLAGS = "protection_level_flags";
 
+    private static final String PERMISSION_TYPE = "type";
+    private static final int PERMISSION_TYPE_SYSTEM = 1;
+    private static final int PERMISSION_TYPE_OEM = 2;
+    private static final int PERMISSION_TYPE_CUSTOM = 3;
+
     private static final String HAS_SYSTEM_UID = "has_system_uid";
 
     private static final String SHARES_INSTALL_PERMISSION = "shares_install_packages_permission";
@@ -86,13 +94,20 @@
 
         final ComponentName defaultAccessibilityComponent = getDefaultAccessibilityComponent();
 
+        // Platform permission data used to tag permissions information with sourcing information
+        final PackageInfo platformInfo = pm.getPackageInfo(PLATFORM , PackageManager.GET_PERMISSIONS);
+        final Set<String> platformPermissions = new HashSet<String>();
+        for (PermissionInfo permission : platformInfo.permissions) {
+          platformPermissions.add(permission.name);
+        }
+
         store.startArray(PACKAGE);
         for (PackageInfo pkg : allPackages) {
             store.startGroup();
             store.addResult(NAME, pkg.packageName);
             store.addResult(VERSION_NAME, pkg.versionName);
 
-            collectPermissions(store, pm, pkg);
+            collectPermissions(store, pm, platformPermissions, pkg);
             collectionApplicationInfo(store, pm, pkg);
 
             store.addResult(HAS_DEFAULT_NOTIFICATION_ACCESS,
@@ -118,6 +133,7 @@
 
     private static void collectPermissions(DeviceInfoStore store,
                                            PackageManager pm,
+                                           Set<String> systemPermissions,
                                            PackageInfo pkg) throws IOException
     {
         store.startArray(REQUESTED_PERMISSIONS);
@@ -129,6 +145,21 @@
                     store.startGroup();
                     store.addResult(PERMISSION_NAME, permission);
                     writePermissionsDetails(pi, store);
+
+                    if (permission == null) continue;
+
+                    final boolean isPlatformPermission = systemPermissions.contains(permission);
+                    if (isPlatformPermission) {
+                      final boolean isAndroidPermission = permission.startsWith(PLATFORM_PERMISSION_PREFIX);
+                      if (isAndroidPermission) {
+                        store.addResult(PERMISSION_TYPE, PERMISSION_TYPE_SYSTEM);
+                      } else {
+                        store.addResult(PERMISSION_TYPE, PERMISSION_TYPE_OEM);
+                      }
+                    } else {
+                      store.addResult(PERMISSION_TYPE, PERMISSION_TYPE_CUSTOM);
+                    }
+
                     store.endGroup();
                 } catch (PackageManager.NameNotFoundException e) {
                     // ignore unrecognized permission and continue
diff --git a/common/device-side/test-app/AndroidManifest.xml b/common/device-side/test-app/AndroidManifest.xml
index 3aa5dc5..70b3d08 100755
--- a/common/device-side/test-app/AndroidManifest.xml
+++ b/common/device-side/test-app/AndroidManifest.xml
@@ -20,6 +20,7 @@
 
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
 
     <application>
         <uses-library android:name="android.test.runner" />