• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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