From 32c4cb1558a9446d538ab1db9647d355ba85a6bd Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Thu, 20 Aug 2015 08:17:59 -0700 Subject: 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: Iffd0f4fd7df04aeece3995290a7798a559430304 --- .../permission/model/AppPermissions.java | 58 +++++++++++----------- .../permission/ui/GrantPermissionsActivity.java | 18 ++++--- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/com/android/packageinstaller/permission/model/AppPermissions.java b/src/com/android/packageinstaller/permission/model/AppPermissions.java index bca06c0c..125a6bd8 100644 --- a/src/com/android/packageinstaller/permission/model/AppPermissions.java +++ b/src/com/android/packageinstaller/permission/model/AppPermissions.java @@ -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 mGroups = new ArrayList<>(); - private final ArrayMap mNameToGroupMap = new ArrayMap<>(); + private final LinkedHashMap 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 (hasGroupForPermission(requestedPerm)) { - continue; - } - - AppPermissionGroup group = AppPermissionGroup.create(mContext, - mPackageInfo, requestedPerm); - if (group == null) { - continue; - } + if (mFilterPermissions != null) { + for (String filterPermission : mFilterPermissions) { + for (String requestedPerm : mPackageInfo.requestedPermissions) { + if (!filterPermission.equals(requestedPerm)) { + continue; + } - mGroups.add(group); - } + if (hasGroupForPermission(requestedPerm)) { + break; + } - 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; + AppPermissionGroup group = AppPermissionGroup.create(mContext, + mPackageInfo, requestedPerm); + if (group == null) { break; } + + mGroups.add(group); + 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); } } diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java index a61432e3..0c087350 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java @@ -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 mRequestGrantPermissionGroups = new ArrayMap<>(); + private LinkedHashMap mRequestGrantPermissionGroups = new LinkedHashMap<>(); private GrantPermissionsViewHandler mViewHandler; private AppPermissions mAppPermissions; @@ -187,8 +187,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( @@ -215,11 +215,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; + return true; } + + currentIndex++; } return false; @@ -359,8 +361,8 @@ public class GrantPermissionsActivity extends OverlayTouchActivity final int groupCount = mRequestGrantPermissionGroups.size(); List 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); -- cgit v1.2.3