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