summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinod Krishnan <vinodkrishnan@google.com>2015-09-14 22:31:48 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-09-14 22:31:48 +0000
commitc4d25fecbc7c8a2f7ad7e0a3ca134af583b88f62 (patch)
tree98bfb33bc5217327eebfa2b4f8170d54084b2886
parent2892267a4af48358f3858bb19b27a89b570bf88e (diff)
parente9c8c7b2942514e566cd02fbf58cb31ab917a72d (diff)
downloadandroid_packages_apps_PackageInstaller-c4d25fecbc7c8a2f7ad7e0a3ca134af583b88f62.tar.gz
android_packages_apps_PackageInstaller-c4d25fecbc7c8a2f7ad7e0a3ca134af583b88f62.tar.bz2
android_packages_apps_PackageInstaller-c4d25fecbc7c8a2f7ad7e0a3ca134af583b88f62.zip
am e9c8c7b2: Merge "Add an API for getting list of all apps that have runtime perms" into cw-e-dev
* commit 'e9c8c7b2942514e566cd02fbf58cb31ab917a72d': Add an API for getting list of all apps that have runtime perms
-rw-r--r--AndroidManifest.xml1
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java92
-rw-r--r--src/com/android/packageinstaller/permission/utils/Utils.java6
3 files changed, 78 insertions, 21 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bfa98483..59c49f59 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -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>
diff --git a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
index 7bae18f3..bd0f7ba0 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
@@ -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;
@@ -30,37 +31,52 @@ 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) {
- int[] counts = new int[3];
- ArrayList<CharSequence> grantedGroups = new ArrayList<>();
- boolean succeeded = false;
+ 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);
- boolean isForPackage = intent.hasExtra(Intent.EXTRA_PACKAGE_NAME);
+ int[] counts = new int[3];
+ ArrayList<CharSequence> grantedGroups = new ArrayList<>();
+ boolean succeeded = false;
- 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);
- } else {
- succeeded = getAppsWithPermissionsCount(context, counts);
- }
- if (succeeded) {
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts);
+ boolean isForPackage = intent.hasExtra(Intent.EXTRA_PACKAGE_NAME);
if (isForPackage) {
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT,
- grantedGroups.toArray(new CharSequence[grantedGroups.size()]));
+ String pkg = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+ succeeded = getPermissionsCount(context, pkg, counts, grantedGroups);
+ } else {
+ succeeded = getAppsWithPermissionsCount(context, counts);
}
- }
+ if (succeeded) {
+ responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts);
- context.sendBroadcast(responseIntent);
+ if (isForPackage) {
+ responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT,
+ 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,
@@ -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.
diff --git a/src/com/android/packageinstaller/permission/utils/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java
index 7ff5c965..2cc5d8aa 100644
--- a/src/com/android/packageinstaller/permission/utils/Utils.java
+++ b/src/com/android/packageinstaller/permission/utils/Utils.java
@@ -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";
@@ -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