Loading AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ android:permission="android.permission.GRANT_RUNTIME_PERMISSIONS"> <intent-filter> <action android:name="android.intent.action.GET_PERMISSIONS_COUNT" /> <action android:name="android.intent.action.GET_PERMISSIONS_PACKAGES" /> </intent-filter> </receiver> Loading src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java +71 −21 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ 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; Loading @@ -30,21 +31,22 @@ import com.android.packageinstaller.permission.utils.Utils; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class PermissionStatusReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( Intent.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); Intent responseIntent = new Intent(intent.getStringExtra( Intent.EXTRA_GET_PERMISSIONS_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); if (isForPackage) { String pkg = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); succeeded = getPermissionsCount(context, pkg, counts, grantedGroups); Loading @@ -59,9 +61,23 @@ public class PermissionStatusReceiver extends BroadcastReceiver { grantedGroups.toArray(new CharSequence[grantedGroups.size()])); } } context.sendBroadcast(responseIntent); } else if (Intent.ACTION_GET_PERMISSIONS_PACKAGES.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( Intent.EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); List<String> appsList = new ArrayList<>(); List<CharSequence> appLabelsList = new ArrayList<>(); if (getAppsWithRuntimePermissions(context, appsList, appLabelsList)) { responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LIST_RESULT, appsList.toArray(new String[appsList.size()])); responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT, appLabelsList.toArray(new String[appLabelsList.size()])); } context.sendBroadcast(responseIntent); } } public boolean getPermissionsCount(Context context, String pkg, int[] counts, ArrayList<CharSequence> grantedGroups) { Loading Loading @@ -105,6 +121,40 @@ public class PermissionStatusReceiver extends BroadcastReceiver { } } public boolean getAppsWithRuntimePermissions(Context context, List<String> appsList, List<CharSequence> appLabelsList) { final List<ApplicationInfo> appInfos = Utils.getAllInstalledApplications(context); if (appInfos == null) { return false; } final int appInfosSize = appInfos.size(); try { for (int i = 0; i < appInfosSize; ++i) { final String packageName = appInfos.get(i).packageName; PackageInfo packageInfo = context.getPackageManager().getPackageInfo( packageName, PackageManager.GET_PERMISSIONS); AppPermissions appPermissions = new AppPermissions(context, packageInfo, null, false, null); boolean shouldShow = false; for (AppPermissionGroup group : appPermissions.getPermissionGroups()) { if (Utils.shouldShowPermission(group, packageName)) { shouldShow = true; break; } } if (shouldShow) { appsList.add(packageName); appLabelsList.add(appPermissions.getAppLabel()); } } } catch (NameNotFoundException e) { return false; } return true; } public boolean getAppsWithPermissionsCount(Context context, int[] counts) { ArraySet<String> launcherPkgs = Utils.getLauncherPackages(context); // Indexed by uid. Loading src/com/android/packageinstaller/permission/utils/Utils.java +6 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import android.util.TypedValue; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; import java.util.List; public class Utils { private static final String LOG_TAG = "Utils"; Loading Loading @@ -127,6 +129,10 @@ public class Utils { return launcherPkgs; } public static List<ApplicationInfo> getAllInstalledApplications(Context context) { return context.getPackageManager().getInstalledApplications(0); } public static boolean isSystem(PermissionApp app, ArraySet<String> launcherPkgs) { ApplicationInfo info = app.getAppInfo(); return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0 Loading Loading
AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ android:permission="android.permission.GRANT_RUNTIME_PERMISSIONS"> <intent-filter> <action android:name="android.intent.action.GET_PERMISSIONS_COUNT" /> <action android:name="android.intent.action.GET_PERMISSIONS_PACKAGES" /> </intent-filter> </receiver> Loading
src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java +71 −21 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ 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; Loading @@ -30,21 +31,22 @@ import com.android.packageinstaller.permission.utils.Utils; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class PermissionStatusReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( Intent.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); Intent responseIntent = new Intent(intent.getStringExtra( Intent.EXTRA_GET_PERMISSIONS_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); if (isForPackage) { String pkg = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); succeeded = getPermissionsCount(context, pkg, counts, grantedGroups); Loading @@ -59,9 +61,23 @@ public class PermissionStatusReceiver extends BroadcastReceiver { grantedGroups.toArray(new CharSequence[grantedGroups.size()])); } } context.sendBroadcast(responseIntent); } else if (Intent.ACTION_GET_PERMISSIONS_PACKAGES.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( Intent.EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); List<String> appsList = new ArrayList<>(); List<CharSequence> appLabelsList = new ArrayList<>(); if (getAppsWithRuntimePermissions(context, appsList, appLabelsList)) { responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LIST_RESULT, appsList.toArray(new String[appsList.size()])); responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT, appLabelsList.toArray(new String[appLabelsList.size()])); } context.sendBroadcast(responseIntent); } } public boolean getPermissionsCount(Context context, String pkg, int[] counts, ArrayList<CharSequence> grantedGroups) { Loading Loading @@ -105,6 +121,40 @@ public class PermissionStatusReceiver extends BroadcastReceiver { } } public boolean getAppsWithRuntimePermissions(Context context, List<String> appsList, List<CharSequence> appLabelsList) { final List<ApplicationInfo> appInfos = Utils.getAllInstalledApplications(context); if (appInfos == null) { return false; } final int appInfosSize = appInfos.size(); try { for (int i = 0; i < appInfosSize; ++i) { final String packageName = appInfos.get(i).packageName; PackageInfo packageInfo = context.getPackageManager().getPackageInfo( packageName, PackageManager.GET_PERMISSIONS); AppPermissions appPermissions = new AppPermissions(context, packageInfo, null, false, null); boolean shouldShow = false; for (AppPermissionGroup group : appPermissions.getPermissionGroups()) { if (Utils.shouldShowPermission(group, packageName)) { shouldShow = true; break; } } if (shouldShow) { appsList.add(packageName); appLabelsList.add(appPermissions.getAppLabel()); } } } catch (NameNotFoundException e) { return false; } return true; } public boolean getAppsWithPermissionsCount(Context context, int[] counts) { ArraySet<String> launcherPkgs = Utils.getLauncherPackages(context); // Indexed by uid. Loading
src/com/android/packageinstaller/permission/utils/Utils.java +6 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import android.util.TypedValue; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; import java.util.List; public class Utils { private static final String LOG_TAG = "Utils"; Loading Loading @@ -127,6 +129,10 @@ public class Utils { return launcherPkgs; } public static List<ApplicationInfo> getAllInstalledApplications(Context context) { return context.getPackageManager().getInstalledApplications(0); } public static boolean isSystem(PermissionApp app, ArraySet<String> launcherPkgs) { ApplicationInfo info = app.getAppInfo(); return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0 Loading