<lambda>null1 package com.android.systemui.settings
2 
3 import android.app.IActivityManager
4 import android.content.Context
5 import android.content.Intent
6 import android.content.pm.UserInfo
7 import android.os.Handler
8 import android.os.UserHandle
9 import android.os.UserManager
10 import androidx.concurrent.futures.DirectExecutor
11 import androidx.test.filters.SmallTest
12 import com.android.systemui.SysuiTestCase
13 import com.android.systemui.dump.DumpManager
14 import com.android.systemui.flags.FakeFeatureFlagsClassic
15 import com.android.systemui.util.mockito.any
16 import com.android.systemui.util.mockito.capture
17 import com.google.common.truth.Truth.assertThat
18 import java.util.concurrent.Executor
19 import kotlinx.coroutines.test.StandardTestDispatcher
20 import kotlinx.coroutines.test.runTest
21 import org.junit.Before
22 import org.junit.Test
23 import org.junit.runner.RunWith
24 import org.junit.runners.Parameterized
25 import org.mockito.ArgumentCaptor
26 import org.mockito.ArgumentMatchers
27 import org.mockito.ArgumentMatchers.anyInt
28 import org.mockito.Captor
29 import org.mockito.Mock
30 import org.mockito.Mockito.times
31 import org.mockito.Mockito.verify
32 import org.mockito.Mockito.`when`
33 import org.mockito.MockitoAnnotations
34 
35 @SmallTest
36 @RunWith(Parameterized::class)
37 class UserTrackerImplReceiveTest : SysuiTestCase() {
38 
39     companion object {
40 
41         @JvmStatic
42         @Parameterized.Parameters
43         fun data(): Iterable<String> =
44             listOf(
45                 Intent.ACTION_LOCALE_CHANGED,
46                 Intent.ACTION_USER_INFO_CHANGED,
47                 Intent.ACTION_MANAGED_PROFILE_AVAILABLE,
48                 Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE,
49                 Intent.ACTION_MANAGED_PROFILE_ADDED,
50                 Intent.ACTION_MANAGED_PROFILE_REMOVED,
51                 Intent.ACTION_MANAGED_PROFILE_UNLOCKED
52             )
53     }
54 
55     private val executor: Executor = DirectExecutor.INSTANCE
56 
57     @Mock private lateinit var context: Context
58     @Mock private lateinit var userManager: UserManager
59     @Mock private lateinit var iActivityManager: IActivityManager
60     @Mock(stubOnly = true) private lateinit var dumpManager: DumpManager
61     @Mock(stubOnly = true) private lateinit var handler: Handler
62 
63     @Parameterized.Parameter lateinit var intentAction: String
64     @Mock private lateinit var callback: UserTracker.Callback
65     @Captor private lateinit var captor: ArgumentCaptor<List<UserInfo>>
66 
67     private val fakeFeatures = FakeFeatureFlagsClassic()
68     private val testDispatcher = StandardTestDispatcher()
69 
70     private lateinit var tracker: UserTrackerImpl
71 
72     @Before
73     fun setUp() {
74         MockitoAnnotations.initMocks(this)
75 
76         `when`(context.user).thenReturn(UserHandle.SYSTEM)
77         `when`(context.createContextAsUser(ArgumentMatchers.any(), anyInt())).thenReturn(context)
78     }
79 
80     @Test
81     fun callsCallbackAndUpdatesProfilesWhenAnIntentReceived() = runTest {
82         `when`(userManager.getProfiles(anyInt())).thenAnswer { invocation ->
83             val id = invocation.getArgument<Int>(0)
84             val info = UserInfo(id, "", UserInfo.FLAG_FULL)
85             val infoProfile =
86                 UserInfo(
87                     id + 10,
88                     "",
89                     "",
90                     UserInfo.FLAG_MANAGED_PROFILE,
91                     UserManager.USER_TYPE_PROFILE_MANAGED
92                 )
93             infoProfile.profileGroupId = id
94             listOf(info, infoProfile)
95         }
96 
97         tracker =
98             UserTrackerImpl(
99                 context,
100                 { fakeFeatures },
101                 userManager,
102                 iActivityManager,
103                 dumpManager,
104                 this,
105                 testDispatcher,
106                 handler
107             )
108         tracker.initialize(0)
109         tracker.addCallback(callback, executor)
110         val profileID = tracker.userId + 10
111 
112         tracker.onReceive(context, Intent(intentAction))
113 
114         verify(callback, times(0)).onUserChanged(anyInt(), any())
115         verify(callback, times(1)).onProfilesChanged(capture(captor))
116         assertThat(captor.value.map { it.id }).containsExactly(0, profileID)
117     }
118 }
119