From fd02606476660e030c090fb6a83b198ec8e63c1d Mon Sep 17 00:00:00 2001 From: Priyanka Advani Date: Mon, 18 Mar 2024 21:11:34 +0000 Subject: Revert "Conditionally show permission grant dialog on a remote device" This reverts commit 7903df8875d9cac7b7ea5fe673127460fa3af1c1. Reason for revert: Droid-monitor created revert for breakages in b/330213318. Will be verifying through ABTD before submission. Change-Id: Ia257fb5b6e8a2ac7484f51b63eda412bc339a77b --- PermissionController/AndroidManifest.xml | 7 -- PermissionController/res/values/strings.xml | 6 - .../permission/data/LightPackageInfoLiveData.kt | 2 +- .../permission/ui/GrantPermissionsActivity.java | 95 ++++++--------- .../ui/PermissionDialogStreamingBlockedActivity.kt | 44 ------- .../permission/utils/MultiDeviceUtils.kt | 29 +---- flags/flags.aconfig | 8 ++ tests/cts/permissionmultidevice/AndroidTest.xml | 7 ++ .../permissionmultidevice/cts/PermissionUtils.kt | 15 +-- .../cts/DeviceAwarePermissionGrantTest.kt | 127 +++++++++------------ 10 files changed, 117 insertions(+), 223 deletions(-) delete mode 100644 PermissionController/src/com/android/permissioncontroller/permission/ui/PermissionDialogStreamingBlockedActivity.kt diff --git a/PermissionController/AndroidManifest.xml b/PermissionController/AndroidManifest.xml index a0f7563bd..4bd7720d0 100644 --- a/PermissionController/AndroidManifest.xml +++ b/PermissionController/AndroidManifest.xml @@ -283,13 +283,6 @@ - - - %4$s to upload a bug repo - - - Permission request suppressed - - - This app is requesting additional permissions, but permissions can’t be granted in a streaming session. Grant the permission on your phone first. diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/LightPackageInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/LightPackageInfoLiveData.kt index f97cbed65..ef0a36583 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/data/LightPackageInfoLiveData.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/data/LightPackageInfoLiveData.kt @@ -233,7 +233,7 @@ private constructor( val deviceContext = ContextCompat.createDeviceContext(app, deviceId) for ((idx, permName) in requestedPermissions.withIndex()) { - if (isPermissionDeviceAware(deviceContext, deviceId, permName)) { + if (isPermissionDeviceAware(permName)) { val result = deviceContext.checkPermission(permName, -1, uid) if (result == PackageManager.PERMISSION_GRANTED) { diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java index ee4318bf0..4fd62dc05 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission_group.LOCATION; import static android.Manifest.permission_group.READ_MEDIA_VISUAL; +import static android.content.Intent.getIntent; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; @@ -36,7 +37,6 @@ import static com.android.permissioncontroller.permission.ui.GrantPermissionsVie import static com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.APP_PERMISSION_REQUEST_CODE; import static com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.ECM_REQUEST_CODE; import static com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.PHOTO_PICKER_REQUEST_CODE; -import static com.android.permissioncontroller.permission.utils.MultiDeviceUtils.isDeviceAwarePermissionSupported; import static com.android.permissioncontroller.permission.utils.Utils.getRequestMessage; import android.Manifest; @@ -50,6 +50,7 @@ import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Icon; +import android.os.Build; import android.os.Bundle; import android.os.Process; import android.permission.flags.Flags; @@ -67,8 +68,6 @@ import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.GuardedBy; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -223,16 +222,6 @@ public class GrantPermissionsActivity extends SettingsActivity /** Which device the permission will affect. Default is the primary device. */ private int mTargetDeviceId = ContextCompat.DEVICE_ID_DEFAULT; - private ActivityResultLauncher mShowWarningDialog = - registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), - result -> { - int resultCode = result.getResultCode(); - if (resultCode == RESULT_OK) { - finishAfterTransition(); - } - }); - @Override public void onCreate(Bundle icicle) { if (DeviceUtils.isAuto(this)) { @@ -252,6 +241,7 @@ public class GrantPermissionsActivity extends SettingsActivity getWindow().addFlags(FLAG_ALT_FOCUSABLE_IM); } + int permissionsSdkLevel; if (PackageManager.ACTION_REQUEST_PERMISSIONS_FOR_OTHER.equals(getIntent().getAction())) { mIsSystemTriggered = true; mTargetPackage = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME); @@ -261,6 +251,9 @@ public class GrantPermissionsActivity extends SettingsActivity finishAfterTransition(); return; } + // We don't want to do any filtering in this case. + // These calls are coming from the system on behalf of the app. + permissionsSdkLevel = Build.VERSION_CODES.CUR_DEVELOPMENT; } else { // Cache this as this can only read on onCreate, not later. mTargetPackage = getCallingPackage(); @@ -272,6 +265,7 @@ public class GrantPermissionsActivity extends SettingsActivity } try { PackageInfo packageInfo = getPackageManager().getPackageInfo(mTargetPackage, 0); + permissionsSdkLevel = packageInfo.applicationInfo.targetSdkVersion; } catch (PackageManager.NameNotFoundException e) { Log.e(LOG_TAG, "Unable to get package info for the calling package.", e); finishAfterTransition(); @@ -287,49 +281,8 @@ public class GrantPermissionsActivity extends SettingsActivity } mRequestedPermissions = removeNullOrEmptyPermissions(requestedPermissionsArray); - mOriginalRequestedPermissions = mRequestedPermissions.toArray(new String[0]); - - // Do validation if permissions are requested for a remote device or the dialog is being - // streamed to a remote device. - if (isDeviceAwarePermissionSupported(getApplicationContext())) { - mTargetDeviceId = getIntent().getIntExtra( - PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, - ContextCompat.DEVICE_ID_DEFAULT); - - // When the dialog is streamed to a remote device, verify requested permissions are all - // device aware and target device is the same as the remote device. Otherwise show a - // warning dialog. - if (getDeviceId() != ContextCompat.DEVICE_ID_DEFAULT) { - boolean showWarningDialog = mTargetDeviceId != getDeviceId(); - - for (String permission : mRequestedPermissions) { - if (!MultiDeviceUtils.isPermissionDeviceAware( - getApplicationContext(), mTargetDeviceId, permission)) { - showWarningDialog = true; - } - } - - if (showWarningDialog) { - mShowWarningDialog.launch( - new Intent(this, PermissionDialogStreamingBlockedActivity.class)); - return; - } - } else if (mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT) { - // On the default device, when requested permissions are for a remote device, - // filter out non-device aware permissions. - for (int i = mRequestedPermissions.size() - 1; i >= 0; i--) { - if (!MultiDeviceUtils.isPermissionDeviceAware( - getApplicationContext(), - mTargetDeviceId, - mRequestedPermissions.get(i))) { - Log.e( - LOG_TAG, - "non-device aware permission is requested for a remote device: " - + mRequestedPermissions.get(i)); - mRequestedPermissions.remove(i); - } - } - } + if (mIsSystemTriggered) { + mSystemRequestedPermissions.addAll(mRequestedPermissions); } if (mRequestedPermissions.isEmpty()) { @@ -337,10 +290,36 @@ public class GrantPermissionsActivity extends SettingsActivity return; } - if (mIsSystemTriggered) { - mSystemRequestedPermissions.addAll(mRequestedPermissions); + if (MultiDeviceUtils.isDeviceAwareGrantFlowEnabled()) { + mTargetDeviceId = + getIntent() + .getIntExtra( + PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, + ContextCompat.DEVICE_ID_DEFAULT); } + // If the permissions requested are for a remote device, check if each permission is device + // aware. + if (mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT) { + if (!MultiDeviceUtils.isDeviceAwareGrantFlowEnabled()) { + Log.e(LOG_TAG, "targetDeviceId should be the default device if device aware grant" + + " flow is not enabled"); + finishAfterTransition(); + return; + } + + for (String permission : mRequestedPermissions) { + if (!MultiDeviceUtils.isPermissionDeviceAware(permission)) { + Log.e(LOG_TAG, "When target device is external, permission " + permission + + " needs to be device aware."); + finishAfterTransition(); + return; + } + } + } + + mOriginalRequestedPermissions = mRequestedPermissions.toArray(new String[0]); + if (SdkLevel.isAtLeastV() && Flags.enhancedConfirmationModeApisEnabled()) { EnhancedConfirmationManager ecm = getEnhancedConfirmationManager(); diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/PermissionDialogStreamingBlockedActivity.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/PermissionDialogStreamingBlockedActivity.kt deleted file mode 100644 index 29f9ed2c7..000000000 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/PermissionDialogStreamingBlockedActivity.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 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. - */ - -package com.android.permissioncontroller.permission.ui - -import android.app.AlertDialog -import android.os.Bundle -import androidx.fragment.app.FragmentActivity -import com.android.permissioncontroller.R - -/** - * In some scenarios we want to prevent the permission grant dialog from streaming to a remote - * device. If the streaming is blocked show a warning dialog rendered by this activity. - */ -class PermissionDialogStreamingBlockedActivity : FragmentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - AlertDialog.Builder(this) - .setTitle(R.string.permission_grant_dialog_streaming_blocked_title) - .setMessage(R.string.permission_grant_dialog_streaming_blocked_description) - .setPositiveButton(R.string.ongoing_usage_dialog_ok, null) - .setOnDismissListener() { - setResult(RESULT_OK) - finish() - } - .create() - .show() - } -} diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt index 117a6c8ed..ba5ba1c23 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt @@ -7,7 +7,7 @@ import android.os.Build import android.provider.Settings import androidx.annotation.ChecksSdkIntAtLeast import com.android.modules.utils.build.SdkLevel -import com.android.permissioncontroller.DeviceUtils +import com.android.permission.flags.Flags object MultiDeviceUtils { const val DEFAULT_REMOTE_DEVICE_NAME = "remote device" @@ -21,32 +21,13 @@ object MultiDeviceUtils { setOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) @JvmStatic - fun isDeviceAwarePermissionSupported(context: Context): Boolean = - SdkLevel.isAtLeastV() && - !(DeviceUtils.isTelevision(context) || - DeviceUtils.isAuto(context) || - DeviceUtils.isWear(context)) + fun isPermissionDeviceAware(permission: String): Boolean = + permission in DEVICE_AWARE_PERMISSIONS @JvmStatic @ChecksSdkIntAtLeast(Build.VERSION_CODES.VANILLA_ICE_CREAM) - fun isPermissionDeviceAware(context: Context, deviceId: Int, permission: String): Boolean { - if (!SdkLevel.isAtLeastV()) { - return false - } - - if (permission !in DEVICE_AWARE_PERMISSIONS) { - return false - } - - val virtualDevice = - context.getSystemService(VirtualDeviceManager::class.java)!!.getVirtualDevice(deviceId) - ?: return false - - return when (permission) { - Manifest.permission.CAMERA -> virtualDevice.hasCustomCameraSupport() - Manifest.permission.RECORD_AUDIO -> virtualDevice.hasCustomAudioInputSupport() - else -> false - } + fun isDeviceAwareGrantFlowEnabled(): Boolean { + return SdkLevel.isAtLeastV() && Flags.deviceAwarePermissionGrantEnabled() } @JvmStatic diff --git a/flags/flags.aconfig b/flags/flags.aconfig index 337936fd4..3077dd290 100644 --- a/flags/flags.aconfig +++ b/flags/flags.aconfig @@ -1,6 +1,14 @@ package: "com.android.permission.flags" container: "com.android.permission" +flag { + name: "device_aware_permission_grant_enabled" + is_fixed_read_only: true + namespace: "permissions" + description: "Enables device aware grant permission flow" + bug: "292252664" +} + flag { name: "private_profile_supported" namespace: "permissions" diff --git a/tests/cts/permissionmultidevice/AndroidTest.xml b/tests/cts/permissionmultidevice/AndroidTest.xml index d86bea2d5..2b43fd01c 100644 --- a/tests/cts/permissionmultidevice/AndroidTest.xml +++ b/tests/cts/permissionmultidevice/AndroidTest.xml @@ -37,6 +37,13 @@