diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt index ae4c7c73a2ea1..6baf6e137ab4d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt @@ -41,6 +41,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dreams.DreamOverlayStateController import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.media.dream.MediaDreamComplication import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.shade.NotifPanelEvents import com.android.systemui.statusbar.CrossFadeHelper @@ -401,7 +402,7 @@ class MediaHierarchyManager @Inject constructor( } /** - * Is the doze animation currently Running + * Is the dream overlay currently active */ private var dreamOverlayActive: Boolean = false private set(value) { @@ -411,6 +412,17 @@ class MediaHierarchyManager @Inject constructor( } } + /** + * Is the dream media complication currently active + */ + private var dreamMediaComplicationActive: Boolean = false + private set(value) { + if (field != value) { + field = value + updateDesiredLocation(forceNoAnimation = true) + } + } + /** * The current cross fade progress. 0.5f means it's just switching * between the start and the end location and the content is fully faded, while 0.75f means @@ -500,6 +512,12 @@ class MediaHierarchyManager @Inject constructor( }) dreamOverlayStateController.addCallback(object : DreamOverlayStateController.Callback { + override fun onComplicationsChanged() { + dreamMediaComplicationActive = dreamOverlayStateController.complications.any { + it is MediaDreamComplication + } + } + override fun onStateChanged() { dreamOverlayStateController.isOverlayActive.also { dreamOverlayActive = it } } @@ -1068,7 +1086,7 @@ class MediaHierarchyManager @Inject constructor( val onLockscreen = (!bypassController.bypassEnabled && (statusbarState == StatusBarState.KEYGUARD)) val location = when { - dreamOverlayActive -> LOCATION_DREAM_OVERLAY + dreamOverlayActive && dreamMediaComplicationActive -> LOCATION_DREAM_OVERLAY (qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS qsExpansion > 0.4f && onLockscreen -> LOCATION_QS !hasActiveMedia -> LOCATION_QS diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt index 18bfd04102b7d..954b4386b71d3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.controls.controller.ControlsControllerImplTest.Companion.eq import com.android.systemui.dreams.DreamOverlayStateController import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.media.dream.MediaDreamComplication import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.shade.testing.FakeNotifPanelEvents import com.android.systemui.statusbar.StatusBarState @@ -38,6 +39,8 @@ import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.nullable import com.android.systemui.util.settings.FakeSettings import com.android.systemui.utils.os.FakeHandler import com.google.common.truth.Truth.assertThat @@ -79,6 +82,9 @@ class MediaHierarchyManagerTest : SysuiTestCase() { private lateinit var wakefullnessObserver: ArgumentCaptor<(WakefulnessLifecycle.Observer)> @Captor private lateinit var statusBarCallback: ArgumentCaptor<(StatusBarStateController.StateListener)> + @Captor + private lateinit var dreamOverlayCallback: + ArgumentCaptor<(DreamOverlayStateController.Callback)> @JvmField @Rule val mockito = MockitoJUnit.rule() @@ -113,6 +119,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { fakeHandler,) verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture()) verify(statusBarStateController).addCallback(statusBarCallback.capture()) + verify(dreamOverlayStateController).addCallback(dreamOverlayCallback.capture()) setupHost(lockHost, MediaHierarchyManager.LOCATION_LOCKSCREEN, LOCKSCREEN_TOP) setupHost(qsHost, MediaHierarchyManager.LOCATION_QS, QS_TOP) setupHost(qqsHost, MediaHierarchyManager.LOCATION_QQS, QQS_TOP) @@ -332,6 +339,27 @@ class MediaHierarchyManagerTest : SysuiTestCase() { assertThat(mediaHierarchyManager.isCurrentlyInGuidedTransformation()).isFalse() } + @Test + fun testDream() { + goToDream() + setMediaDreamComplicationEnabled(true) + verify(mediaCarouselController).onDesiredLocationChanged( + eq(MediaHierarchyManager.LOCATION_DREAM_OVERLAY), + nullable(), + eq(false), + anyLong(), + anyLong()) + clearInvocations(mediaCarouselController) + + setMediaDreamComplicationEnabled(false) + verify(mediaCarouselController).onDesiredLocationChanged( + eq(MediaHierarchyManager.LOCATION_QQS), + any(MediaHostState::class.java), + eq(false), + anyLong(), + anyLong()) + } + private fun enableSplitShade() { context.getOrCreateTestableResources().addOverride( R.bool.config_use_split_notification_shade, true @@ -343,6 +371,8 @@ class MediaHierarchyManagerTest : SysuiTestCase() { whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) settings.putInt(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, 1) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) + whenever(dreamOverlayStateController.isOverlayActive).thenReturn(false) + dreamOverlayCallback.value.onStateChanged() clearInvocations(mediaCarouselController) } @@ -354,6 +384,17 @@ class MediaHierarchyManagerTest : SysuiTestCase() { ) } + private fun goToDream() { + whenever(dreamOverlayStateController.isOverlayActive).thenReturn(true) + dreamOverlayCallback.value.onStateChanged() + } + + private fun setMediaDreamComplicationEnabled(enabled: Boolean) { + val complications = if (enabled) listOf(mock()) else emptyList() + whenever(dreamOverlayStateController.complications).thenReturn(complications) + dreamOverlayCallback.value.onComplicationsChanged() + } + private fun expandQS() { mediaHierarchyManager.qsExpansion = 1.0f }