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

Commit 76d298d2 authored by Beth Thibodeau's avatar Beth Thibodeau Committed by Android Build Coastguard Worker
Browse files

Update media_controls_lock_screen setting behavior

When the setting is disabled, hide the media carousel everywhere when
the device is on lockscreen, not just in the keyguard layout

Bug: 314333719
Test: manual
Test: atest MediaHierarchyManagerTest
Flag: NONE
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:a441f4acd62cce1059818ce8e9b7ab93b0079e50)
Merged-In: I4f618e4013db894291e6fca9d49bceb1cb7e4bd9
Change-Id: I4f618e4013db894291e6fca9d49bceb1cb7e4bd9
parent 3c59b877
Loading
Loading
Loading
Loading
+0 −40
Original line number Original line Diff line number Diff line
@@ -18,16 +18,10 @@ package com.android.systemui.media.controls.ui


import android.content.Context
import android.content.Context
import android.content.res.Configuration
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.View
import android.view.ViewGroup
import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.annotation.VisibleForTesting
import com.android.systemui.dagger.SysUISingleton
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.media.dagger.MediaModule.KEYGUARD
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.StatusBarState
@@ -36,7 +30,6 @@ import com.android.systemui.statusbar.notification.stack.MediaContainerView
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.util.settings.SecureSettings
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named
import javax.inject.Named


@@ -52,8 +45,6 @@ constructor(
    private val bypassController: KeyguardBypassController,
    private val bypassController: KeyguardBypassController,
    private val statusBarStateController: SysuiStatusBarStateController,
    private val statusBarStateController: SysuiStatusBarStateController,
    private val context: Context,
    private val context: Context,
    private val secureSettings: SecureSettings,
    @Main private val handler: Handler,
    configurationController: ConfigurationController,
    configurationController: ConfigurationController,
) {
) {


@@ -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
        // First let's set the desired state that we want for this host
        mediaHost.expansion = MediaHostState.EXPANDED
        mediaHost.expansion = MediaHostState.EXPANDED
        mediaHost.showsOnlyActiveMedia = true
        mediaHost.showsOnlyActiveMedia = true
@@ -142,16 +113,6 @@ constructor(
        private set
        private set
    private var splitShadeContainer: ViewGroup? = null
    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
     * Attaches media container in single pane mode, situated at the top of the notifications list
     */
     */
@@ -211,7 +172,6 @@ constructor(
            mediaHost.visible &&
            mediaHost.visible &&
                !bypassController.bypassEnabled &&
                !bypassController.bypassEnabled &&
                keyguardOrUserSwitcher &&
                keyguardOrUserSwitcher &&
                allowMediaPlayerOnLockScreen &&
                shouldBeVisibleForSplitShade()
                shouldBeVisibleForSplitShade()
        if (visible) {
        if (visible) {
            showMediaPlayer()
            showMediaPlayer()
+19 −8
Original line number Original line Diff line number Diff line
@@ -104,7 +104,7 @@ constructor(
) {
) {


    /** Track the media player setting status on lock screen. */
    /** Track the media player setting status on lock screen. */
    private var allowMediaPlayerOnLockScreen: Boolean = true
    private var allowMediaPlayerOnLockScreen: Boolean = getMediaLockScreenSetting()
    private val lockScreenMediaPlayerUri =
    private val lockScreenMediaPlayerUri =
        secureSettings.getUriFor(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN)
        secureSettings.getUriFor(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN)


@@ -461,6 +461,7 @@ constructor(
                        mediaCarouselController.logSmartspaceImpression(qsExpanded)
                        mediaCarouselController.logSmartspaceImpression(qsExpanded)
                    }
                    }
                    updateUserVisibility()
                    updateUserVisibility()
                    mediaCarouselController.updateHostVisibility()
                }
                }


                override fun onDozeAmountChanged(linear: Float, eased: Float) {
                override fun onDozeAmountChanged(linear: Float, eased: Float) {
@@ -533,7 +534,6 @@ constructor(
        mediaCarouselController.updateHostVisibility = {
        mediaCarouselController.updateHostVisibility = {
            mediaHosts.forEach { it?.updateViewVisibility() }
            mediaHosts.forEach { it?.updateViewVisibility() }
        }
        }

        panelEventsEvents.addShadeStateEventsListener(
        panelEventsEvents.addShadeStateEventsListener(
            object : ShadeStateEventsListener {
            object : ShadeStateEventsListener {
                override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {
                override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {
@@ -547,12 +547,8 @@ constructor(
            object : ContentObserver(handler) {
            object : ContentObserver(handler) {
                override fun onChange(selfChange: Boolean, uri: Uri?) {
                override fun onChange(selfChange: Boolean, uri: Uri?) {
                    if (uri == lockScreenMediaPlayerUri) {
                    if (uri == lockScreenMediaPlayerUri) {
                        allowMediaPlayerOnLockScreen =
                        allowMediaPlayerOnLockScreen = getMediaLockScreenSetting()
                            secureSettings.getBoolForUser(
                        mediaCarouselController.updateHostVisibility()
                                Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN,
                                true,
                                UserHandle.USER_CURRENT
                            )
                    }
                    }
                }
                }
            }
            }
@@ -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() {
    private fun updateConfiguration() {
        distanceForFullShadeTransition =
        distanceForFullShadeTransition =
            context.resources.getDimensionPixelSize(
            context.resources.getDimensionPixelSize(
@@ -602,6 +606,13 @@ constructor(
        mediaCarouselController.closeGuts()
        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 {
    private fun createUniqueObjectHost(): UniqueObjectHostView {
        val viewHost = UniqueObjectHostView(context)
        val viewHost = UniqueObjectHostView(context)
        viewHost.addOnAttachStateChangeListener(
        viewHost.addOnAttachStateChangeListener(
+3 −1
Original line number Original line Diff line number Diff line
@@ -199,7 +199,9 @@ constructor(
     */
     */
    fun updateViewVisibility() {
    fun updateViewVisibility() {
        state.visible =
        state.visible =
            if (showsOnlyActiveMedia) {
            if (mediaHierarchyManager.isLockedAndHidden()) {
                false
            } else if (showsOnlyActiveMedia) {
                mediaDataManager.hasActiveMediaOrRecommendation()
                mediaDataManager.hasActiveMediaOrRecommendation()
            } else {
            } else {
                mediaDataManager.hasAnyMediaOrRecommendation()
                mediaDataManager.hasAnyMediaOrRecommendation()
+0 −28
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@


package com.android.systemui.media.controls.ui
package com.android.systemui.media.controls.ui


import android.provider.Settings
import android.test.suitebuilder.annotation.SmallTest
import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.TestableLooper
@@ -32,8 +31,6 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.animation.UniqueObjectHostView
import com.android.systemui.util.animation.UniqueObjectHostView
import com.android.systemui.util.mockito.whenever
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 com.google.common.truth.Truth.assertThat
import junit.framework.Assert.assertTrue
import junit.framework.Assert.assertTrue
import org.junit.Before
import org.junit.Before
@@ -60,10 +57,7 @@ class KeyguardMediaControllerTest : SysuiTestCase() {


    private val mediaContainerView: MediaContainerView = MediaContainerView(context, null)
    private val mediaContainerView: MediaContainerView = MediaContainerView(context, null)
    private val hostView = UniqueObjectHostView(context)
    private val hostView = UniqueObjectHostView(context)
    private val settings = FakeSettings()
    private lateinit var keyguardMediaController: KeyguardMediaController
    private lateinit var keyguardMediaController: KeyguardMediaController
    private lateinit var testableLooper: TestableLooper
    private lateinit var fakeHandler: FakeHandler
    private lateinit var statusBarStateListener: StatusBarStateController.StateListener
    private lateinit var statusBarStateListener: StatusBarStateController.StateListener


    @Before
    @Before
@@ -79,16 +73,12 @@ class KeyguardMediaControllerTest : SysuiTestCase() {
        whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
        whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
        whenever(mediaHost.hostView).thenReturn(hostView)
        whenever(mediaHost.hostView).thenReturn(hostView)
        hostView.layoutParams = FrameLayout.LayoutParams(100, 100)
        hostView.layoutParams = FrameLayout.LayoutParams(100, 100)
        testableLooper = TestableLooper.get(this)
        fakeHandler = FakeHandler(testableLooper.looper)
        keyguardMediaController =
        keyguardMediaController =
            KeyguardMediaController(
            KeyguardMediaController(
                mediaHost,
                mediaHost,
                bypassController,
                bypassController,
                statusBarStateController,
                statusBarStateController,
                context,
                context,
                settings,
                fakeHandler,
                configurationController,
                configurationController,
            )
            )
        keyguardMediaController.attachSinglePaneContainer(mediaContainerView)
        keyguardMediaController.attachSinglePaneContainer(mediaContainerView)
@@ -117,24 +107,6 @@ class KeyguardMediaControllerTest : SysuiTestCase() {
        assertThat(mediaContainerView.visibility).isEqualTo(visibility)
        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
    @Test
    fun testActivatesSplitShadeContainerInSplitShadeMode() {
    fun testActivatesSplitShadeContainerInSplitShadeMode() {
        val splitShadeContainer = FrameLayout(context)
        val splitShadeContainer = FrameLayout(context)
+50 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
        verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture())
        verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture())
        verify(statusBarStateController).addCallback(statusBarCallback.capture())
        verify(statusBarStateController).addCallback(statusBarCallback.capture())
        verify(dreamOverlayStateController).addCallback(dreamOverlayCallback.capture())
        verify(dreamOverlayStateController).addCallback(dreamOverlayCallback.capture())
        whenever(mediaCarouselController.updateHostVisibility).thenReturn({})
        setupHost(lockHost, MediaHierarchyManager.LOCATION_LOCKSCREEN, LOCKSCREEN_TOP)
        setupHost(lockHost, MediaHierarchyManager.LOCATION_LOCKSCREEN, LOCKSCREEN_TOP)
        setupHost(qsHost, MediaHierarchyManager.LOCATION_QS, QS_TOP)
        setupHost(qsHost, MediaHierarchyManager.LOCATION_QS, QS_TOP)
        setupHost(qqsHost, MediaHierarchyManager.LOCATION_QQS, QQS_TOP)
        setupHost(qqsHost, MediaHierarchyManager.LOCATION_QQS, QQS_TOP)
@@ -485,6 +486,55 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
        assertThat(mediaCarouselScrollHandler.visibleToUser).isFalse()
        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() {
    private fun enableSplitShade() {
        context
        context
            .getOrCreateTestableResources()
            .getOrCreateTestableResources()