1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.safetycenter.functional.multiusers 18 19 import android.Manifest.permission.INTERACT_ACROSS_USERS 20 import android.Manifest.permission.INTERACT_ACROSS_USERS_FULL 21 import android.app.PendingIntent 22 import android.content.Context 23 import android.os.UserHandle 24 import android.platform.test.annotations.RequiresFlagsDisabled 25 import android.platform.test.annotations.RequiresFlagsEnabled 26 import android.platform.test.flag.junit.DeviceFlagsValueProvider 27 import android.safetycenter.SafetyCenterData 28 import android.safetycenter.SafetyCenterEntry 29 import android.safetycenter.SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING 30 import android.safetycenter.SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNKNOWN 31 import android.safetycenter.SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED 32 import android.safetycenter.SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 33 import android.safetycenter.SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_PRIVACY 34 import android.safetycenter.SafetyCenterEntryGroup 35 import android.safetycenter.SafetyCenterEntryOrGroup 36 import android.safetycenter.SafetyCenterIssue 37 import android.safetycenter.SafetyCenterManager 38 import android.safetycenter.SafetyCenterStaticEntry 39 import android.safetycenter.SafetyCenterStaticEntryGroup 40 import android.safetycenter.SafetyEvent 41 import android.safetycenter.SafetySourceData 42 import androidx.test.core.app.ApplicationProvider 43 import androidx.test.filters.LargeTest 44 import com.android.bedstead.enterprise.annotations.EnsureHasDeviceOwner 45 import com.android.bedstead.enterprise.annotations.EnsureHasNoDeviceOwner 46 import com.android.bedstead.enterprise.annotations.EnsureHasNoWorkProfile 47 import com.android.bedstead.enterprise.annotations.EnsureHasWorkProfile 48 import com.android.bedstead.enterprise.workProfile 49 import com.android.bedstead.harrier.BedsteadJUnit4 50 import com.android.bedstead.harrier.DeviceState 51 import com.android.bedstead.multiuser.additionalUser 52 import com.android.bedstead.multiuser.annotations.EnsureHasAdditionalUser 53 import com.android.bedstead.multiuser.annotations.EnsureHasCloneProfile 54 import com.android.bedstead.multiuser.annotations.EnsureHasNoPrivateProfile 55 import com.android.bedstead.multiuser.annotations.EnsureHasPrivateProfile 56 import com.android.bedstead.multiuser.cloneProfile 57 import com.android.bedstead.multiuser.privateProfile 58 import com.android.bedstead.nene.TestApis 59 import com.android.bedstead.nene.types.OptionalBoolean.TRUE 60 import com.android.compatibility.common.util.DisableAnimationRule 61 import com.android.compatibility.common.util.FreezeRotationRule 62 import com.android.safetycenter.resources.SafetyCenterResourcesApk 63 import com.android.safetycenter.testing.Coroutines.TIMEOUT_SHORT 64 import com.android.safetycenter.testing.NotificationCharacteristics 65 import com.android.safetycenter.testing.SafetyCenterActivityLauncher.launchSafetyCenterActivity 66 import com.android.safetycenter.testing.SafetyCenterApisWithShellPermissions.getSafetyCenterDataWithPermission 67 import com.android.safetycenter.testing.SafetyCenterApisWithShellPermissions.getSafetySourceDataWithPermission 68 import com.android.safetycenter.testing.SafetyCenterApisWithShellPermissions.setSafetySourceDataWithPermission 69 import com.android.safetycenter.testing.SafetyCenterFlags 70 import com.android.safetycenter.testing.SafetyCenterTestConfigs 71 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.DYNAMIC_BAREBONE_ID 72 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.DYNAMIC_DISABLED_ID 73 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.DYNAMIC_GROUP_ID 74 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.DYNAMIC_HIDDEN_ID 75 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.DYNAMIC_IN_STATELESS_ID 76 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.ISSUE_ONLY_ALL_OPTIONAL_ID 77 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.ISSUE_ONLY_ALL_PROFILE_SOURCE_ID 78 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.ISSUE_ONLY_BAREBONE_ID 79 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.ISSUE_ONLY_GROUP_ID 80 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.ISSUE_ONLY_IN_STATELESS_ID 81 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.MIXED_STATELESS_GROUP_ID 82 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.SINGLE_SOURCE_ALL_PROFILE_ID 83 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.SINGLE_SOURCE_GROUP_ID 84 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.SINGLE_SOURCE_ID 85 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.STATIC_ALL_OPTIONAL_ID 86 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.STATIC_BAREBONE_ID 87 import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.STATIC_GROUP_ID 88 import com.android.safetycenter.testing.SafetyCenterTestData 89 import com.android.safetycenter.testing.SafetyCenterTestData.Companion.withoutExtras 90 import com.android.safetycenter.testing.SafetyCenterTestHelper 91 import com.android.safetycenter.testing.SafetyCenterTestRule 92 import com.android.safetycenter.testing.SafetySourceTestData 93 import com.android.safetycenter.testing.SafetySourceTestData.Companion.EVENT_SOURCE_STATE_CHANGED 94 import com.android.safetycenter.testing.SafetySourceTestData.Companion.ISSUE_TYPE_ID 95 import com.android.safetycenter.testing.ShellPermissions.callWithShellPermissionIdentity 96 import com.android.safetycenter.testing.SupportsSafetyCenterRule 97 import com.android.safetycenter.testing.TestNotificationListener 98 import com.android.safetycenter.testing.UiTestHelper.waitAllTextDisplayed 99 import com.android.safetycenter.testing.UiTestHelper.waitAllTextNotDisplayed 100 import com.google.common.base.Preconditions.checkState 101 import com.google.common.truth.Truth.assertThat 102 import kotlin.test.assertFailsWith 103 import org.junit.After 104 import org.junit.Before 105 import org.junit.ClassRule 106 import org.junit.Rule 107 import org.junit.Test 108 import org.junit.runner.RunWith 109 110 /** 111 * Functional tests for our APIs and UI on a device with multiple users. e.g. with a managed or 112 * additional user(s). 113 */ 114 @LargeTest 115 @RunWith(BedsteadJUnit4::class) 116 class SafetyCenterMultiUsersTest { 117 118 companion object { 119 @JvmField @ClassRule @Rule val deviceState: DeviceState = DeviceState() 120 } 121 122 @Rule @JvmField val mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() 123 124 private val context: Context = ApplicationProvider.getApplicationContext() 125 private val safetyCenterResourcesApk = SafetyCenterResourcesApk.forTests(context) 126 private val safetyCenterTestHelper = SafetyCenterTestHelper(context) 127 private val safetySourceTestData = SafetySourceTestData(context) 128 private val safetyCenterTestData = SafetyCenterTestData(context) 129 private val safetyCenterTestConfigs = SafetyCenterTestConfigs(context) 130 private val safetyCenterManager = context.getSystemService(SafetyCenterManager::class.java)!! 131 132 private var inQuietMode = false 133 134 private val primaryProfileOnlyIssues: List<SafetyCenterIssue> 135 get() = 136 listOf( 137 safetyCenterTestData.safetyCenterIssueCritical( 138 DYNAMIC_BAREBONE_ID, 139 groupId = DYNAMIC_GROUP_ID, 140 ), 141 safetyCenterTestData.safetyCenterIssueCritical( 142 ISSUE_ONLY_BAREBONE_ID, 143 attributionTitle = null, 144 groupId = ISSUE_ONLY_GROUP_ID, 145 ), 146 safetyCenterTestData.safetyCenterIssueRecommendation( 147 DYNAMIC_DISABLED_ID, 148 groupId = DYNAMIC_GROUP_ID, 149 ), 150 safetyCenterTestData.safetyCenterIssueRecommendation( 151 ISSUE_ONLY_ALL_OPTIONAL_ID, 152 attributionTitle = null, 153 groupId = ISSUE_ONLY_GROUP_ID, 154 ), 155 safetyCenterTestData.safetyCenterIssueInformation( 156 DYNAMIC_IN_STATELESS_ID, 157 groupId = MIXED_STATELESS_GROUP_ID, 158 ), 159 safetyCenterTestData.safetyCenterIssueInformation( 160 ISSUE_ONLY_IN_STATELESS_ID, 161 groupId = MIXED_STATELESS_GROUP_ID, 162 ), 163 ) 164 165 private val dynamicBareboneDefault: SafetyCenterEntry 166 get() = safetyCenterTestData.safetyCenterEntryDefault(DYNAMIC_BAREBONE_ID) 167 168 private val dynamicBareboneUpdated: SafetyCenterEntry 169 get() = safetyCenterTestData.safetyCenterEntryCritical(DYNAMIC_BAREBONE_ID) 170 171 private val dynamicDisabledDefault: SafetyCenterEntry 172 get() = 173 safetyCenterTestData 174 .safetyCenterEntryDefaultBuilder(DYNAMIC_DISABLED_ID) 175 .setPendingIntent(null) 176 .setEnabled(false) 177 .build() 178 179 private val dynamicDisabledUpdated: SafetyCenterEntry 180 get() = safetyCenterTestData.safetyCenterEntryRecommendation(DYNAMIC_DISABLED_ID) 181 182 private val dynamicDisabledForWorkDefaultBuilder: SafetyCenterEntry.Builder 183 get() = 184 safetyCenterTestData 185 .safetyCenterEntryDefaultBuilder( 186 DYNAMIC_DISABLED_ID, 187 userId = deviceState.workProfile().id(), 188 title = "Paste", 189 ) 190 .setPendingIntent(null) 191 .setEnabled(false) 192 193 private val dynamicDisabledForWorkDefault: SafetyCenterEntry 194 get() = dynamicDisabledForWorkDefaultBuilder.build() 195 196 private val dynamicDisabledForWorkPausedUpdated: SafetyCenterEntry 197 get() = 198 safetyCenterTestData 199 .safetyCenterEntryDefaultBuilder( 200 DYNAMIC_DISABLED_ID, 201 deviceState.workProfile().id(), 202 title = "Ok title for Work", 203 pendingIntent = null, 204 ) 205 .setSummary(safetyCenterResourcesApk.getStringByName("work_profile_paused")) 206 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNSPECIFIED) 207 .setEnabled(false) 208 .build() 209 210 private val dynamicDisabledForWorkUpdated: SafetyCenterEntry 211 get() = safetyCenterEntryOkForWork(DYNAMIC_DISABLED_ID, deviceState.workProfile().id()) 212 213 private val dynamicHiddenUpdated: SafetyCenterEntry 214 get() = 215 safetyCenterTestData.safetyCenterEntryUnspecified( 216 DYNAMIC_HIDDEN_ID, 217 pendingIntent = null, 218 ) 219 220 private val dynamicHiddenForWorkUpdated: SafetyCenterEntry 221 get() = safetyCenterEntryOkForWork(DYNAMIC_HIDDEN_ID, deviceState.workProfile().id()) 222 223 private val dynamicHiddenForWorkPausedUpdated 224 get() = 225 safetyCenterTestData 226 .safetyCenterEntryDefaultBuilder( 227 DYNAMIC_HIDDEN_ID, 228 deviceState.workProfile().id(), 229 title = "Ok title for Work", 230 pendingIntent = null, 231 ) 232 .setSummary(safetyCenterResourcesApk.getStringByName("work_profile_paused")) 233 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNSPECIFIED) 234 .setEnabled(false) 235 .build() 236 237 private val dynamicDisabledForPrivateUpdated: SafetyCenterEntry 238 get() = 239 safetyCenterEntryOkForPrivate(DYNAMIC_DISABLED_ID, deviceState.privateProfile().id()) 240 241 private val dynamicHiddenForPrivateUpdated: SafetyCenterEntry 242 get() = safetyCenterEntryOkForPrivate(DYNAMIC_HIDDEN_ID, deviceState.privateProfile().id()) 243 244 private val staticGroupBuilder = 245 SafetyCenterEntryGroup.Builder(STATIC_GROUP_ID, "OK") 246 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNSPECIFIED) 247 .setSeverityUnspecifiedIconType(SEVERITY_UNSPECIFIED_ICON_TYPE_PRIVACY) 248 .setSummary("OK") 249 250 private val staticBarebone = 251 safetyCenterTestData 252 .safetyCenterEntryDefaultStaticBuilder(STATIC_BAREBONE_ID) 253 .setSummary(null) 254 .build() 255 256 private val staticAllOptional = 257 safetyCenterTestData.safetyCenterEntryDefaultStaticBuilder(STATIC_ALL_OPTIONAL_ID).build() 258 259 private val staticAllOptionalForWorkBuilder 260 get() = 261 safetyCenterTestData 262 .safetyCenterEntryDefaultStaticBuilder( 263 STATIC_ALL_OPTIONAL_ID, 264 userId = deviceState.workProfile().id(), 265 title = "Paste", 266 ) 267 .setPendingIntent( 268 createTestActivityRedirectPendingIntentForUser( 269 deviceState.workProfile().userHandle(), 270 explicit = false, 271 ) 272 ) 273 274 private val staticAllOptionalForWork 275 get() = staticAllOptionalForWorkBuilder.build() 276 277 private val staticAllOptionalForWorkPaused 278 get() = 279 staticAllOptionalForWorkBuilder 280 .setSummary(safetyCenterResourcesApk.getStringByName("work_profile_paused")) 281 .setEnabled(false) 282 .build() 283 284 private val staticAllOptionalForPrivateBuilder 285 get() = 286 safetyCenterTestData 287 .safetyCenterEntryDefaultStaticBuilder( 288 STATIC_ALL_OPTIONAL_ID, 289 userId = deviceState.privateProfile().id(), 290 title = "Unknown", 291 ) 292 .setPendingIntent( 293 createTestActivityRedirectPendingIntentForUser( 294 deviceState.privateProfile().userHandle(), 295 explicit = false, 296 ) 297 ) 298 299 private val staticAllOptionalForPrivate 300 get() = staticAllOptionalForPrivateBuilder.build() 301 createStaticEntrynull302 private fun createStaticEntry(explicit: Boolean = true): SafetyCenterStaticEntry = 303 SafetyCenterStaticEntry.Builder("OK") 304 .setSummary("OK") 305 .setPendingIntent( 306 safetySourceTestData.createTestActivityRedirectPendingIntent(explicit) 307 ) 308 .build() 309 310 private val staticEntryUpdated: SafetyCenterStaticEntry 311 get() = 312 SafetyCenterStaticEntry.Builder("Unspecified title") 313 .setSummary("Unspecified summary") 314 .setPendingIntent(safetySourceTestData.createTestActivityRedirectPendingIntent()) 315 .build() 316 317 private fun staticEntryForWorkBuilder(title: CharSequence = "Paste", explicit: Boolean = true) = 318 SafetyCenterStaticEntry.Builder(title) 319 .setSummary("OK") 320 .setPendingIntent( 321 createTestActivityRedirectPendingIntentForUser( 322 deviceState.workProfile().userHandle(), 323 explicit, 324 ) 325 ) 326 327 private fun staticEntryForPrivateBuilder( 328 title: CharSequence = "Unknown", 329 explicit: Boolean = true, 330 ) = 331 SafetyCenterStaticEntry.Builder(title) 332 .setSummary("OK") 333 .setPendingIntent( 334 createTestActivityRedirectPendingIntentForUser( 335 deviceState.privateProfile().userHandle(), 336 explicit, 337 ) 338 ) 339 340 private fun createStaticEntryForWork(explicit: Boolean = true): SafetyCenterStaticEntry = 341 staticEntryForWorkBuilder(explicit = explicit).build() 342 343 private fun createStaticEntryForPrivate(explicit: Boolean = true): SafetyCenterStaticEntry = 344 staticEntryForPrivateBuilder(explicit = explicit).build() 345 346 private fun createStaticEntryForWorkPaused(): SafetyCenterStaticEntry = 347 staticEntryForWorkBuilder(explicit = false) 348 .setSummary(safetyCenterResourcesApk.getStringByName("work_profile_paused")) 349 .build() 350 351 private val staticEntryForWorkPausedUpdated: SafetyCenterStaticEntry 352 get() = 353 staticEntryForWorkBuilder(title = "Unspecified title for Work") 354 .setSummary(safetyCenterResourcesApk.getStringByName("work_profile_paused")) 355 .build() 356 357 private val staticEntryForWorkUpdated: SafetyCenterStaticEntry 358 get() = 359 SafetyCenterStaticEntry.Builder("Unspecified title for Work") 360 .setSummary("Unspecified summary") 361 .setPendingIntent(safetySourceTestData.createTestActivityRedirectPendingIntent()) 362 .build() 363 364 private val staticEntryForPrivateUpdated: SafetyCenterStaticEntry 365 get() = 366 SafetyCenterStaticEntry.Builder("Unspecified title for Private") 367 .setSummary("Unspecified summary") 368 .setPendingIntent(safetySourceTestData.createTestActivityRedirectPendingIntent()) 369 .build() 370 371 private val safetyCenterDataForAdditionalUser 372 get() = 373 SafetyCenterData( 374 safetyCenterTestData.safetyCenterStatusUnknown, 375 emptyList(), 376 listOf( 377 safetyCenterTestData.singletonSafetyCenterEntryOrGroup( 378 SINGLE_SOURCE_GROUP_ID, 379 safetyCenterTestData.safetyCenterEntryDefault( 380 SINGLE_SOURCE_ALL_PROFILE_ID, 381 deviceState.additionalUser().id(), 382 pendingIntent = 383 createTestActivityRedirectPendingIntentForUser( 384 deviceState.additionalUser().userHandle() 385 ), 386 ), 387 "No info yet", 388 ) 389 ), 390 emptyList(), 391 ) 392 393 @get:Rule(order = 1) val supportsSafetyCenterRule = SupportsSafetyCenterRule(context) 394 @get:Rule(order = 2) 395 val safetyCenterTestRule = 396 SafetyCenterTestRule(safetyCenterTestHelper, withNotifications = true) 397 @get:Rule(order = 3) val disableAnimationRule = DisableAnimationRule() 398 @get:Rule(order = 4) val freezeRotationRule = FreezeRotationRule() 399 400 @Before 401 fun setRefreshTimeoutsBeforeTest() { 402 SafetyCenterFlags.setAllRefreshTimeoutsTo(TIMEOUT_SHORT) 403 } 404 405 @After resetQuietModeAfterTestnull406 fun resetQuietModeAfterTest() { 407 setQuietMode(false) 408 } 409 410 @Test 411 @EnsureHasWorkProfile getSafetyCenterData_withProfileOwner_hasWorkPolicyInfonull412 fun getSafetyCenterData_withProfileOwner_hasWorkPolicyInfo() { 413 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.workPolicyInfoConfig) 414 415 findWorkPolicyInfo() 416 } 417 418 @Test 419 @EnsureHasDeviceOwner getSafetyCenterData_withDeviceOwner_hasWorkPolicyInfonull420 fun getSafetyCenterData_withDeviceOwner_hasWorkPolicyInfo() { 421 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.workPolicyInfoConfig) 422 423 findWorkPolicyInfo() 424 } 425 426 @Test 427 @EnsureHasWorkProfile launchActivity_withQuietModeEnabled_hasWorkPolicyInfonull428 fun launchActivity_withQuietModeEnabled_hasWorkPolicyInfo() { 429 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.workPolicyInfoConfig) 430 431 setQuietMode(true) 432 433 findWorkPolicyInfo() 434 } 435 436 @Test 437 @EnsureHasNoWorkProfile 438 @EnsureHasNoDeviceOwner launchActivity_withoutWorkProfileOrDeviceOwner_doesntHaveWorkPolicyInfonull439 fun launchActivity_withoutWorkProfileOrDeviceOwner_doesntHaveWorkPolicyInfo() { 440 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.workPolicyInfoConfig) 441 442 context.launchSafetyCenterActivity { waitAllTextNotDisplayed("Your work policy info") } 443 } 444 445 @Test 446 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) getSafetySourceData_withQuietModeEnabled_dataIsNotClearednull447 fun getSafetySourceData_withQuietModeEnabled_dataIsNotCleared() { 448 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 449 val dataForWork = safetySourceTestData.informationWithIssueForWork 450 val managedSafetyCenterManager = 451 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 452 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 453 SINGLE_SOURCE_ALL_PROFILE_ID, 454 dataForWork, 455 ) 456 457 setQuietMode(true) 458 val apiSafetySourceDataForWork = 459 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 460 SINGLE_SOURCE_ALL_PROFILE_ID 461 ) 462 463 assertThat(apiSafetySourceDataForWork).isEqualTo(dataForWork) 464 } 465 466 @Test 467 @EnsureHasAdditionalUser(installInstrumentedApp = TRUE) getSafetySourceData_afterAdditionalUserRemoved_returnsNullnull468 fun getSafetySourceData_afterAdditionalUserRemoved_returnsNull() { 469 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 470 val additionalUserSafetyCenterManager = 471 getSafetyCenterManagerForUser(deviceState.additionalUser().userHandle()) 472 val dataForAdditionalUser = safetySourceTestData.information 473 additionalUserSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 474 SINGLE_SOURCE_ALL_PROFILE_ID, 475 dataForAdditionalUser, 476 ) 477 checkState( 478 additionalUserSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 479 SINGLE_SOURCE_ALL_PROFILE_ID 480 ) == dataForAdditionalUser 481 ) 482 483 deviceState.additionalUser().remove() 484 485 assertThat( 486 additionalUserSafetyCenterManager 487 .getSafetySourceDataWithInteractAcrossUsersPermission( 488 SINGLE_SOURCE_ALL_PROFILE_ID 489 ) 490 ) 491 .isNull() 492 } 493 494 @Test 495 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) getSafetySourceData_withoutInteractAcrossUserPermission_shouldThrowErrornull496 fun getSafetySourceData_withoutInteractAcrossUserPermission_shouldThrowError() { 497 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 498 499 val managedSafetyCenterManager = 500 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 501 assertFailsWith(SecurityException::class) { 502 managedSafetyCenterManager.getSafetySourceData(SINGLE_SOURCE_ALL_PROFILE_ID) 503 } 504 } 505 506 @Test 507 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) getSafetySourceData_withoutAppInstalledForWorkProfile_shouldReturnNullnull508 fun getSafetySourceData_withoutAppInstalledForWorkProfile_shouldReturnNull() { 509 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 510 val managedSafetyCenterManager = 511 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 512 val dataForWork = safetySourceTestData.informationWithIssueForWork 513 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 514 SINGLE_SOURCE_ALL_PROFILE_ID, 515 dataForWork, 516 ) 517 TestApis.packages().find(context.packageName).uninstall(deviceState.workProfile()) 518 519 val safetySourceData = 520 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 521 SINGLE_SOURCE_ALL_PROFILE_ID 522 ) 523 524 assertThat(safetySourceData).isNull() 525 } 526 527 @Test 528 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) getSafetySourceData_withRemovedProfile_shouldReturnNullnull529 fun getSafetySourceData_withRemovedProfile_shouldReturnNull() { 530 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 531 val managedSafetyCenterManager = 532 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 533 val dataForWork = safetySourceTestData.informationWithIssueForWork 534 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 535 SINGLE_SOURCE_ALL_PROFILE_ID, 536 dataForWork, 537 ) 538 deviceState.workProfile().remove() 539 540 val safetySourceData = 541 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 542 SINGLE_SOURCE_ALL_PROFILE_ID 543 ) 544 545 assertThat(safetySourceData).isNull() 546 } 547 548 @Test 549 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) getSafetySourceData_withProfileInQuietMode_shouldReturnDatanull550 fun getSafetySourceData_withProfileInQuietMode_shouldReturnData() { 551 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 552 val managedSafetyCenterManager = 553 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 554 val dataForWork = safetySourceTestData.informationWithIssueForWork 555 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 556 SINGLE_SOURCE_ALL_PROFILE_ID, 557 dataForWork, 558 ) 559 setQuietMode(true) 560 561 val safetySourceData = 562 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 563 SINGLE_SOURCE_ALL_PROFILE_ID 564 ) 565 566 assertThat(safetySourceData).isEqualTo(dataForWork) 567 } 568 569 @Test 570 @EnsureHasNoWorkProfile 571 @EnsureHasNoPrivateProfile getSafetyCenterData_withComplexConfigWithoutWorkProfile_returnsPrimaryDataFromConfignull572 fun getSafetyCenterData_withComplexConfigWithoutWorkProfile_returnsPrimaryDataFromConfig() { 573 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 574 575 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 576 577 val safetyCenterDataFromComplexConfig = 578 SafetyCenterData( 579 safetyCenterTestData.safetyCenterStatusUnknown, 580 emptyList(), 581 listOf( 582 SafetyCenterEntryOrGroup( 583 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 584 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNKNOWN) 585 .setSummary( 586 safetyCenterResourcesApk.getStringByName("group_unknown_summary") 587 ) 588 .setEntries(listOf(dynamicBareboneDefault, dynamicDisabledDefault)) 589 .setSeverityUnspecifiedIconType( 590 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 591 ) 592 .build() 593 ), 594 SafetyCenterEntryOrGroup( 595 staticGroupBuilder 596 .setEntries(listOf(staticBarebone, staticAllOptional)) 597 .build() 598 ), 599 ), 600 listOf( 601 SafetyCenterStaticEntryGroup( 602 "OK", 603 listOf(createStaticEntry(), createStaticEntry(explicit = false)), 604 ) 605 ), 606 ) 607 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 608 } 609 610 @Test 611 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 612 @EnsureHasNoPrivateProfile getSafetyCenterData_withComplexConfigWithoutDataProvided_returnsDataFromConfignull613 fun getSafetyCenterData_withComplexConfigWithoutDataProvided_returnsDataFromConfig() { 614 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 615 616 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 617 618 val safetyCenterDataFromComplexConfig = 619 SafetyCenterData( 620 safetyCenterTestData.safetyCenterStatusUnknown, 621 emptyList(), 622 listOf( 623 SafetyCenterEntryOrGroup( 624 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 625 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNKNOWN) 626 .setSummary( 627 safetyCenterResourcesApk.getStringByName("group_unknown_summary") 628 ) 629 .setEntries( 630 listOf( 631 dynamicBareboneDefault, 632 dynamicDisabledDefault, 633 dynamicDisabledForWorkDefault, 634 ) 635 ) 636 .setSeverityUnspecifiedIconType( 637 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 638 ) 639 .build() 640 ), 641 SafetyCenterEntryOrGroup( 642 staticGroupBuilder 643 .setEntries( 644 listOf(staticBarebone, staticAllOptional, staticAllOptionalForWork) 645 ) 646 .build() 647 ), 648 ), 649 listOf( 650 SafetyCenterStaticEntryGroup( 651 "OK", 652 listOf( 653 createStaticEntry(), 654 createStaticEntryForWork(), 655 createStaticEntry(explicit = false), 656 createStaticEntryForWork(explicit = false), 657 ), 658 ) 659 ), 660 ) 661 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 662 } 663 664 @Test 665 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 666 @EnsureHasNoPrivateProfile getSafetyCenterData_withComplexConfigWithPrimaryDataProvided_returnsPrimaryDataProvidednull667 fun getSafetyCenterData_withComplexConfigWithPrimaryDataProvided_returnsPrimaryDataProvided() { 668 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 669 updatePrimaryProfileSources() 670 671 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 672 673 val safetyCenterDataFromComplexConfig = 674 SafetyCenterData( 675 safetyCenterTestData.safetyCenterStatusCritical(6), 676 primaryProfileOnlyIssues, 677 listOf( 678 SafetyCenterEntryOrGroup( 679 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 680 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING) 681 .setSummary("Critical summary") 682 .setEntries( 683 listOf( 684 dynamicBareboneUpdated, 685 dynamicDisabledUpdated, 686 dynamicDisabledForWorkDefault, 687 dynamicHiddenUpdated, 688 ) 689 ) 690 .setSeverityUnspecifiedIconType( 691 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 692 ) 693 .build() 694 ), 695 SafetyCenterEntryOrGroup( 696 staticGroupBuilder 697 .setEntries( 698 listOf(staticBarebone, staticAllOptional, staticAllOptionalForWork) 699 ) 700 .build() 701 ), 702 ), 703 listOf( 704 SafetyCenterStaticEntryGroup( 705 "OK", 706 listOf( 707 staticEntryUpdated, 708 createStaticEntryForWork(), 709 createStaticEntry(explicit = false), 710 createStaticEntryForWork(explicit = false), 711 ), 712 ) 713 ), 714 ) 715 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 716 } 717 718 @Test 719 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 720 @EnsureHasNoPrivateProfile getSafetyCenterData_withComplexConfigWithExtraWorkOnlyWithAllDataProvided_returnsAllDataProvidednull721 fun getSafetyCenterData_withComplexConfigWithExtraWorkOnlyWithAllDataProvided_returnsAllDataProvided() { 722 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 723 updatePrimaryProfileSources() 724 updateWorkProfileSources() 725 726 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 727 728 val managedUserId = deviceState.workProfile().id() 729 val safetyCenterDataFromComplexConfig = 730 SafetyCenterData( 731 safetyCenterTestData.safetyCenterStatusCritical(11), 732 listOf( 733 safetyCenterTestData.safetyCenterIssueCritical( 734 DYNAMIC_BAREBONE_ID, 735 groupId = DYNAMIC_GROUP_ID, 736 ), 737 safetyCenterTestData.safetyCenterIssueCritical( 738 ISSUE_ONLY_BAREBONE_ID, 739 attributionTitle = null, 740 groupId = ISSUE_ONLY_GROUP_ID, 741 ), 742 safetyCenterTestData.safetyCenterIssueRecommendation( 743 DYNAMIC_DISABLED_ID, 744 groupId = DYNAMIC_GROUP_ID, 745 ), 746 safetyCenterTestData.safetyCenterIssueRecommendation( 747 ISSUE_ONLY_ALL_OPTIONAL_ID, 748 attributionTitle = null, 749 groupId = ISSUE_ONLY_GROUP_ID, 750 ), 751 safetyCenterTestData.safetyCenterIssueInformation( 752 DYNAMIC_IN_STATELESS_ID, 753 groupId = MIXED_STATELESS_GROUP_ID, 754 ), 755 safetyCenterTestData.safetyCenterIssueInformation( 756 ISSUE_ONLY_IN_STATELESS_ID, 757 groupId = MIXED_STATELESS_GROUP_ID, 758 ), 759 safetyCenterTestData.safetyCenterIssueInformation( 760 DYNAMIC_DISABLED_ID, 761 managedUserId, 762 groupId = DYNAMIC_GROUP_ID, 763 ), 764 safetyCenterTestData.safetyCenterIssueInformation( 765 DYNAMIC_HIDDEN_ID, 766 managedUserId, 767 groupId = DYNAMIC_GROUP_ID, 768 ), 769 safetyCenterTestData.safetyCenterIssueInformation( 770 ISSUE_ONLY_ALL_OPTIONAL_ID, 771 managedUserId, 772 attributionTitle = null, 773 groupId = ISSUE_ONLY_GROUP_ID, 774 ), 775 safetyCenterTestData.safetyCenterIssueInformation( 776 DYNAMIC_IN_STATELESS_ID, 777 managedUserId, 778 groupId = MIXED_STATELESS_GROUP_ID, 779 ), 780 safetyCenterTestData.safetyCenterIssueInformation( 781 ISSUE_ONLY_IN_STATELESS_ID, 782 managedUserId, 783 groupId = MIXED_STATELESS_GROUP_ID, 784 ), 785 ), 786 listOf( 787 SafetyCenterEntryOrGroup( 788 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 789 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING) 790 .setSummary("Critical summary") 791 .setEntries( 792 listOf( 793 dynamicBareboneUpdated, 794 dynamicDisabledUpdated, 795 dynamicDisabledForWorkUpdated, 796 dynamicHiddenUpdated, 797 dynamicHiddenForWorkUpdated, 798 ) 799 ) 800 .setSeverityUnspecifiedIconType( 801 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 802 ) 803 .build() 804 ), 805 SafetyCenterEntryOrGroup( 806 staticGroupBuilder 807 .setEntries( 808 listOf(staticBarebone, staticAllOptional, staticAllOptionalForWork) 809 ) 810 .build() 811 ), 812 ), 813 listOf( 814 SafetyCenterStaticEntryGroup( 815 "OK", 816 listOf( 817 staticEntryUpdated, 818 staticEntryForWorkUpdated, 819 createStaticEntry(explicit = false), 820 createStaticEntryForWork(explicit = false), 821 ), 822 ) 823 ), 824 ) 825 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 826 } 827 828 @Test 829 @RequiresFlagsDisabled(com.android.permission.flags.Flags.FLAG_PRIVATE_PROFILE_SUPPORTED) 830 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 831 @EnsureHasPrivateProfile(installInstrumentedApp = TRUE) getSafetyCenterData_withComplexConfigWithPrivateProfileDisallowedWithAllDataProvided_returnsAllDataProvidednull832 fun getSafetyCenterData_withComplexConfigWithPrivateProfileDisallowedWithAllDataProvided_returnsAllDataProvided() { 833 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 834 updatePrimaryProfileSources() 835 updateWorkProfileSources() 836 updatePrivateProfileSources() 837 838 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 839 840 val managedUserId = deviceState.workProfile().id() 841 val safetyCenterDataFromComplexConfig = 842 SafetyCenterData( 843 safetyCenterTestData.safetyCenterStatusCritical(11), 844 listOf( 845 safetyCenterTestData.safetyCenterIssueCritical( 846 DYNAMIC_BAREBONE_ID, 847 groupId = DYNAMIC_GROUP_ID, 848 ), 849 safetyCenterTestData.safetyCenterIssueCritical( 850 ISSUE_ONLY_BAREBONE_ID, 851 attributionTitle = null, 852 groupId = ISSUE_ONLY_GROUP_ID, 853 ), 854 safetyCenterTestData.safetyCenterIssueRecommendation( 855 DYNAMIC_DISABLED_ID, 856 groupId = DYNAMIC_GROUP_ID, 857 ), 858 safetyCenterTestData.safetyCenterIssueRecommendation( 859 ISSUE_ONLY_ALL_OPTIONAL_ID, 860 attributionTitle = null, 861 groupId = ISSUE_ONLY_GROUP_ID, 862 ), 863 safetyCenterTestData.safetyCenterIssueInformation( 864 DYNAMIC_IN_STATELESS_ID, 865 groupId = MIXED_STATELESS_GROUP_ID, 866 ), 867 safetyCenterTestData.safetyCenterIssueInformation( 868 ISSUE_ONLY_IN_STATELESS_ID, 869 groupId = MIXED_STATELESS_GROUP_ID, 870 ), 871 safetyCenterTestData.safetyCenterIssueInformation( 872 DYNAMIC_DISABLED_ID, 873 managedUserId, 874 groupId = DYNAMIC_GROUP_ID, 875 ), 876 safetyCenterTestData.safetyCenterIssueInformation( 877 DYNAMIC_HIDDEN_ID, 878 managedUserId, 879 groupId = DYNAMIC_GROUP_ID, 880 ), 881 safetyCenterTestData.safetyCenterIssueInformation( 882 ISSUE_ONLY_ALL_OPTIONAL_ID, 883 managedUserId, 884 attributionTitle = null, 885 groupId = ISSUE_ONLY_GROUP_ID, 886 ), 887 safetyCenterTestData.safetyCenterIssueInformation( 888 DYNAMIC_IN_STATELESS_ID, 889 managedUserId, 890 groupId = MIXED_STATELESS_GROUP_ID, 891 ), 892 safetyCenterTestData.safetyCenterIssueInformation( 893 ISSUE_ONLY_IN_STATELESS_ID, 894 managedUserId, 895 groupId = MIXED_STATELESS_GROUP_ID, 896 ), 897 ), 898 listOf( 899 SafetyCenterEntryOrGroup( 900 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 901 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING) 902 .setSummary("Critical summary") 903 .setEntries( 904 listOf( 905 dynamicBareboneUpdated, 906 dynamicDisabledUpdated, 907 dynamicDisabledForWorkUpdated, 908 dynamicHiddenUpdated, 909 dynamicHiddenForWorkUpdated, 910 ) 911 ) 912 .setSeverityUnspecifiedIconType( 913 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 914 ) 915 .build() 916 ), 917 SafetyCenterEntryOrGroup( 918 staticGroupBuilder 919 .setEntries( 920 listOf(staticBarebone, staticAllOptional, staticAllOptionalForWork) 921 ) 922 .build() 923 ), 924 ), 925 listOf( 926 SafetyCenterStaticEntryGroup( 927 "OK", 928 listOf( 929 staticEntryUpdated, 930 staticEntryForWorkUpdated, 931 createStaticEntry(explicit = false), 932 createStaticEntryForWork(explicit = false), 933 ), 934 ) 935 ), 936 ) 937 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 938 } 939 940 // TODO(b/286539356) add the os feature flag requirement when available. 941 @Test 942 @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_PRIVATE_PROFILE_SUPPORTED) 943 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 944 @EnsureHasPrivateProfile(installInstrumentedApp = TRUE) getSafetyCenterData_withComplexConfigWithAllDataProvided_returnsAllDataProvidednull945 fun getSafetyCenterData_withComplexConfigWithAllDataProvided_returnsAllDataProvided() { 946 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 947 updatePrimaryProfileSources() 948 updateWorkProfileSources() 949 updatePrivateProfileSources() 950 951 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 952 953 val managedUserId = deviceState.workProfile().id() 954 val privateProfileId = deviceState.privateProfile().id() 955 val safetyCenterDataFromComplexConfig = 956 SafetyCenterData( 957 safetyCenterTestData.safetyCenterStatusCritical(11), 958 listOf( 959 safetyCenterTestData.safetyCenterIssueCritical( 960 DYNAMIC_BAREBONE_ID, 961 groupId = DYNAMIC_GROUP_ID, 962 ), 963 safetyCenterTestData.safetyCenterIssueCritical( 964 ISSUE_ONLY_BAREBONE_ID, 965 attributionTitle = null, 966 groupId = ISSUE_ONLY_GROUP_ID, 967 ), 968 safetyCenterTestData.safetyCenterIssueRecommendation( 969 DYNAMIC_DISABLED_ID, 970 groupId = DYNAMIC_GROUP_ID, 971 ), 972 safetyCenterTestData.safetyCenterIssueRecommendation( 973 ISSUE_ONLY_ALL_OPTIONAL_ID, 974 attributionTitle = null, 975 groupId = ISSUE_ONLY_GROUP_ID, 976 ), 977 safetyCenterTestData.safetyCenterIssueInformation( 978 DYNAMIC_IN_STATELESS_ID, 979 groupId = MIXED_STATELESS_GROUP_ID, 980 ), 981 safetyCenterTestData.safetyCenterIssueInformation( 982 ISSUE_ONLY_IN_STATELESS_ID, 983 groupId = MIXED_STATELESS_GROUP_ID, 984 ), 985 safetyCenterTestData.safetyCenterIssueInformation( 986 DYNAMIC_DISABLED_ID, 987 managedUserId, 988 groupId = DYNAMIC_GROUP_ID, 989 ), 990 safetyCenterTestData.safetyCenterIssueInformation( 991 DYNAMIC_HIDDEN_ID, 992 managedUserId, 993 groupId = DYNAMIC_GROUP_ID, 994 ), 995 safetyCenterTestData.safetyCenterIssueInformation( 996 ISSUE_ONLY_ALL_OPTIONAL_ID, 997 managedUserId, 998 attributionTitle = null, 999 groupId = ISSUE_ONLY_GROUP_ID, 1000 ), 1001 safetyCenterTestData.safetyCenterIssueInformation( 1002 DYNAMIC_IN_STATELESS_ID, 1003 managedUserId, 1004 groupId = MIXED_STATELESS_GROUP_ID, 1005 ), 1006 safetyCenterTestData.safetyCenterIssueInformation( 1007 ISSUE_ONLY_IN_STATELESS_ID, 1008 managedUserId, 1009 groupId = MIXED_STATELESS_GROUP_ID, 1010 ), 1011 safetyCenterTestData.safetyCenterIssueInformation( 1012 DYNAMIC_DISABLED_ID, 1013 privateProfileId, 1014 groupId = DYNAMIC_GROUP_ID, 1015 ), 1016 safetyCenterTestData.safetyCenterIssueInformation( 1017 DYNAMIC_HIDDEN_ID, 1018 privateProfileId, 1019 groupId = DYNAMIC_GROUP_ID, 1020 ), 1021 safetyCenterTestData.safetyCenterIssueInformation( 1022 ISSUE_ONLY_ALL_OPTIONAL_ID, 1023 privateProfileId, 1024 attributionTitle = null, 1025 groupId = ISSUE_ONLY_GROUP_ID, 1026 ), 1027 safetyCenterTestData.safetyCenterIssueInformation( 1028 DYNAMIC_IN_STATELESS_ID, 1029 privateProfileId, 1030 groupId = MIXED_STATELESS_GROUP_ID, 1031 ), 1032 safetyCenterTestData.safetyCenterIssueInformation( 1033 ISSUE_ONLY_IN_STATELESS_ID, 1034 privateProfileId, 1035 groupId = MIXED_STATELESS_GROUP_ID, 1036 ), 1037 ), 1038 listOf( 1039 SafetyCenterEntryOrGroup( 1040 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 1041 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING) 1042 .setSummary("Critical summary") 1043 .setEntries( 1044 listOf( 1045 dynamicBareboneUpdated, 1046 dynamicDisabledUpdated, 1047 dynamicDisabledForWorkUpdated, 1048 dynamicDisabledForPrivateUpdated, 1049 dynamicHiddenUpdated, 1050 dynamicHiddenForWorkUpdated, 1051 dynamicHiddenForPrivateUpdated, 1052 ) 1053 ) 1054 .setSeverityUnspecifiedIconType( 1055 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 1056 ) 1057 .build() 1058 ), 1059 SafetyCenterEntryOrGroup( 1060 staticGroupBuilder 1061 .setEntries( 1062 listOf( 1063 staticBarebone, 1064 staticAllOptional, 1065 staticAllOptionalForWork, 1066 staticAllOptionalForPrivate, 1067 ) 1068 ) 1069 .build() 1070 ), 1071 ), 1072 listOf( 1073 SafetyCenterStaticEntryGroup( 1074 "OK", 1075 listOf( 1076 staticEntryUpdated, 1077 staticEntryForWorkUpdated, 1078 staticEntryForPrivateUpdated, 1079 createStaticEntry(explicit = false), 1080 createStaticEntryForWork(explicit = false), 1081 createStaticEntryForPrivate(explicit = false), 1082 ), 1083 ) 1084 ), 1085 ) 1086 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 1087 } 1088 1089 @Test 1090 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 1091 @EnsureHasNoPrivateProfile getSafetyCenterData_withQuietMode_shouldHaveWorkProfilePausedSummaryAndNoWorkIssuesnull1092 fun getSafetyCenterData_withQuietMode_shouldHaveWorkProfilePausedSummaryAndNoWorkIssues() { 1093 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig) 1094 updatePrimaryProfileSources() 1095 updateWorkProfileSources() 1096 setQuietMode(true) 1097 1098 val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission() 1099 1100 val safetyCenterDataFromComplexConfig = 1101 SafetyCenterData( 1102 safetyCenterTestData.safetyCenterStatusCritical(6), 1103 primaryProfileOnlyIssues, 1104 listOf( 1105 SafetyCenterEntryOrGroup( 1106 SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK") 1107 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING) 1108 .setSummary("Critical summary") 1109 .setEntries( 1110 listOf( 1111 dynamicBareboneUpdated, 1112 dynamicDisabledUpdated, 1113 dynamicDisabledForWorkPausedUpdated, 1114 dynamicHiddenUpdated, 1115 dynamicHiddenForWorkPausedUpdated, 1116 ) 1117 ) 1118 .setSeverityUnspecifiedIconType( 1119 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 1120 ) 1121 .build() 1122 ), 1123 SafetyCenterEntryOrGroup( 1124 staticGroupBuilder 1125 .setEntries( 1126 listOf( 1127 staticBarebone, 1128 staticAllOptional, 1129 staticAllOptionalForWorkPaused, 1130 ) 1131 ) 1132 .build() 1133 ), 1134 ), 1135 listOf( 1136 SafetyCenterStaticEntryGroup( 1137 "OK", 1138 listOf( 1139 staticEntryUpdated, 1140 staticEntryForWorkPausedUpdated, 1141 createStaticEntry(explicit = false), 1142 createStaticEntryForWorkPaused(), 1143 ), 1144 ) 1145 ), 1146 ) 1147 assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig) 1148 } 1149 1150 @Test 1151 @EnsureHasAdditionalUser(installInstrumentedApp = TRUE) 1152 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) getSafetyCenterData_withDataForDifferentUserProfileGroup_shouldBeUnaffectednull1153 fun getSafetyCenterData_withDataForDifferentUserProfileGroup_shouldBeUnaffected() { 1154 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1155 val dataForPrimaryUser = safetySourceTestData.information 1156 safetyCenterTestHelper.setData(SINGLE_SOURCE_ALL_PROFILE_ID, dataForPrimaryUser) 1157 val dataForPrimaryUserWorkProfile = safetySourceTestData.informationWithIssueForWork 1158 val managedSafetyCenterManager = 1159 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1160 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1161 SINGLE_SOURCE_ALL_PROFILE_ID, 1162 dataForPrimaryUserWorkProfile, 1163 ) 1164 1165 val additionalUserSafetyCenterManager = 1166 getSafetyCenterManagerForUser(deviceState.additionalUser().userHandle()) 1167 val apiSafetyCenterDataForAdditionalUser = 1168 additionalUserSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission() 1169 1170 assertThat(apiSafetyCenterDataForAdditionalUser) 1171 .isEqualTo(safetyCenterDataForAdditionalUser) 1172 } 1173 1174 @Test 1175 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) 1176 @EnsureHasNoPrivateProfile getSafetyCenterData_afterManagedProfileRemoved_returnsDefaultDatanull1177 fun getSafetyCenterData_afterManagedProfileRemoved_returnsDefaultData() { 1178 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1179 val managedSafetyCenterManager = 1180 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1181 val safetyCenterDataWithWorkProfile = 1182 SafetyCenterData( 1183 safetyCenterTestData.safetyCenterStatusUnknown, 1184 emptyList(), 1185 listOf( 1186 SafetyCenterEntryOrGroup( 1187 SafetyCenterEntryGroup.Builder(SINGLE_SOURCE_GROUP_ID, "OK") 1188 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNKNOWN) 1189 .setSummary( 1190 safetyCenterResourcesApk.getStringByName("group_unknown_summary") 1191 ) 1192 .setEntries( 1193 listOf( 1194 safetyCenterTestData.safetyCenterEntryDefault( 1195 SINGLE_SOURCE_ALL_PROFILE_ID 1196 ), 1197 safetyCenterTestData.safetyCenterEntryDefault( 1198 SINGLE_SOURCE_ALL_PROFILE_ID, 1199 deviceState.workProfile().id(), 1200 title = "Paste", 1201 pendingIntent = 1202 createTestActivityRedirectPendingIntentForUser( 1203 deviceState.workProfile().userHandle() 1204 ), 1205 ), 1206 ) 1207 ) 1208 .setSeverityUnspecifiedIconType( 1209 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 1210 ) 1211 .build() 1212 ) 1213 ), 1214 emptyList(), 1215 ) 1216 checkState( 1217 safetyCenterManager.getSafetyCenterDataWithPermission() == 1218 safetyCenterDataWithWorkProfile 1219 ) 1220 checkState( 1221 managedSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission() == 1222 safetyCenterDataWithWorkProfile 1223 ) 1224 1225 deviceState.workProfile().remove() 1226 1227 val safetyCenterDataForPrimaryUser = 1228 SafetyCenterData( 1229 safetyCenterTestData.safetyCenterStatusUnknown, 1230 emptyList(), 1231 listOf( 1232 safetyCenterTestData.singletonSafetyCenterEntryOrGroup( 1233 SINGLE_SOURCE_GROUP_ID, 1234 safetyCenterTestData.safetyCenterEntryDefault(SINGLE_SOURCE_ALL_PROFILE_ID), 1235 "No info yet", 1236 ) 1237 ), 1238 emptyList(), 1239 ) 1240 assertThat(safetyCenterManager.getSafetyCenterDataWithPermission()) 1241 .isEqualTo(safetyCenterDataForPrimaryUser) 1242 assertThat( 1243 managedSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission() 1244 ) 1245 .isEqualTo(SafetyCenterTestData.DEFAULT) 1246 } 1247 1248 @Test 1249 @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_PRIVATE_PROFILE_SUPPORTED) 1250 @EnsureHasPrivateProfile(installInstrumentedApp = TRUE) getSafetyCenterData_afterPrivateProfileRemoved_returnsDefaultDatanull1251 fun getSafetyCenterData_afterPrivateProfileRemoved_returnsDefaultData() { 1252 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1253 val privateSafetyCenterManager = 1254 getSafetyCenterManagerForUser(deviceState.privateProfile().userHandle()) 1255 val safetyCenterDataWithPrivateProfile = 1256 SafetyCenterData( 1257 safetyCenterTestData.safetyCenterStatusUnknown, 1258 emptyList(), 1259 listOf( 1260 SafetyCenterEntryOrGroup( 1261 SafetyCenterEntryGroup.Builder(SINGLE_SOURCE_GROUP_ID, "OK") 1262 .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNKNOWN) 1263 .setSummary( 1264 safetyCenterResourcesApk.getStringByName("group_unknown_summary") 1265 ) 1266 .setEntries( 1267 listOf( 1268 safetyCenterTestData.safetyCenterEntryDefault( 1269 SINGLE_SOURCE_ALL_PROFILE_ID 1270 ), 1271 safetyCenterTestData.safetyCenterEntryDefault( 1272 SINGLE_SOURCE_ALL_PROFILE_ID, 1273 deviceState.privateProfile().id(), 1274 title = "Unknown", 1275 pendingIntent = 1276 createTestActivityRedirectPendingIntentForUser( 1277 deviceState.privateProfile().userHandle() 1278 ), 1279 ), 1280 ) 1281 ) 1282 .setSeverityUnspecifiedIconType( 1283 SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION 1284 ) 1285 .build() 1286 ) 1287 ), 1288 emptyList(), 1289 ) 1290 1291 assertThat(safetyCenterManager.getSafetyCenterDataWithPermission()) 1292 .isEqualTo(safetyCenterDataWithPrivateProfile) 1293 assertThat( 1294 privateSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission() 1295 ) 1296 .isEqualTo(safetyCenterDataWithPrivateProfile) 1297 1298 deviceState.privateProfile().remove() 1299 1300 val safetyCenterDataForPrimaryUser = 1301 SafetyCenterData( 1302 safetyCenterTestData.safetyCenterStatusUnknown, 1303 emptyList(), 1304 listOf( 1305 safetyCenterTestData.singletonSafetyCenterEntryOrGroup( 1306 SINGLE_SOURCE_GROUP_ID, 1307 safetyCenterTestData.safetyCenterEntryDefault(SINGLE_SOURCE_ALL_PROFILE_ID), 1308 "No info yet", 1309 ) 1310 ), 1311 emptyList(), 1312 ) 1313 assertThat(safetyCenterManager.getSafetyCenterDataWithPermission()) 1314 .isEqualTo(safetyCenterDataForPrimaryUser) 1315 assertThat( 1316 privateSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission() 1317 ) 1318 .isEqualTo(SafetyCenterTestData.DEFAULT) 1319 } 1320 1321 @Test 1322 @EnsureHasAdditionalUser(installInstrumentedApp = TRUE) getSafetyCenterData_afterAdditionalUserRemoved_returnsDefaultDatanull1323 fun getSafetyCenterData_afterAdditionalUserRemoved_returnsDefaultData() { 1324 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1325 val additionalUserSafetyCenterManager = 1326 getSafetyCenterManagerForUser(deviceState.additionalUser().userHandle()) 1327 checkState( 1328 additionalUserSafetyCenterManager 1329 .getSafetyCenterDataWithInteractAcrossUsersPermission() == 1330 safetyCenterDataForAdditionalUser 1331 ) 1332 1333 deviceState.additionalUser().remove() 1334 1335 assertThat( 1336 additionalUserSafetyCenterManager 1337 .getSafetyCenterDataWithInteractAcrossUsersPermission() 1338 ) 1339 .isEqualTo(SafetyCenterTestData.DEFAULT) 1340 } 1341 1342 @Test 1343 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_primaryProfileIssueOnlySource_shouldNotBeAbleToSetDataToWorkProfilenull1344 fun setSafetySourceData_primaryProfileIssueOnlySource_shouldNotBeAbleToSetDataToWorkProfile() { 1345 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.issueOnlySourceConfig) 1346 val managedSafetyCenterManager = 1347 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1348 val dataForWork = 1349 SafetySourceTestData.issuesOnly(safetySourceTestData.criticalResolvingGeneralIssue) 1350 1351 assertFailsWith(IllegalArgumentException::class) { 1352 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1353 ISSUE_ONLY_ALL_OPTIONAL_ID, 1354 dataForWork, 1355 ) 1356 } 1357 } 1358 1359 @Test 1360 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_withoutInteractAcrossUserPermission_shouldThrowErrornull1361 fun setSafetySourceData_withoutInteractAcrossUserPermission_shouldThrowError() { 1362 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1363 val dataForWork = safetySourceTestData.informationWithIssueForWork 1364 val managedSafetyCenterManager = 1365 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1366 1367 assertFailsWith(SecurityException::class) { 1368 managedSafetyCenterManager.setSafetySourceData( 1369 SINGLE_SOURCE_ALL_PROFILE_ID, 1370 dataForWork, 1371 EVENT_SOURCE_STATE_CHANGED, 1372 ) 1373 } 1374 } 1375 1376 @Test 1377 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_withoutAppInstalledForWorkProfile_shouldNoOpnull1378 fun setSafetySourceData_withoutAppInstalledForWorkProfile_shouldNoOp() { 1379 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1380 val dataForWork = safetySourceTestData.informationWithIssueForWork 1381 val managedSafetyCenterManager = 1382 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1383 TestApis.packages().find(context.packageName).uninstall(deviceState.workProfile()) 1384 1385 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1386 SINGLE_SOURCE_ALL_PROFILE_ID, 1387 dataForWork, 1388 ) 1389 1390 val safetySourceData = 1391 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1392 SINGLE_SOURCE_ALL_PROFILE_ID 1393 ) 1394 assertThat(safetySourceData).isNull() 1395 } 1396 1397 @Test 1398 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_withRemovedProfile_shouldNoOpnull1399 fun setSafetySourceData_withRemovedProfile_shouldNoOp() { 1400 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1401 val dataForWork = safetySourceTestData.informationWithIssueForWork 1402 val managedSafetyCenterManager = 1403 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1404 deviceState.workProfile().remove() 1405 1406 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1407 SINGLE_SOURCE_ALL_PROFILE_ID, 1408 dataForWork, 1409 ) 1410 1411 val safetySourceData = 1412 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1413 SINGLE_SOURCE_ALL_PROFILE_ID 1414 ) 1415 assertThat(safetySourceData).isNull() 1416 } 1417 1418 @Test 1419 @EnsureHasCloneProfile(installInstrumentedApp = TRUE) setSafetySourceData_withUnsupportedProfile_shouldNoOpnull1420 fun setSafetySourceData_withUnsupportedProfile_shouldNoOp() { 1421 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1422 val dataForClone = safetySourceTestData.informationWithIssueForWork 1423 val clonedSafetyCenterManager = 1424 getSafetyCenterManagerForUser(deviceState.cloneProfile().userHandle()) 1425 1426 clonedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1427 SINGLE_SOURCE_ALL_PROFILE_ID, 1428 dataForClone, 1429 ) 1430 1431 val safetySourceData = 1432 clonedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1433 SINGLE_SOURCE_ALL_PROFILE_ID 1434 ) 1435 assertThat(safetySourceData).isNull() 1436 } 1437 1438 @Test 1439 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_withProfileInQuietMode_shouldSetDatanull1440 fun setSafetySourceData_withProfileInQuietMode_shouldSetData() { 1441 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1442 val dataForWork = safetySourceTestData.informationWithIssueForWork 1443 val managedSafetyCenterManager = 1444 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1445 setQuietMode(true) 1446 1447 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1448 SINGLE_SOURCE_ALL_PROFILE_ID, 1449 dataForWork, 1450 ) 1451 1452 val safetySourceData = 1453 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1454 SINGLE_SOURCE_ALL_PROFILE_ID 1455 ) 1456 assertThat(safetySourceData).isEqualTo(dataForWork) 1457 } 1458 1459 @Test 1460 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_issuesOnlySourceWithWorkProfile_shouldBeAbleToSetDatanull1461 fun setSafetySourceData_issuesOnlySourceWithWorkProfile_shouldBeAbleToSetData() { 1462 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.issueOnlySourceAllProfileConfig) 1463 1464 val dataForPrimaryUser = 1465 SafetySourceTestData.issuesOnly(safetySourceTestData.recommendationGeneralIssue) 1466 safetyCenterTestHelper.setData(ISSUE_ONLY_ALL_PROFILE_SOURCE_ID, dataForPrimaryUser) 1467 val managedSafetyCenterManager = 1468 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1469 val dataForWorkProfile = 1470 SafetySourceTestData.issuesOnly(safetySourceTestData.criticalResolvingGeneralIssue) 1471 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1472 ISSUE_ONLY_ALL_PROFILE_SOURCE_ID, 1473 dataForWorkProfile, 1474 ) 1475 1476 val apiSafetySourceData = 1477 safetyCenterManager.getSafetySourceDataWithPermission(ISSUE_ONLY_ALL_PROFILE_SOURCE_ID) 1478 val apiSafetySourceDataForWork = 1479 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1480 ISSUE_ONLY_ALL_PROFILE_SOURCE_ID 1481 ) 1482 assertThat(apiSafetySourceData).isEqualTo(dataForPrimaryUser) 1483 assertThat(apiSafetySourceDataForWork).isEqualTo(dataForWorkProfile) 1484 } 1485 1486 @Test 1487 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_primaryProfileSource_shouldNotBeAbleToSetDataToWorkProfilenull1488 fun setSafetySourceData_primaryProfileSource_shouldNotBeAbleToSetDataToWorkProfile() { 1489 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceConfig) 1490 1491 val managedSafetyCenterManager = 1492 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1493 val dataForWork = safetySourceTestData.informationWithIssueForWork 1494 assertFailsWith(IllegalArgumentException::class) { 1495 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1496 SINGLE_SOURCE_ID, 1497 dataForWork, 1498 ) 1499 } 1500 } 1501 1502 @Test 1503 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_sourceWithWorkProfile_shouldBeAbleToSetDatanull1504 fun setSafetySourceData_sourceWithWorkProfile_shouldBeAbleToSetData() { 1505 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1506 1507 val dataForPrimaryUser = safetySourceTestData.information 1508 safetyCenterTestHelper.setData(SINGLE_SOURCE_ALL_PROFILE_ID, dataForPrimaryUser) 1509 val dataForWork = safetySourceTestData.informationWithIssueForWork 1510 val managedSafetyCenterManager = 1511 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1512 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1513 SINGLE_SOURCE_ALL_PROFILE_ID, 1514 dataForWork, 1515 ) 1516 1517 val apiSafetySourceData = 1518 safetyCenterManager.getSafetySourceDataWithPermission(SINGLE_SOURCE_ALL_PROFILE_ID) 1519 val apiSafetySourceDataForWork = 1520 managedSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1521 SINGLE_SOURCE_ALL_PROFILE_ID 1522 ) 1523 assertThat(apiSafetySourceData).isEqualTo(dataForPrimaryUser) 1524 assertThat(apiSafetySourceDataForWork).isEqualTo(dataForWork) 1525 } 1526 1527 @Test 1528 @EnsureHasWorkProfile(installInstrumentedApp = TRUE) setSafetySourceData_notificationsAllowed_workProfile_sendsNotificationnull1529 fun setSafetySourceData_notificationsAllowed_workProfile_sendsNotification() { 1530 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig) 1531 SafetyCenterFlags.notificationsEnabled = true 1532 SafetyCenterFlags.notificationsAllowedSources = setOf(SINGLE_SOURCE_ALL_PROFILE_ID) 1533 SafetyCenterFlags.immediateNotificationBehaviorIssues = 1534 setOf("$SINGLE_SOURCE_ALL_PROFILE_ID/$ISSUE_TYPE_ID") 1535 val dataForWork = safetySourceTestData.informationWithIssueForWork 1536 val managedSafetyCenterManager = 1537 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1538 1539 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1540 SINGLE_SOURCE_ALL_PROFILE_ID, 1541 dataForWork, 1542 ) 1543 1544 TestNotificationListener.waitForNotificationsMatching( 1545 NotificationCharacteristics( 1546 title = "Information issue title", 1547 text = "Information issue summary", 1548 actions = listOf("Review"), 1549 ) 1550 ) 1551 } 1552 1553 @Test 1554 @EnsureHasAdditionalUser(installInstrumentedApp = TRUE) setSafetySourceData_forStoppedUser_shouldSetDatanull1555 fun setSafetySourceData_forStoppedUser_shouldSetData() { 1556 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceConfig) 1557 deviceState.additionalUser().stop() 1558 1559 val dataForPrimaryUser = safetySourceTestData.unspecified 1560 val additionalUserSafetyCenterManager = 1561 getSafetyCenterManagerForUser(deviceState.additionalUser().userHandle()) 1562 additionalUserSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1563 SINGLE_SOURCE_ID, 1564 dataForPrimaryUser, 1565 ) 1566 1567 val apiSafetySourceData = 1568 additionalUserSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1569 SINGLE_SOURCE_ID 1570 ) 1571 assertThat(apiSafetySourceData).isEqualTo(dataForPrimaryUser) 1572 } 1573 1574 @Test 1575 @EnsureHasAdditionalUser(installInstrumentedApp = TRUE) setSafetySourceData_forBothPrimaryAdditionalUser_shouldSetDatanull1576 fun setSafetySourceData_forBothPrimaryAdditionalUser_shouldSetData() { 1577 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceConfig) 1578 1579 val dataForPrimaryUser = safetySourceTestData.information 1580 safetyCenterTestHelper.setData(SINGLE_SOURCE_ID, dataForPrimaryUser) 1581 val dataForAdditionalUser = safetySourceTestData.unspecified 1582 val additionalUserSafetyCenterManager = 1583 getSafetyCenterManagerForUser(deviceState.additionalUser().userHandle()) 1584 additionalUserSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1585 SINGLE_SOURCE_ID, 1586 dataForAdditionalUser, 1587 ) 1588 1589 val apiSafetySourceDataForPrimaryUser = 1590 safetyCenterManager.getSafetySourceDataWithPermission(SINGLE_SOURCE_ID) 1591 val apiSafetySourceDataForAdditionalUser = 1592 additionalUserSafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1593 SINGLE_SOURCE_ID 1594 ) 1595 assertThat(apiSafetySourceDataForPrimaryUser).isEqualTo(dataForPrimaryUser) 1596 assertThat(apiSafetySourceDataForAdditionalUser).isEqualTo(dataForAdditionalUser) 1597 } 1598 1599 @Test 1600 @EnsureHasAdditionalUser(installInstrumentedApp = TRUE) setSafetySourceData_forAdditionalUser_shouldNotAffectDataForPrimaryUsernull1601 fun setSafetySourceData_forAdditionalUser_shouldNotAffectDataForPrimaryUser() { 1602 safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceConfig) 1603 1604 val dataForAdditionalUser = safetySourceTestData.unspecified 1605 val additionalUserSafetyCenterManager = 1606 getSafetyCenterManagerForUser(deviceState.additionalUser().userHandle()) 1607 additionalUserSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1608 SINGLE_SOURCE_ID, 1609 dataForAdditionalUser, 1610 ) 1611 1612 val apiSafetySourceDataForPrimaryUser = 1613 safetyCenterManager.getSafetySourceDataWithPermission(SINGLE_SOURCE_ID) 1614 assertThat(apiSafetySourceDataForPrimaryUser).isEqualTo(null) 1615 } 1616 findWorkPolicyInfonull1617 private fun findWorkPolicyInfo() { 1618 context.launchSafetyCenterActivity { 1619 waitAllTextDisplayed("Your work policy info", "Settings managed by your IT admin") 1620 } 1621 } 1622 getSafetyCenterManagerForUsernull1623 private fun getSafetyCenterManagerForUser(userHandle: UserHandle): SafetyCenterManager { 1624 val contextForUser = getContextForUser(userHandle) 1625 return contextForUser.getSystemService(SafetyCenterManager::class.java)!! 1626 } 1627 getContextForUsernull1628 private fun getContextForUser(userHandle: UserHandle): Context { 1629 return callWithShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL) { 1630 context.createContextAsUser(userHandle, 0) 1631 } 1632 } 1633 createTestActivityRedirectPendingIntentForUsernull1634 private fun createTestActivityRedirectPendingIntentForUser( 1635 user: UserHandle, 1636 explicit: Boolean = true, 1637 ): PendingIntent { 1638 return callWithShellPermissionIdentity(INTERACT_ACROSS_USERS) { 1639 SafetySourceTestData.createRedirectPendingIntent( 1640 getContextForUser(user), 1641 SafetySourceTestData.createTestActivityIntent(getContextForUser(user), explicit), 1642 ) 1643 } 1644 } 1645 SafetyCenterManagernull1646 private fun SafetyCenterManager.getSafetySourceDataWithInteractAcrossUsersPermission( 1647 id: String 1648 ): SafetySourceData? = 1649 callWithShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL) { 1650 getSafetySourceDataWithPermission(id) 1651 } 1652 SafetyCenterManagernull1653 private fun SafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1654 id: String, 1655 dataToSet: SafetySourceData, 1656 safetyEvent: SafetyEvent = EVENT_SOURCE_STATE_CHANGED, 1657 ) = 1658 callWithShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL) { 1659 setSafetySourceDataWithPermission(id, dataToSet, safetyEvent) 1660 } 1661 SafetyCenterManagernull1662 private fun SafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission(): 1663 SafetyCenterData = 1664 callWithShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL) { 1665 getSafetyCenterDataWithPermission() 1666 } 1667 setQuietModenull1668 private fun setQuietMode(enableQuietMode: Boolean) { 1669 if (inQuietMode == enableQuietMode) { 1670 return 1671 } 1672 if (enableQuietMode) { 1673 deviceState.workProfile().setQuietMode(true) 1674 } else { 1675 // This is needed to ensure the refresh broadcast doesn't leak onto other tests. 1676 disableQuietModeAndWaitForRefreshToComplete() 1677 } 1678 inQuietMode = enableQuietMode 1679 } 1680 disableQuietModeAndWaitForRefreshToCompletenull1681 private fun disableQuietModeAndWaitForRefreshToComplete() { 1682 val listener = safetyCenterTestHelper.addListener() 1683 deviceState.workProfile().setQuietMode(false) 1684 listener.waitForSafetyCenterRefresh() 1685 } 1686 safetyCenterEntryOkForWorknull1687 private fun safetyCenterEntryOkForWork(sourceId: String, managedUserId: Int) = 1688 safetyCenterTestData 1689 .safetyCenterEntryOkBuilder(sourceId, managedUserId, title = "Ok title for Work") 1690 .build() 1691 1692 private fun safetyCenterEntryOkForPrivate(sourceId: String, managedUserId: Int) = 1693 safetyCenterTestData 1694 .safetyCenterEntryOkBuilder(sourceId, managedUserId, title = "Ok title for Private") 1695 .build() 1696 1697 private fun updatePrimaryProfileSources() { 1698 safetyCenterTestHelper.setData( 1699 DYNAMIC_BAREBONE_ID, 1700 safetySourceTestData.criticalWithResolvingGeneralIssue, 1701 ) 1702 safetyCenterTestHelper.setData( 1703 DYNAMIC_DISABLED_ID, 1704 safetySourceTestData.recommendationWithGeneralIssue, 1705 ) 1706 safetyCenterTestHelper.setData(DYNAMIC_HIDDEN_ID, safetySourceTestData.unspecified) 1707 safetyCenterTestHelper.setData( 1708 ISSUE_ONLY_BAREBONE_ID, 1709 SafetySourceTestData.issuesOnly(safetySourceTestData.criticalResolvingGeneralIssue), 1710 ) 1711 safetyCenterTestHelper.setData( 1712 ISSUE_ONLY_ALL_OPTIONAL_ID, 1713 SafetySourceTestData.issuesOnly(safetySourceTestData.recommendationGeneralIssue), 1714 ) 1715 safetyCenterTestHelper.setData( 1716 DYNAMIC_IN_STATELESS_ID, 1717 safetySourceTestData.unspecifiedWithIssue, 1718 ) 1719 safetyCenterTestHelper.setData( 1720 ISSUE_ONLY_IN_STATELESS_ID, 1721 SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue), 1722 ) 1723 } 1724 updateWorkProfileSourcesnull1725 private fun updateWorkProfileSources() { 1726 val managedSafetyCenterManager = 1727 getSafetyCenterManagerForUser(deviceState.workProfile().userHandle()) 1728 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1729 DYNAMIC_DISABLED_ID, 1730 safetySourceTestData.informationWithIssueForWork, 1731 ) 1732 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1733 DYNAMIC_HIDDEN_ID, 1734 safetySourceTestData.informationWithIssueForWork, 1735 ) 1736 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1737 ISSUE_ONLY_ALL_OPTIONAL_ID, 1738 SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue), 1739 ) 1740 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1741 DYNAMIC_IN_STATELESS_ID, 1742 safetySourceTestData.unspecifiedWithIssueForWork, 1743 ) 1744 managedSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1745 ISSUE_ONLY_IN_STATELESS_ID, 1746 SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue), 1747 ) 1748 } 1749 updatePrivateProfileSourcesnull1750 private fun updatePrivateProfileSources() { 1751 val privateSafetyCenterManager = 1752 getSafetyCenterManagerForUser(deviceState.privateProfile().userHandle()) 1753 privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1754 DYNAMIC_DISABLED_ID, 1755 safetySourceTestData.informationWithIssueForPrivate, 1756 ) 1757 privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1758 DYNAMIC_HIDDEN_ID, 1759 safetySourceTestData.informationWithIssueForPrivate, 1760 ) 1761 privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1762 ISSUE_ONLY_ALL_OPTIONAL_ID, 1763 SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue), 1764 ) 1765 privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1766 DYNAMIC_IN_STATELESS_ID, 1767 safetySourceTestData.unspecifiedWithIssueForPrivate, 1768 ) 1769 privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission( 1770 ISSUE_ONLY_IN_STATELESS_ID, 1771 SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue), 1772 ) 1773 } 1774 } 1775