Better error messages when permissions can't be granted or dropped.

Test: atest CtsDevicePolicyTestCases
Bug: 197627508
Change-Id: I2630ad802ce4cc8746f33d18f1e3a7180c5d3bce
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/permissions/Permissions.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/permissions/Permissions.java
index 35b2d4e..c6edd7d 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/permissions/Permissions.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/permissions/Permissions.java
@@ -182,8 +182,10 @@
                 sInstrumentedPackage.grantPermission(sUser, permission);
             } else {
                 removePermissionContextsUntilCanApply();
-                throw new NeneException("PermissionContext requires granting "
-                        + permission + " but cannot.");
+
+                throwPermissionException("PermissionContext requires granting "
+                        + permission + " but cannot.", permission, sUser,
+                        resolvedInstrumentedPackage);
             }
         }
 
@@ -195,8 +197,9 @@
                 adoptedShellPermissions.add(permission);
             } else { // We can't deny a permission to ourselves
                 removePermissionContextsUntilCanApply();
-                throw new NeneException("PermissionContext requires denying "
-                        + permission + " but cannot.");
+                throwPermissionException("PermissionContext requires denying "
+                        + permission + " but cannot.", permission, sUser,
+                        resolvedInstrumentedPackage);
             }
         }
 
@@ -207,6 +210,30 @@
         }
     }
 
+    private void throwPermissionException(
+            String message, String permission, UserReference user, Package instrumentedPackage) {
+        String protectionLevel = "Permission not found";
+        try {
+            protectionLevel = Integer.toString(sPackageManager.getPermissionInfo(
+                    permission, /* flags= */ 0).protectionLevel);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(LOG_TAG, "Permission not found", e);
+        }
+
+        throw new NeneException(message + "\n\nRunning On User: " + user
+                + "\nPermission: " + permission
+                + "\nPermission protection level: " + protectionLevel
+                + "\nPermission state: " + sContext.checkSelfPermission(permission)
+                + "\nInstrumented Package: " + instrumentedPackage.packageName()
+                + "\n\nGranted Permissions:\n"
+                + instrumentedPackage.grantedPermissions(user)
+                + "\n\nRequested Permissions:\n"
+                + instrumentedPackage.requestedPermissions()
+                + "\n\nCan adopt shell permissions: " + SUPPORTS_ADOPT_SHELL_PERMISSIONS
+                + "\nShell permissions:"
+                + sShellPackage.requestedPermissions());
+    }
+
     void clearPermissions() {
         mPermissionContexts.clear();
         applyPermissions();