Grant default permissions to the setup app robustly.

There is a zoo of components that handle the home intent and
have different priority. There is no reliable way to distinguish
the setup app from the other apps that handle home as some of
them have lower priority than the setup app and some higher.
This change adds a dedicated category to recognize the default
setup app.

Uncommented the code that grants accounts permissions as the
get_accounts permission is now a runtime permission and can be
granted.

bug:22471024
bug:22501463

Change-Id: I41726751fa2567cbcd7d09c7acfa7615b8aba577
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index c9f9b56..5571662 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3094,6 +3094,13 @@
     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
     public static final String CATEGORY_HOME = "android.intent.category.HOME";
     /**
+     * This is the setup wizard activity, that is the first activity that is displayed
+     * when the user sets up the device for the first time.
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.INTENT_CATEGORY)
+    public static final String CATEGORY_SETUP_WIZARD = "android.intent.category.SETUP_WIZARD";
+    /**
      * This activity is a preference panel.
      */
     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index e3c6037..7fde68f 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -29,7 +29,6 @@
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
 import android.os.Build;
-import android.os.Debug;
 import android.os.UserHandle;
 import android.provider.CalendarContract;
 import android.provider.ContactsContract;
@@ -120,12 +119,7 @@
 
     private static final Set<String> ACCOUNTS_PERMISSIONS = new ArraySet<>();
     static {
-        //ACCOUNTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
-    }
-
-    private static final Set<String> SETTINGS_PERMISSIONS = new ArraySet<>();
-    static {
-        SETTINGS_PERMISSIONS.add(Manifest.permission.WRITE_SETTINGS);
+        ACCOUNTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
     }
 
     private final PackageManagerService mService;
@@ -161,7 +155,7 @@
         mDialerAppPackagesProvider = provider;
     }
 
-    public void setSyncAdapterPackagesProviderrLPw(SyncAdapterPackagesProvider provider) {
+    public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) {
         mSyncAdapterPackagesProvider = provider;
     }
 
@@ -256,7 +250,7 @@
 
             // SetupWizard
             Intent setupIntent = new Intent(Intent.ACTION_MAIN);
-            setupIntent.addCategory(Intent.CATEGORY_HOME);
+            setupIntent.addCategory(Intent.CATEGORY_SETUP_WIZARD);
             PackageParser.Package setupPackage = getDefaultSystemHandlerActivityPackageLPr(
                     setupIntent, userId);
             if (setupPackage != null
@@ -374,8 +368,7 @@
 
             // Calendar provider sync adapters
             List<PackageParser.Package> calendarSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
-                    calendarSyncAdapterPackages,
-                            userId);
+                    calendarSyncAdapterPackages, userId);
             final int calendarSyncAdapterCount = calendarSyncAdapters.size();
             for (int i = 0; i < calendarSyncAdapterCount; i++) {
                 PackageParser.Package calendarSyncAdapter = calendarSyncAdapters.get(i);
@@ -398,8 +391,7 @@
 
             // Contacts provider sync adapters
             List<PackageParser.Package> contactsSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
-                    contactsSyncAdapterPackages,
-                            userId);
+                    contactsSyncAdapterPackages, userId);
             final int contactsSyncAdapterCount = contactsSyncAdapters.size();
             for (int i = 0; i < contactsSyncAdapterCount; i++) {
                 PackageParser.Package contactsSyncAdapter = contactsSyncAdapters.get(i);
@@ -628,10 +620,12 @@
         List<ResolveInfo> handlers = mService.mActivities.queryIntent(intent,
                 intent.resolveType(mService.mContext.getContentResolver()),
                 PackageManager.GET_DISABLED_COMPONENTS, userId);
+        if (handlers == null) {
+            return null;
+        }
         final int handlerCount = handlers.size();
         for (int i = 0; i < handlerCount; i++) {
             ResolveInfo handler = handlers.get(i);
-            // TODO: This is a temporary hack to figure out the setup app.
             PackageParser.Package handlerPackage = getSystemPackageLPr(
                     handler.activityInfo.packageName);
             if (handlerPackage != null) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ef9bc8b..4b2c1ff 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -16407,7 +16407,7 @@
         @Override
         public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) {
             synchronized (mPackages) {
-                mDefaultPermissionPolicy.setSyncAdapterPackagesProviderrLPw(provider);
+                mDefaultPermissionPolicy.setSyncAdapterPackagesProviderLPw(provider);
             }
         }