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() {