summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/Android.bp1
-rw-r--r--PermissionController/OWNERS2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt42
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt20
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt3
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerCheckInternalTest.kt5
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt145
-rw-r--r--SafetyCenter/OWNERS1
-rw-r--r--tests/apex/AndroidTest.xml1
-rw-r--r--tests/cts/permission/permissionTestUtilLib/src/android/permission/cts/PermissionUtils.java11
-rw-r--r--tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java11
-rw-r--r--tests/cts/permission/src/android/permission/cts/SplitPermissionTest.java36
-rw-r--r--tests/cts/permissionpolicy/res/raw/android_manifest.xml6
-rw-r--r--tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PrivappPermissionsTest.java13
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/CameraMicIndicatorsPermissionTest.kt6
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt33
21 files changed, 198 insertions, 148 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