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

Commit fdda7b48 authored by Lucas Silva's avatar Lucas Silva
Browse files

Cleanup hub disabled flow by consolidating logic

The isCommunalAvailable flow now controls whether the view gets added to
the shade at all. If the flow is false, the view is removed completely.

This makes the flow the source-of-truth for whether communal hub is
actually available or not.

Test: atest CommunalTutorialInteractorTest
Test: atest CommunalAppWidgetHostStartableTest
Test: atest CommunalInteractorTest
Test: atest CommunalViewModelTest
Bug: 319331389
Flag: ACONFIG com.android.systemui.communal_hub STAGING
Change-Id: I7e0d272eee0579494ad240fcc3c7543dfd3546c2
parent 50cfcf9c
Loading
Loading
Loading
Loading
+0 −8
Original line number Original line Diff line number Diff line
@@ -64,14 +64,6 @@ fun CommunalContainer(
            transitions = sceneTransitions,
            transitions = sceneTransitions,
        )
        )


    // Don't show hub mode UI if communal is not available. Communal is only available if it has
    // been enabled via settings and either keyguard is showing, or, the device is currently
    // dreaming.
    val isCommunalAvailable by viewModel.isCommunalAvailable.collectAsState()
    if (!isCommunalAvailable) {
        return
    }

    // This effect exposes the SceneTransitionLayout's observable transition state to the rest of
    // This effect exposes the SceneTransitionLayout's observable transition state to the rest of
    // the system, and unsets it when the view is disposed to avoid a memory leak.
    // the system, and unsets it when the view is disposed to avoid a memory leak.
    DisposableEffect(viewModel, sceneTransitionLayoutState) {
    DisposableEffect(viewModel, sceneTransitionLayoutState) {
+19 −4
Original line number Original line Diff line number Diff line
@@ -125,7 +125,7 @@ class CommunalInteractorTest : SysuiTestCase() {
            keyguardRepository.setIsEncryptedOrLockdown(false)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(mainUser)
            userRepository.setSelectedUserInfo(mainUser)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardShowing(true)
            runCurrent()
            communalRepository.setCommunalEnabledState(true)


            assertThat(isAvailable).isTrue()
            assertThat(isAvailable).isTrue()
        }
        }
@@ -138,7 +138,8 @@ class CommunalInteractorTest : SysuiTestCase() {


            keyguardRepository.setIsEncryptedOrLockdown(true)
            keyguardRepository.setIsEncryptedOrLockdown(true)
            userRepository.setSelectedUserInfo(mainUser)
            userRepository.setSelectedUserInfo(mainUser)
            runCurrent()
            keyguardRepository.setKeyguardShowing(true)
            communalRepository.setCommunalEnabledState(true)


            assertThat(isAvailable).isFalse()
            assertThat(isAvailable).isFalse()
        }
        }
@@ -152,7 +153,7 @@ class CommunalInteractorTest : SysuiTestCase() {
            keyguardRepository.setIsEncryptedOrLockdown(false)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(secondaryUser)
            userRepository.setSelectedUserInfo(secondaryUser)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardShowing(true)
            runCurrent()
            communalRepository.setCommunalEnabledState(true)


            assertThat(isAvailable).isFalse()
            assertThat(isAvailable).isFalse()
        }
        }
@@ -166,11 +167,25 @@ class CommunalInteractorTest : SysuiTestCase() {
            keyguardRepository.setIsEncryptedOrLockdown(false)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(mainUser)
            userRepository.setSelectedUserInfo(mainUser)
            keyguardRepository.setDreaming(true)
            keyguardRepository.setDreaming(true)
            runCurrent()
            communalRepository.setCommunalEnabledState(true)


            assertThat(isAvailable).isTrue()
            assertThat(isAvailable).isTrue()
        }
        }


    @Test
    fun isCommunalAvailable_communalDisabled_false() =
        testScope.runTest {
            val isAvailable by collectLastValue(underTest.isCommunalAvailable)
            assertThat(isAvailable).isFalse()

            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(mainUser)
            keyguardRepository.setKeyguardShowing(true)
            communalRepository.setCommunalEnabledState(false)

            assertThat(isAvailable).isFalse()
        }

    @Test
    @Test
    fun widget_tutorialCompletedAndWidgetsAvailable_showWidgetContent() =
    fun widget_tutorialCompletedAndWidgetsAvailable_showWidgetContent() =
        testScope.runTest {
        testScope.runTest {
+11 −11
Original line number Original line Diff line number Diff line
@@ -34,20 +34,15 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
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.user.data.repository.fakeUserRepository
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class CommunalTutorialInteractorTest : SysuiTestCase() {
class CommunalTutorialInteractorTest : SysuiTestCase() {
    @Mock lateinit var user: UserInfo

    private val kosmos = testKosmos()
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope


@@ -60,14 +55,14 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {


    @Before
    @Before
    fun setUp() {
    fun setUp() {
        MockitoAnnotations.initMocks(this)

        keyguardRepository = kosmos.fakeKeyguardRepository
        keyguardRepository = kosmos.fakeKeyguardRepository
        communalTutorialRepository = kosmos.fakeCommunalTutorialRepository
        communalTutorialRepository = kosmos.fakeCommunalTutorialRepository
        communalRepository = kosmos.fakeCommunalRepository
        communalRepository = kosmos.fakeCommunalRepository
        communalInteractor = kosmos.communalInteractor
        communalInteractor = kosmos.communalInteractor
        userRepository = kosmos.fakeUserRepository
        userRepository = kosmos.fakeUserRepository


        userRepository.setUserInfos(listOf(MAIN_USER_INFO))

        underTest = kosmos.communalTutorialInteractor
        underTest = kosmos.communalTutorialInteractor
    }
    }


@@ -204,12 +199,17 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
    private suspend fun setCommunalAvailable(available: Boolean) {
    private suspend fun setCommunalAvailable(available: Boolean) {
        if (available) {
        if (available) {
            communalRepository.setIsCommunalEnabled(true)
            communalRepository.setIsCommunalEnabled(true)
            communalRepository.setCommunalEnabledState(true)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            whenever(user.isMain).thenReturn(true)
            userRepository.setSelectedUserInfo(MAIN_USER_INFO)
            userRepository.setUserInfos(listOf(user))
            keyguardRepository.setKeyguardShowing(true)
            userRepository.setSelectedUserInfo(user)
        } else {
        } else {
            keyguardRepository.setIsEncryptedOrLockdown(true)
            communalRepository.setIsCommunalEnabled(false)
            communalRepository.setCommunalEnabledState(false)
        }
    }
    }

    private companion object {
        val MAIN_USER_INFO = UserInfo(0, "primary", UserInfo.FLAG_MAIN)
    }
    }
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.communal.data.repository.FakeCommunalMediaRepository
import com.android.systemui.communal.data.repository.FakeCommunalTutorialRepository
import com.android.systemui.communal.data.repository.FakeCommunalTutorialRepository
import com.android.systemui.communal.data.repository.FakeCommunalWidgetRepository
import com.android.systemui.communal.data.repository.FakeCommunalWidgetRepository
import com.android.systemui.communal.data.repository.fakeCommunalMediaRepository
import com.android.systemui.communal.data.repository.fakeCommunalMediaRepository
import com.android.systemui.communal.data.repository.fakeCommunalRepository
import com.android.systemui.communal.data.repository.fakeCommunalTutorialRepository
import com.android.systemui.communal.data.repository.fakeCommunalTutorialRepository
import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
@@ -90,6 +91,8 @@ class CommunalViewModelTest : SysuiTestCase() {
        mediaRepository = kosmos.fakeCommunalMediaRepository
        mediaRepository = kosmos.fakeCommunalMediaRepository
        userRepository = kosmos.fakeUserRepository
        userRepository = kosmos.fakeUserRepository


        kosmos.fakeCommunalRepository.setCommunalEnabledState(true)

        underTest =
        underTest =
            CommunalViewModel(
            CommunalViewModel(
                testScope,
                testScope,
+3 −1
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.pm.UserInfo
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.fakeCommunalRepository
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.applicationCoroutineScope
@@ -121,9 +122,10 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {


    private suspend fun setCommunalAvailable(available: Boolean) =
    private suspend fun setCommunalAvailable(available: Boolean) =
        with(kosmos) {
        with(kosmos) {
            fakeKeyguardRepository.setIsEncryptedOrLockdown(!available)
            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
            fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
            fakeKeyguardRepository.setKeyguardShowing(true)
            fakeKeyguardRepository.setKeyguardShowing(true)
            fakeCommunalRepository.setCommunalEnabledState(available)
        }
        }


    private companion object {
    private companion object {
Loading