Merge "fix AppPermissionGroups to match AppPermission" into rvc-dev
diff --git a/res/layout-television/radio_button_preference_widget.xml b/res/layout-television/radio_button_preference_widget.xml
deleted file mode 100644
index 38bcc9f..0000000
--- a/res/layout-television/radio_button_preference_widget.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/checkbox"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="center"
-    android:focusable="false"
-    android:clickable="false" />
diff --git a/src/com/android/permissioncontroller/permission/data/PermissionListenerMultiplexer.kt b/src/com/android/permissioncontroller/permission/data/PermissionListenerMultiplexer.kt
index e6ed95d..d6d5323 100644
--- a/src/com/android/permissioncontroller/permission/data/PermissionListenerMultiplexer.kt
+++ b/src/com/android/permissioncontroller/permission/data/PermissionListenerMultiplexer.kt
@@ -35,7 +35,7 @@
     private val pm = app.applicationContext.packageManager
 
     override fun onPermissionsChanged(uid: Int) {
-        callbacks[uid]?.forEach { callback ->
+        callbacks[uid]?.toList()?.forEach { callback ->
             callback.onPermissionChange()
         }
     }
diff --git a/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
index 275e0d1..04336df 100644
--- a/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
+++ b/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
@@ -82,6 +82,13 @@
     public static final String EXTRA_RESULT_PERMISSION_RESULT = "com.android"
             + ".permissioncontroller.extra.PERMISSION_RESULT";
 
+    /**
+     * The requestCode used when we decide not to use this activity, but instead launch
+     * another activity in our place. When that activity finishes, we set it's result
+     * as our result and then finish.
+     */
+    private static final int PROXY_ACTIVITY_REQUEST_CODE = 5;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         if (DeviceUtils.isAuto(this)) {
@@ -139,8 +146,7 @@
                         || DeviceUtils.isWear(this)) {
                     Intent compatIntent = new Intent(this, AppPermissionActivity.class);
                     compatIntent.putExtras(getIntent().getExtras());
-                    startActivity(compatIntent);
-                    finish();
+                    startActivityForResult(compatIntent, PROXY_ACTIVITY_REQUEST_CODE);
                     return;
                 }
                 String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
@@ -321,4 +327,13 @@
         }
         return super.onOptionsItemSelected(item);
     }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == PROXY_ACTIVITY_REQUEST_CODE) {
+            setResult(resultCode, data);
+            finish();
+        }
+    }
 }
diff --git a/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java b/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java
index 6567e45..3181db4 100644
--- a/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java
+++ b/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java
@@ -16,6 +16,9 @@
 
 package com.android.permissioncontroller.permission.ui.auto;
 
+import static com.android.permissioncontroller.permission.ui.ManagePermissionsActivity.EXTRA_RESULT_PERMISSION_INTERACTED;
+import static com.android.permissioncontroller.permission.ui.ManagePermissionsActivity.EXTRA_RESULT_PERMISSION_RESULT;
+
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import android.app.Activity;
@@ -49,6 +52,7 @@
 import com.android.permissioncontroller.auto.AutoSettingsFrameFragment;
 import com.android.permissioncontroller.permission.model.AppPermissionGroup;
 import com.android.permissioncontroller.permission.model.Permission;
+import com.android.permissioncontroller.permission.ui.GrantPermissionsViewHandler;
 import com.android.permissioncontroller.permission.utils.LocationUtils;
 import com.android.permissioncontroller.permission.utils.PackageRemovalMonitor;
 import com.android.permissioncontroller.permission.utils.SafetyNetLogger;
@@ -138,17 +142,25 @@
         }
 
         setHeaderLabel(
-                getContext().getString(R.string.app_permission_title, mGroup.getFullLabel()));
+                requireContext().getString(R.string.app_permission_title, mGroup.getFullLabel()));
+    }
+
+    private void setResult(@GrantPermissionsViewHandler.Result int result) {
+        Intent intent = new Intent()
+                .putExtra(EXTRA_RESULT_PERMISSION_INTERACTED,
+                        requireArguments().getString(Intent.EXTRA_PERMISSION_GROUP_NAME))
+                .putExtra(EXTRA_RESULT_PERMISSION_RESULT, result);
+        requireActivity().setResult(Activity.RESULT_OK, intent);
     }
 
     private AppPermissionGroup getAppPermissionGroup() {
-        Activity activity = getActivity();
+        Activity activity = requireActivity();
         Context context = getPreferenceManager().getContext();
 
-        String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME);
-        String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_GROUP_NAME);
+        String packageName = requireArguments().getString(Intent.EXTRA_PACKAGE_NAME);
+        String groupName = requireArguments().getString(Intent.EXTRA_PERMISSION_GROUP_NAME);
         if (groupName == null) {
-            groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME);
+            groupName = requireArguments().getString(Intent.EXTRA_PERMISSION_NAME);
         }
         PackageItemInfo groupInfo = Utils.getGroupInfo(groupName, context);
         List<PermissionInfo> groupPermInfos = Utils.getGroupPermissionInfos(groupName, context);
@@ -156,7 +168,11 @@
             Log.i(LOG_TAG, "Illegal group: " + groupName);
             return null;
         }
-        UserHandle userHandle = getArguments().getParcelable(Intent.EXTRA_USER);
+        UserHandle userHandle = requireArguments().getParcelable(Intent.EXTRA_USER);
+        if (userHandle == null) {
+            Log.e(LOG_TAG, "User handle is null");
+            return null;
+        }
         PackageInfo packageInfo = AutoPermissionsUtils.getPackageInfo(activity, packageName,
                 userHandle);
         if (packageInfo == null) {
@@ -176,7 +192,7 @@
 
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
-        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(requireContext()));
     }
 
     @Override
@@ -185,29 +201,29 @@
 
         PreferenceScreen screen = getPreferenceScreen();
         screen.addPreference(
-                AutoPermissionsUtils.createHeaderPreference(getContext(),
+                AutoPermissionsUtils.createHeaderPreference(requireContext(),
                         mGroup.getApp().applicationInfo));
 
         // Add permissions selector preferences.
-        PreferenceGroup permissionSelector = new PreferenceCategory(getContext());
+        PreferenceGroup permissionSelector = new PreferenceCategory(requireContext());
         permissionSelector.setTitle(
-                getContext().getString(R.string.app_permission_header, mGroup.getFullLabel()));
+                getString(R.string.app_permission_header, mGroup.getFullLabel()));
         screen.addPreference(permissionSelector);
 
-        mAlwaysPermissionPreference = new SelectedPermissionPreference(getContext());
+        mAlwaysPermissionPreference = new SelectedPermissionPreference(requireContext());
         mAlwaysPermissionPreference.setTitle(R.string.app_permission_button_allow_always);
         permissionSelector.addPreference(mAlwaysPermissionPreference);
 
-        mForegroundOnlyPermissionPreference = new SelectedPermissionPreference(getContext());
+        mForegroundOnlyPermissionPreference = new SelectedPermissionPreference(requireContext());
         mForegroundOnlyPermissionPreference.setTitle(
                 R.string.app_permission_button_allow_foreground);
         permissionSelector.addPreference(mForegroundOnlyPermissionPreference);
 
-        mDenyPermissionPreference = new SelectedPermissionPreference(getContext());
+        mDenyPermissionPreference = new SelectedPermissionPreference(requireContext());
         mDenyPermissionPreference.setTitle(R.string.app_permission_button_deny);
         permissionSelector.addPreference(mDenyPermissionPreference);
 
-        mDetailsPreference = new AutoTwoTargetPreference(getContext());
+        mDetailsPreference = new AutoTwoTargetPreference(requireContext());
         screen.addPreference(mDetailsPreference);
     }
 
@@ -223,7 +239,7 @@
 
         // Get notified when the package is removed.
         String packageName = mGroup.getApp().packageName;
-        mPackageRemovalMonitor = new PackageRemovalMonitor(getContext(), packageName) {
+        mPackageRemovalMonitor = new PackageRemovalMonitor(requireContext(), packageName) {
             @Override
             public void onPackageRemoved() {
                 Log.w(LOG_TAG, packageName + " was uninstalled");
@@ -259,7 +275,7 @@
         }
 
         if (mPermissionChangeListener != null) {
-            getActivity().getPackageManager().removeOnPermissionsChangeListener(
+            requireActivity().getPackageManager().removeOnPermissionsChangeListener(
                     mPermissionChangeListener);
             mPermissionChangeListener = null;
         }
@@ -281,15 +297,20 @@
             setSelectedPermissionState(mDenyPermissionPreference);
         }
 
-        mAlwaysPermissionPreference.setOnPreferenceClickListener(
-                v -> requestChange(/* requestGrant= */true, CHANGE_BOTH));
+        mAlwaysPermissionPreference.setOnPreferenceClickListener(v -> {
+            setResult(GrantPermissionsViewHandler.GRANTED_ALWAYS);
+            return requestChange(/* requestGrant= */true, CHANGE_BOTH);
+        });
         mForegroundOnlyPermissionPreference.setOnPreferenceClickListener(v -> {
+            setResult(GrantPermissionsViewHandler.GRANTED_FOREGROUND_ONLY);
             requestChange(/* requestGrant= */false, CHANGE_BACKGROUND);
             requestChange(/* requestGrant= */true, CHANGE_FOREGROUND);
             return true;
         });
-        mDenyPermissionPreference.setOnPreferenceClickListener(
-                v -> requestChange(/* requestGrant= */ false, CHANGE_BOTH));
+        mDenyPermissionPreference.setOnPreferenceClickListener(v -> {
+            setResult(GrantPermissionsViewHandler.DENIED);
+            return requestChange(/* requestGrant= */ false, CHANGE_BOTH);
+        });
 
         // Set the allow and foreground-only button states appropriately.
         if (mGroup.hasPermissionWithBackgroundMode()) {
@@ -320,7 +341,7 @@
             }
 
             updateDetailForFixedByPolicyPermissionGroup();
-        } else if (Utils.areGroupPermissionsIndividuallyControlled(getContext(),
+        } else if (Utils.areGroupPermissionsIndividuallyControlled(requireContext(),
                 mGroup.getName())) {
             // If the permissions are individually controlled, also show a link to the page that
             // lets you control them.
@@ -454,9 +475,7 @@
     private void updateDetailForIndividuallyControlledPermissionGroup() {
         int revokedCount = 0;
         List<Permission> permissions = mGroup.getPermissions();
-        int permissionCount = permissions.size();
-        for (int i = 0; i < permissionCount; i++) {
-            Permission permission = permissions.get(i);
+        for (Permission permission : permissions) {
             if (!permission.isGrantedIncludingAppOp()) {
                 revokedCount++;
             }
@@ -465,13 +484,13 @@
         int resId;
         if (revokedCount == 0) {
             resId = R.string.permission_revoked_none;
-        } else if (revokedCount == permissionCount) {
+        } else if (revokedCount == permissions.size()) {
             resId = R.string.permission_revoked_all;
         } else {
             resId = R.string.permission_revoked_count;
         }
 
-        mDetailsPreference.setSummary(getContext().getString(resId, revokedCount));
+        mDetailsPreference.setSummary(getString(resId, revokedCount));
         mDetailsPreference.setVisible(true);
     }
 
@@ -570,7 +589,7 @@
     private void showAllPermissions(@NonNull String filterGroup) {
         Fragment frag = AutoAllAppPermissionsFragment.newInstance(mGroup.getApp().packageName,
                 filterGroup, UserHandle.getUserHandleForUid(mGroup.getApp().applicationInfo.uid));
-        getFragmentManager().beginTransaction()
+        requireFragmentManager().beginTransaction()
                 .replace(android.R.id.content, frag)
                 .addToBackStack("AllPerms")
                 .commit();
@@ -597,7 +616,7 @@
         if (LocationUtils.isLocationGroupAndProvider(getContext(), mGroup.getName(),
                 mGroup.getApp().packageName)) {
             LocationUtils.showLocationDialog(getContext(),
-                    Utils.getAppLabel(mGroup.getApp().applicationInfo, getContext()));
+                    Utils.getAppLabel(mGroup.getApp().applicationInfo, requireContext()));
 
             // The request was denied, so update the buttons.
             updateUi();
@@ -705,7 +724,7 @@
         DefaultDenyDialog defaultDenyDialog = new DefaultDenyDialog();
         defaultDenyDialog.setArguments(args);
         defaultDenyDialog.setTargetFragment(this, 0);
-        defaultDenyDialog.show(getFragmentManager().beginTransaction(),
+        defaultDenyDialog.show(requireFragmentManager().beginTransaction(),
                 DefaultDenyDialog.class.getName());
     }
 
@@ -716,7 +735,7 @@
      * @param changeTarget whether to change foreground, background, or both.
      * @see #showDefaultDenyDialog(int)
      */
-    void onDenyAnyWay(@ChangeTarget int changeTarget) {
+    private void onDenyAnyWay(@ChangeTarget int changeTarget) {
         boolean hasDefaultPermissions = false;
         if ((changeTarget & CHANGE_FOREGROUND) != 0) {
             if (mGroup.areRuntimePermissionsGranted()) {
@@ -775,16 +794,17 @@
         private static final String CHANGE_TARGET = DefaultDenyDialog.class.getName()
                 + ".arg.changeTarget";
 
+        @NonNull
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             AutoAppPermissionFragment fragment = (AutoAppPermissionFragment) getTargetFragment();
             return new AlertDialogBuilder(getContext())
-                    .setMessage(getArguments().getInt(MSG))
+                    .setMessage(requireArguments().getInt(MSG))
                     .setNegativeButton(R.string.cancel,
                             (dialog, which) -> fragment.updateUi())
                     .setPositiveButton(R.string.grant_dialog_button_deny_anyway,
                             (dialog, which) ->
-                                    fragment.onDenyAnyWay(getArguments().getInt(CHANGE_TARGET)))
+                                    fragment.onDenyAnyWay(requireArguments().getInt(CHANGE_TARGET)))
                     .create();
         }
     }
diff --git a/src/com/android/permissioncontroller/permission/ui/television/ManagePermissionsFragment.java b/src/com/android/permissioncontroller/permission/ui/television/ManagePermissionsFragment.java
index 7e15105..1f55c95 100644
--- a/src/com/android/permissioncontroller/permission/ui/television/ManagePermissionsFragment.java
+++ b/src/com/android/permissioncontroller/permission/ui/television/ManagePermissionsFragment.java
@@ -127,7 +127,7 @@
 
         // Use this to speed up getting the info for all of the PermissionApps below.
         // Create a new one for each refresh to make sure it has fresh data.
-        PmCache cache = new PmCache(getContext().getPackageManager());
+        PmCache cache = new PmCache(context.getPackageManager());
         for (PermissionGroup group : groups) {
             boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG);
 
diff --git a/src/com/android/permissioncontroller/permission/ui/television/RadioButtonPreference.java b/src/com/android/permissioncontroller/permission/ui/television/RadioButtonPreference.java
index df43931..0ee0ab1 100644
--- a/src/com/android/permissioncontroller/permission/ui/television/RadioButtonPreference.java
+++ b/src/com/android/permissioncontroller/permission/ui/television/RadioButtonPreference.java
@@ -40,7 +40,7 @@
     @Override
     public void onBindViewHolder(PreferenceViewHolder viewHolder) {
         super.onBindViewHolder(viewHolder);
-        final RadioButton rb = (RadioButton) viewHolder.findViewById(android.R.id.checkbox);
+        final RadioButton rb = (RadioButton) viewHolder.findViewById(R.id.radio_button);
         rb.setChecked(mIsChecked);
         mViewHolder = viewHolder;
     }
@@ -54,7 +54,8 @@
     public void setChecked(boolean isChecked) {
         mIsChecked = isChecked;
         if (mViewHolder != null) {
-            ((RadioButton) mViewHolder.findViewById(android.R.id.checkbox)).setChecked(mIsChecked);
+            ((RadioButton) mViewHolder.findViewById(R.id.radio_button))
+                    .setChecked(mIsChecked);
         }
     }
 }
diff --git a/src/com/android/permissioncontroller/role/ui/handheld/FooterPreference.java b/src/com/android/permissioncontroller/role/ui/handheld/FooterPreference.java
index 65e4d41..73d93d4 100644
--- a/src/com/android/permissioncontroller/role/ui/handheld/FooterPreference.java
+++ b/src/com/android/permissioncontroller/role/ui/handheld/FooterPreference.java
@@ -79,6 +79,9 @@
         holder.setDividerAllowedAbove(true);
 
         View iconFrame = holder.findViewById(R.id.icon_frame);
+        if (iconFrame == null) {
+            iconFrame = holder.findViewById(android.R.id.icon_frame);
+        }
         LinearLayout.LayoutParams iconFrameLayoutParams = (LinearLayout.LayoutParams)
                 iconFrame.getLayoutParams();
         iconFrameLayoutParams.gravity = Gravity.TOP;