Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca7d0c74 authored by Bryce Lee's avatar Bryce Lee Committed by Android (Google) Code Review
Browse files

Merge "Block communal widget actions until main user is unlocked" into main

parents 857fb877 8992726a
Loading
Loading
Loading
Loading
+29 −18
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ package com.android.systemui.communal.data.db

import android.content.ComponentName
import android.os.UserHandle
import android.os.UserManager
import android.os.userManager
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -27,10 +27,13 @@ import com.android.systemui.communal.data.db.DefaultWidgetPopulation.SkipReason.
import com.android.systemui.communal.shared.model.SpanValue
import com.android.systemui.communal.widgets.CommunalWidgetHost
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.testKosmos
import kotlinx.coroutines.test.runCurrent
import com.android.systemui.user.data.repository.FakeUserRepository.Companion.MAIN_USER_ID
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.domain.interactor.userLockedInteractor
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -38,6 +41,7 @@ import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.kotlin.any
import org.mockito.kotlin.anyOrNull
import org.mockito.kotlin.atLeastOnce
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
@@ -46,8 +50,7 @@ import org.mockito.kotlin.verify
@SmallTest
@RunWith(AndroidJUnit4::class)
class DefaultWidgetPopulationTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()

    private val communalWidgetHost =
        mock<CommunalWidgetHost> {
@@ -57,11 +60,6 @@ class DefaultWidgetPopulationTest : SysuiTestCase() {
    private val communalWidgetDao = mock<CommunalWidgetDao>()
    private val database = mock<SupportSQLiteDatabase>()
    private val mainUser = UserHandle(0)
    private val userManager =
        mock<UserManager> {
            on { mainUser }.thenReturn(mainUser)
            on { getUserSerialNumber(0) }.thenReturn(0)
        }

    private val defaultWidgets =
        arrayOf(
@@ -74,6 +72,7 @@ class DefaultWidgetPopulationTest : SysuiTestCase() {

    @Before
    fun setUp() {
        kosmos.fakeUserRepository.setUserUnlocked(MAIN_USER_ID, true)
        underTest =
            DefaultWidgetPopulation(
                bgScope = kosmos.applicationCoroutineScope,
@@ -81,32 +80,45 @@ class DefaultWidgetPopulationTest : SysuiTestCase() {
                communalWidgetDaoProvider = { communalWidgetDao },
                defaultWidgets = defaultWidgets,
                logBuffer = logcatLogBuffer("DefaultWidgetPopulationTest"),
                userManager = userManager,
                userManager = kosmos.userManager,
                userLockedInteractor = kosmos.userLockedInteractor,
            )
    }

    @Test
    fun testNoInteractionUntilMainUserUnlocked() =
        kosmos.runTest {
            kosmos.fakeUserRepository.setUserUnlocked(MAIN_USER_ID, false)
            // Database created
            underTest.onCreate(database)
            verify(communalWidgetHost, never())
                .allocateIdAndBindWidget(provider = any(), user = any())
            kosmos.fakeUserRepository.setUserUnlocked(MAIN_USER_ID, true)
            verify(communalWidgetHost, atLeastOnce())
                .allocateIdAndBindWidget(provider = any(), user = any())
        }

    @Test
    fun testPopulateDefaultWidgetsWhenDatabaseCreated() =
        testScope.runTest {
        kosmos.runTest {
            // Database created
            underTest.onCreate(database)
            runCurrent()

            // Verify default widgets bound
            verify(communalWidgetHost)
                .allocateIdAndBindWidget(
                    provider = eq(ComponentName.unflattenFromString(defaultWidgets[0])!!),
                    user = eq(mainUser),
                    user = eq(UserHandle(MAIN_USER_ID)),
                )
            verify(communalWidgetHost)
                .allocateIdAndBindWidget(
                    provider = eq(ComponentName.unflattenFromString(defaultWidgets[1])!!),
                    user = eq(mainUser),
                    user = eq(UserHandle(MAIN_USER_ID)),
                )
            verify(communalWidgetHost)
                .allocateIdAndBindWidget(
                    provider = eq(ComponentName.unflattenFromString(defaultWidgets[2])!!),
                    user = eq(mainUser),
                    user = eq(UserHandle(MAIN_USER_ID)),
                )

            // Verify default widgets added in database
@@ -138,13 +150,12 @@ class DefaultWidgetPopulationTest : SysuiTestCase() {

    @Test
    fun testSkipDefaultWidgetsPopulation() =
        testScope.runTest {
        kosmos.runTest {
            // Skip default widgets population
            underTest.skipDefaultWidgetsPopulation(RESTORED_FROM_BACKUP)

            // Database created
            underTest.onCreate(database)
            runCurrent()

            // Verify no widget bounded or added to the database
            verify(communalWidgetHost, never()).allocateIdAndBindWidget(any(), any())
+12 −11
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.settings.fakeUserTracker
import com.android.systemui.statusbar.phone.fakeManagedProfileController
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.FakeUserRepository
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
@@ -163,12 +164,12 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
        }

    @Test
    fun isCommunalAvailable_storageUnlockedAndMainUser_true() =
    fun isCommunalAvailable_mainUserUnlockedAndMainUser_true() =
        kosmos.runTest {
            val isAvailable by collectLastValue(underTest.isCommunalAvailable)
            assertThat(isAvailable).isFalse()

            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)

@@ -176,12 +177,12 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
        }

    @Test
    fun isCommunalAvailable_storageLockedAndMainUser_false() =
    fun isCommunalAvailable_mainUserLockedAndMainUser_false() =
        kosmos.runTest {
            val isAvailable by collectLastValue(underTest.isCommunalAvailable)
            assertThat(isAvailable).isFalse()

            fakeKeyguardRepository.setIsEncryptedOrLockdown(true)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, false)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)

@@ -189,12 +190,12 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
        }

    @Test
    fun isCommunalAvailable_storageUnlockedAndSecondaryUser_false() =
    fun isCommunalAvailable_mainUserUnlockedAndSecondaryUser_false() =
        kosmos.runTest {
            val isAvailable by collectLastValue(underTest.isCommunalAvailable)
            assertThat(isAvailable).isFalse()

            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(secondaryUser)
            fakeKeyguardRepository.setKeyguardShowing(true)

@@ -207,7 +208,7 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
            val isAvailable by collectLastValue(underTest.isCommunalAvailable)
            assertThat(isAvailable).isFalse()

            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)

@@ -222,7 +223,7 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
            val isAvailable by collectLastValue(underTest.isCommunalAvailable)
            assertThat(isAvailable).isFalse()

            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, false)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)

@@ -1282,7 +1283,7 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
    @Test
    fun showCommunalWhileCharging() =
        kosmos.runTest {
            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)
            fakeSettings.putIntForUser(
@@ -1302,7 +1303,7 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
    @Test
    fun showCommunalWhilePosturedAndCharging() =
        kosmos.runTest {
            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)
            fakeSettings.putIntForUser(
@@ -1323,7 +1324,7 @@ class CommunalInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
    @Test
    fun showCommunalWhileDocked() =
        kosmos.runTest {
            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(mainUser)
            fakeKeyguardRepository.setKeyguardShowing(true)
            fakeSettings.putIntForUser(Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, 1, mainUser.id)
+1 −1
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
            // Keyguard showing, storage unlocked, main user, and tutorial not started.
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setUserUnlocked(FakeUserRepository.MAIN_USER_ID, true)
            setIsMainUser(true)
            tutorialRepository.setTutorialSettingState(
                Settings.Secure.HUB_MODE_TUTORIAL_NOT_STARTED
+5 −1
Original line number Diff line number Diff line
@@ -37,7 +37,9 @@ import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
import com.android.systemui.settings.fakeUserTracker
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.FakeUserRepository.Companion.MAIN_USER_ID
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.domain.interactor.userLockedInteractor
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
@@ -91,6 +93,7 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
                kosmos.testDispatcher,
                { widgetManager },
                helper,
                kosmos.userLockedInteractor,
            )
    }

@@ -269,6 +272,7 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {

                // Binding to the service does not require keyguard showing
                setCommunalAvailable(true, setKeyguardShowing = false)
                fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
                runCurrent()
                verify(widgetManager).register()

@@ -283,7 +287,7 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
        setKeyguardShowing: Boolean = true,
    ) =
        with(kosmos) {
            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setUserUnlocked(MAIN_USER_ID, true)
            fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
            if (setKeyguardShowing) {
                fakeKeyguardRepository.setKeyguardShowing(true)
+37 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
package com.android.systemui.user.data.repository

import android.app.admin.devicePolicyManager
import android.content.Intent
import android.content.pm.UserInfo
import android.internal.statusbar.fakeStatusBarService
import android.os.UserHandle
@@ -27,6 +28,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.broadcastDispatcher
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
@@ -50,6 +52,8 @@ import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -171,6 +175,39 @@ class UserRepositoryImplTest : SysuiTestCase() {
            job2.cancel()
        }

    @Test
    fun userUnlockedFlow_tracksBroadcastedChanges() =
        testScope.runTest {
            val userHandle: UserHandle = mock()
            underTest = create(testScope.backgroundScope)
            val latest by collectLastValue(underTest.isUserUnlocked(userHandle))
            whenever(manager.isUserUnlocked(eq(userHandle))).thenReturn(false)
            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                context,
                Intent(Intent.ACTION_USER_UNLOCKED),
            )

            assertThat(latest).isFalse()

            whenever(manager.isUserUnlocked(eq(userHandle))).thenReturn(true)
            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                context,
                Intent(Intent.ACTION_USER_UNLOCKED),
            )

            assertThat(latest).isTrue()
        }

    @Test
    fun userUnlockedFlow_initialValueReported() =
        testScope.runTest {
            val userHandle: UserHandle = mock()
            underTest = create(testScope.backgroundScope)
            whenever(manager.isUserUnlocked(eq(userHandle))).thenReturn(true)
            val latest by collectLastValue(underTest.isUserUnlocked(userHandle))
            assertThat(latest).isTrue()
        }

    @Test
    fun refreshUsers_sortsByCreationTime_guestUserLast() =
        testScope.runTest {
Loading