Loading AndroidManifest.xml +0 −7 Original line number Original line Diff line number Diff line Loading @@ -172,13 +172,6 @@ android:excludeFromRecents="true" android:excludeFromRecents="true" android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar" /> android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar" /> <receiver android:name=".permission.model.PermissionStatusReceiver" android:permission="android.permission.GRANT_RUNTIME_PERMISSIONS"> <intent-filter android:priority="1"> <action android:name="android.intent.action.GET_PERMISSIONS_COUNT" /> </intent-filter> </receiver> <!-- Wearable Components --> <!-- Wearable Components --> <service android:name=".wear.WearPackageInstallerService" <service android:name=".wear.WearPackageInstallerService" android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" Loading src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.javadeleted 100644 → 0 +0 −187 Original line number Original line Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.packageinstaller.permission.model; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.util.ArrayMap; import android.util.ArraySet; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; import com.android.packageinstaller.permission.utils.Utils; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * This class handles backwards compatibility for M. Don't remove * until we decide to drop M support altogether. */ public class PermissionStatusReceiver extends BroadcastReceiver { /** * Broadcast action that requests current permission granted information. It will respond * to the request by sending a broadcast with action defined by * {@link #EXTRA_GET_PERMISSIONS_RESPONSE_INTENT}. The response will contain * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}, as well as * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}, with contents described below or * a null upon failure. * * <p>If {@link Intent#EXTRA_PACKAGE_NAME} is included then the number of permissions granted, the * number of permissions requested and the number of granted additional permissions * by that package will be calculated and included as the first * and second elements respectively of an int[] in the response as * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. The response will also deliver the list * of localized permission group names that are granted in * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}. * * <p>If {@link #EXTRA_PACKAGE_NAME} is not included then the number of apps granted any runtime * permissions and the total number of apps requesting runtime permissions will be the first * and second elements respectively of an int[] in the response as * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. * * @hide */ public static final String ACTION_GET_PERMISSIONS_COUNT = "android.intent.action.GET_PERMISSIONS_COUNT"; /** * Extra included in response to {@link #ACTION_GET_PERMISSIONS_COUNT}. * @hide */ public static final String EXTRA_GET_PERMISSIONS_COUNT_RESULT = "android.intent.extra.GET_PERMISSIONS_COUNT_RESULT"; /** * List of CharSequence of localized permission group labels. * @hide */ public static final String EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT = "android.intent.extra.GET_PERMISSIONS_GROUP_LIST_RESULT"; /** * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_COUNT} broadcasts. * @hide */ public static final String EXTRA_GET_PERMISSIONS_RESPONSE_INTENT = "android.intent.extra.GET_PERMISSIONS_RESONSE_INTENT"; @Override public void onReceive(Context context, Intent intent) { if (ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( EXTRA_GET_PERMISSIONS_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); int[] counts = new int[3]; ArrayList<CharSequence> grantedGroups = new ArrayList<>(); boolean succeeded = false; boolean isForPackage = intent.hasExtra(Intent.EXTRA_PACKAGE_NAME); if (isForPackage) { String pkg = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); succeeded = getPermissionsCount(context, pkg, counts, grantedGroups); } else { succeeded = getAppsWithPermissionsCount(context, counts); } if (succeeded) { responseIntent.putExtra(EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts); if (isForPackage) { responseIntent.putExtra(EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT, grantedGroups.toArray(new CharSequence[grantedGroups.size()])); } } context.sendBroadcast(responseIntent); } } public boolean getPermissionsCount(Context context, String pkg, int[] counts, ArrayList<CharSequence> grantedGroups) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(pkg, PackageManager.GET_PERMISSIONS); AppPermissions appPermissions = new AppPermissions(context, packageInfo, null, false, null); int grantedCount = 0; int totalCount = 0; int additionalCount = 0; for (AppPermissionGroup group : appPermissions.getPermissionGroups()) { if (Utils.shouldShowPermission(group, pkg)) { totalCount++; if (group.areRuntimePermissionsGranted()) { grantedCount++; if (Utils.OS_PKG.equals(group.getDeclaringPackage())) { grantedGroups.add(group.getLabel()); } else { additionalCount++; } } } } // Sort Collator coll = Collator.getInstance(); coll.setStrength(Collator.PRIMARY); Collections.sort(grantedGroups, coll); // Set results counts[0] = grantedCount; counts[1] = totalCount; counts[2] = additionalCount; return true; } catch (NameNotFoundException e) { return false; } } public boolean getAppsWithPermissionsCount(Context context, int[] counts) { ArraySet<String> launcherPkgs = Utils.getLauncherPackages(context); // Indexed by uid. ArrayMap<String, Boolean> grantedApps = new ArrayMap<>(); ArrayMap<String, Boolean> allApps = new ArrayMap<>(); for (String group : Utils.MODERN_PERMISSION_GROUPS) { PermissionApps permissionApps = new PermissionApps(context, group, null); permissionApps.loadNowWithoutUi(); for (PermissionApp app : permissionApps.getApps()) { String key = app.getKey(); if (Utils.isSystem(app, launcherPkgs)) { // We default to not showing system apps, so hide them from count. continue; } if (app.areRuntimePermissionsGranted()) { grantedApps.put(key, true); } allApps.put(key, true); } } counts[0] = grantedApps.size(); counts[1] = allApps.size(); return true; } } Loading
AndroidManifest.xml +0 −7 Original line number Original line Diff line number Diff line Loading @@ -172,13 +172,6 @@ android:excludeFromRecents="true" android:excludeFromRecents="true" android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar" /> android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar" /> <receiver android:name=".permission.model.PermissionStatusReceiver" android:permission="android.permission.GRANT_RUNTIME_PERMISSIONS"> <intent-filter android:priority="1"> <action android:name="android.intent.action.GET_PERMISSIONS_COUNT" /> </intent-filter> </receiver> <!-- Wearable Components --> <!-- Wearable Components --> <service android:name=".wear.WearPackageInstallerService" <service android:name=".wear.WearPackageInstallerService" android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" Loading
src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.javadeleted 100644 → 0 +0 −187 Original line number Original line Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.packageinstaller.permission.model; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.util.ArrayMap; import android.util.ArraySet; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; import com.android.packageinstaller.permission.utils.Utils; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * This class handles backwards compatibility for M. Don't remove * until we decide to drop M support altogether. */ public class PermissionStatusReceiver extends BroadcastReceiver { /** * Broadcast action that requests current permission granted information. It will respond * to the request by sending a broadcast with action defined by * {@link #EXTRA_GET_PERMISSIONS_RESPONSE_INTENT}. The response will contain * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}, as well as * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}, with contents described below or * a null upon failure. * * <p>If {@link Intent#EXTRA_PACKAGE_NAME} is included then the number of permissions granted, the * number of permissions requested and the number of granted additional permissions * by that package will be calculated and included as the first * and second elements respectively of an int[] in the response as * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. The response will also deliver the list * of localized permission group names that are granted in * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}. * * <p>If {@link #EXTRA_PACKAGE_NAME} is not included then the number of apps granted any runtime * permissions and the total number of apps requesting runtime permissions will be the first * and second elements respectively of an int[] in the response as * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. * * @hide */ public static final String ACTION_GET_PERMISSIONS_COUNT = "android.intent.action.GET_PERMISSIONS_COUNT"; /** * Extra included in response to {@link #ACTION_GET_PERMISSIONS_COUNT}. * @hide */ public static final String EXTRA_GET_PERMISSIONS_COUNT_RESULT = "android.intent.extra.GET_PERMISSIONS_COUNT_RESULT"; /** * List of CharSequence of localized permission group labels. * @hide */ public static final String EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT = "android.intent.extra.GET_PERMISSIONS_GROUP_LIST_RESULT"; /** * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_COUNT} broadcasts. * @hide */ public static final String EXTRA_GET_PERMISSIONS_RESPONSE_INTENT = "android.intent.extra.GET_PERMISSIONS_RESONSE_INTENT"; @Override public void onReceive(Context context, Intent intent) { if (ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( EXTRA_GET_PERMISSIONS_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); int[] counts = new int[3]; ArrayList<CharSequence> grantedGroups = new ArrayList<>(); boolean succeeded = false; boolean isForPackage = intent.hasExtra(Intent.EXTRA_PACKAGE_NAME); if (isForPackage) { String pkg = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); succeeded = getPermissionsCount(context, pkg, counts, grantedGroups); } else { succeeded = getAppsWithPermissionsCount(context, counts); } if (succeeded) { responseIntent.putExtra(EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts); if (isForPackage) { responseIntent.putExtra(EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT, grantedGroups.toArray(new CharSequence[grantedGroups.size()])); } } context.sendBroadcast(responseIntent); } } public boolean getPermissionsCount(Context context, String pkg, int[] counts, ArrayList<CharSequence> grantedGroups) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(pkg, PackageManager.GET_PERMISSIONS); AppPermissions appPermissions = new AppPermissions(context, packageInfo, null, false, null); int grantedCount = 0; int totalCount = 0; int additionalCount = 0; for (AppPermissionGroup group : appPermissions.getPermissionGroups()) { if (Utils.shouldShowPermission(group, pkg)) { totalCount++; if (group.areRuntimePermissionsGranted()) { grantedCount++; if (Utils.OS_PKG.equals(group.getDeclaringPackage())) { grantedGroups.add(group.getLabel()); } else { additionalCount++; } } } } // Sort Collator coll = Collator.getInstance(); coll.setStrength(Collator.PRIMARY); Collections.sort(grantedGroups, coll); // Set results counts[0] = grantedCount; counts[1] = totalCount; counts[2] = additionalCount; return true; } catch (NameNotFoundException e) { return false; } } public boolean getAppsWithPermissionsCount(Context context, int[] counts) { ArraySet<String> launcherPkgs = Utils.getLauncherPackages(context); // Indexed by uid. ArrayMap<String, Boolean> grantedApps = new ArrayMap<>(); ArrayMap<String, Boolean> allApps = new ArrayMap<>(); for (String group : Utils.MODERN_PERMISSION_GROUPS) { PermissionApps permissionApps = new PermissionApps(context, group, null); permissionApps.loadNowWithoutUi(); for (PermissionApp app : permissionApps.getApps()) { String key = app.getKey(); if (Utils.isSystem(app, launcherPkgs)) { // We default to not showing system apps, so hide them from count. continue; } if (app.areRuntimePermissionsGranted()) { grantedApps.put(key, true); } allApps.put(key, true); } } counts[0] = grantedApps.size(); counts[1] = allApps.size(); return true; } }