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

Commit c4d25fec authored by Vinod Krishnan's avatar Vinod Krishnan Committed by Android Git Automerger
Browse files

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

* commit 'e9c8c7b2':
  Add an API for getting list of all apps that have runtime perms
parents 2892267a e9c8c7b2
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