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

Commit afb71ecd authored by William Xiao's avatar William Xiao Committed by Android (Google) Code Review
Browse files

Merge "Add config variable for targeting glanceable hub" into main

parents be05b054 a7d1210a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2779,6 +2779,9 @@
         If empty, logs "other" for all. -->
    <string-array name="config_loggable_dream_prefixes"></string-array>

    <!-- Whether to enable glanceable hub features on this device. -->
    <bool name="config_glanceableHubEnabled">false</bool>

    <!-- ComponentName of a dream to show whenever the system would otherwise have
         gone to sleep.  When the PowerManager is asked to go to sleep, it will instead
         try to start this dream if possible.  The dream should typically call startDozing()
+1 −0
Original line number Diff line number Diff line
@@ -2054,6 +2054,7 @@
  <java-symbol type="bool" name="config_allowTheaterModeWakeFromDock" />
  <java-symbol type="bool" name="config_allowTheaterModeWakeFromWindowLayout" />
  <java-symbol type="bool" name="config_keepDreamingWhenUnplugging" />
  <java-symbol type="bool" name="config_glanceableHubEnabled" />
  <java-symbol type="integer" name="config_keyguardDrawnTimeout" />
  <java-symbol type="bool" name="config_goToSleepOnButtonPressTheaterMode" />
  <java-symbol type="bool" name="config_supportLongPressPowerWhenNonInteractive" />
+65 −15
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL
import android.app.admin.devicePolicyManager
import android.content.Intent
import android.content.pm.UserInfo
import android.content.res.mainResources
import android.os.UserManager.USER_TYPE_PROFILE_MANAGED
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
@@ -29,6 +30,7 @@ import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.broadcastDispatcher
import com.android.systemui.communal.data.model.DisabledReason
@@ -53,7 +55,8 @@ import org.mockito.ArgumentMatchers.eq
@SmallTest
@RunWith(AndroidJUnit4::class)
class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos =
        testKosmos().apply { mainResources = mContext.orCreateTestableResources.resources }
    private val testScope = kosmos.testScope
    private lateinit var underTest: CommunalSettingsRepository

@@ -67,6 +70,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
    }

    @EnableFlags(FLAG_COMMUNAL_HUB)
    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
    @Test
    fun getFlagEnabled_bothEnabled() {
        kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
@@ -74,7 +78,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
        assertThat(underTest.getFlagEnabled()).isTrue()
    }

    @DisableFlags(FLAG_COMMUNAL_HUB)
    @DisableFlags(FLAG_COMMUNAL_HUB, FLAG_GLANCEABLE_HUB_V2)
    @Test
    fun getFlagEnabled_bothDisabled() {
        kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, false)
@@ -82,7 +86,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
        assertThat(underTest.getFlagEnabled()).isFalse()
    }

    @DisableFlags(FLAG_COMMUNAL_HUB)
    @DisableFlags(FLAG_COMMUNAL_HUB, FLAG_GLANCEABLE_HUB_V2)
    @Test
    fun getFlagEnabled_onlyClassicFlagEnabled() {
        kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
@@ -91,6 +95,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
    }

    @EnableFlags(FLAG_COMMUNAL_HUB)
    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
    @Test
    fun getFlagEnabled_onlyTrunkFlagEnabled() {
        kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, false)
@@ -98,6 +103,57 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
        assertThat(underTest.getFlagEnabled()).isFalse()
    }

    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    @DisableFlags(FLAG_COMMUNAL_HUB)
    @Test
    fun getFlagEnabled_mobileConfigEnabled() {
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_glanceableHubEnabled,
            true,
        )

        assertThat(underTest.getFlagEnabled()).isTrue()
    }

    @DisableFlags(FLAG_GLANCEABLE_HUB_V2, FLAG_COMMUNAL_HUB)
    @Test
    fun getFlagEnabled_onlyMobileConfigEnabled() {
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_glanceableHubEnabled,
            true,
        )

        assertThat(underTest.getFlagEnabled()).isFalse()
    }

    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    @DisableFlags(FLAG_COMMUNAL_HUB)
    @Test
    fun getFlagEnabled_onlyMobileFlagEnabled() {
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_glanceableHubEnabled,
            false,
        )

        assertThat(underTest.getFlagEnabled()).isFalse()
    }

    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    @DisableFlags(FLAG_COMMUNAL_HUB)
    @Test
    fun getFlagEnabled_oldFlagIgnored() {
        // New config flag enabled.
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_glanceableHubEnabled,
            true,
        )

        // Old config flag disabled.
        kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, false)

        assertThat(underTest.getFlagEnabled()).isTrue()
    }

    @EnableFlags(FLAG_COMMUNAL_HUB)
    @Test
    fun secondaryUserIsInvalid() =
@@ -134,7 +190,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
            kosmos.fakeSettings.putIntForUser(
                Settings.Secure.GLANCEABLE_HUB_ENABLED,
                0,
                PRIMARY_USER.id
                PRIMARY_USER.id,
            )
            val enabledState by collectLastValue(underTest.getEnabledState(PRIMARY_USER))
            assertThat(enabledState?.enabled).isFalse()
@@ -143,14 +199,14 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
            kosmos.fakeSettings.putIntForUser(
                Settings.Secure.GLANCEABLE_HUB_ENABLED,
                1,
                SECONDARY_USER.id
                SECONDARY_USER.id,
            )
            assertThat(enabledState?.enabled).isFalse()

            kosmos.fakeSettings.putIntForUser(
                Settings.Secure.GLANCEABLE_HUB_ENABLED,
                1,
                PRIMARY_USER.id
                PRIMARY_USER.id,
            )
            assertThat(enabledState?.enabled).isTrue()
        }
@@ -201,7 +257,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
            kosmos.fakeSettings.putIntForUser(
                Settings.Secure.GLANCEABLE_HUB_ENABLED,
                0,
                PRIMARY_USER.id
                PRIMARY_USER.id,
            )
            setKeyguardFeaturesDisabled(PRIMARY_USER, KEYGUARD_DISABLE_WIDGETS_ALL)

@@ -228,7 +284,7 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
                kosmos.fakeSettings.putIntForUser(
                    GLANCEABLE_HUB_BACKGROUND_SETTING,
                    type.value,
                    PRIMARY_USER.id
                    PRIMARY_USER.id,
                )
                assertWithMessage(
                        "Expected $type when $GLANCEABLE_HUB_BACKGROUND_SETTING is set to" +
@@ -253,12 +309,6 @@ class CommunalSettingsRepositoryImplTest : SysuiTestCase() {
            UserInfo(/* id= */ 0, /* name= */ "primary user", /* flags= */ UserInfo.FLAG_MAIN)
        val SECONDARY_USER = UserInfo(/* id= */ 1, /* name= */ "secondary user", /* flags= */ 0)
        val WORK_PROFILE =
            UserInfo(
                10,
                "work",
                /* iconPath= */ "",
                /* flags= */ 0,
                USER_TYPE_PROFILE_MANAGED,
            )
            UserInfo(10, "work", /* iconPath= */ "", /* flags= */ 0, USER_TYPE_PROFILE_MANAGED)
    }
}
+37 −5
Original line number Diff line number Diff line
@@ -20,9 +20,11 @@ import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL
import android.content.IntentFilter
import android.content.pm.UserInfo
import android.content.res.Resources
import android.os.UserHandle
import android.provider.Settings
import com.android.systemui.Flags.communalHub
import com.android.systemui.Flags.glanceableHubV2
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.communal.data.model.CommunalEnabledState
import com.android.systemui.communal.data.model.DisabledReason
@@ -33,6 +35,7 @@ import com.android.systemui.communal.data.model.DisabledReason.DISABLED_REASON_U
import com.android.systemui.communal.shared.model.CommunalBackgroundType
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
import com.android.systemui.util.kotlin.emitOnStart
@@ -53,13 +56,30 @@ interface CommunalSettingsRepository {
    fun getEnabledState(user: UserInfo): Flow<CommunalEnabledState>

    /**
     * Returns true if both the communal trunk-stable flag and resource flag are enabled.
     * Returns true if any glanceable hub functionality should be enabled via configs and flags.
     *
     * The trunk-stable flag is controlled by server rollout and is on all devices. The resource
     * flag is enabled via resource overlay only on products we want the hub to be present on.
     * This should be used for preventing basic glanceable hub functionality from running on devices
     * that don't need it.
     *
     * If the glanceable_hub_v2 flag is enabled, checks the config_glanceableHubEnabled Android
     * config boolean. Otherwise, checks the old config_communalServiceEnabled config and
     * communal_hub flag.
     */
    fun getFlagEnabled(): Boolean

    /**
     * Returns true if the Android config config_glanceableHubEnabled and the glanceable_hub_v2 flag
     * are enabled.
     *
     * This should be used to flag off new glanceable hub or dream behavior that should launch
     * together with the new hub experience that brings the hub to mobile.
     *
     * The trunk-stable flag is controlled by server rollout and is on all devices. The Android
     * config flag is enabled via resource overlay only on products we want the hub to be present
     * on.
     */
    fun getV2FlagEnabled(): Boolean

    /** Keyguard widgets enabled state by Device Policy Manager for the specified user. */
    fun getAllowedByDevicePolicy(user: UserInfo): Flow<Boolean>

@@ -72,6 +92,7 @@ class CommunalSettingsRepositoryImpl
@Inject
constructor(
    @Background private val bgDispatcher: CoroutineDispatcher,
    @Main private val resources: Resources,
    private val featureFlagsClassic: FeatureFlagsClassic,
    private val secureSettings: SecureSettings,
    private val broadcastDispatcher: BroadcastDispatcher,
@@ -79,7 +100,18 @@ constructor(
) : CommunalSettingsRepository {

    override fun getFlagEnabled(): Boolean {
        return featureFlagsClassic.isEnabled(Flags.COMMUNAL_SERVICE_ENABLED) && communalHub()
        return if (getV2FlagEnabled()) {
            true
        } else {
            // This config (exposed as a classic feature flag) is targeted only to tablet.
            // TODO(b/379181581): clean up usages of communal_hub flag
            featureFlagsClassic.isEnabled(Flags.COMMUNAL_SERVICE_ENABLED) && communalHub()
        }
    }

    override fun getV2FlagEnabled(): Boolean {
        return resources.getBoolean(com.android.internal.R.bool.config_glanceableHubEnabled) &&
            glanceableHubV2()
    }

    override fun getEnabledState(user: UserInfo): Flow<CommunalEnabledState> {
@@ -128,7 +160,7 @@ constructor(
                    secureSettings.getIntForUser(
                        GLANCEABLE_HUB_BACKGROUND_SETTING,
                        CommunalBackgroundType.ANIMATED.value,
                        user.id
                        user.id,
                    )
                CommunalBackgroundType.entries.find { type -> type.value == intType }
                    ?: CommunalBackgroundType.ANIMATED
+2 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.communal.data.repository

import android.app.admin.devicePolicyManager
import android.content.res.mainResources
import com.android.systemui.broadcast.broadcastDispatcher
import com.android.systemui.flags.featureFlagsClassic
import com.android.systemui.kosmos.Kosmos
@@ -27,6 +28,7 @@ val Kosmos.communalSettingsRepository: CommunalSettingsRepository by
    Kosmos.Fixture {
        CommunalSettingsRepositoryImpl(
            bgDispatcher = testDispatcher,
            resources = mainResources,
            featureFlagsClassic = featureFlagsClassic,
            secureSettings = fakeSettings,
            broadcastDispatcher = broadcastDispatcher,