diff --git a/src/com/android/packageinstaller/permission/model/AppPermissions.java b/src/com/android/packageinstaller/permission/model/AppPermissions.java
index 125a6bd..bca06c0 100644
--- a/src/com/android/packageinstaller/permission/model/AppPermissions.java
+++ b/src/com/android/packageinstaller/permission/model/AppPermissions.java
@@ -19,16 +19,18 @@
 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 LinkedHashMap<String, AppPermissionGroup> mNameToGroupMap = new LinkedHashMap<>();
+    private final ArrayMap<String, AppPermissionGroup> mNameToGroupMap = new ArrayMap<>();
 
     private final Context mContext;
 
@@ -93,40 +95,36 @@
             return;
         }
 
-        if (mFilterPermissions != null) {
-            for (String filterPermission : mFilterPermissions) {
-                for (String requestedPerm : mPackageInfo.requestedPermissions) {
-                    if (!filterPermission.equals(requestedPerm)) {
-                        continue;
-                    }
+        for (int i = 0; i < mPackageInfo.requestedPermissions.length; i++) {
+            String requestedPerm = mPackageInfo.requestedPermissions[i];
 
-                    if (hasGroupForPermission(requestedPerm)) {
-                        break;
-                    }
-
-                    AppPermissionGroup group = AppPermissionGroup.create(mContext,
-                            mPackageInfo, requestedPerm);
-                    if (group == null) {
-                        break;
-                    }
-
-                    mGroups.add(group);
-                    break;
-                }
+            if (hasGroupForPermission(requestedPerm)) {
+                continue;
             }
-        } else {
-            for (String requestedPerm : mPackageInfo.requestedPermissions) {
-                if (hasGroupForPermission(requestedPerm)) {
-                    continue;
-                }
 
-                AppPermissionGroup group = AppPermissionGroup.create(mContext,
-                        mPackageInfo, requestedPerm);
-                if (group == null) {
-                    continue;
-                }
+            AppPermissionGroup group = AppPermissionGroup.create(mContext,
+                    mPackageInfo, requestedPerm);
+            if (group == null) {
+                continue;
+            }
 
-                mGroups.add(group);
+            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);
+                }
             }
         }
 
diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
index 0c08735..a61432e 100644
--- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
+++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
@@ -31,6 +31,7 @@
 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;
@@ -46,7 +47,6 @@
 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 @@
     private String[] mRequestedPermissions;
     private int[] mGrantResults;
 
-    private LinkedHashMap<String, GroupState> mRequestGrantPermissionGroups = new LinkedHashMap<>();
+    private ArrayMap<String, GroupState> mRequestGrantPermissionGroups = new ArrayMap<>();
 
     private GrantPermissionsViewHandler mViewHandler;
     private AppPermissions mAppPermissions;
@@ -187,8 +187,8 @@
     private boolean showNextPermissionGroupGrantRequest() {
         final int groupCount = mRequestGrantPermissionGroups.size();
 
-        int currentIndex = 0;
-        for (GroupState groupState : mRequestGrantPermissionGroups.values()) {
+        for (int i = 0; i < groupCount; i++) {
+            GroupState groupState = mRequestGrantPermissionGroups.valueAt(i);
             if (groupState.mState == GroupState.STATE_UNKNOWN) {
                 CharSequence appLabel = mAppPermissions.getAppLabel();
                 SpannableString message = new SpannableString(getString(
@@ -215,13 +215,11 @@
                 }
                 int icon = groupState.mGroup.getIconResId();
 
-                mViewHandler.updateUi(groupState.mGroup.getName(), groupCount, currentIndex,
+                mViewHandler.updateUi(groupState.mGroup.getName(), groupCount, i,
                         Icon.createWithResource(resources, icon), message,
                         groupState.mGroup.isUserSet());
-                return true;
+                return  true;
             }
-
-            currentIndex++;
         }
 
         return false;
@@ -361,8 +359,8 @@
 
         final int groupCount = mRequestGrantPermissionGroups.size();
         List<AppPermissionGroup> groups = new ArrayList<>(groupCount);
-        for (GroupState groupState : mRequestGrantPermissionGroups.values()) {
-            groups.add(groupState.mGroup);
+        for (int i = 0; i < groupCount; i++) {
+            groups.add(mRequestGrantPermissionGroups.valueAt(i).mGroup);
         }
 
         SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups);
