diff options
22 files changed, 214 insertions, 157 deletions
diff --git a/PermissionController/Android.bp b/PermissionController/Android.bp index 596b2dbb5..397870c20 100644 --- a/PermissionController/Android.bp +++ b/PermissionController/Android.bp @@ -89,6 +89,7 @@ android_library { ], //javacflags: ["-Werror"], + kotlin_lang_version: "1.9", kotlincflags: [ "-Werror", "-opt-in=kotlinx.coroutines.DelicateCoroutinesApi", diff --git a/PermissionController/OWNERS b/PermissionController/OWNERS index 3872198cb..aceac6afa 100644 --- a/PermissionController/OWNERS +++ b/PermissionController/OWNERS @@ -17,7 +17,9 @@ per-file res/** = file:platform/packages/modules/Permission:/SafetyCenter/OWNERS # For Wear related changes per-file WEAR_OWNERS = file:/PermissionController/WEAR_OWNERS +per-file wear-permission-components/** = file:/PermissionController/WEAR_OWNERS per-file src/com/android/permissioncontroller/permission/ui/wear/** = file:/PermissionController/WEAR_OWNERS per-file src/com/android/permissioncontroller/role/ui/wear/** = file:/PermissionController/WEAR_OWNERS +per-file src/com/android/permissioncontroller/incident/wear/** = file:/PermissionController/WEAR_OWNERS per-file res/*-watch/* = file:/PermissionController/WEAR_OWNERS per-file tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/** = file:/PermissionController/WEAR_OWNERS diff --git a/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt b/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt index 0ee0e0d01..d5ef1ebc8 100644 --- a/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt +++ b/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt @@ -56,7 +56,7 @@ class DrivingDecisionReminderService : Service() { data class PermissionReminder( val packageName: String, val permissionGroup: String, - val user: UserHandle + val user: UserHandle, ) private var scheduled = false @@ -85,7 +85,7 @@ class DrivingDecisionReminderService : Service() { context: Context, packageName: String, permissionGroup: String, - user: UserHandle + user: UserHandle, ): Intent { val intent = Intent(context, DrivingDecisionReminderService::class.java) intent.putExtra(EXTRA_PACKAGE_NAME, packageName) @@ -101,7 +101,7 @@ class DrivingDecisionReminderService : Service() { fun startServiceIfCurrentlyRestricted( context: Context, packageName: String, - permGroupName: String + permGroupName: String, ) { Car.createCar(context, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT) { car: Car, @@ -120,20 +120,20 @@ class DrivingDecisionReminderService : Service() { context, packageName, permGroupName, - Process.myUserHandle() + Process.myUserHandle(), ) ) } } else { DumpableLog.e( LOG_TAG, - "Reminder service not created because CarUxRestrictions is null" + "Reminder service not created because CarUxRestrictions is null", ) } } else { DumpableLog.e( LOG_TAG, - "Reminder service not created because CarUxRestrictionsManager is null" + "Reminder service not created because CarUxRestrictionsManager is null", ) } } @@ -145,7 +145,7 @@ class DrivingDecisionReminderService : Service() { val notificationManager = context.getSystemService(NotificationManager::class.java)!! notificationManager.cancel( DrivingDecisionReminderService::class.java.simpleName, - Constants.PERMISSION_DECISION_REMINDER_NOTIFICATION_ID + Constants.PERMISSION_DECISION_REMINDER_NOTIFICATION_ID, ) } } @@ -183,7 +183,7 @@ class DrivingDecisionReminderService : Service() { } else { DumpableLog.w( LOG_TAG, - "Car service disconnected, no notification will be scheduled" + "Car service disconnected, no notification will be scheduled", ) stopSelf() } @@ -198,7 +198,7 @@ class DrivingDecisionReminderService : Service() { if (!restrictions.isRequiresDistractionOptimization) { DumpableLog.d( LOG_TAG, - "UX restrictions no longer required - showing reminder notification" + "UX restrictions no longer required - showing reminder notification", ) showRecentGrantDecisionsPostDriveNotification() stopSelf() @@ -230,14 +230,14 @@ class DrivingDecisionReminderService : Service() { NotificationChannel( Constants.PERMISSION_REMINDER_CHANNEL_ID, getString(R.string.permission_reminders), - NotificationManager.IMPORTANCE_HIGH + NotificationManager.IMPORTANCE_HIGH, ) notificationManager.createNotificationChannel(permissionReminderChannel) notificationManager.notify( DrivingDecisionReminderService::class.java.simpleName, Constants.PERMISSION_DECISION_REMINDER_NOTIFICATION_ID, - createNotification(createNotificationTitle(), createNotificationContent()) + createNotification(createNotificationTitle(), createNotificationContent()), ) logNotificationPresented() @@ -266,26 +266,26 @@ class DrivingDecisionReminderService : Service() { applicationContext, R.string.post_drive_permission_decision_reminder_summary_multi_apps, (packageLabels.size - 1), - packageLabelsDistinct[0] + packageLabelsDistinct[0], ) } else if (permissionGroupNamesDistinct.size == 2) { getString( R.string.post_drive_permission_decision_reminder_summary_1_app_2_permissions, packageLabelsDistinct[0], permissionGroupNamesDistinct[0], - permissionGroupNamesDistinct[1] + permissionGroupNamesDistinct[1], ) } else if (permissionGroupNamesDistinct.size > 2) { getString( R.string.post_drive_permission_decision_reminder_summary_1_app_multi_permission, permissionGroupNamesDistinct.size, - packageLabelsDistinct[0] + packageLabelsDistinct[0], ) } else { getString( R.string.post_drive_permission_decision_reminder_summary_1_app_1_permission, packageLabelsDistinct[0], - permissionGroupNamesDistinct[0] + permissionGroupNamesDistinct[0], ) } } @@ -302,9 +302,9 @@ class DrivingDecisionReminderService : Service() { putExtra(Constants.EXTRA_SESSION_ID, sessionId) putExtra( AutoReviewPermissionDecisionsFragment.EXTRA_SOURCE, - AutoReviewPermissionDecisionsFragment.EXTRA_SOURCE_NOTIFICATION + AutoReviewPermissionDecisionsFragment.EXTRA_SOURCE_NOTIFICATION, ) - flags = Intent.FLAG_ACTIVITY_NEW_TASK + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent = PendingIntent.getActivity( @@ -313,14 +313,14 @@ class DrivingDecisionReminderService : Service() { clickIntent, PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_UPDATE_CURRENT or - PendingIntent.FLAG_IMMUTABLE + PendingIntent.FLAG_IMMUTABLE, ) val settingsIcon = KotlinUtils.getSettingsIcon( application, permissionReminders.first().user, - applicationContext.packageManager + applicationContext.packageManager, ) val b = @@ -342,7 +342,7 @@ class DrivingDecisionReminderService : Service() { Notification.Action.Builder( /* icon= */ null, getString(R.string.go_to_settings), - pendingIntent + pendingIntent, ) .build() ) @@ -358,7 +358,7 @@ class DrivingDecisionReminderService : Service() { PermissionControllerStatsLog.write( PermissionControllerStatsLog.PERMISSION_REMINDER_NOTIFICATION_INTERACTED, sessionId, - PERMISSION_REMINDER_NOTIFICATION_INTERACTED__RESULT__NOTIFICATION_PRESENTED + PERMISSION_REMINDER_NOTIFICATION_INTERACTED__RESULT__NOTIFICATION_PRESENTED, ) } } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt b/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt index a69b78a06..5ba19f4c0 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt @@ -70,7 +70,6 @@ class SafetyCenterQsTileService : TileService() { qsTile.label = getString(R.string.safety_privacy_qs_tile_title) qsTile.subtitle = getString(R.string.safety_privacy_qs_tile_subtitle) qsTile.contentDescription = TextUtils.concat(qsTile.label, ", ", qsTile.subtitle) - qsTile.state = Tile.STATE_ACTIVE qsTile.updateTile() } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt index 36d867b11..f52eaadcd 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt @@ -68,7 +68,7 @@ class AutoPermissionUsageFragment : AutoSettingsFrameFragment() { ?: (arguments?.getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID) ?: Constants.INVALID_SESSION_ID) - val factory = PermissionUsageViewModelFactory(requireActivity().application, this, Bundle()) + val factory = PermissionUsageViewModelFactory(requireActivity().application) mViewModel = ViewModelProvider(this, factory)[PermissionUsageViewModel::class.java] mViewModel.permissionUsagesUiLiveData.observe(this, this::updateAllUI) setLoading(true) diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java index 79db4660e..3fa780145 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java @@ -105,7 +105,7 @@ public class PermissionUsageFragment extends SettingsWithLargeHeader { } PermissionUsageViewModelFactory factory = new PermissionUsageViewModelFactory( - getActivity().getApplication(), this, new Bundle()); + getActivity().getApplication()); mViewModel = new ViewModelProvider(this, factory) .get(PermissionUsageViewModel.class); diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt index 0df91adcc..e763afc30 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt @@ -19,16 +19,16 @@ package com.android.permissioncontroller.permission.ui.viewmodel.v31 import android.app.Application import android.content.Context import android.os.Build -import android.os.Bundle import androidx.annotation.RequiresApi import androidx.annotation.VisibleForTesting -import androidx.lifecycle.AbstractSavedStateViewModelFactory import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.asLiveData +import androidx.lifecycle.createSavedStateHandle import androidx.lifecycle.viewModelScope -import androidx.savedstate.SavedStateRegistryOwner +import androidx.lifecycle.viewmodel.CreationExtras import com.android.permissioncontroller.DeviceUtils import com.android.permissioncontroller.permission.data.repository.v31.PermissionRepository import com.android.permissioncontroller.permission.domain.model.v31.PermissionGroupUsageModel @@ -189,24 +189,16 @@ sealed class PermissionUsagesUiState { /** Factory for [PermissionUsageViewModel]. */ @RequiresApi(Build.VERSION_CODES.S) -class PermissionUsageViewModelFactory( - private val app: Application, - owner: SavedStateRegistryOwner, - defaultArgs: Bundle -) : AbstractSavedStateViewModelFactory(owner, defaultArgs) { +class PermissionUsageViewModelFactory(private val app: Application) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun <T : ViewModel> create( - key: String, - modelClass: Class<T>, - handle: SavedStateHandle - ): T { + override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T { val permissionRepository = PermissionRepository.getInstance(app) val permissionUsageUseCase = GetPermissionGroupUsageUseCase.create(app) return PermissionUsageViewModel( app, permissionRepository, permissionUsageUseCase, - savedState = handle + savedState = extras.createSavedStateHandle() ) as T } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt index 22ab7f77f..d2832bc90 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt @@ -44,7 +44,7 @@ class WearPermissionUsageFragment : Fragment() { val sessionId: Long = arguments?.getLong(Constants.EXTRA_SESSION_ID) ?: Constants.INVALID_SESSION_ID - val factory = PermissionUsageViewModelFactory(requireActivity().application, this, Bundle()) + val factory = PermissionUsageViewModelFactory(requireActivity().application) val viewModel = ViewModelProvider(this, factory).get(PermissionUsageViewModel::class.java) return ComposeView(requireContext()).apply { diff --git a/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt b/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt index c633c013a..1610901bc 100644 --- a/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt +++ b/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt @@ -48,7 +48,6 @@ import androidx.annotation.GuardedBy import androidx.annotation.RequiresApi import androidx.annotation.VisibleForTesting import androidx.annotation.WorkerThread -import androidx.core.util.Preconditions import com.android.modules.utils.build.SdkLevel import com.android.permissioncontroller.Constants import com.android.permissioncontroller.PermissionControllerStatsLog @@ -712,7 +711,7 @@ class AccessibilityPackageResetHandler : BroadcastReceiver() { return } - val data = Preconditions.checkNotNull(intent.data) + val data = requireNotNull(intent.data) val coroutineScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) coroutineScope.launch(Dispatchers.Default) { if (DEBUG) { diff --git a/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt b/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt index 43b3edc04..58a6f1bc4 100644 --- a/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt +++ b/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt @@ -57,7 +57,6 @@ import androidx.annotation.GuardedBy import androidx.annotation.RequiresApi import androidx.annotation.VisibleForTesting import androidx.annotation.WorkerThread -import androidx.core.util.Preconditions import com.android.modules.utils.build.SdkLevel import com.android.permissioncontroller.Constants import com.android.permissioncontroller.Constants.KEY_LAST_NOTIFICATION_LISTENER_NOTIFICATION_SHOWN @@ -1146,7 +1145,7 @@ class NotificationListenerPackageResetHandler : BroadcastReceiver() { return } - val data = Preconditions.checkNotNull(intent.data) + val data = requireNotNull(intent.data) val pkg: String = data.schemeSpecificPart if (DEBUG) Log.i(TAG, "Reset $pkg") diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerCheckInternalTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerCheckInternalTest.kt index bc00d3bc8..4bb021b3d 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerCheckInternalTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerCheckInternalTest.kt @@ -30,7 +30,6 @@ import android.safetycenter.SafetyCenterManager import android.safetycenter.SafetyEvent import android.safetycenter.SafetySourceData import android.safetycenter.SafetySourceIssue -import androidx.core.util.Preconditions import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress @@ -464,9 +463,7 @@ class NotificationListenerCheckInternalTest { } val safetySourceIssue = - Preconditions.checkNotNull( - notificationListenerCheck.createSafetySourceIssue(testComponent, 0) - ) + checkNotNull(notificationListenerCheck.createSafetySourceIssue(testComponent, 0)) val expectedId = "notification_listener_${testComponent.flattenToString()}" val expectedTitle = 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 6a45ac7c4..a0199979d 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 @@ -40,10 +40,10 @@ import com.android.permissioncontroller.privacysources.SafetyCenterReceiver.Refr import com.android.permissioncontroller.privacysources.SafetyCenterReceiver.RefreshEvent.EVENT_REFRESH_REQUESTED import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.runBlockingTest +import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before @@ -74,7 +74,7 @@ class SafetyCenterReceiverTest { val application = Mockito.mock(PermissionControllerApplication::class.java) } - private val testCoroutineDispatcher = TestCoroutineDispatcher() + private val unconfinedCoroutineDispatcher = UnconfinedTestDispatcher() @Mock lateinit var mockSafetyCenterManager: SafetyCenterManager @Mock lateinit var mockPackageManager: PackageManager @@ -88,7 +88,7 @@ class SafetyCenterReceiverTest { private fun privacySourceMap(context: Context) = mapOf( TEST_PRIVACY_SOURCE_ID to mockPrivacySource, - TEST_PRIVACY_SOURCE_ID_2 to mockPrivacySource2 + TEST_PRIVACY_SOURCE_ID_2 to mockPrivacySource2, ) @Before @@ -110,28 +110,28 @@ class SafetyCenterReceiverTest { whenever( Utils.getSystemServiceSafe( any(ContextWrapper::class.java), - eq(UserManager::class.java) + eq(UserManager::class.java), ) ) .thenReturn(mockUserManager) whenever( Utils.getSystemServiceSafe( any(ContextWrapper::class.java), - eq(SafetyCenterManager::class.java) + eq(SafetyCenterManager::class.java), ) ) .thenReturn(mockSafetyCenterManager) whenever(mockUserManager.isProfile).thenReturn(false) - safetyCenterReceiver = SafetyCenterReceiver(::privacySourceMap, testCoroutineDispatcher) + safetyCenterReceiver = + SafetyCenterReceiver(::privacySourceMap, unconfinedCoroutineDispatcher) - Dispatchers.setMain(testCoroutineDispatcher) + Dispatchers.setMain(unconfinedCoroutineDispatcher) } @After fun cleanup() { Dispatchers.resetMain() - testCoroutineDispatcher.cleanupTestCoroutines() mockitoSession.finishMocking() } @@ -141,91 +141,104 @@ class SafetyCenterReceiverTest { DeviceConfig.getInt( eq(DeviceConfig.NAMESPACE_PRIVACY), eq(SafetyCenterQsTileService.QS_TILE_COMPONENT_SETTING_FLAGS), - ArgumentMatchers.anyInt() + ArgumentMatchers.anyInt(), ) ) .thenReturn(PackageManager.DONT_KILL_APP) } @Test - fun onReceive_actionSafetyCenterEnabledChanged() = runBlockingTest { - mockQSTileSettingsFlag() - safetyCenterReceiver.onReceive(application, Intent(ACTION_SAFETY_CENTER_ENABLED_CHANGED)) + fun onReceive_actionSafetyCenterEnabledChanged() = + runTest(UnconfinedTestDispatcher()) { + mockQSTileSettingsFlag() + safetyCenterReceiver.onReceive( + application, + Intent(ACTION_SAFETY_CENTER_ENABLED_CHANGED), + ) - verify(mockPrivacySource).safetyCenterEnabledChanged(application, true) - verify(mockPrivacySource2).safetyCenterEnabledChanged(application, true) - } + verify(mockPrivacySource).safetyCenterEnabledChanged(application, true) + verify(mockPrivacySource2).safetyCenterEnabledChanged(application, true) + } @Test - fun onReceive_actionSafetyCenterEnabledChanged_safetyCenterDisabled() = runBlockingTest { - mockQSTileSettingsFlag() - whenever(mockSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false) - - safetyCenterReceiver.onReceive(application, Intent(ACTION_SAFETY_CENTER_ENABLED_CHANGED)) - advanceUntilIdle() + fun onReceive_actionSafetyCenterEnabledChanged_safetyCenterDisabled() = + runTest(UnconfinedTestDispatcher()) { + mockQSTileSettingsFlag() + whenever(mockSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false) + + safetyCenterReceiver.onReceive( + application, + Intent(ACTION_SAFETY_CENTER_ENABLED_CHANGED), + ) + advanceUntilIdle() - verify(mockPrivacySource).safetyCenterEnabledChanged(application, false) - verify(mockPrivacySource2).safetyCenterEnabledChanged(application, false) - } + verify(mockPrivacySource).safetyCenterEnabledChanged(application, false) + verify(mockPrivacySource2).safetyCenterEnabledChanged(application, false) + } @Test - fun onReceive_actionBootCompleted() = runBlockingTest { - val intent = Intent(ACTION_BOOT_COMPLETED) + fun onReceive_actionBootCompleted() = + runTest(UnconfinedTestDispatcher()) { + val intent = Intent(ACTION_BOOT_COMPLETED) - safetyCenterReceiver.onReceive(application, intent) - advanceUntilIdle() + safetyCenterReceiver.onReceive(application, intent) + advanceUntilIdle() - verify(mockPrivacySource) - .rescanAndPushSafetyCenterData(application, intent, EVENT_DEVICE_REBOOTED) - verify(mockPrivacySource2) - .rescanAndPushSafetyCenterData(application, intent, EVENT_DEVICE_REBOOTED) - } + verify(mockPrivacySource) + .rescanAndPushSafetyCenterData(application, intent, EVENT_DEVICE_REBOOTED) + verify(mockPrivacySource2) + .rescanAndPushSafetyCenterData(application, intent, EVENT_DEVICE_REBOOTED) + } @Test - fun onReceive_actionBootCompleted_safetyCenterDisabled() = runBlockingTest { - whenever(mockSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false) - val intent = Intent(ACTION_BOOT_COMPLETED) + fun onReceive_actionBootCompleted_safetyCenterDisabled() = + runTest(UnconfinedTestDispatcher()) { + whenever(mockSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false) + val intent = Intent(ACTION_BOOT_COMPLETED) - safetyCenterReceiver.onReceive(application, intent) - advanceUntilIdle() + safetyCenterReceiver.onReceive(application, intent) + advanceUntilIdle() - verifyZeroInteractions(mockPrivacySource) - verifyZeroInteractions(mockPrivacySource2) - } + verifyZeroInteractions(mockPrivacySource) + verifyZeroInteractions(mockPrivacySource2) + } @Test - fun onReceive_actionRefreshSafetySources() = runBlockingTest { - val intent = Intent(ACTION_REFRESH_SAFETY_SOURCES) - intent.putExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS, arrayOf(TEST_PRIVACY_SOURCE_ID)) + fun onReceive_actionRefreshSafetySources() = + runTest(UnconfinedTestDispatcher()) { + val intent = Intent(ACTION_REFRESH_SAFETY_SOURCES) + intent.putExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS, arrayOf(TEST_PRIVACY_SOURCE_ID)) - safetyCenterReceiver.onReceive(application, intent) - advanceUntilIdle() + safetyCenterReceiver.onReceive(application, intent) + advanceUntilIdle() - verify(mockPrivacySource) - .rescanAndPushSafetyCenterData(application, intent, EVENT_REFRESH_REQUESTED) - verifyZeroInteractions(mockPrivacySource2) - } + verify(mockPrivacySource) + .rescanAndPushSafetyCenterData(application, intent, EVENT_REFRESH_REQUESTED) + verifyZeroInteractions(mockPrivacySource2) + } @Test - fun onReceive_actionRefreshSafetySources_noSourcesSpecified() = runBlockingTest { - val intent = Intent(ACTION_REFRESH_SAFETY_SOURCES) + fun onReceive_actionRefreshSafetySources_noSourcesSpecified() = + runTest(UnconfinedTestDispatcher()) { + val intent = Intent(ACTION_REFRESH_SAFETY_SOURCES) - safetyCenterReceiver.onReceive(application, intent) - advanceUntilIdle() + safetyCenterReceiver.onReceive(application, intent) + advanceUntilIdle() - verifyZeroInteractions(mockPrivacySource) - verifyZeroInteractions(mockPrivacySource2) - } + verifyZeroInteractions(mockPrivacySource) + verifyZeroInteractions(mockPrivacySource2) + } @Test - fun onReceive_actionRefreshSafetySources_safetyCenterDisabled() = runBlockingTest { - whenever(mockSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false) - val intent = Intent(ACTION_REFRESH_SAFETY_SOURCES) + fun onReceive_actionRefreshSafetySources_safetyCenterDisabled() = + runTest(UnconfinedTestDispatcher()) { + whenever(mockSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false) + val intent = Intent(ACTION_REFRESH_SAFETY_SOURCES) - safetyCenterReceiver.onReceive(application, intent) - advanceUntilIdle() + safetyCenterReceiver.onReceive(application, intent) + advanceUntilIdle() - verifyZeroInteractions(mockPrivacySource) - verifyZeroInteractions(mockPrivacySource2) - } + verifyZeroInteractions(mockPrivacySource) + verifyZeroInteractions(mockPrivacySource2) + } } diff --git a/SafetyCenter/OWNERS b/SafetyCenter/OWNERS index d9039e915..229331d3c 100644 --- a/SafetyCenter/OWNERS +++ b/SafetyCenter/OWNERS @@ -4,7 +4,6 @@ simonjw@google.com davidcoffin@google.com elliotsisteron@google.com fiscella@google.com -shrigupt@google.com jtomljanovic@google.com deweytyl@google.com maxspencer@google.com diff --git a/tests/apex/AndroidTest.xml b/tests/apex/AndroidTest.xml index b1af0f53e..c3807eb9d 100644 --- a/tests/apex/AndroidTest.xml +++ b/tests/apex/AndroidTest.xml @@ -20,6 +20,7 @@ <option name="test-suite-tag" value="apct" /> <option name="test-suite-tag" value="apct-instrumentation" /> <option name="test-tag" value="PermissionApexTests" /> + <option name="hidden-api-checks" value="false" /> <object type="module_controller" class="com.android.tradefed.testtype.suite.module.Sdk30ModuleController" /> <!-- Install test --> diff --git a/tests/cts/permission/permissionTestUtilLib/src/android/permission/cts/PermissionUtils.java b/tests/cts/permission/permissionTestUtilLib/src/android/permission/cts/PermissionUtils.java index 29e97be51..aabdd8565 100644 --- a/tests/cts/permission/permissionTestUtilLib/src/android/permission/cts/PermissionUtils.java +++ b/tests/cts/permission/permissionTestUtilLib/src/android/permission/cts/PermissionUtils.java @@ -103,12 +103,23 @@ public class PermissionUtils { * @param apkFile The apk to install */ public static void install(@NonNull String apkFile) { + install(apkFile, false); + } + + /** + * Install an APK. + * + * @param apkFile The apk to install + * @param grantPermissions whether to grant requested runtime permissions + */ + public static void install(@NonNull String apkFile, boolean grantPermissions) { final int sdkVersion = Build.VERSION.SDK_INT + (Build.VERSION.RELEASE_OR_CODENAME.equals("REL") ? 0 : 1); boolean forceQueryable = sdkVersion > Build.VERSION_CODES.Q; runShellCommandOrThrow("pm install -r --force-sdk " + (SdkLevel.isAtLeastU() ? "--bypass-low-target-sdk-block " : "") + (forceQueryable ? "--force-queryable " : "") + + (grantPermissions ? "-g " : "") + apkFile); } diff --git a/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java b/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java index 166a5dbd1..024a89f2e 100644 --- a/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java +++ b/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java @@ -77,6 +77,7 @@ import androidx.test.filters.SdkSuppress; import androidx.test.runner.AndroidJUnit4; import com.android.compatibility.common.util.DeviceConfigStateChangerRule; +import com.android.compatibility.common.util.UserHelper; import com.android.compatibility.common.util.mainline.MainlineModule; import com.android.compatibility.common.util.mainline.ModuleDetector; import com.android.modules.utils.build.SdkLevel; @@ -199,6 +200,8 @@ public class LocationAccessCheckTest { private static boolean sWasLocationEnabled = true; + private UserHelper mUserHelper = new UserHelper(sContext); + @BeforeClass public static void beforeClassSetup() throws Exception { reduceDelays(); @@ -465,6 +468,14 @@ public class LocationAccessCheckTest { @Before public void beforeEachTestSetup() throws Throwable { assumeIsNotLowRamDevice(); + + // TODO(b/380297485): Remove this assumption once NotificationListeners are supported on + // visible background users. + // Skipping each test for visible background users as all test cases depend on + // NotificationListeners. + assumeFalse("NotificationListeners are not yet supported on visible background users", + mUserHelper.isVisibleBackgroundUser()); + wakeUpAndDismissKeyguard(); bindService(); resetPermissionControllerBeforeEachTest(); diff --git a/tests/cts/permission/src/android/permission/cts/SplitPermissionTest.java b/tests/cts/permission/src/android/permission/cts/SplitPermissionTest.java index a509b3bfe..eda5346f7 100644 --- a/tests/cts/permission/src/android/permission/cts/SplitPermissionTest.java +++ b/tests/cts/permission/src/android/permission/cts/SplitPermissionTest.java @@ -27,6 +27,7 @@ import static android.permission.cts.PermissionUtils.getAppOp; import static android.permission.cts.PermissionUtils.getPermissionFlags; import static android.permission.cts.PermissionUtils.getPermissions; import static android.permission.cts.PermissionUtils.grantPermission; +import static android.permission.cts.PermissionUtils.install; import static android.permission.cts.PermissionUtils.isGranted; import static android.permission.cts.PermissionUtils.revokePermission; import static android.permission.cts.PermissionUtils.setPermissionFlags; @@ -139,15 +140,6 @@ public class SplitPermissionTest { assertWithMessage(permName + " is granted").that(isGranted(APP_PKG, permName)).isFalse(); } - /** - * Install an APK. - * - * @param apkFile The apk to install - */ - public void install(@NonNull String apkFile) { - PermissionUtils.install(apkFile); - } - @After public void uninstallTestApp() { uninstallApp(APP_PKG); @@ -173,7 +165,7 @@ public class SplitPermissionTest { */ @Test public void permissionsDoNotSplitWithHighTargetSDKPreM() throws Exception { - install(APK_CONTACTS_16); + install(APK_CONTACTS_16, true); assertRequestsPermission(READ_CONTACTS); assertNotRequestsPermission(READ_CALL_LOG); @@ -197,7 +189,7 @@ public class SplitPermissionTest { */ @Test public void permissionsSplitWithLowTargetSDKPreM() throws Exception { - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); assertRequestsPermission(READ_CONTACTS); assertRequestsPermission(READ_CALL_LOG); @@ -218,7 +210,7 @@ public class SplitPermissionTest { */ @Test public void nonInheritedStateHighLowTargetSDKPreM() throws Exception { - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); assertPermissionGranted(READ_CONTACTS); } @@ -245,7 +237,7 @@ public class SplitPermissionTest { Assume.assumeTrue("Secondary users have the DISALLOW_OUTGOING_CALLS user restriction", UserHandle.SYSTEM.equals(Process.myUserHandle())); - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); assertPermissionGranted(READ_CONTACTS); assertPermissionGranted(READ_CALL_LOG); @@ -256,7 +248,7 @@ public class SplitPermissionTest { */ @Test public void backgroundLocationPermissionDefaultGrantPreM() throws Exception { - install(APK_LOCATION_22); + install(APK_LOCATION_22, true); assertPermissionGranted(ACCESS_COARSE_LOCATION); assertPermissionGranted(ACCESS_BACKGROUND_LOCATION); @@ -304,7 +296,7 @@ public class SplitPermissionTest { @MtsIgnore(bugId = 152580253) @Test public void inheritFlagsPreM() { - install(APK_CONTACTS_16); + install(APK_CONTACTS_16, true); setPermissionFlags(APP_PKG, READ_CONTACTS, FLAG_PERMISSION_USER_SET, FLAG_PERMISSION_USER_SET); @@ -344,7 +336,7 @@ public class SplitPermissionTest { Assume.assumeTrue("Secondary users have the DISALLOW_OUTGOING_CALLS user restriction", UserHandle.SYSTEM.equals(Process.myUserHandle())); - install(APK_CONTACTS_16); + install(APK_CONTACTS_16, true); install(APK_CONTACTS_15); @@ -374,7 +366,7 @@ public class SplitPermissionTest { */ @Test public void inheritRevokedPermissionStatePreM() throws Exception { - install(APK_CONTACTS_16); + install(APK_CONTACTS_16, true); revokePermission(APP_PKG, READ_CONTACTS); install(APK_CONTACTS_15); @@ -415,7 +407,7 @@ public class SplitPermissionTest { Assume.assumeTrue("Secondary users have the DISALLOW_OUTGOING_CALLS user restriction", UserHandle.SYSTEM.equals(Process.myUserHandle())); - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); revokePermission(APP_PKG, READ_CONTACTS); grantPermission(APP_PKG, READ_CALL_LOG); @@ -446,7 +438,7 @@ public class SplitPermissionTest { */ @Test public void revokeNewSplitPermissionStatePreM() throws Exception { - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); revokePermission(APP_PKG, READ_CALL_LOG); @@ -521,7 +513,7 @@ public class SplitPermissionTest { Assume.assumeTrue("Secondary users have the DISALLOW_OUTGOING_CALLS user restriction", UserHandle.SYSTEM.equals(Process.myUserHandle())); - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); install(APK_CONTACTS_CALLLOG_16); @@ -548,7 +540,7 @@ public class SplitPermissionTest { */ @Test public void oldPermissionStaysGrantedOnUpgradePreM() throws Exception { - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); install(APK_CONTACTS_CALLLOG_16); @@ -574,7 +566,7 @@ public class SplitPermissionTest { */ @Test public void oldPermissionStaysRevokedOnUpgradePreM() throws Exception { - install(APK_CONTACTS_15); + install(APK_CONTACTS_15, true); revokePermission(APP_PKG, READ_CONTACTS); install(APK_CONTACTS_CALLLOG_16); diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml index 6f3c4b447..bdcb11865 100644 --- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml +++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml @@ -9121,7 +9121,11 @@ android:permission="android.permission.BIND_JOB_SERVICE" > </service> - <service android:name="com.android.server.profcollect.ProfcollectForwardingService$ProfcollectBGJobService" + <service android:name="com.android.server.profcollect.ProfcollectForwardingService$PeriodicTraceJobService" + android:permission="android.permission.BIND_JOB_SERVICE" > + </service> + + <service android:name="com.android.server.profcollect.ProfcollectForwardingService$ReportProcessJobService" android:permission="android.permission.BIND_JOB_SERVICE" > </service> diff --git a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PrivappPermissionsTest.java b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PrivappPermissionsTest.java index f33e8a6e6..2c3faefaa 100644 --- a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PrivappPermissionsTest.java +++ b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PrivappPermissionsTest.java @@ -30,6 +30,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; @@ -142,6 +143,9 @@ public class PrivappPermissionsTest { Set<String> granted = filterValues(requestedPrivPermissions, isGranted -> isGranted).keySet(); + Set<String> factoryGranted = intersection(factoryRequestedPrivPermissions, + granted); + Set<String> factoryNotGranted = difference(factoryRequestedPrivPermissions, granted); @@ -176,7 +180,14 @@ public class PrivappPermissionsTest { } } - Set<String> grantedNotInWhitelist = difference(granted, whitelist); + // If an updated module app has a shared user, it may be getting a privileged + // permission through another APK-in-APEX which supports updatable privileged + // permission allowlist, and CTS should keep passing for it. + boolean isUpdatedSystemAppWithSharedUser = + (pkg.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 + && pkg.sharedUserId != null; + Set<String> grantedNotInWhitelist = difference( + isUpdatedSystemAppWithSharedUser ? factoryGranted : granted, whitelist); Set<String> factoryNotGrantedNotRemovedNotInDenylist = difference(difference( factoryNotGranted, removed), denylist); diff --git a/tests/cts/permissionui/src/android/permissionui/cts/CameraMicIndicatorsPermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/CameraMicIndicatorsPermissionTest.kt index 19b67e729..7abea1f23 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/CameraMicIndicatorsPermissionTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/CameraMicIndicatorsPermissionTest.kt @@ -57,6 +57,7 @@ import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity import com.android.compatibility.common.util.UiAutomatorUtils2 import com.android.compatibility.common.util.UiAutomatorUtils2.assertWithUiDump +import com.android.compatibility.common.util.UserHelper import com.android.modules.utils.build.SdkLevel import com.android.sts.common.util.StsExtraBusinessLogicTestCase import java.util.regex.Pattern @@ -163,7 +164,7 @@ class CameraMicIndicatorsPermissionTest : StsExtraBusinessLogicTestCase { @Before fun setUp() { // Camera and Mic are not supported for secondary user visible as a background user. - assumeFalse(isAutomotiveWithVisibleBackgroundUser()) + assumeFalse(isCar && UserHelper(context).isVisibleBackgroundUser()) runWithShellPermissionIdentity { screenTimeoutBeforeTest = Settings.System.getLong(context.contentResolver, Settings.System.SCREEN_OFF_TIMEOUT) @@ -212,7 +213,8 @@ class CameraMicIndicatorsPermissionTest : StsExtraBusinessLogicTestCase { @After fun tearDown() { - if (isAutomotiveWithVisibleBackgroundUser()) { + // Camera and Mic are not supported for secondary user visible as a background user. + if (isCar && UserHelper(context).isVisibleBackgroundUser()) { return } uninstall() diff --git a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt index 8e91a00ce..cde2b6d6a 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt @@ -78,20 +78,14 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun installedAppStartsWithModeDefault() { installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST) - eventually { - runWithShellPermissionIdentity { - assertEquals( - getAppEcmState(context, appOpsManager, APP_PACKAGE_NAME), - AppOpsManager.MODE_DEFAULT - ) - } - } + waitForModeDefault() } @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED) @Test fun givenStoreAppThenIsNotRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } } @@ -101,6 +95,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenLocalAppThenIsRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromLocalFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } } @@ -110,6 +105,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenDownloadedThenAppIsRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } } @@ -119,6 +115,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenExplicitlyRestrictedAppThenIsRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST) + waitForModeDefault() eventually { runWithShellPermissionIdentity { assertEquals( @@ -138,6 +135,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenRestrictedAppThenIsNotRestrictedFromNonProtectedSetting() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, NON_PROTECTED_SETTING)) } } @@ -147,6 +145,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenRestrictedAppThenClearRestrictionNotAllowedByDefault() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertFalse(ecm.isClearRestrictionAllowed(APP_PACKAGE_NAME)) } } @@ -156,6 +155,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenRestrictedAppWhenClearRestrictionThenNotRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } ecm.setClearRestrictionAllowed(APP_PACKAGE_NAME) @@ -169,6 +169,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun createRestrictedSettingDialogIntentReturnsIntent() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() val intent = ecm.createRestrictedSettingDialogIntent(APP_PACKAGE_NAME, PROTECTED_SETTING) @@ -181,6 +182,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() val permissionAndExpectedGrantResults = arrayOf( GROUP_2_PERMISSION_1_RESTRICTED to false, @@ -207,6 +209,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() requestAppPermissionsAndAssertResult( GROUP_3_PERMISSION_1_UNRESTRICTED to false, @@ -236,6 +239,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() requestAppPermissionsAndAssertResult( GROUP_3_PERMISSION_1_UNRESTRICTED to true, @@ -254,6 +258,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() requestAppPermissionsAndAssertResult( GROUP_4_PERMISSION_1_UNRESTRICTED to true, @@ -287,6 +292,18 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { ) } + private fun waitForModeDefault() { + eventually { + runWithShellPermissionIdentity { + assertEquals( + "Timed out waiting for package mode to change to MODE_DEFAULT", + getAppEcmState(context, appOpsManager, APP_PACKAGE_NAME), + AppOpsManager.MODE_DEFAULT + ) + } + } + } + companion object { private const val GROUP_2_PERMISSION_1_RESTRICTED = Manifest.permission.SEND_SMS private const val GROUP_2_PERMISSION_2_RESTRICTED = Manifest.permission.READ_SMS diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt index ae6e33b2a..e4ee52186 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt @@ -53,7 +53,8 @@ class PermissionDecisionsTest : BaseUsePermissionTest() { openPermissionDecisions() waitFindObject( By.hasChild( - By.text("You gave $APP_PACKAGE_NAME access to location").displayId(displayId)) + By.text("You gave $APP_PACKAGE_NAME access to location").displayId(displayId) + ) .hasChild(By.text("Today").displayId(displayId)) .displayId(displayId) ) @@ -69,7 +70,8 @@ class PermissionDecisionsTest : BaseUsePermissionTest() { openPermissionDecisions() waitFindObject( By.hasChild( - By.text("You denied $APP_PACKAGE_NAME access to location").displayId(displayId)) + By.text("You denied $APP_PACKAGE_NAME access to location").displayId(displayId) + ) .hasChild(By.text("Today").displayId(displayId)) .displayId(displayId) ) @@ -86,11 +88,13 @@ class PermissionDecisionsTest : BaseUsePermissionTest() { openPermissionDecisions() assertNull( waitFindObjectOrNull( - By.hasChild(By.text("You denied $APP_PACKAGE_NAME access to location") - .displayId(displayId)) + By.hasChild( + By.text("You denied $APP_PACKAGE_NAME access to location") + .displayId(displayId) + ) .hasChild(By.text("Today").displayId(displayId)) .displayId(displayId), - ASSERT_ABSENT_SELECTOR_TIMEOUT_MS + ASSERT_ABSENT_SELECTOR_TIMEOUT_MS, ) ) } @@ -105,8 +109,10 @@ class PermissionDecisionsTest : BaseUsePermissionTest() { openPermissionDecisions() waitFindObject( - By.hasChild(By.text("You gave $APP_PACKAGE_NAME access to location") - .displayId(displayId)) + By.hasChild( + By.text("You gave $APP_PACKAGE_NAME access to location") + .displayId(displayId) + ) .hasChild(By.text("Today").displayId(displayId)) .displayId(displayId) ) @@ -121,7 +127,8 @@ class PermissionDecisionsTest : BaseUsePermissionTest() { pressBack() waitFindObject( By.hasChild( - By.text("You denied $APP_PACKAGE_NAME access to location").displayId(displayId)) + By.text("You denied $APP_PACKAGE_NAME access to location").displayId(displayId) + ) .hasChild(By.text("Today").displayId(displayId)) .displayId(displayId) ) @@ -132,7 +139,7 @@ class PermissionDecisionsTest : BaseUsePermissionTest() { SystemUtil.runWithShellPermissionIdentity { context.startActivity( Intent(PermissionManager.ACTION_REVIEW_PERMISSION_DECISIONS).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) } ) } |