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

Commit 3d908f2f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Optimize loading permission usages." into qt-dev

parents dd8da4b2 7ce91309
Loading
Loading
Loading
Loading
+40 −22
Original line number Diff line number Diff line
@@ -184,6 +184,31 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
     */
    public static AppPermissionGroup create(Context context, PackageInfo packageInfo,
            PackageItemInfo groupInfo, List<PermissionInfo> permissionInfos, boolean delayChanges) {
        PackageManager packageManager = context.getPackageManager();
        CharSequence groupLabel = groupInfo.loadLabel(packageManager);
        CharSequence fullGroupLabel = groupInfo.loadSafeLabel(packageManager, 0,
                TextUtils.SAFE_STRING_FLAG_TRIM | TextUtils.SAFE_STRING_FLAG_FIRST_LINE);
        return create(context, packageInfo, groupInfo, permissionInfos, groupLabel,
                fullGroupLabel, delayChanges);
    }

    /**
     * Create the app permission group.
     *
     * @param context the {@code Context} to retrieve system services.
     * @param packageInfo package information about the app.
     * @param groupInfo the information about the group created.
     * @param permissionInfos the information about the permissions belonging to the group.
     * @param groupLabel the label of the group.
     * @param fullGroupLabel the untruncated label of the group.
     * @param delayChanges whether to delay changes until {@link #persistChanges} is called.
     *
     * @return the AppPermissionGroup.
     */
    public static AppPermissionGroup create(Context context, PackageInfo packageInfo,
            PackageItemInfo groupInfo, List<PermissionInfo> permissionInfos,
            CharSequence groupLabel, CharSequence fullGroupLabel, boolean delayChanges) {
        PackageManager packageManager = context.getPackageManager();
        UserHandle userHandle = UserHandle.getUserHandleForUid(packageInfo.applicationInfo.uid);

        if (groupInfo instanceof PermissionInfo) {
@@ -195,20 +220,14 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
            return null;
        }

        CharSequence groupLabel = groupInfo.loadLabel(context.getPackageManager());
        String[] permissionNames = new String[permissionInfos.size()];
        int numPermissionInfos = permissionInfos.size();
        for (int i = 0; i < numPermissionInfos; i++) {
            permissionNames[i] = permissionInfos.get(i).name;
        }
        CharSequence fullGroupLabel = groupInfo.loadSafeLabel(context.getPackageManager(), 0,
                TextUtils.SAFE_STRING_FLAG_TRIM | TextUtils.SAFE_STRING_FLAG_FIRST_LINE);
        AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);

        AppPermissionGroup group = new AppPermissionGroup(context, packageInfo, groupInfo.name,
                groupInfo.packageName, groupLabel, fullGroupLabel,
                loadGroupDescription(context, groupInfo), getRequest(groupInfo),
                loadGroupDescription(context, groupInfo, packageManager), getRequest(groupInfo),
                getRequestDetail(groupInfo), getBackgroundRequest(groupInfo),
                getBackgroundRequestDetail(groupInfo), groupInfo.packageName, groupInfo.icon,
                userHandle, delayChanges);
                userHandle, delayChanges, appOpsManager);

        // Parse and create permissions reqested by the app
        ArrayMap<String, Permission> allPermissions = new ArrayMap<>();
@@ -253,12 +272,12 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
            if (appOp == null) {
                appOpAllowed = false;
            } else {
                int appOpsMode = context.getSystemService(AppOpsManager.class).unsafeCheckOpRaw(
                        appOp, packageInfo.applicationInfo.uid, packageName);
                int appOpsMode = appOpsManager.unsafeCheckOpRaw(appOp,
                        packageInfo.applicationInfo.uid, packageName);
                appOpAllowed = appOpsMode == MODE_ALLOWED || appOpsMode == MODE_FOREGROUND;
            }

            final int flags = context.getPackageManager().getPermissionFlags(
            final int flags = packageManager.getPermissionFlags(
                    requestedPermission, packageName, userHandle);

            Permission permission = new Permission(requestedPermission, requestedPermissionInfo,
@@ -313,7 +332,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
                            group.getRequest(), group.getRequestDetail(),
                            group.getBackgroundRequest(), group.getBackgroundRequestDetail(),
                            group.getIconPkg(), group.getIconResId(), group.getUser(),
                            delayChanges);
                            delayChanges, appOpsManager);
                }

                group.getBackgroundPermissions().addPermission(permission);
@@ -352,14 +371,13 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
        }
    }

    private static CharSequence loadGroupDescription(Context context, PackageItemInfo group) {
    private static CharSequence loadGroupDescription(Context context, PackageItemInfo group,
                                                     @NonNull PackageManager packageManager) {
        CharSequence description = null;
        if (group instanceof PermissionGroupInfo) {
            description = ((PermissionGroupInfo) group).loadDescription(
                    context.getPackageManager());
            description = ((PermissionGroupInfo) group).loadDescription(packageManager);
        } else if (group instanceof PermissionInfo) {
            description = ((PermissionInfo) group).loadDescription(
                    context.getPackageManager());
            description = ((PermissionInfo) group).loadDescription(packageManager);
        }

        if (description == null || description.length() <= 0) {
@@ -373,8 +391,8 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
            String declaringPackage, CharSequence label, CharSequence fullLabel,
            CharSequence description, @StringRes int request, @StringRes int requestDetail,
            @StringRes int backgroundRequest, @StringRes int backgroundRequestDetail,
            String iconPkg, int iconResId,
            UserHandle userHandle, boolean delayChanges) {
            String iconPkg, int iconResId, UserHandle userHandle, boolean delayChanges,
            @NonNull AppOpsManager appOpsManager) {
        int targetSDK = packageInfo.applicationInfo.targetSdkVersion;

        mContext = context;
@@ -383,7 +401,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
        mPackageInfo = packageInfo;
        mAppSupportsRuntimePermissions = targetSDK > Build.VERSION_CODES.LOLLIPOP_MR1;
        mIsEphemeralApp = packageInfo.applicationInfo.isInstantApp();
        mAppOps = context.getSystemService(AppOpsManager.class);
        mAppOps = appOpsManager;
        mActivityManager = context.getSystemService(ActivityManager.class);
        mDeclaringPackage = declaringPackage;
        mName = name;
+18 −12
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
@@ -210,6 +211,21 @@ public class PermissionApps {
        if (groupPermInfos == null) {
            return Collections.emptyList();
        }
        List<PermissionInfo> targetPermInfos = new ArrayList<PermissionInfo>(groupPermInfos.size());
        for (int i = 0; i < groupPermInfos.size(); i++) {
            PermissionInfo permInfo = groupPermInfos.get(i);
            if ((permInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                    == PermissionInfo.PROTECTION_DANGEROUS
                    && (permInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0
                    && (permInfo.flags & PermissionInfo.FLAG_REMOVED) == 0) {
                targetPermInfos.add(permInfo);
            }
        }

        PackageManager packageManager = mContext.getPackageManager();
        CharSequence groupLabel = groupInfo.loadLabel(packageManager);
        CharSequence fullGroupLabel = groupInfo.loadSafeLabel(packageManager, 0,
                TextUtils.SAFE_STRING_FLAG_TRIM | TextUtils.SAFE_STRING_FLAG_FIRST_LINE);

        ArrayList<PermissionApp> permApps = new ArrayList<>();

@@ -228,7 +244,7 @@ public class PermissionApps {

                    PermissionInfo requestedPermissionInfo = null;

                    for (PermissionInfo groupPermInfo : groupPermInfos) {
                    for (PermissionInfo groupPermInfo : targetPermInfos) {
                        if (requestedPerm.equals(groupPermInfo.name)) {
                            requestedPermissionInfo = groupPermInfo;
                            break;
@@ -239,18 +255,8 @@ public class PermissionApps {
                        continue;
                    }

                    if ((requestedPermissionInfo.protectionLevel
                                & PermissionInfo.PROTECTION_MASK_BASE)
                                    != PermissionInfo.PROTECTION_DANGEROUS
                            || (requestedPermissionInfo.flags
                                & PermissionInfo.FLAG_INSTALLED) == 0
                            || (requestedPermissionInfo.flags
                                & PermissionInfo.FLAG_REMOVED) != 0) {
                        continue;
                    }

                    AppPermissionGroup group = AppPermissionGroup.create(mContext,
                            app, groupInfo, groupPermInfos, false);
                            app, groupInfo, groupPermInfos, groupLabel, fullGroupLabel, false);

                    if (group == null) {
                        continue;