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