From 7f62addc1082f5f926a04a83edf07675b1317019 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Wed, 13 Apr 2016 18:28:24 -0700 Subject: [PATCH] Cleanup of the PackageInstaller API - Settings The PackageInstaller app manages side-loading apps as well as permission management. It should be updatable, hence should rely on system APIs to talk to the platform. This is the first step of defining an API boundary. Change-Id: Ibb21114a7a9fa28f6db68492fe37c02c1b2f0c6b --- .../applications/AdvancedAppSettings.java | 55 ++---------- .../applications/InstalledAppDetails.java | 50 ++++------- .../PermissionsSummaryHelper.java | 88 +++++++++++-------- 3 files changed, 75 insertions(+), 118 deletions(-) diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java index 6edbf60d933..ffa22368743 100644 --- a/src/com/android/settings/applications/AdvancedAppSettings.java +++ b/src/com/android/settings/applications/AdvancedAppSettings.java @@ -123,66 +123,23 @@ public class AdvancedAppSettings extends SettingsPreferenceFragment implements 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 { - 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 { - 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 14277c995c1..1ef304f74ff 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -179,8 +179,6 @@ public class InstalledAppDetails extends AppInfoBase 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 @@ public class InstalledAppDetails extends AppInfoBase @Override public void onDestroy() { TrafficStats.closeQuietly(mStatsSession); - if (mPermissionReceiver != null) { - getContext().unregisterReceiver(mPermissionReceiver); - mPermissionReceiver = null; - } - super.onDestroy(); } @@ -564,10 +557,8 @@ public class InstalledAppDetails extends AppInfoBase // 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 @@ public class InstalledAppDetails extends AppInfoBase private final PermissionsResultCallback mPermissionCallback = new PermissionsResultCallback() { @Override - public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) { + public void onPermissionSummaryResult(int standardGrantedPermissionCount, + int requestedPermissionCount, int additionalGrantedPermissionCount, + List 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 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 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 859e4468ca4..bac6b24b4d9 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 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 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 grantedGroupLabels) { + /* do nothing - stub */ + } } }