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

Commit ceda1701 authored by Darrell Shi's avatar Darrell Shi Committed by Android (Google) Code Review
Browse files

Merge changes Iaf7a7f07,I736337c0 into main

* changes:
  Communal Hub only for the main user
  Do not show tutorial indicator when communal unavailable
parents 423c4f67 25fa4ad4
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()
+35 −6
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
@@ -30,9 +31,9 @@ import com.android.systemui.coroutines.collectLastValue
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.settings.UserTracker
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.mock
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
@@ -45,15 +46,17 @@ 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

    @Mock private lateinit var userTracker: UserTracker

    private lateinit var underTest: CommunalTutorialInteractor
    private lateinit var keyguardRepository: FakeKeyguardRepository
    private lateinit var communalTutorialRepository: FakeCommunalTutorialRepository
    private lateinit var communalRepository: FakeCommunalRepository
    private lateinit var communalInteractor: CommunalInteractor
    private lateinit var userRepository: FakeUserRepository

    @Before
    fun setUp() {
@@ -62,16 +65,17 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
        keyguardRepository = kosmos.fakeKeyguardRepository
        communalTutorialRepository = kosmos.fakeCommunalTutorialRepository
        communalRepository = kosmos.fakeCommunalRepository
        communalInteractor = kosmos.communalInteractor
        userRepository = kosmos.fakeUserRepository

        underTest = kosmos.communalTutorialInteractor

        whenever(userTracker.userHandle).thenReturn(mock())
    }

    @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()
@@ -81,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)
@@ -88,10 +93,21 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
            assertThat(isTutorialAvailable).isFalse()
        }

    @Test
    fun tutorialUnavailable_whenCommunalNotAvailable() =
        testScope.runTest {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            setCommunalAvailable(false)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)
            keyguardRepository.setKeyguardShowing(true)
            assertThat(isTutorialAvailable).isFalse()
        }

    @Test
    fun tutorialAvailable_whenTutorialNotStarted() =
        testScope.runTest {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            setCommunalAvailable(true)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalRepository.setIsCommunalHubShowing(false)
@@ -103,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)
@@ -183,4 +200,16 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {

            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

    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)
        }
    }
}
+15 −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,9 +109,11 @@ class CommunalViewModelTest : SysuiTestCase() {
    @Test
    fun tutorial_tutorialNotCompletedAndKeyguardVisible_showTutorialContent() =
        testScope.runTest {
            // Keyguard showing, 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
            )
@@ -201,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) }
+5 −2
Original line number Diff line number Diff line
@@ -45,13 +45,16 @@ constructor(
    private val communalTutorialRepository: CommunalTutorialRepository,
    keyguardInteractor: KeyguardInteractor,
    private val communalRepository: CommunalRepository,
    communalInteractor: CommunalInteractor,
) {
    /** An observable for whether the tutorial is available. */
    val isTutorialAvailable: Flow<Boolean> =
        combine(
                communalInteractor.isCommunalAvailable,
                keyguardInteractor.isKeyguardVisible,
                communalTutorialRepository.tutorialSettingState,
            ) { isKeyguardVisible, tutorialSettingState ->
            ) { isCommunalAvailable, isKeyguardVisible, tutorialSettingState ->
                isCommunalAvailable &&
                    isKeyguardVisible &&
                    tutorialSettingState != Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
            }
Loading