Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/KeyguardMediaController.kt +0 −40 Original line number Diff line number Diff line Loading @@ -18,16 +18,10 @@ package com.android.systemui.media.controls.ui import android.content.Context import android.content.res.Configuration import android.database.ContentObserver import android.net.Uri import android.os.Handler import android.os.UserHandle import android.provider.Settings import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.media.dagger.MediaModule.KEYGUARD import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.StatusBarState Loading @@ -36,7 +30,6 @@ import com.android.systemui.statusbar.notification.stack.MediaContainerView import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.LargeScreenUtils import com.android.systemui.util.settings.SecureSettings import javax.inject.Inject import javax.inject.Named Loading @@ -52,8 +45,6 @@ constructor( private val bypassController: KeyguardBypassController, private val statusBarStateController: SysuiStatusBarStateController, private val context: Context, private val secureSettings: SecureSettings, @Main private val handler: Handler, configurationController: ConfigurationController, ) { Loading @@ -77,26 +68,6 @@ constructor( } ) val settingsObserver: ContentObserver = object : ContentObserver(handler) { override fun onChange(selfChange: Boolean, uri: Uri?) { if (uri == lockScreenMediaPlayerUri) { allowMediaPlayerOnLockScreen = secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) refreshMediaPosition() } } } secureSettings.registerContentObserverForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, settingsObserver, UserHandle.USER_ALL ) // First let's set the desired state that we want for this host mediaHost.expansion = MediaHostState.EXPANDED mediaHost.showsOnlyActiveMedia = true Loading Loading @@ -142,16 +113,6 @@ constructor( private set private var splitShadeContainer: ViewGroup? = null /** Track the media player setting status on lock screen. */ private var allowMediaPlayerOnLockScreen: Boolean = secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) private val lockScreenMediaPlayerUri = secureSettings.getUriFor(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN) /** * Attaches media container in single pane mode, situated at the top of the notifications list */ Loading Loading @@ -211,7 +172,6 @@ constructor( mediaHost.visible && !bypassController.bypassEnabled && keyguardOrUserSwitcher && allowMediaPlayerOnLockScreen && shouldBeVisibleForSplitShade() if (visible) { showMediaPlayer() Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +19 −8 Original line number Diff line number Diff line Loading @@ -104,7 +104,7 @@ constructor( ) { /** Track the media player setting status on lock screen. */ private var allowMediaPlayerOnLockScreen: Boolean = true private var allowMediaPlayerOnLockScreen: Boolean = getMediaLockScreenSetting() private val lockScreenMediaPlayerUri = secureSettings.getUriFor(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN) Loading Loading @@ -461,6 +461,7 @@ constructor( mediaCarouselController.logSmartspaceImpression(qsExpanded) } updateUserVisibility() mediaCarouselController.updateHostVisibility() } override fun onDozeAmountChanged(linear: Float, eased: Float) { Loading Loading @@ -533,7 +534,6 @@ constructor( mediaCarouselController.updateHostVisibility = { mediaHosts.forEach { it?.updateViewVisibility() } } panelEventsEvents.addShadeStateEventsListener( object : ShadeStateEventsListener { override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) { Loading @@ -547,12 +547,8 @@ constructor( object : ContentObserver(handler) { override fun onChange(selfChange: Boolean, uri: Uri?) { if (uri == lockScreenMediaPlayerUri) { allowMediaPlayerOnLockScreen = secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) allowMediaPlayerOnLockScreen = getMediaLockScreenSetting() mediaCarouselController.updateHostVisibility() } } } Loading @@ -563,6 +559,14 @@ constructor( ) } private fun getMediaLockScreenSetting(): Boolean { return secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) } private fun updateConfiguration() { distanceForFullShadeTransition = context.resources.getDimensionPixelSize( Loading Loading @@ -602,6 +606,13 @@ constructor( mediaCarouselController.closeGuts() } /** Return true if the carousel should be hidden because lockscreen is currently visible */ fun isLockedAndHidden(): Boolean { return !allowMediaPlayerOnLockScreen && (statusbarState == StatusBarState.SHADE_LOCKED || statusbarState == StatusBarState.KEYGUARD) } private fun createUniqueObjectHost(): UniqueObjectHostView { val viewHost = UniqueObjectHostView(context) viewHost.addOnAttachStateChangeListener( Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHost.kt +3 −1 Original line number Diff line number Diff line Loading @@ -199,7 +199,9 @@ constructor( */ fun updateViewVisibility() { state.visible = if (showsOnlyActiveMedia) { if (mediaHierarchyManager.isLockedAndHidden()) { false } else if (showsOnlyActiveMedia) { mediaDataManager.hasActiveMediaOrRecommendation() } else { mediaDataManager.hasAnyMediaOrRecommendation() Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/KeyguardMediaControllerTest.kt +0 −28 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.media.controls.ui import android.provider.Settings import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import android.testing.TestableLooper Loading @@ -32,8 +31,6 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.mockito.whenever import com.android.systemui.util.settings.FakeSettings import com.android.systemui.utils.os.FakeHandler import com.google.common.truth.Truth.assertThat import junit.framework.Assert.assertTrue import org.junit.Before Loading @@ -60,10 +57,7 @@ class KeyguardMediaControllerTest : SysuiTestCase() { private val mediaContainerView: MediaContainerView = MediaContainerView(context, null) private val hostView = UniqueObjectHostView(context) private val settings = FakeSettings() private lateinit var keyguardMediaController: KeyguardMediaController private lateinit var testableLooper: TestableLooper private lateinit var fakeHandler: FakeHandler private lateinit var statusBarStateListener: StatusBarStateController.StateListener @Before Loading @@ -79,16 +73,12 @@ class KeyguardMediaControllerTest : SysuiTestCase() { whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) whenever(mediaHost.hostView).thenReturn(hostView) hostView.layoutParams = FrameLayout.LayoutParams(100, 100) testableLooper = TestableLooper.get(this) fakeHandler = FakeHandler(testableLooper.looper) keyguardMediaController = KeyguardMediaController( mediaHost, bypassController, statusBarStateController, context, settings, fakeHandler, configurationController, ) keyguardMediaController.attachSinglePaneContainer(mediaContainerView) Loading Loading @@ -117,24 +107,6 @@ class KeyguardMediaControllerTest : SysuiTestCase() { assertThat(mediaContainerView.visibility).isEqualTo(visibility) } @Test fun testHiddenOnKeyguard_whenMediaOnLockScreenDisabled() { settings.putInt(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, 0) keyguardMediaController.refreshMediaPosition() assertThat(mediaContainerView.visibility).isEqualTo(GONE) } @Test fun testAvailableOnKeyguard_whenMediaOnLockScreenEnabled() { settings.putInt(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, 1) keyguardMediaController.refreshMediaPosition() assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE) } @Test fun testActivatesSplitShadeContainerInSplitShadeMode() { val splitShadeContainer = FrameLayout(context) Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt +50 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture()) verify(statusBarStateController).addCallback(statusBarCallback.capture()) verify(dreamOverlayStateController).addCallback(dreamOverlayCallback.capture()) whenever(mediaCarouselController.updateHostVisibility).thenReturn({}) setupHost(lockHost, MediaHierarchyManager.LOCATION_LOCKSCREEN, LOCKSCREEN_TOP) setupHost(qsHost, MediaHierarchyManager.LOCATION_QS, QS_TOP) setupHost(qqsHost, MediaHierarchyManager.LOCATION_QQS, QQS_TOP) Loading Loading @@ -485,6 +486,55 @@ class MediaHierarchyManagerTest : SysuiTestCase() { assertThat(mediaCarouselScrollHandler.visibleToUser).isFalse() } @Test fun keyguardState_allowedOnLockscreen_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true) clearInvocations(mediaCarouselController) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) statusBarCallback.value.onStateChanged(StatusBarState.KEYGUARD) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isFalse() } @Test fun keyguardState_notAllowedOnLockscreen_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false) clearInvocations(mediaCarouselController) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) statusBarCallback.value.onStateChanged(StatusBarState.KEYGUARD) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isTrue() } @Test fun keyguardGone_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false) clearInvocations(mediaCarouselController) statusBarCallback.value.onStatePreChange(StatusBarState.KEYGUARD, StatusBarState.SHADE) statusBarCallback.value.onStateChanged(StatusBarState.SHADE) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isFalse() } @Test fun lockscreenSettingChanged_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) statusBarCallback.value.onStateChanged(StatusBarState.KEYGUARD) clearInvocations(mediaCarouselController) settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isTrue() } private fun enableSplitShade() { context .getOrCreateTestableResources() Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/KeyguardMediaController.kt +0 −40 Original line number Diff line number Diff line Loading @@ -18,16 +18,10 @@ package com.android.systemui.media.controls.ui import android.content.Context import android.content.res.Configuration import android.database.ContentObserver import android.net.Uri import android.os.Handler import android.os.UserHandle import android.provider.Settings import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.media.dagger.MediaModule.KEYGUARD import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.StatusBarState Loading @@ -36,7 +30,6 @@ import com.android.systemui.statusbar.notification.stack.MediaContainerView import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.LargeScreenUtils import com.android.systemui.util.settings.SecureSettings import javax.inject.Inject import javax.inject.Named Loading @@ -52,8 +45,6 @@ constructor( private val bypassController: KeyguardBypassController, private val statusBarStateController: SysuiStatusBarStateController, private val context: Context, private val secureSettings: SecureSettings, @Main private val handler: Handler, configurationController: ConfigurationController, ) { Loading @@ -77,26 +68,6 @@ constructor( } ) val settingsObserver: ContentObserver = object : ContentObserver(handler) { override fun onChange(selfChange: Boolean, uri: Uri?) { if (uri == lockScreenMediaPlayerUri) { allowMediaPlayerOnLockScreen = secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) refreshMediaPosition() } } } secureSettings.registerContentObserverForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, settingsObserver, UserHandle.USER_ALL ) // First let's set the desired state that we want for this host mediaHost.expansion = MediaHostState.EXPANDED mediaHost.showsOnlyActiveMedia = true Loading Loading @@ -142,16 +113,6 @@ constructor( private set private var splitShadeContainer: ViewGroup? = null /** Track the media player setting status on lock screen. */ private var allowMediaPlayerOnLockScreen: Boolean = secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) private val lockScreenMediaPlayerUri = secureSettings.getUriFor(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN) /** * Attaches media container in single pane mode, situated at the top of the notifications list */ Loading Loading @@ -211,7 +172,6 @@ constructor( mediaHost.visible && !bypassController.bypassEnabled && keyguardOrUserSwitcher && allowMediaPlayerOnLockScreen && shouldBeVisibleForSplitShade() if (visible) { showMediaPlayer() Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +19 −8 Original line number Diff line number Diff line Loading @@ -104,7 +104,7 @@ constructor( ) { /** Track the media player setting status on lock screen. */ private var allowMediaPlayerOnLockScreen: Boolean = true private var allowMediaPlayerOnLockScreen: Boolean = getMediaLockScreenSetting() private val lockScreenMediaPlayerUri = secureSettings.getUriFor(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN) Loading Loading @@ -461,6 +461,7 @@ constructor( mediaCarouselController.logSmartspaceImpression(qsExpanded) } updateUserVisibility() mediaCarouselController.updateHostVisibility() } override fun onDozeAmountChanged(linear: Float, eased: Float) { Loading Loading @@ -533,7 +534,6 @@ constructor( mediaCarouselController.updateHostVisibility = { mediaHosts.forEach { it?.updateViewVisibility() } } panelEventsEvents.addShadeStateEventsListener( object : ShadeStateEventsListener { override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) { Loading @@ -547,12 +547,8 @@ constructor( object : ContentObserver(handler) { override fun onChange(selfChange: Boolean, uri: Uri?) { if (uri == lockScreenMediaPlayerUri) { allowMediaPlayerOnLockScreen = secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) allowMediaPlayerOnLockScreen = getMediaLockScreenSetting() mediaCarouselController.updateHostVisibility() } } } Loading @@ -563,6 +559,14 @@ constructor( ) } private fun getMediaLockScreenSetting(): Boolean { return secureSettings.getBoolForUser( Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true, UserHandle.USER_CURRENT ) } private fun updateConfiguration() { distanceForFullShadeTransition = context.resources.getDimensionPixelSize( Loading Loading @@ -602,6 +606,13 @@ constructor( mediaCarouselController.closeGuts() } /** Return true if the carousel should be hidden because lockscreen is currently visible */ fun isLockedAndHidden(): Boolean { return !allowMediaPlayerOnLockScreen && (statusbarState == StatusBarState.SHADE_LOCKED || statusbarState == StatusBarState.KEYGUARD) } private fun createUniqueObjectHost(): UniqueObjectHostView { val viewHost = UniqueObjectHostView(context) viewHost.addOnAttachStateChangeListener( Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHost.kt +3 −1 Original line number Diff line number Diff line Loading @@ -199,7 +199,9 @@ constructor( */ fun updateViewVisibility() { state.visible = if (showsOnlyActiveMedia) { if (mediaHierarchyManager.isLockedAndHidden()) { false } else if (showsOnlyActiveMedia) { mediaDataManager.hasActiveMediaOrRecommendation() } else { mediaDataManager.hasAnyMediaOrRecommendation() Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/KeyguardMediaControllerTest.kt +0 −28 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.media.controls.ui import android.provider.Settings import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import android.testing.TestableLooper Loading @@ -32,8 +31,6 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.mockito.whenever import com.android.systemui.util.settings.FakeSettings import com.android.systemui.utils.os.FakeHandler import com.google.common.truth.Truth.assertThat import junit.framework.Assert.assertTrue import org.junit.Before Loading @@ -60,10 +57,7 @@ class KeyguardMediaControllerTest : SysuiTestCase() { private val mediaContainerView: MediaContainerView = MediaContainerView(context, null) private val hostView = UniqueObjectHostView(context) private val settings = FakeSettings() private lateinit var keyguardMediaController: KeyguardMediaController private lateinit var testableLooper: TestableLooper private lateinit var fakeHandler: FakeHandler private lateinit var statusBarStateListener: StatusBarStateController.StateListener @Before Loading @@ -79,16 +73,12 @@ class KeyguardMediaControllerTest : SysuiTestCase() { whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) whenever(mediaHost.hostView).thenReturn(hostView) hostView.layoutParams = FrameLayout.LayoutParams(100, 100) testableLooper = TestableLooper.get(this) fakeHandler = FakeHandler(testableLooper.looper) keyguardMediaController = KeyguardMediaController( mediaHost, bypassController, statusBarStateController, context, settings, fakeHandler, configurationController, ) keyguardMediaController.attachSinglePaneContainer(mediaContainerView) Loading Loading @@ -117,24 +107,6 @@ class KeyguardMediaControllerTest : SysuiTestCase() { assertThat(mediaContainerView.visibility).isEqualTo(visibility) } @Test fun testHiddenOnKeyguard_whenMediaOnLockScreenDisabled() { settings.putInt(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, 0) keyguardMediaController.refreshMediaPosition() assertThat(mediaContainerView.visibility).isEqualTo(GONE) } @Test fun testAvailableOnKeyguard_whenMediaOnLockScreenEnabled() { settings.putInt(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, 1) keyguardMediaController.refreshMediaPosition() assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE) } @Test fun testActivatesSplitShadeContainerInSplitShadeMode() { val splitShadeContainer = FrameLayout(context) Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt +50 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture()) verify(statusBarStateController).addCallback(statusBarCallback.capture()) verify(dreamOverlayStateController).addCallback(dreamOverlayCallback.capture()) whenever(mediaCarouselController.updateHostVisibility).thenReturn({}) setupHost(lockHost, MediaHierarchyManager.LOCATION_LOCKSCREEN, LOCKSCREEN_TOP) setupHost(qsHost, MediaHierarchyManager.LOCATION_QS, QS_TOP) setupHost(qqsHost, MediaHierarchyManager.LOCATION_QQS, QQS_TOP) Loading Loading @@ -485,6 +486,55 @@ class MediaHierarchyManagerTest : SysuiTestCase() { assertThat(mediaCarouselScrollHandler.visibleToUser).isFalse() } @Test fun keyguardState_allowedOnLockscreen_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true) clearInvocations(mediaCarouselController) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) statusBarCallback.value.onStateChanged(StatusBarState.KEYGUARD) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isFalse() } @Test fun keyguardState_notAllowedOnLockscreen_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false) clearInvocations(mediaCarouselController) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) statusBarCallback.value.onStateChanged(StatusBarState.KEYGUARD) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isTrue() } @Test fun keyguardGone_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false) clearInvocations(mediaCarouselController) statusBarCallback.value.onStatePreChange(StatusBarState.KEYGUARD, StatusBarState.SHADE) statusBarCallback.value.onStateChanged(StatusBarState.SHADE) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isFalse() } @Test fun lockscreenSettingChanged_updateVisibility() { settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, true) statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) statusBarCallback.value.onStateChanged(StatusBarState.KEYGUARD) clearInvocations(mediaCarouselController) settings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false) verify(mediaCarouselController).updateHostVisibility assertThat(mediaHierarchyManager.isLockedAndHidden()).isTrue() } private fun enableSplitShade() { context .getOrCreateTestableResources() Loading