Respect permission request order.
Show permission accept dialogs in the order of which
the developer requested the permissions.
bug:21559824
Change-Id: I2a8f459252b31440707c6d8ffb3766e8ab6e0031
diff --git a/PermissionController/src/com/android/packageinstaller/permission/model/AppPermissions.java b/PermissionController/src/com/android/packageinstaller/permission/model/AppPermissions.java
index 1701477..bca06c0 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/model/AppPermissions.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/model/AppPermissions.java
@@ -28,7 +28,9 @@
import java.util.List;
public final class AppPermissions {
- private final ArrayMap<String, AppPermissionGroup> mGroups = new ArrayMap<>();
+ private final ArrayList<AppPermissionGroup> mGroups = new ArrayList<>();
+
+ private final ArrayMap<String, AppPermissionGroup> mNameToGroupMap = new ArrayMap<>();
private final Context mContext;
@@ -38,14 +40,17 @@
private final Runnable mOnErrorCallback;
+ private final boolean mSortGroups;
+
private PackageInfo mPackageInfo;
public AppPermissions(Context context, PackageInfo packageInfo, String[] permissions,
- Runnable onErrorCallback) {
+ boolean sortGroups, Runnable onErrorCallback) {
mContext = context;
mPackageInfo = packageInfo;
mFilterPermissions = permissions;
mAppLabel = packageInfo.applicationInfo.loadLabel(context.getPackageManager());
+ mSortGroups = sortGroups;
mOnErrorCallback = onErrorCallback;
loadPermissionGroups();
}
@@ -64,11 +69,11 @@
}
public AppPermissionGroup getPermissionGroup(String name) {
- return mGroups.get(name);
+ return mNameToGroupMap.get(name);
}
public List<AppPermissionGroup> getPermissionGroups() {
- return new ArrayList<>(mGroups.values());
+ return mGroups;
}
@@ -84,7 +89,7 @@
}
private void loadPermissionGroups() {
- List<AppPermissionGroup> groups = new ArrayList<>();
+ mGroups.clear();
if (mPackageInfo.requestedPermissions == null) {
return;
@@ -93,7 +98,7 @@
for (int i = 0; i < mPackageInfo.requestedPermissions.length; i++) {
String requestedPerm = mPackageInfo.requestedPermissions[i];
- if (hasGroupForPermission(requestedPerm, groups)) {
+ if (hasGroupForPermission(requestedPerm)) {
continue;
}
@@ -103,13 +108,13 @@
continue;
}
- groups.add(group);
+ mGroups.add(group);
}
if (!ArrayUtils.isEmpty(mFilterPermissions)) {
- final int groupCount = groups.size();
+ final int groupCount = mGroups.size();
for (int i = groupCount - 1; i >= 0; i--) {
- AppPermissionGroup group = groups.get(i);
+ AppPermissionGroup group = mGroups.get(i);
boolean groupHasPermission = false;
for (String filterPerm : mFilterPermissions) {
if (group.hasPermission(filterPerm)) {
@@ -118,22 +123,23 @@
}
}
if (!groupHasPermission) {
- groups.remove(i);
+ mGroups.remove(i);
}
}
}
- Collections.sort(groups);
+ if (mSortGroups) {
+ Collections.sort(mGroups);
+ }
- mGroups.clear();
- for (AppPermissionGroup group : groups) {
- mGroups.put(group.getName(), group);
+ mNameToGroupMap.clear();
+ for (AppPermissionGroup group : mGroups) {
+ mNameToGroupMap.put(group.getName(), group);
}
}
- private static boolean hasGroupForPermission(String permission,
- List<AppPermissionGroup> groups) {
- for (AppPermissionGroup group : groups) {
+ private boolean hasGroupForPermission(String permission) {
+ for (AppPermissionGroup group : mGroups) {
if (group.hasPermission(permission)) {
return true;
}
diff --git a/PermissionController/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java b/PermissionController/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
index f84a075..c1a68ab 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
@@ -51,7 +51,7 @@
PackageInfo packageInfo =
context.getPackageManager().getPackageInfo(pkg, PackageManager.GET_PERMISSIONS);
AppPermissions appPermissions =
- new AppPermissions(context, packageInfo, null, null);
+ new AppPermissions(context, packageInfo, null, false, null);
int grantedCount = 0;
int totalCount = 0;
for (AppPermissionGroup group : appPermissions.getPermissionGroups()) {
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java b/PermissionController/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
index 50aa2af..e83641f 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
@@ -186,7 +186,8 @@
breadcrumbView.setText(label);
}
- mAppPermissions = new AppPermissions(activity, packageInfo, null, new Runnable() {
+ mAppPermissions = new AppPermissions(activity, packageInfo, null, true,
+ new Runnable() {
@Override
public void run() {
getActivity().finish();
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
index fca3d13..7d516b2 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
@@ -99,7 +99,7 @@
return;
}
- mAppPermissions = new AppPermissions(this, callingPackageInfo, mRequestedPermissions,
+ mAppPermissions = new AppPermissions(this, callingPackageInfo, mRequestedPermissions, false,
new Runnable() {
@Override
public void run() {