Merge "Cleanup of the PackageInstaller API - Settings" into nyc-dev
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 6edbf60..ffa2236 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -123,66 +123,23 @@
 
     private final PermissionsResultCallback mPermissionCallback = new PermissionsResultCallback() {
         @Override
-        public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) {
+        public void onAppWithPermissionsCountsResult(int standardGrantedPermissionAppCount,
+                int standardUsedPermissionAppCount) {
             if (getActivity() == null) {
                 return;
             }
             mPermissionReceiver = null;
-            if (counts != null) {
+            if (standardUsedPermissionAppCount != 0) {
                 mAppPermsPreference.setSummary(getContext().getString(
-                        R.string.app_permissions_summary, counts[0], counts[1]));
+                        R.string.app_permissions_summary,
+                        standardGrantedPermissionAppCount,
+                        standardUsedPermissionAppCount));
             } else {
                 mAppPermsPreference.setSummary(null);
             }
         }
     };
 
-    private class CountAppsWithOverlayPermission extends
-            AsyncTask<AppStateOverlayBridge, Void, Integer> {
-        int numOfPackagesRequestedPermission = 0;
-
-        @Override
-        protected Integer doInBackground(AppStateOverlayBridge... params) {
-            AppStateOverlayBridge overlayBridge = params[0];
-            numOfPackagesRequestedPermission = overlayBridge
-                    .getNumberOfPackagesWithPermission();
-            return overlayBridge.getNumberOfPackagesCanDrawOverlay();
-        }
-
-        @Override
-        protected void onPostExecute(Integer result) {
-            // checks if fragment is still there before updating the preference object
-            if (isAdded()) {
-                mSystemAlertWindowPreference.setSummary(getContext().getString(
-                        R.string.system_alert_window_summary, result,
-                        numOfPackagesRequestedPermission));
-            }
-        }
-    }
-
-    private class CountAppsWithWriteSettingsPermission extends
-        AsyncTask<AppStateWriteSettingsBridge, Void, Integer> {
-        int numOfPackagesRequestedPermission = 0;
-
-        @Override
-        protected Integer doInBackground(AppStateWriteSettingsBridge... params) {
-            AppStateWriteSettingsBridge writeSettingsBridge = params[0];
-            numOfPackagesRequestedPermission = writeSettingsBridge
-                .getNumberOfPackagesWithPermission();
-            return writeSettingsBridge.getNumberOfPackagesCanWriteSettings();
-        }
-
-        @Override
-        protected void onPostExecute(Integer result) {
-            // checks if fragment is still there before updating the preference object
-            if (isAdded()) {
-                mWriteSettingsPreference.setSummary(getContext().getString(
-                        R.string.write_settings_summary, result,
-                        numOfPackagesRequestedPermission));
-            }
-        }
-    }
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 14277c9..1ef304f 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -179,8 +179,6 @@
     protected ProcStatsData mStatsManager;
     protected ProcStatsPackageEntry mStats;
 
-    private BroadcastReceiver mPermissionReceiver;
-
     private boolean handleDisableable(Button button) {
         boolean disableable = false;
         // Try to prevent the user from bricking their phone
@@ -356,11 +354,6 @@
     @Override
     public void onDestroy() {
         TrafficStats.closeQuietly(mStatsSession);
-        if (mPermissionReceiver != null) {
-            getContext().unregisterReceiver(mPermissionReceiver);
-            mPermissionReceiver = null;
-        }
-
         super.onDestroy();
     }
 
@@ -564,10 +557,8 @@
         // Update the preference summaries.
         Activity context = getActivity();
         mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context));
-        if (mPermissionReceiver != null) {
-            getContext().unregisterReceiver(mPermissionReceiver);
-        }
-        mPermissionReceiver = PermissionsSummaryHelper.getPermissionSummary(getContext(),
+
+        PermissionsSummaryHelper.getPermissionSummary(getContext(),
                 mPackageName, mPermissionCallback);
         mLaunchPreference.setSummary(AppUtils.getLaunchByDefaultSummary(mAppEntry, mUsbManager,
                 mPm, context));
@@ -1187,34 +1178,31 @@
     private final PermissionsResultCallback mPermissionCallback
             = new PermissionsResultCallback() {
         @Override
-        public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) {
+        public void onPermissionSummaryResult(int standardGrantedPermissionCount,
+                int requestedPermissionCount, int additionalGrantedPermissionCount,
+                List<CharSequence> grantedGroupLabels) {
             if (getActivity() == null) {
                 return;
             }
-            mPermissionReceiver = null;
             final Resources res = getResources();
             CharSequence summary = null;
-            if (counts != null) {
-                int totalCount = counts[1];
-                int additionalCounts = counts[2];
 
-                if (totalCount == 0) {
+            if (requestedPermissionCount == 0) {
+                summary = res.getString(
+                        R.string.runtime_permissions_summary_no_permissions_requested);
+            } else {
+                final ArrayList<CharSequence> list = new ArrayList<>(grantedGroupLabels);
+                if (additionalGrantedPermissionCount > 0) {
+                    // N additional permissions.
+                    list.add(res.getQuantityString(
+                            R.plurals.runtime_permissions_additional_count,
+                            additionalGrantedPermissionCount, additionalGrantedPermissionCount));
+                }
+                if (list.size() == 0) {
                     summary = res.getString(
-                            R.string.runtime_permissions_summary_no_permissions_requested);
+                            R.string.runtime_permissions_summary_no_permissions_granted);
                 } else {
-                    final ArrayList<CharSequence> list = new ArrayList(Arrays.asList(groupLabels));
-                    if (additionalCounts > 0) {
-                        // N additional permissions.
-                        list.add(res.getQuantityString(
-                                R.plurals.runtime_permissions_additional_count,
-                                additionalCounts, additionalCounts));
-                    }
-                    if (list.size() == 0) {
-                        summary = res.getString(
-                                R.string.runtime_permissions_summary_no_permissions_granted);
-                    } else {
-                        summary = ListFormatter.getInstance().format(list);
-                    }
+                    summary = ListFormatter.getInstance().format(list);
                 }
             }
             mPermissionsPreference.setSummary(summary);
diff --git a/src/com/android/settings/applications/PermissionsSummaryHelper.java b/src/com/android/settings/applications/PermissionsSummaryHelper.java
index 859e446..bac6b24 100644
--- a/src/com/android/settings/applications/PermissionsSummaryHelper.java
+++ b/src/com/android/settings/applications/PermissionsSummaryHelper.java
@@ -15,54 +15,66 @@
  */
 package com.android.settings.applications;
 
-import android.content.BroadcastReceiver;
+import android.annotation.NonNull;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.content.pm.permission.RuntimePermissionPresentationInfo;
+import android.content.pm.permission.RuntimePermissionPresenter;
 
-public class PermissionsSummaryHelper {
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
-    private static final String ACTION_PERM_COUNT_RESPONSE
-            = "com.android.settings.PERM_COUNT_RESPONSE";
-    private static final String ACTION_APP_COUNT_RESPONSE
-            = "com.android.settings.APP_COUNT_RESPONSE";
+public class PermissionsSummaryHelper  {
 
-    public static BroadcastReceiver getPermissionSummary(Context context, String pkg,
-            PermissionsResultCallback callback) {
-        Intent request = new Intent(Intent.ACTION_GET_PERMISSIONS_COUNT);
-        request.putExtra(Intent.EXTRA_PACKAGE_NAME, pkg);
-        return sendPermissionRequest(context, ACTION_PERM_COUNT_RESPONSE, request, callback);
-    }
-
-    public static BroadcastReceiver getAppWithPermissionsCounts(Context context,
-            PermissionsResultCallback callback) {
-        Intent request = new Intent(Intent.ACTION_GET_PERMISSIONS_COUNT);
-        return sendPermissionRequest(context, ACTION_APP_COUNT_RESPONSE, request, callback);
-    }
-
-    private static BroadcastReceiver sendPermissionRequest(Context context, String action,
-            Intent request, final PermissionsResultCallback callback) {
-        BroadcastReceiver receiver = new BroadcastReceiver() {
+    public static void getPermissionSummary(Context context, String pkg,
+            final PermissionsResultCallback callback) {
+        final RuntimePermissionPresenter presenter =
+                RuntimePermissionPresenter.getInstance(context);
+        presenter.getAppPermissions(pkg, new RuntimePermissionPresenter.OnResultCallback() {
             @Override
-            public void onReceive(Context context, Intent intent) {
-                int[] counts = intent.getIntArrayExtra(Intent.EXTRA_GET_PERMISSIONS_COUNT_RESULT);
+            public void onGetAppPermissions(
+                    @NonNull List<RuntimePermissionPresentationInfo> permissions) {
+                final int permissionCount = permissions.size();
 
-                CharSequence[] groups = intent.getCharSequenceArrayExtra(
-                        Intent.EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT);
+                int grantedStandardCount = 0;
+                int grantedAdditionalCount = 0;
+                int requestedCount = 0;
+                List<CharSequence> grantedStandardLabels = new ArrayList<>();
 
-                callback.onPermissionSummaryResult(counts, groups);
+                for (int i = 0; i < permissionCount; i++) {
+                    RuntimePermissionPresentationInfo permission = permissions.get(i);
+                    requestedCount++;
+                    if (permission.isGranted()) {
+                        if (permission.isStandard()) {
+                            grantedStandardLabels.add(permission.getLabel());
+                            grantedStandardCount++;
+                        } else {
+                            grantedAdditionalCount++;
+                        }
+                    }
+                }
 
-                context.unregisterReceiver(this);
+                Collator collator = Collator.getInstance();
+                collator.setStrength(Collator.PRIMARY);
+                Collections.sort(grantedStandardLabels, collator);
+
+                callback.onPermissionSummaryResult(grantedStandardCount, requestedCount,
+                        grantedAdditionalCount, grantedStandardLabels);
             }
-        };
-        context.registerReceiver(receiver, new IntentFilter(action));
-        request.putExtra(Intent.EXTRA_GET_PERMISSIONS_RESPONSE_INTENT, action);
-        request.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        context.sendBroadcast(request);
-        return receiver;
+        }, null);
     }
 
-    public interface PermissionsResultCallback {
-        void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels);
+    public static abstract class PermissionsResultCallback {
+        public void onAppWithPermissionsCountsResult(int standardGrantedPermissionAppCount,
+                int standardUsedPermissionAppCount) {
+            /* do nothing - stub */
+        }
+
+        public void onPermissionSummaryResult(int standardGrantedPermissionCount,
+                int requestedPermissionCount, int additionalGrantedPermissionCount,
+                List<CharSequence> grantedGroupLabels) {
+            /* do nothing - stub */
+        }
     }
 }