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

Commit fa5d8e19 authored by Darrell Shi's avatar Darrell Shi
Browse files

Disable swipe to communal hub when not available

Bug: 323065420
Fix: 323065420
Test: atest LockscreenSceneViewModelTest
Test: verified unable to swipe to CH after a reboot before unlocking
storage, and available again after unlocking
Flag: ACONFIG com.android.systemui.communal_hub STAGING
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT

Change-Id: I082bf6da99d923110d9d893c776963bcc374ed8e
parent fda620ae
Loading
Loading
Loading
Loading
+9 −31
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.content.pm.UserInfo
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -27,21 +25,20 @@ import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
import com.android.systemui.SysuiTestCase
import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.kosmos.testScope
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@@ -85,35 +82,21 @@ class LockscreenSceneViewModelTest : SysuiTestCase() {

    @EnableFlags(FLAG_COMMUNAL_HUB)
    @Test
    fun leftTransitionSceneKey_communalIsEnabled_communal() =
    fun leftTransitionSceneKey_communalIsAvailable_communal() =
        testScope.runTest {
            with(kosmos.fakeUserRepository) {
                setUserInfos(listOf(PRIMARY_USER))
                setSelectedUserInfo(PRIMARY_USER)
            }
            kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
            val leftDestinationSceneKey by collectLastValue(underTest.leftDestinationSceneKey)
            assertThat(leftDestinationSceneKey).isEqualTo(SceneKey.Communal)
        }

    @DisableFlags(FLAG_COMMUNAL_HUB)
    @Test
    fun leftTransitionSceneKey_communalIsDisabled_null() =
        testScope.runTest {
            with(kosmos.fakeUserRepository) {
                setUserInfos(listOf(PRIMARY_USER))
                setSelectedUserInfo(PRIMARY_USER)
            }
            kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, false)
            val leftDestinationSceneKey by collectLastValue(underTest.leftDestinationSceneKey)
            assertThat(leftDestinationSceneKey).isNull()

            kosmos.setCommunalAvailable(true)
            runCurrent()
            assertThat(leftDestinationSceneKey).isEqualTo(SceneKey.Communal)
        }

    private fun createLockscreenSceneViewModel(): LockscreenSceneViewModel {
        return LockscreenSceneViewModel(
            applicationScope = testScope.backgroundScope,
            deviceEntryInteractor = kosmos.deviceEntryInteractor,
            communalSettingsInteractor = kosmos.communalSettingsInteractor,
            communalInteractor = kosmos.communalInteractor,
            longPress =
                KeyguardLongPressViewModel(
                    interactor = mock(),
@@ -121,9 +104,4 @@ class LockscreenSceneViewModelTest : SysuiTestCase() {
            notifications = kosmos.notificationsPlaceholderViewModel,
        )
    }

    private companion object {
        val PRIMARY_USER =
            UserInfo(/* id= */ 0, /* name= */ "primary user", /* flags= */ UserInfo.FLAG_MAIN)
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.bouncerViewModel
import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.classifier.falsingCollector
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
@@ -130,7 +130,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
    private val sceneInteractor by lazy { kosmos.sceneInteractor }
    private val authenticationInteractor by lazy { kosmos.authenticationInteractor }
    private val deviceEntryInteractor by lazy { kosmos.deviceEntryInteractor }
    private val communalSettingsInteractor by lazy { kosmos.communalSettingsInteractor }
    private val communalInteractor by lazy { kosmos.communalInteractor }

    private val transitionState by lazy {
        MutableStateFlow<ObservableTransitionState>(
@@ -155,7 +155,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
        LockscreenSceneViewModel(
            applicationScope = testScope.backgroundScope,
            deviceEntryInteractor = deviceEntryInteractor,
            communalSettingsInteractor = communalSettingsInteractor,
            communalInteractor = communalInteractor,
            longPress =
                KeyguardLongPressViewModel(
                    interactor = mock(),
+3 −3
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.systemui.keyguard.ui.viewmodel

import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
@@ -36,7 +36,7 @@ class LockscreenSceneViewModel
constructor(
    @Application applicationScope: CoroutineScope,
    deviceEntryInteractor: DeviceEntryInteractor,
    communalSettingsInteractor: CommunalSettingsInteractor,
    communalInteractor: CommunalInteractor,
    val longPress: KeyguardLongPressViewModel,
    val notifications: NotificationsPlaceholderViewModel,
) {
@@ -56,7 +56,7 @@ constructor(

    /** The key of the scene we should switch to when swiping left. */
    val leftDestinationSceneKey: StateFlow<SceneKey?> =
        communalSettingsInteractor.isCommunalEnabled
        communalInteractor.isCommunalAvailable
            .map { available -> if (available) SceneKey.Communal else null }
            .stateIn(
                scope = applicationScope,
+15 −0
Original line number Diff line number Diff line
@@ -21,12 +21,16 @@ import com.android.systemui.communal.data.repository.communalPrefsRepository
import com.android.systemui.communal.data.repository.communalRepository
import com.android.systemui.communal.data.repository.communalWidgetRepository
import com.android.systemui.communal.widgets.EditWidgetsActivityStarter
import com.android.systemui.flags.Flags
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.smartspace.data.repository.smartspaceRepository
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.mock

val Kosmos.communalInteractor by Fixture {
@@ -47,3 +51,14 @@ val Kosmos.communalInteractor by Fixture {
}

val Kosmos.editWidgetsActivityStarter by Fixture<EditWidgetsActivityStarter> { mock() }

suspend fun Kosmos.setCommunalAvailable(available: Boolean) {
    fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, available)
    if (available) {
        fakeUserRepository.asMainUser()
        with(fakeKeyguardRepository) {
            setIsEncryptedOrLockdown(false)
            setKeyguardShowing(true)
        }
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -39,13 +39,19 @@ class FakeUserRepository @Inject constructor() : UserRepository {
        // User id to represent a non system (human) user id. We presume this is the main user.
        private const val MAIN_USER_ID = 10

        private val DEFAULT_SELECTED_USER = 0
        private const val DEFAULT_SELECTED_USER = 0
        private val DEFAULT_SELECTED_USER_INFO =
            UserInfo(
                /* id= */ DEFAULT_SELECTED_USER,
                /* name= */ "default selected user",
                /* flags= */ 0,
            )
        private val MAIN_USER =
            UserInfo(
                /* id= */ MAIN_USER_ID,
                /* name= */ "main user",
                /* flags= */ UserInfo.FLAG_MAIN,
            )
    }

    private val _userSwitcherSettings = MutableStateFlow(UserSwitcherSettingsModel())
@@ -113,6 +119,13 @@ class FakeUserRepository @Inject constructor() : UserRepository {
        yield()
    }

    /** Makes the current user [MAIN_USER]. */
    suspend fun asMainUser(): UserInfo {
        setUserInfos(listOf(MAIN_USER))
        setSelectedUserInfo(MAIN_USER)
        return MAIN_USER
    }

    suspend fun setSettings(settings: UserSwitcherSettingsModel) {
        _userSwitcherSettings.value = settings
        yield()