Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9c8c7b2 authored by Vinod Krishnan's avatar Vinod Krishnan Committed by Android (Google) Code Review
Browse files

Merge "Add an API for getting list of all apps that have runtime perms" into cw-e-dev

parents 03dc824d 94df7bf7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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>

+71 −21
Original line number Diff line number Diff line
@@ -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,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);
@@ -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) {
@@ -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.
+6 −0
Original line number Diff line number Diff line
@@ -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