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

Commit 25fa4ad4 authored by Darrell Shi's avatar Darrell Shi
Browse files

Communal Hub only for the main user

Test: atest CommunalInteractorTest
Test: verified that communal hub is disabled for a secondary user
Bug: 316961478
Fix: 316961478
Flag: ACONFIG com.android.systemui.communal_hub DEVELOPMENT
Change-Id: Iaf7a7f07b6cb9ae3afcc9c6fa3683b0480df752c
parent 82bc7b87
Loading
Loading
Loading
Loading
+36 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
package com.android.systemui.communal.domain.interactor

import android.app.smartspace.SmartspaceTarget
import android.content.pm.UserInfo
import android.provider.Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
import android.widget.RemoteViews
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -46,6 +47,8 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.smartspace.data.repository.FakeSmartspaceRepository
import com.android.systemui.smartspace.data.repository.fakeSmartspaceRepository
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.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
@@ -57,8 +60,10 @@ import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations

/**
 * This class of test cases assume that communal is enabled. For disabled cases, see
@@ -68,6 +73,9 @@ import org.mockito.Mockito.verify
@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
class CommunalInteractorTest : SysuiTestCase() {
    @Mock private lateinit var mainUser: UserInfo
    @Mock private lateinit var secondaryUser: UserInfo

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

@@ -76,6 +84,7 @@ class CommunalInteractorTest : SysuiTestCase() {
    private lateinit var mediaRepository: FakeCommunalMediaRepository
    private lateinit var widgetRepository: FakeCommunalWidgetRepository
    private lateinit var smartspaceRepository: FakeSmartspaceRepository
    private lateinit var userRepository: FakeUserRepository
    private lateinit var keyguardRepository: FakeKeyguardRepository
    private lateinit var communalPrefsRepository: FakeCommunalPrefsRepository
    private lateinit var editWidgetsActivityStarter: EditWidgetsActivityStarter
@@ -84,15 +93,22 @@ class CommunalInteractorTest : SysuiTestCase() {

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

        tutorialRepository = kosmos.fakeCommunalTutorialRepository
        communalRepository = kosmos.fakeCommunalRepository
        mediaRepository = kosmos.fakeCommunalMediaRepository
        widgetRepository = kosmos.fakeCommunalWidgetRepository
        smartspaceRepository = kosmos.fakeSmartspaceRepository
        userRepository = kosmos.fakeUserRepository
        keyguardRepository = kosmos.fakeKeyguardRepository
        editWidgetsActivityStarter = kosmos.editWidgetsActivityStarter
        communalPrefsRepository = kosmos.fakeCommunalPrefsRepository

        whenever(mainUser.isMain).thenReturn(true)
        whenever(secondaryUser.isMain).thenReturn(false)
        userRepository.setUserInfos(listOf(mainUser, secondaryUser))

        underTest = kosmos.communalInteractor
    }

@@ -101,36 +117,52 @@ class CommunalInteractorTest : SysuiTestCase() {
        testScope.runTest { assertThat(underTest.isCommunalEnabled).isTrue() }

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

            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(mainUser)
            runCurrent()

            assertThat(isAvailable).isTrue()
        }

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

            keyguardRepository.setIsEncryptedOrLockdown(true)
            userRepository.setSelectedUserInfo(mainUser)
            runCurrent()

            assertThat(isAvailable).isFalse()
        }

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

            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(secondaryUser)
            runCurrent()

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

    @Test
    fun updateAppWidgetHostActive_uponStorageUnlock_true() =
    fun updateAppWidgetHostActive_uponStorageUnlockAsMainUser_true() =
        testScope.runTest {
            collectLastValue(underTest.isCommunalAvailable)
            assertThat(widgetRepository.isHostActive()).isFalse()

            keyguardRepository.setIsEncryptedOrLockdown(false)
            userRepository.setSelectedUserInfo(mainUser)
            runCurrent()

            assertThat(widgetRepository.isHostActive()).isTrue()
+20 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.communal.domain.interactor

import android.content.pm.UserInfo
import android.provider.Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
import android.provider.Settings.Secure.HUB_MODE_TUTORIAL_NOT_STARTED
import android.provider.Settings.Secure.HUB_MODE_TUTORIAL_STARTED
@@ -31,15 +32,22 @@ import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.kosmos.testScope
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.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations

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

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

@@ -48,23 +56,26 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
    private lateinit var communalTutorialRepository: FakeCommunalTutorialRepository
    private lateinit var communalRepository: FakeCommunalRepository
    private lateinit var communalInteractor: CommunalInteractor
    private lateinit var userRepository: FakeUserRepository

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

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

        underTest = kosmos.communalTutorialInteractor

        setCommunalAvailable(true)
    }

    @Test
    fun tutorialUnavailable_whenKeyguardNotVisible() =
        testScope.runTest {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            setCommunalAvailable(true)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)
            keyguardRepository.setKeyguardShowing(false)
            assertThat(isTutorialAvailable).isFalse()
@@ -74,6 +85,7 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
    fun tutorialUnavailable_whenTutorialIsCompleted() =
        testScope.runTest {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            setCommunalAvailable(true)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalRepository.setIsCommunalHubShowing(false)
@@ -95,6 +107,7 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
    fun tutorialAvailable_whenTutorialNotStarted() =
        testScope.runTest {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            setCommunalAvailable(true)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalRepository.setIsCommunalHubShowing(false)
@@ -106,6 +119,7 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
    fun tutorialAvailable_whenTutorialIsStarted() =
        testScope.runTest {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            setCommunalAvailable(true)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalRepository.setIsCommunalHubShowing(true)
@@ -187,10 +201,13 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

    private fun setCommunalAvailable(available: Boolean) {
    private suspend fun setCommunalAvailable(available: Boolean) {
        if (available) {
            communalRepository.setIsCommunalEnabled(true)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            whenever(user.isMain).thenReturn(true)
            userRepository.setUserInfos(listOf(user))
            userRepository.setSelectedUserInfo(user)
        } else {
            keyguardRepository.setIsEncryptedOrLockdown(true)
        }
+14 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.communal.view.viewmodel

import android.app.smartspace.SmartspaceTarget
import android.content.pm.UserInfo
import android.provider.Settings
import android.widget.RemoteViews
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -43,6 +44,8 @@ import com.android.systemui.media.controls.ui.MediaHost
import com.android.systemui.smartspace.data.repository.FakeSmartspaceRepository
import com.android.systemui.smartspace.data.repository.fakeSmartspaceRepository
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.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
@@ -62,6 +65,7 @@ import org.mockito.MockitoAnnotations
@RunWith(AndroidJUnit4::class)
class CommunalViewModelTest : SysuiTestCase() {
    @Mock private lateinit var mediaHost: MediaHost
    @Mock private lateinit var user: UserInfo

    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
@@ -71,6 +75,7 @@ class CommunalViewModelTest : SysuiTestCase() {
    private lateinit var widgetRepository: FakeCommunalWidgetRepository
    private lateinit var smartspaceRepository: FakeSmartspaceRepository
    private lateinit var mediaRepository: FakeCommunalMediaRepository
    private lateinit var userRepository: FakeUserRepository

    private lateinit var underTest: CommunalViewModel

@@ -83,6 +88,7 @@ class CommunalViewModelTest : SysuiTestCase() {
        widgetRepository = kosmos.fakeCommunalWidgetRepository
        smartspaceRepository = kosmos.fakeSmartspaceRepository
        mediaRepository = kosmos.fakeCommunalMediaRepository
        userRepository = kosmos.fakeUserRepository

        underTest =
            CommunalViewModel(
@@ -103,10 +109,11 @@ class CommunalViewModelTest : SysuiTestCase() {
    @Test
    fun tutorial_tutorialNotCompletedAndKeyguardVisible_showTutorialContent() =
        testScope.runTest {
            // Keyguard showing, storage unlocked, and tutorial not started.
            // Keyguard showing, storage unlocked, main user, and tutorial not started.
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            keyguardRepository.setIsEncryptedOrLockdown(false)
            setIsMainUser(true)
            tutorialRepository.setTutorialSettingState(
                Settings.Secure.HUB_MODE_TUTORIAL_NOT_STARTED
            )
@@ -202,4 +209,10 @@ class CommunalViewModelTest : SysuiTestCase() {
            underTest.onHidePopupAfterDismissCta()
            assertThat(isPopupOnDismissCtaShowing).isEqualTo(false)
        }

    private suspend fun setIsMainUser(isMainUser: Boolean) {
        whenever(user.isMain).thenReturn(isMainUser)
        userRepository.setUserInfos(listOf(user))
        userRepository.setSelectedUserInfo(user)
    }
}
+10 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.smartspace.data.repository.SmartspaceRepository
import com.android.systemui.user.data.repository.UserRepository
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -62,6 +63,7 @@ constructor(
    private val communalPrefsRepository: CommunalPrefsRepository,
    mediaRepository: CommunalMediaRepository,
    smartspaceRepository: SmartspaceRepository,
    userRepository: UserRepository,
    keyguardInteractor: KeyguardInteractor,
    private val appWidgetHost: CommunalAppWidgetHost,
    private val editWidgetsActivityStarter: EditWidgetsActivityStarter
@@ -75,7 +77,14 @@ constructor(
    val isCommunalAvailable: StateFlow<Boolean> =
        flowOf(isCommunalEnabled)
            .flatMapLatest { enabled ->
                if (enabled) keyguardInteractor.isEncryptedOrLockdown.map { !it } else flowOf(false)
                if (enabled)
                    combine(
                        keyguardInteractor.isEncryptedOrLockdown,
                        userRepository.selectedUserInfo,
                    ) { isEncryptedOrLockdown, selectedUserInfo ->
                        !isEncryptedOrLockdown && selectedUserInfo.isMain
                    }
                else flowOf(false)
            }
            .distinctUntilChanged()
            .onEach { available -> widgetRepository.updateAppWidgetHostActive(available) }
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.smartspace.data.repository.smartspaceRepository
import com.android.systemui.user.data.repository.userRepository
import com.android.systemui.util.mockito.mock

val Kosmos.communalInteractor by Fixture {
@@ -36,6 +37,7 @@ val Kosmos.communalInteractor by Fixture {
        mediaRepository = communalMediaRepository,
        communalPrefsRepository = communalPrefsRepository,
        smartspaceRepository = smartspaceRepository,
        userRepository = userRepository,
        appWidgetHost = mock(),
        keyguardInteractor = keyguardInteractor,
        editWidgetsActivityStarter = editWidgetsActivityStarter,