diff options
15 files changed, 135 insertions, 59 deletions
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index c1f786826922..ee229158decc 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1230,13 +1230,6 @@ flag { } flag { - name: "communal_hub_on_mobile" - namespace: "systemui" - description: "Brings the glanceable hub experience to mobile phones" - bug: "375689917" -} - -flag { name: "glanceable_hub_v2" namespace: "systemui" description: "Gates the refreshed glanceable hub experience that also brings the glanceable hub to mobile phones" diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt index 4705d8dd86c4..beaf9631ae5a 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt @@ -44,7 +44,6 @@ import com.android.compose.animation.scene.SceneTransitionLayout import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.observableTransitionState import com.android.compose.animation.scene.transitions -import com.android.systemui.Flags.communalHubOnMobile import com.android.systemui.communal.shared.model.CommunalBackgroundType import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.communal.shared.model.CommunalTransitionKeys @@ -188,7 +187,7 @@ fun CommunalContainer( scene( CommunalScenes.Blank, userActions = - if (communalHubOnMobile()) emptyMap() + if (viewModel.v2FlagEnabled()) emptyMap() else mapOf(Swipe.Start(fromSource = Edge.End) to CommunalScenes.Communal), ) { // This scene shows nothing only allowing for transitions to the communal scene. @@ -198,7 +197,8 @@ fun CommunalContainer( scene( CommunalScenes.Communal, userActions = - if (communalHubOnMobile()) emptyMap() else mapOf(Swipe.End to CommunalScenes.Blank), + if (viewModel.v2FlagEnabled()) emptyMap() + else mapOf(Swipe.End to CommunalScenes.Blank), ) { CommunalScene( backgroundType = backgroundType, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayRegistrantTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayRegistrantTest.kt index 790df03e6401..1e937b46dbcb 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayRegistrantTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayRegistrantTest.kt @@ -29,8 +29,11 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags import com.android.systemui.SysuiTestCase +import com.android.systemui.communal.domain.interactor.communalSettingsInteractor +import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled import com.android.systemui.log.core.FakeLogBuffer import com.android.systemui.shared.condition.Monitor +import com.android.systemui.testKosmos import com.android.systemui.util.mockito.withArgCaptor import kotlin.test.Test import org.junit.Before @@ -48,6 +51,8 @@ import org.mockito.kotlin.whenever @TestableLooper.RunWithLooper @RunWith(AndroidJUnit4::class) class DreamOverlayRegistrantTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val context = mock<Context>() private val packageManager = mock<PackageManager>() @@ -73,6 +78,7 @@ class DreamOverlayRegistrantTest : SysuiTestCase() { monitor, packageManager, dreamManager, + kosmos.communalSettingsInteractor, logBuffer, ) @@ -117,7 +123,7 @@ class DreamOverlayRegistrantTest : SysuiTestCase() { /** Verify overlay registered when enabled in manifest. */ @Test - @DisableFlags(Flags.FLAG_COMMUNAL_HUB_ON_MOBILE) + @DisableFlags(Flags.FLAG_GLANCEABLE_HUB_V2) fun testRegisteredWhenEnabledWithManifest() { serviceInfo.enabled = true start() @@ -127,8 +133,10 @@ class DreamOverlayRegistrantTest : SysuiTestCase() { /** Verify overlay registered for mobile hub with flag. */ @Test - @EnableFlags(Flags.FLAG_COMMUNAL_HUB_ON_MOBILE) + @EnableFlags(Flags.FLAG_GLANCEABLE_HUB_V2) fun testRegisteredForMobileHub() { + kosmos.setCommunalV2ConfigEnabled(true) + start() verify(dreamManager).registerDreamOverlayService(componentName) @@ -139,7 +147,7 @@ class DreamOverlayRegistrantTest : SysuiTestCase() { * enabled. */ @Test - @DisableFlags(Flags.FLAG_COMMUNAL_HUB_ON_MOBILE) + @DisableFlags(Flags.FLAG_GLANCEABLE_HUB_V2) fun testDisabledForMobileWithoutMobileHub() { start() @@ -154,8 +162,9 @@ class DreamOverlayRegistrantTest : SysuiTestCase() { /** Ensure service unregistered when component is disabled at runtime. */ @Test - @EnableFlags(Flags.FLAG_COMMUNAL_HUB_ON_MOBILE) + @EnableFlags(Flags.FLAG_GLANCEABLE_HUB_V2) fun testUnregisteredWhenComponentDisabled() { + kosmos.setCommunalV2ConfigEnabled(true) start() verify(dreamManager).registerDreamOverlayService(componentName) clearInvocations(dreamManager) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt index f924ccb42cb0..b07097d61b96 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt @@ -43,7 +43,7 @@ import com.android.internal.logging.UiEventLogger import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.Flags.FLAG_COMMUNAL_HUB -import com.android.systemui.Flags.FLAG_COMMUNAL_HUB_ON_MOBILE +import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2 import com.android.systemui.Flags.FLAG_SCENE_CONTAINER import com.android.systemui.SysuiTestCase import com.android.systemui.ambient.touch.TouchHandler @@ -55,7 +55,9 @@ import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepositor import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.communal.domain.interactor.communalInteractor +import com.android.systemui.communal.domain.interactor.communalSettingsInteractor import com.android.systemui.communal.domain.interactor.setCommunalAvailable +import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled import com.android.systemui.communal.shared.log.CommunalUiEvent import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.complication.ComplicationHostViewController @@ -262,6 +264,7 @@ class DreamOverlayServiceTest(flags: FlagsParameterization?) : SysuiTestCase() { mKeyguardUpdateMonitor, mScrimManager, mCommunalInteractor, + kosmos.communalSettingsInteractor, kosmos.sceneInteractor, mSystemDialogsCloser, mUiEventLogger, @@ -1283,7 +1286,7 @@ class DreamOverlayServiceTest(flags: FlagsParameterization?) : SysuiTestCase() { environmentComponents.verifyNoMoreInteractions() } - @DisableFlags(FLAG_COMMUNAL_HUB_ON_MOBILE) + @DisableFlags(FLAG_GLANCEABLE_HUB_V2) @Test fun testAmbientTouchHandlersRegistration_registerHideComplicationAndCommunal() { val client = client @@ -1303,9 +1306,11 @@ class DreamOverlayServiceTest(flags: FlagsParameterization?) : SysuiTestCase() { .containsExactly(mHideComplicationTouchHandler, mCommunalTouchHandler) } - @EnableFlags(FLAG_COMMUNAL_HUB_ON_MOBILE) + @EnableFlags(FLAG_GLANCEABLE_HUB_V2) @Test fun testAmbientTouchHandlersRegistration_v2_registerOnlyHideComplication() { + kosmos.setCommunalV2ConfigEnabled(true) + val client = client // Inform the overlay service of dream starting. diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfigTest.kt index 77c615cce287..789b10b7830c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfigTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfigTest.kt @@ -25,7 +25,8 @@ import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.communal.data.repository.communalSceneRepository import com.android.systemui.communal.domain.interactor.communalInteractor -import com.android.systemui.communal.domain.interactor.setCommunalEnabled +import com.android.systemui.communal.domain.interactor.communalSettingsInteractor +import com.android.systemui.communal.domain.interactor.setCommunalV2Enabled import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.andSceneContainer @@ -38,7 +39,6 @@ import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -48,7 +48,7 @@ import platform.test.runner.parameterized.Parameters @SmallTest @OptIn(ExperimentalCoroutinesApi::class) -@EnableFlags(Flags.FLAG_GLANCEABLE_HUB_SHORTCUT_BUTTON) +@EnableFlags(Flags.FLAG_GLANCEABLE_HUB_SHORTCUT_BUTTON, Flags.FLAG_GLANCEABLE_HUB_V2) @RunWith(ParameterizedAndroidJunit4::class) class GlanceableHubQuickAffordanceConfigTest(flags: FlagsParameterization?) : SysuiTestCase() { private val kosmos = testKosmos() @@ -69,6 +69,7 @@ class GlanceableHubQuickAffordanceConfigTest(flags: FlagsParameterization?) : Sy context = context, communalInteractor = kosmos.communalInteractor, communalSceneRepository = kosmos.communalSceneRepository, + communalSettingsInteractor = kosmos.communalSettingsInteractor, sceneInteractor = kosmos.sceneInteractor, ) } @@ -76,28 +77,30 @@ class GlanceableHubQuickAffordanceConfigTest(flags: FlagsParameterization?) : Sy @Test fun lockscreenState_whenGlanceableHubEnabled_returnsVisible() = testScope.runTest { - kosmos.setCommunalEnabled(true) + kosmos.setCommunalV2Enabled(true) runCurrent() val lockScreenState by collectLastValue(underTest.lockScreenState) - assertTrue(lockScreenState is KeyguardQuickAffordanceConfig.LockScreenState.Visible) + assertThat(lockScreenState) + .isInstanceOf(KeyguardQuickAffordanceConfig.LockScreenState.Visible::class.java) } @Test fun lockscreenState_whenGlanceableHubDisabled_returnsHidden() = testScope.runTest { - kosmos.setCommunalEnabled(false) + kosmos.setCommunalV2Enabled(false) val lockScreenState by collectLastValue(underTest.lockScreenState) runCurrent() - assertTrue(lockScreenState is KeyguardQuickAffordanceConfig.LockScreenState.Hidden) + assertThat(lockScreenState) + .isEqualTo(KeyguardQuickAffordanceConfig.LockScreenState.Hidden) } @Test fun pickerScreenState_whenGlanceableHubEnabled_returnsDefault() = testScope.runTest { - kosmos.setCommunalEnabled(true) + kosmos.setCommunalV2Enabled(true) runCurrent() assertThat(underTest.getPickerScreenState()) @@ -107,7 +110,7 @@ class GlanceableHubQuickAffordanceConfigTest(flags: FlagsParameterization?) : Sy @Test fun pickerScreenState_whenGlanceableHubDisabled_returnsDisabled() = testScope.runTest { - kosmos.setCommunalEnabled(false) + kosmos.setCommunalV2Enabled(false) runCurrent() assertThat( @@ -143,7 +146,8 @@ class GlanceableHubQuickAffordanceConfigTest(flags: FlagsParameterization?) : Sy @Parameters(name = "{0}") fun getParams(): List<FlagsParameterization> { return FlagsParameterization.allCombinationsOf( - Flags.FLAG_GLANCEABLE_HUB_SHORTCUT_BUTTON + Flags.FLAG_GLANCEABLE_HUB_SHORTCUT_BUTTON, + Flags.FLAG_GLANCEABLE_HUB_V2, ) .andSceneContainer() } diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt index d648b9c6442b..5644e6b3b9bf 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt @@ -23,7 +23,6 @@ import com.android.compose.animation.scene.SceneKey import com.android.compose.animation.scene.TransitionKey import com.android.internal.logging.UiEventLogger import com.android.systemui.CoreStartable -import com.android.systemui.Flags.communalHubOnMobile import com.android.systemui.Flags.communalSceneKtfRefactor import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor @@ -218,7 +217,8 @@ constructor( newScene = CommunalScenes.Blank, loggingReason = "hub timeout", transitionKey = - if (communalHubOnMobile()) CommunalTransitionKeys.SimpleFade + if (communalSettingsInteractor.isV2FlagEnabled()) + CommunalTransitionKeys.SimpleFade else null, ) uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT) diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSettingsInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSettingsInteractor.kt index 0cdbad40b2d1..862b05bc9b5d 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSettingsInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSettingsInteractor.kt @@ -63,24 +63,41 @@ constructor( .logDiffsForTable( tableLogBuffer = tableLogBuffer, columnPrefix = "disabledReason", - initialValue = CommunalEnabledState() + initialValue = CommunalEnabledState(), ) .map { model -> model.enabled } // Start this eagerly since the value is accessed synchronously in many places. .stateIn(scope = bgScope, started = SharingStarted.Eagerly, initialValue = false) /** - * 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 this is false, then the hub is definitely not available on the device. If this is true, * refer to [isCommunalEnabled] which takes into account other factors that can change at * runtime. + * + * 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 isCommunalFlagEnabled(): Boolean = repository.getFlagEnabled() + /** + * 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 isV2FlagEnabled(): Boolean = repository.getV2FlagEnabled() + /** The type of background to use for the hub. Used to experiment with different backgrounds */ val communalBackground: Flow<CommunalBackgroundType> = userInteractor.selectedUserInfo @@ -120,6 +137,6 @@ constructor( .stateIn( scope = bgScope, started = SharingStarted.WhileSubscribed(), - initialValue = null + initialValue = null, ) } diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt index 9cd6465266d4..eb7420f76f59 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt @@ -90,7 +90,7 @@ constructor( private val keyguardIndicationController: KeyguardIndicationController, communalSceneInteractor: CommunalSceneInteractor, private val communalInteractor: CommunalInteractor, - communalSettingsInteractor: CommunalSettingsInteractor, + private val communalSettingsInteractor: CommunalSettingsInteractor, tutorialInteractor: CommunalTutorialInteractor, private val shadeInteractor: ShadeInteractor, @Named(MediaModule.COMMUNAL_HUB) mediaHost: MediaHost, @@ -372,6 +372,9 @@ constructor( val communalBackground: Flow<CommunalBackgroundType> = communalSettingsInteractor.communalBackground + /** See [CommunalSettingsInteractor.isV2FlagEnabled] */ + fun v2FlagEnabled(): Boolean = communalSettingsInteractor.isV2FlagEnabled() + companion object { const val POPUP_AUTO_HIDE_TIMEOUT_MS = 12000L } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.kt index e76fd47c74de..c425bee74b2b 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.kt @@ -25,7 +25,7 @@ import android.os.PatternMatcher import android.os.RemoteException import android.service.dreams.IDreamManager import android.util.Log -import com.android.systemui.Flags +import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor import com.android.systemui.dagger.qualifiers.SystemUser import com.android.systemui.dreams.dagger.DreamModule import com.android.systemui.log.LogBuffer @@ -48,6 +48,7 @@ constructor( @SystemUser monitor: Monitor, private val packageManager: PackageManager, private val dreamManager: IDreamManager, + private val communalSettingsInteractor: CommunalSettingsInteractor, @DreamLog private val logBuffer: LogBuffer, ) : ConditionalCoreStartable(monitor) { private var currentRegisteredState = false @@ -90,7 +91,7 @@ constructor( } if ( - Flags.communalHubOnMobile() && + communalSettingsInteractor.isV2FlagEnabled() && packageManager.getComponentEnabledSetting(overlayServiceComponent) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED ) { @@ -111,7 +112,7 @@ constructor( } // Enable for hub on mobile - if (Flags.communalHubOnMobile()) { + if (communalSettingsInteractor.isV2FlagEnabled()) { // Not available on TV or auto if ( packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) || diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java index aee3a457e18a..571b37f43fd4 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java @@ -18,7 +18,6 @@ package com.android.systemui.dreams; import static android.service.dreams.Flags.dreamWakeRedirect; -import static com.android.systemui.Flags.communalHubOnMobile; import static com.android.systemui.Flags.glanceableHubAllowKeyguardWhenDreaming; import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_WINDOW_TITLE; import static com.android.systemui.dreams.dagger.DreamModule.DREAM_TOUCH_INSET_MANAGER; @@ -60,6 +59,7 @@ import com.android.systemui.ambient.touch.TouchMonitor; import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent; import com.android.systemui.ambient.touch.scrim.ScrimManager; import com.android.systemui.communal.domain.interactor.CommunalInteractor; +import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor; import com.android.systemui.communal.shared.log.CommunalUiEvent; import com.android.systemui.communal.shared.model.CommunalScenes; import com.android.systemui.communal.shared.model.CommunalTransitionKeys; @@ -171,6 +171,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ private final SceneInteractor mSceneInteractor; private final CommunalInteractor mCommunalInteractor; + private final CommunalSettingsInteractor mCommunalSettingsInteractor; private boolean mCommunalAvailable; @@ -383,6 +384,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ KeyguardUpdateMonitor keyguardUpdateMonitor, ScrimManager scrimManager, CommunalInteractor communalInteractor, + CommunalSettingsInteractor communalSettingsInteractor, SceneInteractor sceneInteractor, SystemDialogsCloser systemDialogsCloser, UiEventLogger uiEventLogger, @@ -411,6 +413,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ mDreamOverlayCallbackController = dreamOverlayCallbackController; mWindowTitle = windowTitle; mCommunalInteractor = communalInteractor; + mCommunalSettingsInteractor = communalSettingsInteractor; mSceneInteractor = sceneInteractor; mSystemDialogsCloser = systemDialogsCloser; mGestureInteractor = gestureInteractor; @@ -488,7 +491,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ final ArrayList<TouchHandler> touchHandlers = new ArrayList<>( List.of(dreamComplicationComponent.getHideComplicationTouchHandler())); - if (!communalHubOnMobile()) { + if (!mCommunalSettingsInteractor.isV2FlagEnabled()) { // Do not add the communal touch handler for glanceable hub v2 since there is no dream // to hub swipe gesture. touchHandlers.add(dreamOverlayComponent.getCommunalTouchHandler()); @@ -575,7 +578,8 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ } else { mCommunalInteractor.changeScene(CommunalScenes.Communal, "dream wake requested", - communalHubOnMobile() ? CommunalTransitionKeys.INSTANCE.getSimpleFade() : null); + mCommunalSettingsInteractor.isV2FlagEnabled() + ? CommunalTransitionKeys.INSTANCE.getSimpleFade() : null); } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfig.kt index 71f29c0062bc..d335a1806a6d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/GlanceableHubQuickAffordanceConfig.kt @@ -20,12 +20,12 @@ import android.content.Context import android.content.Intent import android.provider.Settings import android.util.Log -import com.android.systemui.Flags.glanceableHubShortcutButton import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.Icon import com.android.systemui.communal.data.repository.CommunalSceneRepository import com.android.systemui.communal.domain.interactor.CommunalInteractor +import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.communal.shared.model.CommunalTransitionKeys import com.android.systemui.dagger.SysUISingleton @@ -46,6 +46,7 @@ constructor( @Application private val context: Context, private val communalSceneRepository: CommunalSceneRepository, private val communalInteractor: CommunalInteractor, + private val communalSettingsInteractor: CommunalSettingsInteractor, private val sceneInteractor: SceneInteractor, ) : KeyguardQuickAffordanceConfig { @@ -61,8 +62,7 @@ constructor( override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> get() = flow { emit( - // TODO(b/378113263): Gate on getV2FlagEnabled() when ready. - if (!glanceableHubShortcutButton()) { + if (!communalSettingsInteractor.isV2FlagEnabled()) { Log.i(TAG, "Button hidden on lockscreen: flag not enabled.") KeyguardQuickAffordanceConfig.LockScreenState.Hidden } else if (!communalInteractor.isCommunalEnabled.value) { @@ -81,8 +81,7 @@ constructor( } override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { - // TODO(b/378113263): Gate on getV2FlagEnabled() when ready. - return if (!glanceableHubShortcutButton()) { + return if (!communalSettingsInteractor.isV2FlagEnabled()) { Log.i(TAG, "Button unavailable in picker: flag not enabled.") KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice } else if (!communalInteractor.isCommunalEnabled.value) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt index 25e6f0e6044a..a9992112f893 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt @@ -21,7 +21,6 @@ import android.annotation.SuppressLint import android.app.DreamManager import com.android.app.animation.Interpolators import com.android.app.tracing.coroutines.launchTraced as launch -import com.android.systemui.Flags.communalHubOnMobile import com.android.systemui.Flags.communalSceneKtfRefactor import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor @@ -177,7 +176,8 @@ constructor( newScene = CommunalScenes.Communal, loggingReason = "FromDreamingTransitionInteractor", transitionKey = - if (communalHubOnMobile()) CommunalTransitionKeys.SimpleFade + if (communalSettingsInteractor.isV2FlagEnabled()) + CommunalTransitionKeys.SimpleFade else null, ) } else { diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt index 31780a56f7f0..61ac1a029f1f 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt @@ -41,11 +41,11 @@ import com.android.app.tracing.coroutines.launchTraced as launch import com.android.compose.theme.PlatformTheme import com.android.internal.annotations.VisibleForTesting import com.android.systemui.Flags -import com.android.systemui.Flags.communalHubOnMobile import com.android.systemui.ambient.touch.TouchMonitor import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent import com.android.systemui.communal.dagger.Communal import com.android.systemui.communal.domain.interactor.CommunalInteractor +import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor import com.android.systemui.communal.ui.compose.CommunalContainer import com.android.systemui.communal.ui.compose.CommunalContent import com.android.systemui.communal.ui.viewmodel.CommunalViewModel @@ -83,6 +83,7 @@ class GlanceableHubContainerController @Inject constructor( private val communalInteractor: CommunalInteractor, + private val communalSettingsInteractor: CommunalSettingsInteractor, private val communalViewModel: CommunalViewModel, private val keyguardInteractor: KeyguardInteractor, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, @@ -514,7 +515,7 @@ constructor( val touchOnUmo = keyguardMediaController.isWithinMediaViewBounds(ev.x.toInt(), ev.y.toInt()) val touchOnSmartspace = lockscreenSmartspaceController.isWithinSmartspaceBounds(ev.x.toInt(), ev.y.toInt()) - val glanceableHubV2 = communalHubOnMobile() + val glanceableHubV2 = communalSettingsInteractor.isV2FlagEnabled() if ( !hubShowing && (touchOnNotifications || touchOnUmo || touchOnSmartspace || glanceableHubV2) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt index e7fb470cfa76..c410111bc2e1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt @@ -33,7 +33,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.test.filters.SmallTest import com.android.compose.animation.scene.SceneKey import com.android.systemui.Flags -import com.android.systemui.Flags.FLAG_COMMUNAL_HUB_ON_MOBILE +import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2 import com.android.systemui.Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX import com.android.systemui.SysuiTestCase import com.android.systemui.ambient.touch.TouchHandler @@ -43,7 +43,9 @@ import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepositor import com.android.systemui.communal.data.repository.FakeCommunalSceneRepository import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository import com.android.systemui.communal.domain.interactor.communalInteractor +import com.android.systemui.communal.domain.interactor.communalSettingsInteractor import com.android.systemui.communal.domain.interactor.setCommunalAvailable +import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.communal.ui.compose.CommunalContent import com.android.systemui.communal.ui.viewmodel.CommunalViewModel @@ -131,20 +133,26 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { underTest = GlanceableHubContainerController( communalInteractor, + communalSettingsInteractor, communalViewModel, keyguardInteractor, - kosmos.keyguardTransitionInteractor, + keyguardTransitionInteractor, shadeInteractor, powerManager, communalColors, ambientTouchComponentFactory, communalContent, - kosmos.sceneDataSourceDelegator, - kosmos.notificationStackScrollLayoutController, - kosmos.keyguardMediaController, - kosmos.lockscreenSmartspaceController, + sceneDataSourceDelegator, + notificationStackScrollLayoutController, + keyguardMediaController, + lockscreenSmartspaceController, logcatLogBuffer("GlanceableHubContainerControllerTest"), ) + + // Make below last notification true by default or else touches will be ignored by + // default when the hub is not showing. + whenever(notificationStackScrollLayoutController.isBelowLastNotification(any(), any())) + .thenReturn(true) } testableLooper = TestableLooper.get(this) @@ -178,6 +186,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { underTest = GlanceableHubContainerController( communalInteractor, + kosmos.communalSettingsInteractor, communalViewModel, keyguardInteractor, kosmos.keyguardTransitionInteractor, @@ -207,6 +216,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { val underTest = GlanceableHubContainerController( communalInteractor, + kosmos.communalSettingsInteractor, communalViewModel, keyguardInteractor, kosmos.keyguardTransitionInteractor, @@ -231,6 +241,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { val underTest = GlanceableHubContainerController( communalInteractor, + kosmos.communalSettingsInteractor, communalViewModel, keyguardInteractor, kosmos.keyguardTransitionInteractor, @@ -631,7 +642,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { } } - @DisableFlags(FLAG_COMMUNAL_HUB_ON_MOBILE) + @DisableFlags(FLAG_GLANCEABLE_HUB_V2) @Test fun onTouchEvent_shadeInteracting_movesNotDispatched() = with(kosmos) { @@ -688,7 +699,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { } } - @DisableFlags(FLAG_COMMUNAL_HUB_ON_MOBILE) + @DisableFlags(FLAG_GLANCEABLE_HUB_V2) @Test fun onTouchEvent_bouncerInteracting_movesNotDispatched() = with(kosmos) { @@ -721,11 +732,13 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { } } - @EnableFlags(FLAG_COMMUNAL_HUB_ON_MOBILE) + @EnableFlags(FLAG_GLANCEABLE_HUB_V2) @Test fun onTouchEvent_onLockscreenAndGlanceableHubV2_touchIgnored() = with(kosmos) { testScope.runTest { + kosmos.setCommunalV2ConfigEnabled(true) + // On lockscreen. goToScene(CommunalScenes.Blank) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt index 1f68195a9acc..ad92b318b0b9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt @@ -16,6 +16,7 @@ package com.android.systemui.communal.domain.interactor +import android.content.testableContext import android.os.userManager import com.android.systemui.broadcast.broadcastDispatcher import com.android.systemui.communal.data.repository.communalMediaRepository @@ -34,6 +35,7 @@ import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.log.logcatLogBuffer import com.android.systemui.plugins.activityStarter +import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.settings.userTracker import com.android.systemui.statusbar.phone.fakeManagedProfileController @@ -67,6 +69,13 @@ val Kosmos.communalInteractor by Fixture { val Kosmos.editWidgetsActivityStarter by Fixture<EditWidgetsActivityStarter> { mock() } +fun Kosmos.setCommunalV2ConfigEnabled(enabled: Boolean) { + testableContext.orCreateTestableResources.addOverride( + com.android.internal.R.bool.config_glanceableHubEnabled, + enabled, + ) +} + suspend fun Kosmos.setCommunalEnabled(enabled: Boolean) { fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, enabled) if (enabled) { @@ -76,6 +85,15 @@ suspend fun Kosmos.setCommunalEnabled(enabled: Boolean) { } } +suspend fun Kosmos.setCommunalV2Enabled(enabled: Boolean) { + setCommunalV2ConfigEnabled(true) + if (enabled) { + fakeUserRepository.asMainUser() + } else { + fakeUserRepository.asDefaultUser() + } +} + suspend fun Kosmos.setCommunalAvailable(available: Boolean) { setCommunalEnabled(available) with(fakeKeyguardRepository) { @@ -83,3 +101,12 @@ suspend fun Kosmos.setCommunalAvailable(available: Boolean) { setKeyguardShowing(available) } } + +suspend fun Kosmos.setCommunalV2Available(available: Boolean) { + setCommunalV2ConfigEnabled(true) + setCommunalEnabled(available) + with(fakeKeyguardRepository) { + setIsEncryptedOrLockdown(!available) + setKeyguardShowing(available) + } +} |