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;