Fix use of getProtection pre SDK 28

Bug: 148555208
Test: manual
Change-Id: I9d267c1cd2a9b778b1a445809635127503cd59fa
Signed-off-by: Tom Bell <bellthomas@google.com>
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 8b1e28c..e953724 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
@@ -19,6 +19,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PermissionInfo;
+import android.os.Build;
 import com.android.compatibility.common.util.DeviceInfoStore;
 
 import java.io.IOException;
@@ -55,7 +56,8 @@
     protected void collectDeviceInfo(DeviceInfoStore store) throws Exception {
         final PackageManager pm = getContext().getPackageManager();
 
-        final List<PackageInfo> allPackages = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
+        final List<PackageInfo> allPackages =
+                pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
 
         store.startArray(PACKAGE);
         for (PackageInfo pkg : allPackages) {
@@ -72,10 +74,7 @@
 
                         store.startGroup();
                         store.addResult(PERMISSION_NAME, permission);
-                        store.addResult(PERMISSION_FLAGS, pi.flags);
-                        store.addResult(PERMISSION_GROUP, pi.group);
-                        store.addResult(PERMISSION_PROTECTION, pi.getProtection());
-                        store.addResult(PERMISSION_PROTECTION_FLAGS, pi.getProtectionFlags());
+                        writePermissionsDetails(pi, store);
                         store.endGroup();
                     } catch (PackageManager.NameNotFoundException e) {
                         // ignore unrecognized permission and continue
@@ -94,7 +93,7 @@
 
                 store.addResult(HAS_SYSTEM_UID, appInfo.uid < SYS_UID_MAX);
 
-                final boolean canInstall = sharesUidWithPackageHolding(pm, appInfo.uid, INSTALL_PACKAGES_PERMISSION);
+                final boolean canInstall = sharesUidWithInstallerPackage(pm, appInfo.uid);
                 store.addResult(SHARES_INSTALL_PERMISSION, canInstall);
             }
 
@@ -102,7 +101,8 @@
         }
         store.endArray(); // "package"
     }
-    private static boolean sharesUidWithPackageHolding(PackageManager pm, int uid, String permission) {
+
+    private static boolean sharesUidWithInstallerPackage(PackageManager pm, int uid) {
         final String[] sharesUidWith = pm.getPackagesForUid(uid);
 
         if (sharesUidWith == null) {
@@ -110,7 +110,8 @@
         }
 
         // Approx 20 permissions per package for rough estimate of sizing
-        final List<String> sharedPermissions = new ArrayList<>(sharesUidWith.length * 20);
+        final int capacity = sharesUidWith.length * 20;
+        final List<String> sharedPermissions = new ArrayList<>(capacity);
         for (String pkg :sharesUidWith){
             try {
                 final PackageInfo info = pm.getPackageInfo(pkg, PackageManager.GET_PERMISSIONS);
@@ -129,6 +130,27 @@
             }
         }
 
-        return sharedPermissions.contains(permission);
+        return sharedPermissions.contains(PackageDeviceInfo.INSTALL_PACKAGES_PERMISSION);
+    }
+
+    private static void writePermissionsDetails(PermissionInfo pi, DeviceInfoStore store)
+            throws IOException {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            store.addResult(PERMISSION_FLAGS, pi.flags);
+        } else {
+            store.addResult(PERMISSION_FLAGS, 0);
+        }
+
+        store.addResult(PERMISSION_GROUP, pi.group);
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            store.addResult(PERMISSION_PROTECTION, pi.getProtection());
+            store.addResult(PERMISSION_PROTECTION_FLAGS, pi.getProtectionFlags());
+        } else {
+            store.addResult(PERMISSION_PROTECTION,
+                    pi.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE);
+            store.addResult(PERMISSION_PROTECTION_FLAGS,
+                    pi.protectionLevel & ~PermissionInfo.PROTECTION_MASK_BASE);
+        }
     }
 }