Grant default permissions to default apps despite user choices.

This implements the policy of granting default permissions to default
apps upon a selection despite past user permission choices. The act of
picking the app as the default one means the user expects it to work in
this capacity as SMS app, Phone app, Browser app.

bug:22062549

Change-Id: I5e427f2b939e85bb8bbfd311cc271b96857a7ce6
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index b76db41..f04790e 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -559,9 +559,9 @@
         }
         PackageParser.Package smsPackage = getPackageLPr(packageName);
         if (smsPackage != null && doesPackageSupportRuntimePermissions(smsPackage)) {
-            grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
-            grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId);
-            grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId);
+            grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, false, true, userId);
+            grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, false, true, userId);
+            grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, false, true, userId);
         }
     }
 
@@ -573,10 +573,10 @@
         PackageParser.Package dialerPackage = getPackageLPr(packageName);
         if (dialerPackage != null
                 && doesPackageSupportRuntimePermissions(dialerPackage)) {
-            grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
-            grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
-            grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
-            grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
+            grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, false, true, userId);
+            grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, false, true, userId);
+            grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, false, true, userId);
+            grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, false, true, userId);
         }
     }
 
@@ -603,7 +603,7 @@
         PackageParser.Package browserPackage = getSystemPackageLPr(packageName);
         if (browserPackage != null
                 && doesPackageSupportRuntimePermissions(browserPackage)) {
-            grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
+            grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, false, false, userId);
         }
     }
 
@@ -676,11 +676,16 @@
 
     private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
             int userId) {
-        grantRuntimePermissionsLPw(pkg, permissions, false, userId);
+        grantRuntimePermissionsLPw(pkg, permissions, false, false, userId);
     }
 
     private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
             boolean systemFixed, int userId) {
+        grantRuntimePermissionsLPw(pkg, permissions, systemFixed, false, userId);
+    }
+
+    private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
+            boolean systemFixed, boolean overrideUserChoice,  int userId) {
         List<String> requestedPermissions = pkg.requestedPermissions;
 
         if (pkg.isUpdatedSystemApp()) {
@@ -699,7 +704,17 @@
                 // If any flags are set to the permission, then it is either set in
                 // its current state by the system or device/profile owner or the user.
                 // In all these cases we do not want to clobber the current state.
-                if (flags == 0) {
+                // Unless the caller wants to override user choices. The override is
+                // to make sure we can grant the needed permission to the default
+                // sms and phone apps after the user chooses this in the UI.
+                if (flags == 0 || overrideUserChoice) {
+                    // Never clobber policy or system.
+                    final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
+                            | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
+                    if ((flags & fixedFlags) != 0) {
+                        continue;
+                    }
+
                     mService.grantRuntimePermission(pkg.packageName, permission, userId);
                     if (DEBUG) {
                         Log.i(TAG, "Granted " + permission + " to default handler "