Loading packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt +36 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 } Loading @@ -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() Loading packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractorTest.kt +35 −6 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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() { Loading @@ -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() Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading Loading @@ -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) } } } packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt +15 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -83,6 +88,7 @@ class CommunalViewModelTest : SysuiTestCase() { widgetRepository = kosmos.fakeCommunalWidgetRepository smartspaceRepository = kosmos.fakeSmartspaceRepository mediaRepository = kosmos.fakeCommunalMediaRepository userRepository = kosmos.fakeUserRepository underTest = CommunalViewModel( Loading @@ -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 ) Loading Loading @@ -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) } } packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt +10 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) } Loading packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractor.kt +5 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt +36 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 } Loading @@ -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() Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractorTest.kt +35 −6 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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() { Loading @@ -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() Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading Loading @@ -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) } } }
packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt +15 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -83,6 +88,7 @@ class CommunalViewModelTest : SysuiTestCase() { widgetRepository = kosmos.fakeCommunalWidgetRepository smartspaceRepository = kosmos.fakeSmartspaceRepository mediaRepository = kosmos.fakeCommunalMediaRepository userRepository = kosmos.fakeUserRepository underTest = CommunalViewModel( Loading @@ -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 ) Loading Loading @@ -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) } }
packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt +10 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) } Loading
packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractor.kt +5 −2 Original line number Diff line number Diff line Loading @@ -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