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

Commit 8dcea3bf authored by Svet Ganov's avatar Svet Ganov Committed by Jeff Sharkey
Browse files

Show multi-permission UI in the requested order.

Apps can request several permissions at once but the UI was
not shown in the request order. This is problematic since
apps may show on board UI stating which permissions will be
requested.

Bug: 23314383
Change-Id: I0c59a741fb09e63bead0f76d4d337769d2dff387
parent 9b724fd6
Loading
Loading
Loading
Loading
+30 −28
Original line number Diff line number Diff line
@@ -19,18 +19,16 @@ package com.android.packageinstaller.permission.model;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.ArrayMap;

import com.android.internal.util.ArrayUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;

public final class AppPermissions {
    private final ArrayList<AppPermissionGroup> mGroups = new ArrayList<>();

    private final ArrayMap<String, AppPermissionGroup> mNameToGroupMap = new ArrayMap<>();
    private final LinkedHashMap<String, AppPermissionGroup> mNameToGroupMap = new LinkedHashMap<>();

    private final Context mContext;

@@ -95,36 +93,40 @@ public final class AppPermissions {
            return;
        }

        for (int i = 0; i < mPackageInfo.requestedPermissions.length; i++) {
            String requestedPerm = mPackageInfo.requestedPermissions[i];
        if (mFilterPermissions != null) {
            for (String filterPermission : mFilterPermissions) {
                for (String requestedPerm : mPackageInfo.requestedPermissions) {
                    if (!filterPermission.equals(requestedPerm)) {
                        continue;
                    }

                    if (hasGroupForPermission(requestedPerm)) {
                continue;
                        break;
                    }

                    AppPermissionGroup group = AppPermissionGroup.create(mContext,
                            mPackageInfo, requestedPerm);
                    if (group == null) {
                continue;
                        break;
                    }

                    mGroups.add(group);
        }

        if (!ArrayUtils.isEmpty(mFilterPermissions)) {
            final int groupCount = mGroups.size();
            for (int i = groupCount - 1; i >= 0; i--) {
                AppPermissionGroup group = mGroups.get(i);
                boolean groupHasPermission = false;
                for (String filterPerm : mFilterPermissions) {
                    if (group.hasPermission(filterPerm)) {
                        groupHasPermission = true;
                    break;
                }
            }
                if (!groupHasPermission) {
                    mGroups.remove(i);
        } else {
            for (String requestedPerm : mPackageInfo.requestedPermissions) {
                if (hasGroupForPermission(requestedPerm)) {
                    continue;
                }

                AppPermissionGroup group = AppPermissionGroup.create(mContext,
                        mPackageInfo, requestedPerm);
                if (group == null) {
                    continue;
                }

                mGroups.add(group);
            }
        }

+10 −8
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import android.hardware.camera2.utils.ArrayUtils;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.ArrayMap;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -47,6 +46,7 @@ import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import com.android.packageinstaller.permission.utils.Utils;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class GrantPermissionsActivity extends OverlayTouchActivity
@@ -57,7 +57,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
    private String[] mRequestedPermissions;
    private int[] mGrantResults;

    private ArrayMap<String, GroupState> mRequestGrantPermissionGroups = new ArrayMap<>();
    private LinkedHashMap<String, GroupState> mRequestGrantPermissionGroups = new LinkedHashMap<>();

    private GrantPermissionsViewHandler mViewHandler;
    private AppPermissions mAppPermissions;
@@ -178,8 +178,8 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
    private boolean showNextPermissionGroupGrantRequest() {
        final int groupCount = mRequestGrantPermissionGroups.size();

        for (int i = 0; i < groupCount; i++) {
            GroupState groupState = mRequestGrantPermissionGroups.valueAt(i);
        int currentIndex = 0;
        for (GroupState groupState : mRequestGrantPermissionGroups.values()) {
            if (groupState.mState == GroupState.STATE_UNKNOWN) {
                CharSequence appLabel = mAppPermissions.getAppLabel();
                SpannableString message = new SpannableString(getString(
@@ -206,11 +206,13 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
                }
                int icon = groupState.mGroup.getIconResId();

                mViewHandler.updateUi(groupState.mGroup.getName(), groupCount, i,
                mViewHandler.updateUi(groupState.mGroup.getName(), groupCount, currentIndex,
                        Icon.createWithResource(resources, icon), message,
                        groupState.mGroup.isUserSet());
                return true;
            }

            currentIndex++;
        }

        return false;
@@ -350,8 +352,8 @@ public class GrantPermissionsActivity extends OverlayTouchActivity

        final int groupCount = mRequestGrantPermissionGroups.size();
        List<AppPermissionGroup> groups = new ArrayList<>(groupCount);
        for (int i = 0; i < groupCount; i++) {
            groups.add(mRequestGrantPermissionGroups.valueAt(i).mGroup);
        for (GroupState groupState : mRequestGrantPermissionGroups.values()) {
            groups.add(groupState.mGroup);
        }

        SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups);