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

Commit 33966c3f authored by Bryce Lee's avatar Bryce Lee Committed by William Xiao
Browse files

Determine when to show communal based on hub specific setting.

This changelist updates the trigger logic for automatically showing
glanceable hub based on the newly introduced setting rather than the
screensaver setting.

Test: atest CommunalSettingsInteractorTest
Test: atest CommunalViewModelTest
Test: atest CommunalInteractorTest
Bug: 401001786
Flag: com.android.systemui.glanceable_hub_v2
Change-Id: I839c3e05ede148460d5d2b6f5b4bd13202f60699
parent 1a3eeb5c
Loading
Loading
Loading
Loading
+17 −25
Original line number Diff line number Diff line
@@ -55,9 +55,11 @@ class CommunalAutoOpenInteractorTest : SysuiTestCase() {
    fun setUp() {
        runBlocking { kosmos.fakeUserRepository.asMainUser() }
        with(kosmos.fakeSettings) {
            putBoolForUser(Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, false, MAIN_USER_ID)
            putBoolForUser(Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, false, MAIN_USER_ID)
            putBoolForUser(Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, false, MAIN_USER_ID)
            putIntForUser(
                Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                Settings.Secure.GLANCEABLE_HUB_START_NEVER,
                MAIN_USER_ID,
            )
        }
    }

@@ -67,9 +69,9 @@ class CommunalAutoOpenInteractorTest : SysuiTestCase() {
            val shouldAutoOpen by collectLastValue(underTest.shouldAutoOpen)
            val suppressionReason by collectLastValue(underTest.suppressionReason)

            fakeSettings.putBoolForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                true,
            fakeSettings.putIntForUser(
                Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                Settings.Secure.GLANCEABLE_HUB_START_CHARGING,
                MAIN_USER_ID,
            )

@@ -91,9 +93,9 @@ class CommunalAutoOpenInteractorTest : SysuiTestCase() {
            val shouldAutoOpen by collectLastValue(underTest.shouldAutoOpen)
            val suppressionReason by collectLastValue(underTest.suppressionReason)

            fakeSettings.putBoolForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
                true,
            fakeSettings.putIntForUser(
                Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                Settings.Secure.GLANCEABLE_HUB_START_DOCKED,
                MAIN_USER_ID,
            )

@@ -118,9 +120,9 @@ class CommunalAutoOpenInteractorTest : SysuiTestCase() {
            val shouldAutoOpen by collectLastValue(underTest.shouldAutoOpen)
            val suppressionReason by collectLastValue(underTest.suppressionReason)

            fakeSettings.putBoolForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                true,
            fakeSettings.putIntForUser(
                Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                Settings.Secure.GLANCEABLE_HUB_START_CHARGING_UPRIGHT,
                MAIN_USER_ID,
            )

@@ -144,19 +146,9 @@ class CommunalAutoOpenInteractorTest : SysuiTestCase() {
            val shouldAutoOpen by collectLastValue(underTest.shouldAutoOpen)
            val suppressionReason by collectLastValue(underTest.suppressionReason)

            fakeSettings.putBoolForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                false,
                MAIN_USER_ID,
            )
            fakeSettings.putBoolForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
                false,
                MAIN_USER_ID,
            )
            fakeSettings.putBoolForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                false,
            fakeSettings.putIntForUser(
                Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                Settings.Secure.GLANCEABLE_HUB_START_NEVER,
                MAIN_USER_ID,
            )

+16 −0
Original line number Diff line number Diff line
@@ -21,10 +21,12 @@ import android.app.admin.devicePolicyManager
import android.content.Intent
import android.content.pm.UserInfo
import android.os.UserManager
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.broadcastDispatcher
import com.android.systemui.communal.shared.model.WhenToStartHub
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -32,6 +34,7 @@ import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.settings.fakeUserTracker
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.settings.fakeSettings
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
@@ -82,6 +85,19 @@ class CommunalSettingsInteractorTest : SysuiTestCase() {
            assertEquals(USER_INFO_WORK.id, disallowedUser!!.id)
        }

    @Test
    fun whenToStartHub_matchesRepository() =
        kosmos.runTest {
            fakeSettings.putIntForUser(
                Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                Settings.Secure.GLANCEABLE_HUB_START_CHARGING,
                MAIN_USER_INFO.id,
            )

            val startCondition by collectLastValue(underTest.whenToStartHub)
            assertEquals(startCondition, WhenToStartHub.WHILE_CHARGING)
        }

    private fun setKeyguardFeaturesDisabled(user: UserInfo, disabledFlags: Int) {
        whenever(
                kosmos.devicePolicyManager.getKeyguardDisabledFeatures(
+36 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.systemui.communal.data.model.SuppressionReason
import com.android.systemui.communal.data.repository.CommunalSettingsRepositoryModule.Companion.DEFAULT_BACKGROUND_TYPE
import com.android.systemui.communal.shared.model.CommunalBackgroundType
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.communal.shared.model.WhenToStartHub
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
@@ -64,6 +65,12 @@ interface CommunalSettingsRepository {
     */
    fun getWhenToDreamState(user: UserInfo): Flow<WhenToDream>

    /**
     * Returns a[WhenToStartHub] for the specified user, indicating what state the device should be
     * in to automatically display the hub.
     */
    fun getWhenToStartHubState(user: UserInfo): Flow<WhenToStartHub>

    /** Returns whether glanceable hub is enabled by the current user. */
    fun getSettingEnabledByUser(user: UserInfo): Flow<Boolean>

@@ -124,6 +131,10 @@ constructor(
        resources.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault)
    }

    private val whenToStartHubByDefault by lazy {
        resources.getInteger(com.android.internal.R.integer.config_whenToStartHubModeDefault)
    }

    private val _suppressionReasons =
        MutableStateFlow<List<SuppressionReason>>(
            // Suppress hub by default until we get an initial update.
@@ -195,6 +206,31 @@ constructor(
            }
            .flowOn(bgDispatcher)

    override fun getWhenToStartHubState(user: UserInfo): Flow<WhenToStartHub> =
        secureSettings
            .observerFlow(
                userId = user.id,
                names = arrayOf(Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB),
            )
            .emitOnStart()
            .map {
                when (
                    secureSettings.getIntForUser(
                        Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                        whenToStartHubByDefault,
                        user.id,
                    )
                ) {
                    Settings.Secure.GLANCEABLE_HUB_START_NEVER -> WhenToStartHub.NEVER
                    Settings.Secure.GLANCEABLE_HUB_START_CHARGING -> WhenToStartHub.WHILE_CHARGING
                    Settings.Secure.GLANCEABLE_HUB_START_CHARGING_UPRIGHT ->
                        WhenToStartHub.WHILE_CHARGING_AND_POSTURED
                    Settings.Secure.GLANCEABLE_HUB_START_DOCKED -> WhenToStartHub.WHILE_DOCKED
                    else -> WhenToStartHub.NEVER
                }
            }
            .flowOn(bgDispatcher)

    override fun getAllowedByDevicePolicy(user: UserInfo): Flow<Boolean> =
        broadcastDispatcher
            .broadcastFlow(
+8 −8
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import com.android.systemui.communal.data.model.FEATURE_AUTO_OPEN
import com.android.systemui.communal.data.model.FEATURE_MANUAL_OPEN
import com.android.systemui.communal.data.model.SuppressionReason
import com.android.systemui.communal.posturing.domain.interactor.PosturingInteractor
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.communal.shared.model.WhenToStartHub
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dock.DockManager
@@ -49,17 +49,17 @@ constructor(
    @Named(SWIPE_TO_HUB) private val allowSwipeAlways: Boolean,
) {
    val shouldAutoOpen: Flow<Boolean> =
        communalSettingsInteractor.whenToDream
            .flatMapLatestConflated { whenToDream ->
                when (whenToDream) {
                    WhenToDream.WHILE_CHARGING -> batteryInteractor.isDevicePluggedIn
                    WhenToDream.WHILE_DOCKED -> {
        communalSettingsInteractor.whenToStartHub
            .flatMapLatestConflated { whenToStartHub ->
                when (whenToStartHub) {
                    WhenToStartHub.WHILE_CHARGING -> batteryInteractor.isDevicePluggedIn
                    WhenToStartHub.WHILE_DOCKED -> {
                        allOf(batteryInteractor.isDevicePluggedIn, dockManager.retrieveIsDocked())
                    }
                    WhenToDream.WHILE_POSTURED -> {
                    WhenToStartHub.WHILE_CHARGING_AND_POSTURED -> {
                        allOf(batteryInteractor.isDevicePluggedIn, posturingInteractor.postured)
                    }
                    WhenToDream.NEVER -> flowOf(false)
                    WhenToStartHub.NEVER -> flowOf(false)
                }
            }
            .flowOn(backgroundContext)
+8 −1
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.communal.domain.interactor

import android.content.pm.UserInfo
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import com.android.systemui.communal.data.model.FEATURE_AUTO_OPEN
import com.android.systemui.communal.data.model.FEATURE_ENABLED
import com.android.systemui.communal.data.model.FEATURE_MANUAL_OPEN
@@ -25,10 +24,12 @@ import com.android.systemui.communal.data.model.SuppressionReason
import com.android.systemui.communal.data.repository.CommunalSettingsRepository
import com.android.systemui.communal.shared.model.CommunalBackgroundType
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.communal.shared.model.WhenToStartHub
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.settings.UserTracker
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
import java.util.concurrent.Executor
import javax.inject.Inject
@@ -79,6 +80,12 @@ constructor(
            repository.getWhenToDreamState(user)
        }

    /** When to automatically start hub for the currently selected user. */
    val whenToStartHub: Flow<WhenToStartHub> =
        userInteractor.selectedUserInfo.flatMapLatest { user ->
            repository.getWhenToStartHubState(user)
        }

    /** Whether communal hub is allowed by device policy for the current user */
    val allowedForCurrentUserByDevicePolicy: Flow<Boolean> =
        userInteractor.selectedUserInfo.flatMapLatestConflated { user ->
Loading