summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/jarjar-rules.txt4
-rw-r--r--PermissionController/res/values-es-rUS/strings.xml2
-rw-r--r--PermissionController/res/values-pt-rBR/strings.xml2
-rw-r--r--PermissionController/res/values-pt/strings.xml2
-rw-r--r--PermissionController/res/values-tr-v33/strings.xml2
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java33
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java3
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt6
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt4
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt6
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt6
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt16
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt6
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt6
-rw-r--r--PermissionController/tests/permissionui/AndroidTest.xml6
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt2
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt5
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt1
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt13
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt26
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt8
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt13
-rw-r--r--SafetyCenter/Resources/res/raw-v36/safety_center_config.xml1
-rw-r--r--service/java/com/android/role/RoleService.java30
-rw-r--r--tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml1
-rw-r--r--tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt18
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt50
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt585
-rw-r--r--tests/cts/permissionpolicy/res/raw/android_manifest.xml4
-rw-r--r--tests/cts/role/src/android/app/role/cts/RoleManagerTest.java1
36 files changed, 613 insertions, 271 deletions
diff --git a/PermissionController/jarjar-rules.txt b/PermissionController/jarjar-rules.txt
index 5ecb0241f..ceac6c3a7 100644
--- a/PermissionController/jarjar-rules.txt
+++ b/PermissionController/jarjar-rules.txt
@@ -26,6 +26,10 @@ rule android.os.*FeatureFlags* com.android.permissioncontroller.jarjar.@0
rule android.os.FeatureFlags* com.android.permissioncontroller.jarjar.@0
rule android.os.FeatureFlags com.android.permissioncontroller.jarjar.@0
rule android.os.Flags com.android.permissioncontroller.jarjar.@0
+rule android.xr.*FeatureFlags* com.android.permissioncontroller.jarjar.@0
+rule android.xr.FeatureFlags* com.android.permissioncontroller.jarjar.@0
+rule android.xr.FeatureFlags com.android.permissioncontroller.jarjar.@0
+rule android.xr.Flags com.android.permissioncontroller.jarjar.@0
rule com.android.permission.flags.*FeatureFlags* com.android.permissioncontroller.jarjar.@0
rule com.android.permission.flags.FeatureFlags* com.android.permissioncontroller.jarjar.@0
rule com.android.permission.flags.FeatureFlags com.android.permissioncontroller.jarjar.@0
diff --git a/PermissionController/res/values-es-rUS/strings.xml b/PermissionController/res/values-es-rUS/strings.xml
index 0a8908fd7..94179a6e7 100644
--- a/PermissionController/res/values-es-rUS/strings.xml
+++ b/PermissionController/res/values-es-rUS/strings.xml
@@ -370,7 +370,7 @@
<string name="role_dialer_request_description" msgid="6288839625724909320">"Esta app obtendrá acceso a la cámara, los contactos, micrófono, teléfono y SMS"</string>
<string name="role_dialer_search_keywords" msgid="3324448983559188087">"marcador"</string>
<string name="role_sms_label" msgid="8456999857547686640">"App de SMS predeterminada"</string>
- <string name="role_sms_short_label" msgid="4371444488034692243">"app de SMS"</string>
+ <string name="role_sms_short_label" msgid="4371444488034692243">"App de SMS"</string>
<string name="role_sms_description" msgid="3424020199148153513">"Apps que te permiten usar tu número de teléfono para enviar y recibir mensajes de texto cortos, fotos, videos y mucho más"</string>
<string name="role_sms_request_title" msgid="7953552109601185602">"¿Quieres establecer <xliff:g id="APP_NAME">%1$s</xliff:g> como app de SMS predeterminada?"</string>
<string name="role_sms_request_description" msgid="2691004766132144886">"Se le otorgará acceso a esta app a tu cámara, contactos, archivos y contenido multimedia, micrófono, teléfono y SMS"</string>
diff --git a/PermissionController/res/values-pt-rBR/strings.xml b/PermissionController/res/values-pt-rBR/strings.xml
index 17d18a2b7..48cedd428 100644
--- a/PermissionController/res/values-pt-rBR/strings.xml
+++ b/PermissionController/res/values-pt-rBR/strings.xml
@@ -442,7 +442,7 @@
<string name="default_apps_for_private_profile" msgid="2022024112144880785">"Padrão para o espaço privado"</string>
<string name="default_app_recommended" msgid="5669584821778942909">"Otimizados para o dispositivo"</string>
<string name="default_app_others" msgid="7793029848126079876">"Outros"</string>
- <string name="default_app_none" msgid="9084592086808194457">"Nenhuma"</string>
+ <string name="default_app_none" msgid="9084592086808194457">"Nenhum"</string>
<string name="default_app_system_default" msgid="6218386768175513760">"(Padrão do sistema)"</string>
<string name="default_app_no_apps" msgid="115720991680586885">"Nenhum app"</string>
<string name="default_payment_app_other_nfc_services" msgid="5957633798695758917">"Outros serviços de NFC"</string>
diff --git a/PermissionController/res/values-pt/strings.xml b/PermissionController/res/values-pt/strings.xml
index 17d18a2b7..48cedd428 100644
--- a/PermissionController/res/values-pt/strings.xml
+++ b/PermissionController/res/values-pt/strings.xml
@@ -442,7 +442,7 @@
<string name="default_apps_for_private_profile" msgid="2022024112144880785">"Padrão para o espaço privado"</string>
<string name="default_app_recommended" msgid="5669584821778942909">"Otimizados para o dispositivo"</string>
<string name="default_app_others" msgid="7793029848126079876">"Outros"</string>
- <string name="default_app_none" msgid="9084592086808194457">"Nenhuma"</string>
+ <string name="default_app_none" msgid="9084592086808194457">"Nenhum"</string>
<string name="default_app_system_default" msgid="6218386768175513760">"(Padrão do sistema)"</string>
<string name="default_app_no_apps" msgid="115720991680586885">"Nenhum app"</string>
<string name="default_payment_app_other_nfc_services" msgid="5957633798695758917">"Outros serviços de NFC"</string>
diff --git a/PermissionController/res/values-tr-v33/strings.xml b/PermissionController/res/values-tr-v33/strings.xml
index ee3827f93..f3b0f08e5 100644
--- a/PermissionController/res/values-tr-v33/strings.xml
+++ b/PermissionController/res/values-tr-v33/strings.xml
@@ -33,7 +33,7 @@
<string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Daralt"</string>
<string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Uyarı. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"İşlem tamamlandı"</string>
- <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Cihazınızın korumasını artırabilecek ayarlara göz atın"</string>
+ <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Cihazınızın korunma düzeyini artırabilecek ayarlara göz atın"</string>
<string name="safety_center_qs_page_landing" msgid="1717368301679228128">"Güvenlik ve gizlilikle ilgili hızlı ayarlar"</string>
<string name="safety_center_qs_close_button" msgid="1352313308176244599">"Kapat"</string>
<string name="safety_center_qs_expand_action" msgid="2193190557696484169">"Seçenekleri genişletip göster"</string>
diff --git a/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java b/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java
index 41233a23e..00ec67569 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java
@@ -18,7 +18,6 @@ package com.android.role.controller.util;
import android.content.Context;
import android.os.Build;
-import android.os.Flags;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
@@ -91,7 +90,7 @@ public final class UserUtils {
* allowed from Android V+ only, so this method will return false on Sdk levels below that.
*/
public static boolean isPrivateProfile(@NonNull UserHandle user, @NonNull Context context) {
- if (!SdkLevel.isAtLeastV() || !Flags.allowPrivateProfile()) {
+ if (!SdkLevel.isAtLeastV()) {
return false;
}
Context userContext = getUserContext(context, user);
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
index 7573b571d..0dd07ffd0 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
@@ -311,10 +311,8 @@ public class GrantPermissionsActivity extends SettingsActivity
PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID,
ContextCompat.DEVICE_ID_DEFAULT);
- if (mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT) {
- mPackageManager = ContextCompat.createDeviceContext(this, mTargetDeviceId)
- .getPackageManager();
- }
+ mPackageManager = ContextCompat.createDeviceContext(this, mTargetDeviceId)
+ .getPackageManager();
// When the permission grant dialog is streamed to a virtual device, and when requested
// permissions include both device-aware permissions and non-device aware permissions,
@@ -337,21 +335,6 @@ public class GrantPermissionsActivity extends SettingsActivity
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);
- }
- }
}
}
@@ -740,7 +723,7 @@ public class GrantPermissionsActivity extends SettingsActivity
int dialogDisplayDeviceId = ContextCompat.getDeviceId(this);
boolean isMessageDeviceAware =
dialogDisplayDeviceId != ContextCompat.DEVICE_ID_DEFAULT
- || dialogDisplayDeviceId != mTargetDeviceId;
+ || dialogDisplayDeviceId != info.getDeviceId();
int messageId = getMessageId(info.getGroupName(), info.getPrompt(), isMessageDeviceAware);
CharSequence message =
@@ -1132,17 +1115,9 @@ public class GrantPermissionsActivity extends SettingsActivity
if ((mDelegated || (mViewModel != null && mViewModel.shouldReturnPermissionState()))
&& mTargetPackage != null) {
- PackageManager defaultDevicePackageManager = SdkLevel.isAtLeastV()
- && mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT
- ? createDeviceContext(ContextCompat.DEVICE_ID_DEFAULT).getPackageManager()
- : mPackageManager;
- PackageManager targetDevicePackageManager = mPackageManager;
for (int i = 0; i < resultPermissions.length; i++) {
String permission = resultPermissions[i];
- PackageManager pm = MultiDeviceUtils.isPermissionDeviceAware(
- getApplicationContext(), mTargetDeviceId, permission)
- ? targetDevicePackageManager : defaultDevicePackageManager;
- grantResults[i] = pm.checkPermission(resultPermissions[i], mTargetPackage);
+ grantResults[i] = mPackageManager.checkPermission(permission, mTargetPackage);
}
} else {
grantResults = new int[0];
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt
index 3ed58cf4a..f918da729 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt
@@ -62,6 +62,7 @@ fun WearGrantPermissionsScreen(
val materialUIVersion = ResourceHelper.materialUIVersionInApp
ScrollableScreen(
materialUIVersion = materialUIVersion,
+ asScalingList = true,
showTimeText = false,
image = icon.value,
title = groupMessage.value,
diff --git a/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java b/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java
index 4d778befb..10e8dd0e1 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java
@@ -139,7 +139,7 @@ public class UserUtils {
*/
private static boolean isPrivateProfile(@NonNull UserHandle userHandle,
@NonNull Context context) {
- if (!SdkLevel.isAtLeastV() || !android.os.Flags.allowPrivateProfile()) {
+ if (!SdkLevel.isAtLeastV()) {
return false;
}
Context userContext = context.createContextAsUser(userHandle, /* flags= */ 0);
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt
index 8d7d96f99..307ef9cf6 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt
@@ -331,9 +331,7 @@ class SafetyCenterSearchIndexablesProvider : BaseSearchIndexablesProvider() {
get() = SafetyCenterIds.entryIdFromString(id)
private fun isPrivateProfileSupported(): Boolean {
- return SdkLevel.isAtLeastV() &&
- com.android.permission.flags.Flags.privateProfileSupported() &&
- android.os.Flags.allowPrivateProfile()
+ return SdkLevel.isAtLeastV() && com.android.permission.flags.Flags.privateProfileSupported()
}
companion object {
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt
index b89abde13..551f676f1 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt
@@ -49,7 +49,7 @@ class SafetySubpageEntryPreference(
context: Context,
private val launchTaskId: Int?,
private val entry: SafetyCenterEntry,
- private val viewModel: SafetyCenterViewModel
+ private val viewModel: SafetyCenterViewModel,
) : TwoTargetPreference(context), ComparablePreference {
init {
@@ -108,9 +108,7 @@ class SafetySubpageEntryPreference(
}
private fun isPrivateProfileSupported(): Boolean {
- return SdkLevel.isAtLeastV() &&
- com.android.permission.flags.Flags.privateProfileSupported() &&
- android.os.Flags.allowPrivateProfile()
+ return SdkLevel.isAtLeastV() && com.android.permission.flags.Flags.privateProfileSupported()
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
@@ -125,7 +123,7 @@ class SafetySubpageEntryPreference(
PendingIntentSender.send(iconAction.pendingIntent, launchTaskId)
viewModel.interactionLogger.recordForEntry(
Action.ENTRY_ICON_ACTION_CLICKED,
- entry
+ entry,
)
} catch (ex: Exception) {
Log.e(TAG, "Failed to execute icon action intent for $entry", ex)
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java
index 87d8744a8..0da8286f6 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java
@@ -98,8 +98,7 @@ public class StaticSafetyEntryPreference extends Preference implements Comparabl
private Boolean isPrivateProfileSupported() {
return SdkLevel.isAtLeastV()
- && com.android.permission.flags.Flags.privateProfileSupported()
- && android.os.Flags.allowPrivateProfile();
+ && com.android.permission.flags.Flags.privateProfileSupported();
}
@Override
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt
index 2ae4b0585..5612b7731 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt
@@ -49,7 +49,7 @@ import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -125,7 +125,7 @@ class PermissionStorageTimeChangeReceiverTest {
receiver.onReceive(context, Intent(Intent.ACTION_TIME_CHANGED))
verify(receiver, never()).onTimeChanged(anyLong())
- verifyZeroInteractions(editor)
+ verifyNoMoreInteractions(editor)
}
@Test
@@ -133,7 +133,7 @@ class PermissionStorageTimeChangeReceiverTest {
receiver.onReceive(context, Intent(Intent.ACTION_MANAGE_PERMISSIONS))
verify(receiver, never()).onTimeChanged(anyLong())
- verifyZeroInteractions(editor)
+ verifyNoMoreInteractions(editor)
}
@Test
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt
index baa848960..4b89d5141 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt
@@ -40,7 +40,7 @@ import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.spy
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -102,7 +102,7 @@ class PersistedStoragePackageUninstalledReceiverTest {
receiver.onReceive(context, intent)
- verifyZeroInteractions(permissionEventStorage)
+ verifyNoMoreInteractions(permissionEventStorage)
}
@Test
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt
index d09b5093f..731022cb5 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt
@@ -55,7 +55,7 @@ import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -102,14 +102,14 @@ class AppDataSharingUpdatesPrivacySourceTest {
fun safetyCenterEnabledChanged_enabled_doesNothing() {
appDataSharingUpdatesPrivacySource.safetyCenterEnabledChanged(context, true)
- verifyZeroInteractions(mockSafetyCenterManager)
+ verifyNoMoreInteractions(mockSafetyCenterManager)
}
@Test
fun safetyCenterEnabledChanged_disabled_doesNothing() {
appDataSharingUpdatesPrivacySource.safetyCenterEnabledChanged(context, false)
- verifyZeroInteractions(mockSafetyCenterManager)
+ verifyNoMoreInteractions(mockSafetyCenterManager)
}
@Test
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt
index cc3b096a8..cac60e1a2 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt
@@ -55,7 +55,7 @@ import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -209,7 +209,7 @@ class NotificationListenerPrivacySourceTest {
privacySource.safetyCenterEnabledChanged(context, false)
- verifyZeroInteractions(mockSafetyCenterManager)
+ verifyNoMoreInteractions(mockSafetyCenterManager)
}
@Test
@@ -281,7 +281,7 @@ class NotificationListenerPrivacySourceTest {
SafetyCenterReceiver.RefreshEvent.UNKNOWN
)
- verifyZeroInteractions(mockSafetyCenterManager)
+ verifyNoMoreInteractions(mockSafetyCenterManager)
}
private fun setNotificationListenerCheckEnabled(enabled: Boolean) {
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt
index a0199979d..2c166f24b 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt
@@ -55,7 +55,7 @@ import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -199,8 +199,8 @@ class SafetyCenterReceiverTest {
safetyCenterReceiver.onReceive(application, intent)
advanceUntilIdle()
- verifyZeroInteractions(mockPrivacySource)
- verifyZeroInteractions(mockPrivacySource2)
+ verifyNoMoreInteractions(mockPrivacySource)
+ verifyNoMoreInteractions(mockPrivacySource2)
}
@Test
@@ -214,7 +214,7 @@ class SafetyCenterReceiverTest {
verify(mockPrivacySource)
.rescanAndPushSafetyCenterData(application, intent, EVENT_REFRESH_REQUESTED)
- verifyZeroInteractions(mockPrivacySource2)
+ verifyNoMoreInteractions(mockPrivacySource2)
}
@Test
@@ -225,8 +225,8 @@ class SafetyCenterReceiverTest {
safetyCenterReceiver.onReceive(application, intent)
advanceUntilIdle()
- verifyZeroInteractions(mockPrivacySource)
- verifyZeroInteractions(mockPrivacySource2)
+ verifyNoMoreInteractions(mockPrivacySource)
+ verifyNoMoreInteractions(mockPrivacySource2)
}
@Test
@@ -238,7 +238,7 @@ class SafetyCenterReceiverTest {
safetyCenterReceiver.onReceive(application, intent)
advanceUntilIdle()
- verifyZeroInteractions(mockPrivacySource)
- verifyZeroInteractions(mockPrivacySource2)
+ verifyNoMoreInteractions(mockPrivacySource)
+ verifyNoMoreInteractions(mockPrivacySource2)
}
}
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt
index 38baee3ed..e2f1443e3 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt
@@ -47,7 +47,7 @@ import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -169,7 +169,7 @@ class WorkPolicyInfoTest {
fun safetyCenterEnabledChanged_safetyCenterDisabled() {
workPolicyInfo.safetyCenterEnabledChanged(context, false)
- verifyZeroInteractions(mockSafetyCenterManager)
+ verifyNoMoreInteractions(mockSafetyCenterManager)
}
@Test
@@ -196,7 +196,7 @@ class WorkPolicyInfoTest {
workPolicyInfo.safetyCenterEnabledChanged(context, false)
- verifyZeroInteractions(mockSafetyCenterManager)
+ verifyNoMoreInteractions(mockSafetyCenterManager)
}
@Test
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt
index 4d206a2f4..396ad41df 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt
@@ -46,7 +46,7 @@ import org.mockito.Mockito.doNothing
import org.mockito.Mockito.mock
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
@@ -121,14 +121,14 @@ class SafetyLabelChangesJobServiceTest {
receiver.onReceive(application, Intent(Intent.ACTION_BOOT_COMPLETED))
- verifyZeroInteractions(mockJobScheduler)
+ verifyNoMoreInteractions(mockJobScheduler)
}
@Test
fun onReceiveInvalidIntentAction_jobNotScheduled() {
receiver.onReceive(application, Intent(Intent.ACTION_DEFAULT))
- verifyZeroInteractions(mockJobScheduler)
+ verifyNoMoreInteractions(mockJobScheduler)
}
@Test
diff --git a/PermissionController/tests/permissionui/AndroidTest.xml b/PermissionController/tests/permissionui/AndroidTest.xml
index 9cadbd12f..2462dc4c7 100644
--- a/PermissionController/tests/permissionui/AndroidTest.xml
+++ b/PermissionController/tests/permissionui/AndroidTest.xml
@@ -63,6 +63,12 @@
value="/data/local/tmp/pc-permissionui/PermissionUiUseReadHeartRatePermissionApp.apk" />
</target_preparer>
+ <!-- Wake the screen, and dismiss keyguard -->
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+ <option name="run-command" value="wm dismiss-keyguard" />
+ </target_preparer>
+
<!-- Uninstall test-apps -->
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="teardown-command" value="pm uninstall android.permission.cts.appthatrequestpermission" />
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt
index 23074a06f..57fdbca03 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt
@@ -205,7 +205,7 @@ fun Chip(
color = secondaryTextColor,
overflow = TextOverflow.Ellipsis,
maxLines = secondaryLabelMaxLines ?: 1,
- style = MaterialTheme.typography.caption2,
+ style = MaterialTheme.typography.caption2.copy(hyphens = Hyphens.Auto),
)
}
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt
index de8e0542d..46a55bdc7 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt
@@ -33,6 +33,7 @@ import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.role
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.stateDescription
+import androidx.compose.ui.text.style.Hyphens
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.wear.compose.material.ChipDefaults
@@ -78,7 +79,7 @@ fun ToggleChip(
textAlign = TextAlign.Start,
overflow = TextOverflow.Ellipsis,
maxLines = labelMaxLine ?: if (hasSecondaryLabel) 1 else 2,
- style = MaterialTheme.typography.button,
+ style = MaterialTheme.typography.button.copy(hyphens = Hyphens.Auto),
)
}
@@ -89,7 +90,7 @@ fun ToggleChip(
text = secondaryLabel,
overflow = TextOverflow.Ellipsis,
maxLines = secondaryLabelMaxLine ?: 1,
- style = MaterialTheme.typography.caption2,
+ style = MaterialTheme.typography.caption2.copy(hyphens = Hyphens.Auto),
)
}
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt
index 5f1c8dd2c..320e58964 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt
@@ -123,6 +123,7 @@ internal fun WearPermissionButtonInternal(
text = secondaryLabel,
modifier = Modifier.fillMaxWidth(),
maxLines = secondaryLabelMaxLines ?: LocalTextConfiguration.current.maxLines,
+ style = LocalTextStyle.current.copy(hyphens = Hyphens.Auto),
)
}
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt
index 114bcd4bc..f48d47b2c 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt
@@ -16,6 +16,7 @@
package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
import androidx.wear.compose.material.ChipColors
import androidx.wear.compose.material.ChipDefaults
import androidx.wear.compose.material3.ButtonColors
@@ -26,6 +27,7 @@ import com.android.permissioncontroller.wear.permission.components.material3.Wea
import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Primary
import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Secondary
import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Transparent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Warning
/**
* This component is wrapper on material control colors, It applies the right colors based material
@@ -36,6 +38,7 @@ enum class WearPermissionButtonStyle {
Secondary,
Transparent,
DisabledLike,
+ Warning,
}
@Composable
@@ -45,6 +48,11 @@ internal fun WearPermissionButtonStyle.material2ChipColors(): ChipColors {
Secondary -> ChipDefaults.secondaryChipColors()
Transparent -> ChipDefaults.childChipColors()
DisabledLike -> chipDisabledColors()
+ Warning ->
+ ChipDefaults.secondaryChipColors(
+ backgroundColor =
+ Color(red = 65, green = 14, blue = 11, alpha = (0.8f * 255).toInt())
+ )
}
}
@@ -55,6 +63,11 @@ internal fun WearPermissionButtonStyle.material3ButtonColors(): ButtonColors {
Secondary -> ButtonDefaults.filledTonalButtonColors()
Transparent -> ButtonDefaults.childButtonColors()
DisabledLike -> ButtonDefaults.disabledLikeColors()
+ Warning ->
+ ButtonDefaults.buttonColors(
+ containerColor =
+ Color(red = 65, green = 14, blue = 11, alpha = (0.8f * 255).toInt())
+ )
}
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
index 19423f5b0..87ca048bc 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
@@ -16,7 +16,6 @@
package com.android.permissioncontroller.wear.permission.components.material3
import android.graphics.drawable.Drawable
-import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.ScrollableState
import androidx.compose.foundation.layout.Box
@@ -30,9 +29,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
@@ -53,6 +50,7 @@ import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState
import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.CircularProgressIndicator
+import androidx.wear.compose.material3.Icon
import androidx.wear.compose.material3.IconButtonDefaults
import androidx.wear.compose.material3.ListHeader
import androidx.wear.compose.material3.MaterialTheme
@@ -60,7 +58,6 @@ import androidx.wear.compose.material3.ScreenScaffold
import androidx.wear.compose.material3.ScrollIndicator
import androidx.wear.compose.material3.Text
import androidx.wear.compose.material3.TimeText
-import androidx.wear.compose.material3.lazy.scrollTransform
import com.android.permissioncontroller.wear.permission.components.AnnotatedText
import com.android.permissioncontroller.wear.permission.components.ListScopeWrapper
import com.android.permissioncontroller.wear.permission.components.material2.Wear2Scaffold
@@ -74,7 +71,7 @@ private class TransformingScopeConverter(private val scope: TransformingLazyColu
ListScopeWrapper {
override fun item(key: Any?, contentType: Any?, content: @Composable () -> Unit) {
// TODO:https://buganizer.corp.google.com/issues/389093588.
- scope.item { Box(modifier = Modifier.scrollTransform(this)) { content() } }
+ scope.item { content() }
}
override fun items(
@@ -272,6 +269,7 @@ private fun BoxScope.LazyColumnView(
titleItem(
text = title,
testTag = titleTestTag,
+ asScalingList = true,
contentPaddingValues = paddingDefaults.titlePaddingValues(subtitle == null),
)
subtitleItem(
@@ -288,6 +286,7 @@ private fun BoxScope.LazyColumnView(
ScalingLazyColumn(
contentPadding = scrollContentPadding,
state = listState as ScalingLazyListState,
+ autoCentering = null,
modifier = Modifier.background(MaterialTheme.colorScheme.background),
content = { scrollingViewContent(ScalingScopeConverter(this)) },
)
@@ -351,24 +350,25 @@ private fun ListScopeWrapper.iconItem(painter: Painter?, modifier: Modifier = Mo
painter?.let {
item {
val iconColor = WearPermissionButtonStyle.Secondary.material3ButtonColors().iconColor
- Image(
- painter = it,
- contentDescription = null,
- contentScale = ContentScale.Crop,
- modifier = modifier,
- colorFilter = ColorFilter.tint(iconColor),
- )
+ Icon(painter = it, contentDescription = null, modifier = modifier, tint = iconColor)
}
}
private fun ListScopeWrapper.titleItem(
text: String?,
+ asScalingList: Boolean,
testTag: String?,
contentPaddingValues: PaddingValues,
modifier: Modifier = Modifier,
) =
text?.let {
item(contentType = "header") {
+ val style =
+ if (asScalingList) {
+ MaterialTheme.typography.titleMedium
+ } else {
+ MaterialTheme.typography.titleLarge
+ }
ListHeader(
modifier = modifier.requiredHeightIn(1.dp), // We do not want default min height
contentPadding = contentPaddingValues,
@@ -377,7 +377,7 @@ private fun ListScopeWrapper.titleItem(
text = it,
textAlign = TextAlign.Center,
modifier = Modifier.optionalTestTag(testTag),
- style = MaterialTheme.typography.titleLarge.copy(hyphens = Hyphens.Auto),
+ style = style.copy(hyphens = Hyphens.Auto),
)
}
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt
index 595fb50a3..01b8fc4be 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt
@@ -25,15 +25,15 @@ data class WearPermissionScaffoldPaddingDefaults(
private val screenHeight: Int,
) {
private val scrollContentHorizontalPadding = (screenWidth * 0.052).dp
- private val titleHorizontalPadding = (screenWidth * 0.0520).dp
- private val subtitleHorizontalPadding = (screenWidth * 0.0624).dp
+ private val titleHorizontalPadding = (screenWidth * 0.1200).dp
+ private val subtitleHorizontalPadding = (screenWidth * 0.0416).dp
private val scrollContentTopPadding = (screenHeight * 0.1664).dp
private val dialogScrollContentLargeTopPadding = (screenHeight * 0.10).dp
private val dialogScrollContentTopPadding = (screenHeight * 0.012).dp
private val scrollContentBottomPadding = (screenHeight * 0.3646).dp
private val noPadding = 0.dp
private val defaultItemPadding = 4.dp
- private val largeItemPadding = 8.dp
+ private val largeItemPadding = 12.dp
private val extraLargePadding = 12.dp
fun titlePaddingValues(needsLargePadding: Boolean): PaddingValues =
@@ -48,7 +48,7 @@ data class WearPermissionScaffoldPaddingDefaults(
PaddingValues(
start = subtitleHorizontalPadding,
top = if (needsLargePadding) extraLargePadding else noPadding,
- bottom = largeItemPadding,
+ bottom = 8.dp,
end = subtitleHorizontalPadding,
)
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt
index 1dfb90682..7998f43de 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt
@@ -23,8 +23,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.stateDescription
+import androidx.compose.ui.text.style.Hyphens
import androidx.wear.compose.material3.CheckboxButton
import androidx.wear.compose.material3.LocalTextConfiguration
+import androidx.wear.compose.material3.LocalTextStyle
import androidx.wear.compose.material3.RadioButton
import androidx.wear.compose.material3.SwitchButton
import androidx.wear.compose.material3.Text
@@ -112,6 +114,7 @@ private fun WearPermissionToggleControlInternal(
text = label,
modifier = Modifier.fillMaxWidth(),
maxLines = labelMaxLines ?: LocalTextConfiguration.current.maxLines,
+ style = LocalTextStyle.current.copy(hyphens = Hyphens.Auto),
)
}
@@ -122,6 +125,7 @@ private fun WearPermissionToggleControlInternal(
text = it,
modifier = Modifier.fillMaxWidth(),
maxLines = secondaryLabelMaxLines ?: LocalTextConfiguration.current.maxLines,
+ style = LocalTextStyle.current.copy(hyphens = Hyphens.Auto),
)
}
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt
index e44a24981..c85381c1b 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt
@@ -24,6 +24,7 @@ import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontVariation
import androidx.compose.ui.unit.sp
+import androidx.wear.compose.foundation.CurvedTextStyle
import androidx.wear.compose.material3.Typography
import com.android.permissioncontroller.wear.permission.components.R
@@ -50,6 +51,18 @@ internal object WearComposeMaterial3Typography {
return FontFamily(font)
}
+ private fun CurvedTextStyle.updatedTextStyle(
+ context: Context,
+ @StringRes fontRes: Int,
+ variationSettings: FontVariation.Settings? = null,
+ @DimenRes fontSizeRes: Int,
+ ): CurvedTextStyle {
+ val fontFamily =
+ fontFamily(context = context, id = fontRes, variationSettings = variationSettings)
+ val fontSize = ResourceHelper.getDimen(context = context, id = fontSizeRes)?.sp ?: fontSize
+ return copy(fontFamily = fontFamily, fontSize = fontSize)
+ }
+
private fun TextStyle.updatedTextStyle(
context: Context,
@StringRes fontRes: Int,
diff --git a/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml b/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml
index cb6323fff..4e1865697 100644
--- a/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml
+++ b/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml
@@ -67,6 +67,7 @@
titleForWork="@com.android.safetycenter.resources:string/biometrics_title_for_work"
titleForPrivateProfile="@com.android.safetycenter.resources:string/biometrics_title_for_private_profile"
searchTerms="@com.android.safetycenter.resources:string/biometrics_search_terms"
+ refreshOnPageOpenAllowed="true"
initialDisplayState="hidden"/>
</safety-sources-group>
<safety-sources-group
diff --git a/service/java/com/android/role/RoleService.java b/service/java/com/android/role/RoleService.java
index ac6703545..529b0cbdf 100644
--- a/service/java/com/android/role/RoleService.java
+++ b/service/java/com/android/role/RoleService.java
@@ -40,6 +40,7 @@ import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
+import android.os.Process;
import android.os.RemoteCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -726,6 +727,35 @@ public class RoleService extends SystemService implements RoleUserState.Callback
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Objects.requireNonNull(callback, "callback cannot be null");
+ // Work around VoiceInteractionManagerService resetting default assistant upon force
+ // stop on pre-V platforms (b/191743558).
+ if (!SdkLevel.isAtLeastV() && Objects.equals(roleName, RoleManager.ROLE_ASSISTANT)
+ && Binder.getCallingUid() == Process.myUid()) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+ boolean isCallFromForceStop = false;
+ for (StackTraceElement stackTraceElement : stackTraceElements) {
+ if (stackTraceElement.getClassName().contains(
+ "com.android.server.voiceinteraction.VoiceInteractionManagerService")
+ && stackTraceElement.getMethodName().equals("onHandleForceStop")) {
+ isCallFromForceStop = true;
+ break;
+ }
+ }
+ if (isCallFromForceStop) {
+ Log.i(LOG_TAG, "Ignoring clearRoleHoldersAsUser() call from"
+ + " VoiceInteractionManagerService due to force stopping the current"
+ + " assistant");
+ ForegroundThread.getHandler().post(() -> {
+ // Notify the callback as if this call has failed for some reason.
+ callback.sendResult(null);
+ // Announce a role holder change to trigger the default assistant to be
+ // re-configured in VoiceInteractionManagerService.
+ onRoleHoldersChanged(roleName, userId);
+ });
+ return;
+ }
+ }
+
getOrCreateController(userId).onClearRoleHolders(roleName, flags, callback);
}
diff --git a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml
index 211e415bd..c31bfdaf3 100644
--- a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml
+++ b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml
@@ -21,6 +21,7 @@
package="android.permissionmultidevice.cts.accessremotedevicecamera">
<uses-permission android:name="android.permission.CAMERA" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
<application>
<activity android:name=".RequestPermissionActivity" android:exported="true" />
diff --git a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt
index fa1d1f83c..33daa1253 100644
--- a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt
+++ b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt
@@ -16,7 +16,6 @@
package android.permissionmultidevice.cts.accessremotedevicecamera
-import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
@@ -33,17 +32,24 @@ class RequestPermissionActivity : Activity() {
val deviceId =
intent.getIntExtra(
PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID,
- Context.DEVICE_ID_DEFAULT
+ Context.DEVICE_ID_INVALID,
)
- requestPermissions(DEVICE_AWARE_PERMISSIONS, 1001, deviceId)
+ val permissions =
+ intent.getStringArrayExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES)!!
+
+ if (deviceId != Context.DEVICE_ID_INVALID) {
+ requestPermissions(permissions, 1001, deviceId)
+ } else {
+ requestPermissions(permissions, 1001)
+ }
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray,
- deviceId: Int
+ deviceId: Int,
) {
val resultReceiver =
intent.getParcelableExtra(Intent.EXTRA_RESULT_RECEIVER, RemoteCallback::class.java)
@@ -57,8 +63,4 @@ class RequestPermissionActivity : Activity() {
resultReceiver?.sendResult(result)
finish()
}
-
- companion object {
- private val DEVICE_AWARE_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
- }
}
diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt
index 907917f6f..76c86df76 100644
--- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt
+++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt
@@ -108,7 +108,7 @@ class AppPermissionsTest {
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
)
@Test
fun externalDevicePermissionGrantTest() {
@@ -123,7 +123,7 @@ class AppPermissionsTest {
verifyRadioButtonStates(
allowForegroundChecked = true,
askChecked = false,
- denyChecked = false
+ denyChecked = false,
)
UiAutomatorUtils2.getUiDevice().pressBack()
@@ -131,14 +131,14 @@ class AppPermissionsTest {
mapOf(
"Allowed" to listOf(externalDeviceCameraText),
"Ask every time" to emptyList(),
- "Not allowed" to listOf("Camera")
+ "Not allowed" to listOf("Camera", "Contacts"),
)
assertEquals(expectedGrantInfoMap, getGrantInfoMap())
}
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
)
@Test
fun externalDevicePermissionChangeToAskTest() {
@@ -153,7 +153,7 @@ class AppPermissionsTest {
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
)
@Test
fun externalDevicePermissionChangeToDenyTest() {
@@ -168,7 +168,7 @@ class AppPermissionsTest {
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
)
@Test
fun externalDevicePermissionChangeToAllowTest() {
@@ -180,7 +180,7 @@ class AppPermissionsTest {
verifyRadioButtonStates(
allowForegroundChecked = false,
askChecked = true,
- denyChecked = false
+ denyChecked = false,
)
clickAllowForegroundButton()
@@ -189,7 +189,7 @@ class AppPermissionsTest {
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
)
@Test
fun externalDevicePermissionNotDisplayedInitiallyTest() {
@@ -200,14 +200,14 @@ class AppPermissionsTest {
mapOf(
"Allowed" to emptyList(),
"Ask every time" to emptyList(),
- "Not allowed" to listOf("Camera")
+ "Not allowed" to listOf("Camera", "Contacts"),
)
assertEquals(expectedGrantInfoMap, getGrantInfoMap())
}
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
)
@Test
fun externalDevicePermissionStickyOnGrantTest() {
@@ -219,7 +219,7 @@ class AppPermissionsTest {
verifyRadioButtonStates(
allowForegroundChecked = true,
askChecked = false,
- denyChecked = false
+ denyChecked = false,
)
clickDenyButton()
@@ -232,7 +232,7 @@ class AppPermissionsTest {
mapOf(
"Allowed" to emptyList(),
"Ask every time" to emptyList(),
- "Not allowed" to listOf("Camera", externalDeviceCameraText)
+ "Not allowed" to listOf("Camera", externalDeviceCameraText, "Contacts"),
)
assertEquals(expectedGrantInfoMap, getGrantInfoMap())
}
@@ -243,7 +243,7 @@ class AppPermissionsTest {
verifyRadioButtonStates(
allowForegroundChecked = false,
askChecked = true,
- denyChecked = false
+ denyChecked = false,
)
UiAutomatorUtils2.getUiDevice().pressBack()
@@ -252,7 +252,7 @@ class AppPermissionsTest {
mapOf(
"Allowed" to emptyList(),
"Ask every time" to listOf(externalDeviceCameraText),
- "Not allowed" to listOf("Camera")
+ "Not allowed" to listOf("Camera", "Contacts"),
)
assertEquals(expectedGrantInfoMap, getGrantInfoMap())
@@ -270,7 +270,7 @@ class AppPermissionsTest {
verifyRadioButtonStates(
allowForegroundChecked = false,
askChecked = false,
- denyChecked = true
+ denyChecked = true,
)
UiAutomatorUtils2.getUiDevice().pressBack()
@@ -279,7 +279,7 @@ class AppPermissionsTest {
mapOf(
"Allowed" to emptyList(),
"Ask every time" to emptyList(),
- "Not allowed" to listOf("Camera", externalDeviceCameraText)
+ "Not allowed" to listOf("Camera", externalDeviceCameraText, "Contacts"),
)
assertEquals(expectedGrantInfoMap, getGrantInfoMap())
@@ -297,7 +297,7 @@ class AppPermissionsTest {
verifyRadioButtonStates(
allowForegroundChecked = true,
askChecked = false,
- denyChecked = false
+ denyChecked = false,
)
UiAutomatorUtils2.getUiDevice().pressBack()
@@ -306,7 +306,7 @@ class AppPermissionsTest {
mapOf(
"Allowed" to listOf(externalDeviceCameraText),
"Ask every time" to emptyList(),
- "Not allowed" to listOf("Camera")
+ "Not allowed" to listOf("Camera", "Contacts"),
)
assertEquals(expectedGrantInfoMap, getGrantInfoMap())
@@ -327,7 +327,7 @@ class AppPermissionsTest {
mapOf(
"Allowed" to mutableListOf<String>(),
"Ask every time" to mutableListOf(),
- "Not allowed" to mutableListOf()
+ "Not allowed" to mutableListOf(),
)
val outOfScopeTitles = setOf("Unused app settings", "Manage app if unused")
@@ -360,21 +360,21 @@ class AppPermissionsTest {
private fun verifyRadioButtonStates(
allowForegroundChecked: Boolean,
askChecked: Boolean,
- denyChecked: Boolean
+ denyChecked: Boolean,
) {
eventually {
assertEquals(
allowForegroundChecked,
UiAutomatorUtils2.waitFindObject(By.res(ALLOW_FOREGROUND_ONLY_RADIO_BUTTON))
- .isChecked
+ .isChecked,
)
assertEquals(
askChecked,
- UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)).isChecked
+ UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)).isChecked,
)
assertEquals(
denyChecked,
- UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)).isChecked
+ UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)).isChecked,
)
}
}
@@ -392,7 +392,7 @@ class AppPermissionsTest {
)
},
Until.newWindow(),
- NEW_WINDOW_TIMEOUT_MILLIS
+ NEW_WINDOW_TIMEOUT_MILLIS,
)
}
@@ -418,7 +418,7 @@ class AppPermissionsTest {
permissionManager.grantRuntimePermission(
APP_PACKAGE_NAME,
DEVICE_AWARE_PERMISSION,
- persistentDeviceId
+ persistentDeviceId,
)
private fun getPermState(): Map<String, PermissionManager.PermissionState> =
diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
index 5c7573a0b..0f6504502 100644
--- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
+++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
@@ -24,11 +24,11 @@ import android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM
import android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT
import android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA
import android.content.ComponentName
+import android.content.Context
import android.content.Intent
import android.content.Intent.EXTRA_RESULT_RECEIVER
import android.content.pm.PackageManager
import android.content.pm.PackageManager.ACTION_REQUEST_PERMISSIONS
-import android.hardware.display.DisplayManager
import android.hardware.display.VirtualDisplay
import android.os.Build
import android.os.Bundle
@@ -41,7 +41,6 @@ import android.permissionmultidevice.cts.UiAutomatorUtils.click
import android.permissionmultidevice.cts.UiAutomatorUtils.findTextForView
import android.permissionmultidevice.cts.UiAutomatorUtils.waitFindObject
import android.platform.test.annotations.AppModeFull
-import android.platform.test.annotations.RequiresFlagsDisabled
import android.platform.test.annotations.RequiresFlagsEnabled
import android.provider.Settings
import android.view.Display
@@ -63,15 +62,16 @@ import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
-@SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, codeName = "VanillaIceCream")
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
@AppModeFull(reason = "VirtualDeviceManager cannot be accessed by instant apps")
-class DeviceAwarePermissionGrantTest {
+open class DeviceAwarePermissionGrantTest {
private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private val defaultDeviceContext = instrumentation.targetContext
+ private lateinit var defaultDeviceName: String
private lateinit var virtualDeviceManager: VirtualDeviceManager
private lateinit var virtualDevice: VirtualDeviceManager.VirtualDevice
private lateinit var virtualDisplay: VirtualDisplay
- private lateinit var deviceDisplayName: String
+ private lateinit var virtualDeviceName: String
private val permissionManager =
defaultDeviceContext.getSystemService(PermissionManager::class.java)!!
@@ -88,194 +88,458 @@ class DeviceAwarePermissionGrantTest {
installPackage(APP_APK_PATH_STREAMING)
virtualDeviceManager =
defaultDeviceContext.getSystemService(VirtualDeviceManager::class.java)!!
+
+ defaultDeviceName =
+ Settings.Global.getString(
+ defaultDeviceContext.contentResolver,
+ Settings.Global.DEVICE_NAME,
+ )
+ }
+
+ @After
+ fun cleanup() {
+ uninstallPackage(APP_PACKAGE_NAME, requireSuccess = false)
+ Thread.sleep(2000)
+ }
+
+ private fun createVirtualDevice(cameraPolicy: Int = DEVICE_POLICY_DEFAULT) {
virtualDevice =
virtualDeviceRule.createManagedVirtualDevice(
VirtualDeviceParams.Builder()
- .setDevicePolicy(POLICY_TYPE_CAMERA, DEVICE_POLICY_CUSTOM)
+ .setDevicePolicy(POLICY_TYPE_CAMERA, cameraPolicy)
.build()
)
-
- val displayConfigBuilder =
- VirtualDeviceRule.createDefaultVirtualDisplayConfigBuilder(
- DISPLAY_WIDTH,
- DISPLAY_HEIGHT,
- )
- .setFlags(
- DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC or
- DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED or
- DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
- )
-
virtualDisplay =
- virtualDeviceRule.createManagedVirtualDisplay(virtualDevice, displayConfigBuilder)!!
- deviceDisplayName =
+ virtualDeviceRule.createManagedVirtualDisplay(
+ virtualDevice,
+ VirtualDeviceRule.createTrustedVirtualDisplayConfigBuilder(),
+ )!!
+ virtualDeviceName =
virtualDeviceManager.getVirtualDevice(virtualDevice.deviceId)!!.displayName.toString()
}
- @After
- fun cleanup() {
- uninstallPackage(APP_PACKAGE_NAME, requireSuccess = false)
- Thread.sleep(2000)
+ @Test
+ fun deviceAwarePermission_onHost_requestHostPermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = false,
+ )
}
- @RequiresFlagsEnabled(
- Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
- )
@Test
- fun onHostDevice_requestPermissionForHostDevice_shouldGrantPermission() {
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+ fun deviceAwarePermission_onHost_withRemotePermission_requestHostPermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = true,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- testGrantPermissionForDevice(
- Display.DEFAULT_DISPLAY,
- DEVICE_ID_DEFAULT,
- false,
- "",
+ @Test
+ fun deviceAwarePermission_onHost_requestPermissionWithoutDeviceId() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = DEVICE_ID_INVALID,
expectPermissionGrantedOnDefaultDevice = true,
- expectPermissionGrantedOnRemoteDevice = false,
+ expectPermissionGrantedOnVirtualDevice = false,
)
}
- @RequiresFlagsEnabled(
- Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
- )
@Test
- fun onHostDevice_requestPermissionForRemoteDevice_shouldGrantPermission() {
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+ fun deviceAwarePermission_onHost_withRemotePermission_requestPermissionWithoutDeviceId() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = true,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- testGrantPermissionForDevice(
- Display.DEFAULT_DISPLAY,
- virtualDevice.deviceId,
- true,
- deviceDisplayName,
+ @Test
+ fun deviceAwarePermission_onHost_requestRemotePermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = virtualDevice.deviceId,
expectPermissionGrantedOnDefaultDevice = false,
- expectPermissionGrantedOnRemoteDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
)
}
@Test
- fun onHostDevice_requestPermissionForRemoteDeviceAfterPermissionGrantedToHostDevice() {
- instrumentation.uiAutomation.grantRuntimePermission(APP_PACKAGE_NAME, PERMISSION)
+ fun deviceAwarePermission_onHost_withHostPermission_requestRemotePermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = true,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = virtualDevice.deviceId,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, true)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+ @Test
+ fun deviceAwarePermission_onRemote_requestRemotePermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = virtualDevice.deviceId,
+ expectPermissionGrantedOnDefaultDevice = false,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- testGrantPermissionForDevice(
- Display.DEFAULT_DISPLAY,
- virtualDevice.deviceId,
- true,
- deviceDisplayName,
+ @Test
+ fun deviceAwarePermission_onRemote_withHostPermission_requestRemotePermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = true,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = virtualDevice.deviceId,
expectPermissionGrantedOnDefaultDevice = true,
- expectPermissionGrantedOnRemoteDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
)
}
@Test
- fun onHostDevice_requestPermissionForHostDeviceAfterPermissionGrantedToRemoteDevice() {
- permissionManager.grantRuntimePermission(
- APP_PACKAGE_NAME,
- PERMISSION,
- virtualDevice.persistentDeviceId!!,
+ fun deviceAwarePermission_onRemote_requestPermissionWithoutDeviceId() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = virtualDevice.deviceId,
+ expectPermissionGrantedOnDefaultDevice = false,
+ expectPermissionGrantedOnVirtualDevice = true,
)
+ }
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, true)
+ @Test
+ fun deviceAwarePermission_onRemote_withHostPermission_requestPermissionWithoutDeviceId() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = true,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = virtualDevice.deviceId,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- testGrantPermissionForDevice(
- Display.DEFAULT_DISPLAY,
- DEVICE_ID_DEFAULT,
- false,
- "",
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun deviceAwarePermission_onRemote_requestHostPermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
expectPermissionGrantedOnDefaultDevice = true,
- expectPermissionGrantedOnRemoteDevice = true,
+ expectPermissionGrantedOnVirtualDevice = false,
)
}
- @RequiresFlagsEnabled(
- Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
- )
- @RequiresFlagsDisabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
@Test
- fun onRemoteDevice_requestPermissionForHostDevice_shouldShowWarningDialog() {
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+ fun deviceAwarePermission_onRemote_withRemotePermission_requestHostPermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = true,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- requestPermissionOnDevice(virtualDisplay.display.displayId, DEVICE_ID_DEFAULT)
+ @Test
+ fun deviceAwarePermissionWithoutCapability_onHost_requestHostPermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- val displayId = virtualDisplay.display.displayId
- waitFindObject(By.displayId(displayId).textContains("Permission request suppressed"))
+ @Test
+ fun deviceAwarePermissionWithoutCapability_onHost_requestPermissionWithoutDeviceId() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
}
- @RequiresFlagsEnabled(
- Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
- Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES,
- )
- @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
@Test
- fun onRemoteDevice_requestPermissionForHostDevice_shouldGrantPermission() {
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
- // Create a virtual device with default policy, so that camera permission request will
- // correspond to default device camera access.
- virtualDevice =
- virtualDeviceRule.createManagedVirtualDevice(
- VirtualDeviceParams.Builder()
- .setDevicePolicy(POLICY_TYPE_CAMERA, DEVICE_POLICY_DEFAULT)
- .build()
- )
- testGrantPermissionForDevice(
- virtualDisplay.display.displayId,
- virtualDevice.deviceId,
- true,
- Settings.Global.getString(
- defaultDeviceContext.contentResolver,
- Settings.Global.DEVICE_NAME,
- ),
+ fun deviceAwarePermissionWithoutCapability_onHost_requestRemotePermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = DEVICE_ID_INVALID,
expectPermissionGrantedOnDefaultDevice = true,
- expectPermissionGrantedOnRemoteDevice = false,
+ expectPermissionGrantedOnVirtualDevice = true,
)
}
- @RequiresFlagsEnabled(
- Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
- Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
- )
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
@Test
- fun onRemoteDevice_requestPermissionForRemoteDevice_shouldGrantPermission() {
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+ fun deviceAwarePermissionWithoutCapability_onRemote_requestRemotePermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
- testGrantPermissionForDevice(
- virtualDisplay.display.displayId,
- virtualDevice.deviceId,
- true,
- deviceDisplayName,
- expectPermissionGrantedOnDefaultDevice = false,
- expectPermissionGrantedOnRemoteDevice = true,
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun deviceAwarePermissionWithoutCapability_onRemote_requestPermissionWithoutDeviceId() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
)
}
- private fun testGrantPermissionForDevice(
- displayId: Int,
- targetDeviceId: Int,
- showDeviceName: Boolean,
- expectedDeviceNameInDialog: String,
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun deviceAwarePermissionWithoutCapability_onRemote_requestHostPermission() {
+ createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT)
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.CAMERA,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ @Test
+ fun nonDeviceAwarePermission_onHost_requestHostPermission() {
+ createVirtualDevice()
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.READ_CONTACTS,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ @Test
+ fun nonDeviceAwarePermission_onHost_requestPermissionWithoutDeviceId() {
+ createVirtualDevice()
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.READ_CONTACTS,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun nonDeviceAwarePermission_onHost_requestRemotePermission() {
+ createVirtualDevice()
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.READ_CONTACTS,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = DEVICE_ID_DEFAULT,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = DEVICE_ID_INVALID,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun nonDeviceAwarePermission_onRemote_requestRemotePermission() {
+ createVirtualDevice()
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.READ_CONTACTS,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = virtualDevice.deviceId,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun nonDeviceAwarePermission_onRemote_requestPermissionWithoutDeviceId() {
+ createVirtualDevice()
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.READ_CONTACTS,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_INVALID,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
+ @Test
+ fun nonDeviceAwarePermission_onRemote_requestHostPermission() {
+ createVirtualDevice()
+ testMultiDevicePermissionGrant(
+ permission = Manifest.permission.READ_CONTACTS,
+ initialDefaultDevicePermission = false,
+ initialVirtualDevicePermission = false,
+ requestingFromDevice = virtualDevice.deviceId,
+ requestingForDevice = DEVICE_ID_DEFAULT,
+ dialogDeviceName = DEVICE_ID_DEFAULT,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnVirtualDevice = true,
+ )
+ }
+
+ private fun testMultiDevicePermissionGrant(
+ permission: String,
+ initialDefaultDevicePermission: Boolean,
+ initialVirtualDevicePermission: Boolean,
+ requestingFromDevice: Int,
+ requestingForDevice: Int,
+ dialogDeviceName: Int,
expectPermissionGrantedOnDefaultDevice: Boolean,
- expectPermissionGrantedOnRemoteDevice: Boolean,
+ expectPermissionGrantedOnVirtualDevice: Boolean,
) {
- val future = requestPermissionOnDevice(displayId, targetDeviceId)
+ if (initialDefaultDevicePermission) {
+ instrumentation.uiAutomation.grantRuntimePermission(APP_PACKAGE_NAME, permission)
+ }
+ if (initialVirtualDevicePermission) {
+ grantRuntimePermissionOnVirtualDevice(permission)
+ }
+ assertAppHasPermissionForDevice(
+ DEVICE_ID_DEFAULT,
+ permission,
+ initialDefaultDevicePermission,
+ )
+ assertAppHasPermissionForDevice(
+ virtualDevice.deviceId,
+ permission,
+ initialVirtualDevicePermission,
+ )
- if (showDeviceName) {
+ val displayId =
+ if (requestingFromDevice == DEVICE_ID_DEFAULT) {
+ Display.DEFAULT_DISPLAY
+ } else {
+ virtualDisplay.display.displayId
+ }
+
+ val future = requestPermissionOnDevice(displayId, requestingForDevice, permission)
+
+ if (dialogDeviceName != DEVICE_ID_INVALID) {
+ val expectedDeviceNameInDialog =
+ if (dialogDeviceName == DEVICE_ID_DEFAULT) {
+ defaultDeviceName
+ } else {
+ virtualDeviceName
+ }
assertPermissionMessageContainsDeviceName(displayId, expectedDeviceNameInDialog)
+ } else {
+ assertPermissionMessageDoesNotContainDeviceName(displayId)
}
// Click the allow button in the dialog to grant permission
- SystemUtil.eventually { click(By.displayId(displayId).res(ALLOW_BUTTON)) }
+ val allowButton =
+ if (permission == Manifest.permission.CAMERA) ALLOW_BUTTON_FOREGROUND else ALLOW_BUTTON
+ SystemUtil.eventually { click(By.displayId(displayId).res(allowButton)) }
// Validate permission grant result returned from callback
val grantPermissionResult = future.get(TIMEOUT, TimeUnit.MILLISECONDS)
@@ -284,34 +548,49 @@ class DeviceAwarePermissionGrantTest {
TestConstants.PERMISSION_RESULT_KEY_PERMISSIONS
)
)
- .isEqualTo(arrayOf(PERMISSION))
+ .isEqualTo(arrayOf(permission))
assertThat(
grantPermissionResult.getIntArray(TestConstants.PERMISSION_RESULT_KEY_GRANT_RESULTS)
)
.isEqualTo(arrayOf(PackageManager.PERMISSION_GRANTED).toIntArray())
+
+ val expectedPermissionResultDeviceId =
+ if (requestingForDevice == DEVICE_ID_INVALID) {
+ requestingFromDevice
+ } else {
+ requestingForDevice
+ }
assertThat(grantPermissionResult.getInt(TestConstants.PERMISSION_RESULT_KEY_DEVICE_ID))
- .isEqualTo(targetDeviceId)
+ .isEqualTo(expectedPermissionResultDeviceId)
// Validate whether permission is granted as expected
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, expectPermissionGrantedOnDefaultDevice)
+ assertAppHasPermissionForDevice(
+ DEVICE_ID_DEFAULT,
+ permission,
+ expectPermissionGrantedOnDefaultDevice,
+ )
assertAppHasPermissionForDevice(
virtualDevice.deviceId,
- expectPermissionGrantedOnRemoteDevice,
+ permission,
+ expectPermissionGrantedOnVirtualDevice,
)
}
private fun requestPermissionOnDevice(
displayId: Int,
targetDeviceId: Int,
+ permission: String,
): CompletableFuture<Bundle> {
val future = CompletableFuture<Bundle>()
val callback = RemoteCallback { result: Bundle? -> future.complete(result) }
+ val permissions = mutableListOf(permission).toTypedArray()
val intent =
Intent()
.setComponent(
ComponentName(APP_PACKAGE_NAME, "$APP_PACKAGE_NAME.RequestPermissionActivity")
)
.putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, targetDeviceId)
+ .putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES, permissions)
.putExtra(EXTRA_RESULT_RECEIVER, callback)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
@@ -327,12 +606,23 @@ class DeviceAwarePermissionGrantTest {
assertThat(text).contains(deviceName)
}
- private fun assertAppHasPermissionForDevice(deviceId: Int, expectPermissionGranted: Boolean) {
+ private fun assertPermissionMessageDoesNotContainDeviceName(displayId: Int) {
+ waitFindObject(By.displayId(displayId).res(PERMISSION_MESSAGE_ID))
+ val text = findTextForView(By.displayId(displayId).res(PERMISSION_MESSAGE_ID))
+ assertThat(text).doesNotContain(virtualDeviceName)
+ assertThat(text).doesNotContain(defaultDeviceName)
+ }
+
+ private fun assertAppHasPermissionForDevice(
+ deviceId: Int,
+ permission: String,
+ expectPermissionGranted: Boolean,
+ ) {
val checkPermissionResult =
defaultDeviceContext
.createDeviceContext(deviceId)
.packageManager
- .checkPermission(PERMISSION, APP_PACKAGE_NAME)
+ .checkPermission(permission, APP_PACKAGE_NAME)
if (expectPermissionGranted) {
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, checkPermissionResult)
@@ -347,18 +637,25 @@ class DeviceAwarePermissionGrantTest {
return intent.resolveActivity(defaultDeviceContext.packageManager)
}
+ private fun grantRuntimePermissionOnVirtualDevice(permission: String) {
+ permissionManager.grantRuntimePermission(
+ APP_PACKAGE_NAME,
+ permission,
+ virtualDevice.persistentDeviceId!!,
+ )
+ }
+
companion object {
const val APK_DIRECTORY = "/data/local/tmp/cts-permissionmultidevice"
const val APP_APK_PATH_STREAMING = "${APK_DIRECTORY}/CtsAccessRemoteDeviceCamera.apk"
const val APP_PACKAGE_NAME = "android.permissionmultidevice.cts.accessremotedevicecamera"
const val PERMISSION_MESSAGE_ID = "com.android.permissioncontroller:id/permission_message"
- const val ALLOW_BUTTON =
+ const val ALLOW_BUTTON_FOREGROUND =
"com.android.permissioncontroller:id/permission_allow_foreground_only_button"
- const val DEVICE_ID_DEFAULT = 0
+ const val ALLOW_BUTTON = "com.android.permissioncontroller:id/permission_allow_button"
+ const val DEVICE_ID_DEFAULT = Context.DEVICE_ID_DEFAULT
+ const val DEVICE_ID_INVALID = Context.DEVICE_ID_INVALID
const val PERSISTENT_DEVICE_ID_DEFAULT = VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT
- const val PERMISSION = Manifest.permission.CAMERA
const val TIMEOUT = 5000L
- private const val DISPLAY_HEIGHT = 1920
- private const val DISPLAY_WIDTH = 1080
}
}
diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
index 2547b9786..4476d934b 100644
--- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml
+++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
@@ -5394,13 +5394,13 @@
corresponding permission such as {@link #HEAD_TRACKING} or
{@link #FACE_TRACKING} for the data being accessed.
- <p>Protection level: normal|appop
+ <p>Protection level: signature|privileged
@SystemApi
@FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES)
@hide -->
<permission android:name="android.permission.XR_TRACKING_IN_BACKGROUND"
- android:protectionLevel="normal|appop"
+ android:protectionLevel="signature|privileged"
android:description="@string/permdesc_xr_tracking_in_background"
android:label="@string/permlab_xr_tracking_in_background"
android:featureFlag="android.xr.xr_manifest_entries" />
diff --git a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java
index 3bc3ff12b..e15614be2 100644
--- a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java
+++ b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java
@@ -878,7 +878,6 @@ public class RoleManagerTest {
}
@Test
- @RequiresFlagsEnabled(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE)
@EnsureHasPrivateProfile(installInstrumentedApp = OptionalBoolean.TRUE)
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM,
codeName = "VanillaIceCream")