Allow passing the permission group name to PermissionUsageFragment.

PermissionUsageFragment can now take in the name of the permission
group instead of the name of the permission.  If both are passed, it
aborts if they are inconsistent.

Also fix a bug with restoring the saved permission filter.

Test: Open Permissions Hub with permission or group name.
Test: Verify Permissions Hub aborts with inconsistent permission and
group names.

Change-Id: I2d6cf802ecc8ba157a725976086866828c386a51
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
index fa762fa..16f7e62 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
@@ -33,6 +33,7 @@
 import com.android.packageinstaller.permission.ui.handheld.ManageStandardPermissionsFragment;
 import com.android.packageinstaller.permission.ui.handheld.PermissionUsageFragment;
 import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear;
+import com.android.packageinstaller.permission.utils.Utils;
 
 public final class ManagePermissionsActivity extends FragmentActivity {
     private static final String LOG_TAG = ManagePermissionsActivity.class.getSimpleName();
@@ -65,10 +66,28 @@
             case PermissionSearchIndexablesProvider.ACTION_REVIEW_PERMISSION_USAGE:
                 verifyIntent(this, getIntent());
                 // fall through
-            case Intent.ACTION_REVIEW_PERMISSION_USAGE:
+            case Intent.ACTION_REVIEW_PERMISSION_USAGE: {
                 permissionName = getIntent().getStringExtra(Intent.EXTRA_PERMISSION_NAME);
-                androidXFragment = PermissionUsageFragment.newInstance(permissionName);
-                break;
+                String groupName = getIntent().getStringExtra(Intent.EXTRA_PERMISSION_GROUP_NAME);
+
+                if (permissionName != null) {
+                    String permGroupName = Utils.getGroupOfPlatformPermission(permissionName);
+                    if (permGroupName == null) {
+                        Log.w(LOG_TAG, "Invalid platform permission: " + permissionName);
+                    }
+                    if (groupName != null && !groupName.equals(permGroupName)) {
+                        Log.i(LOG_TAG,
+                                "Inconsistent EXTRA_PERMISSION_NAME / EXTRA_PERMISSION_GROUP_NAME");
+                        finish();
+                        return;
+                    }
+                    if (groupName == null) {
+                        groupName = permGroupName;
+                    }
+                }
+
+                androidXFragment = PermissionUsageFragment.newInstance(groupName);
+            } break;
 
             case Intent.ACTION_MANAGE_APP_PERMISSIONS: {
                 String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/PermissionUsageFragment.java b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/PermissionUsageFragment.java
index b003dfb..0a06d2c 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/PermissionUsageFragment.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/PermissionUsageFragment.java
@@ -125,10 +125,10 @@
     private FilterSpinnerAdapter<SortItem> mSortAdapter;
 
     /**
-     * Only used to restore group selection state after onCreate. Once the first list of groups
-     * is reported, this becomes invalid.
+     * Only used to restore permission selection state or use the passed permission after onCreate.
+     * Once the first list of groups is reported, this becomes invalid.
      */
-    private String mSavedGroup;
+    private String mSavedGroupName;
 
     /**
      * Only used to restore time spinner state after onCreate. Once the list of times is reported,
@@ -145,11 +145,11 @@
     /**
      * @return A new fragment
      */
-    public static @NonNull PermissionUsageFragment newInstance(@Nullable String permissionName) {
+    public static @NonNull PermissionUsageFragment newInstance(@Nullable String groupName) {
         PermissionUsageFragment fragment = new PermissionUsageFragment();
         Bundle arguments = new Bundle();
-        if (permissionName != null) {
-            arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName);
+        if (groupName != null) {
+            arguments.putString(Intent.EXTRA_PERMISSION_GROUP_NAME, groupName);
         }
         fragment.setArguments(arguments);
         return fragment;
@@ -167,7 +167,7 @@
 
         if (savedInstanceState != null) {
             mShowSystem = savedInstanceState.getBoolean(SHOW_SYSTEM_KEY);
-            mSavedGroup = savedInstanceState.getString(PERMS_INDEX_KEY);
+            mSavedGroupName = savedInstanceState.getString(PERMS_INDEX_KEY);
             mSavedTimeSpinnerIndex = savedInstanceState.getInt(SPINNER_TIME_INDEX_KEY);
             mSavedSortSpinnerIndex = savedInstanceState.getInt(SPINNER_SORT_INDEX_KEY);
         }
@@ -179,6 +179,10 @@
             ab.setDisplayHomeAsUpEnabled(true);
         }
 
+        if (mSavedGroupName == null) {
+            mSavedGroupName = getArguments().getString(Intent.EXTRA_PERMISSION_GROUP_NAME);
+        }
+
         Context context = getPreferenceManager().getContext();
         mFilterGroup = null;
         mCollator = Collator.getInstance(
@@ -313,12 +317,13 @@
         }
 
         // Use the saved permission group or the one passed as an argument, if applicable.
-        mFilterGroup = mSavedGroup;
-        if (mFilterGroup == null) {
-            String permName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME);
-            mFilterGroup = Utils.getGroupOfPlatformPermission(permName);
-            if (mFilterGroup == null) {
-                Log.w(LOG_TAG, "Invalid platform permission: " + permName);
+        if (mSavedGroupName != null && mFilterGroup == null) {
+            List<AppPermissionGroup> groups = getOSPermissionGroups();
+            int numGroups = groups.size();
+            for (int i = 0; i < numGroups; i++) {
+                if (groups.get(i).getName().equals(mSavedGroupName)) {
+                    mFilterGroup = mSavedGroupName;
+                }
             }
         }