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

Commit 06e0a7b6 authored by Beth Thibodeau's avatar Beth Thibodeau
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

Change-Id: I4f618e4013db894291e6fca9d49bceb1cb7e4bd9
Merged-In: I4f618e4013db894291e6fca9d49bceb1cb7e4bd9
parent ff8132ea
Loading
Loading
Loading
Loading
+0 −40
Original line number Diff line number Diff line
@@ -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
@@ -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

@@ -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,
) {

@@ -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
@@ -133,16 +104,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
     */
@@ -202,7 +163,6 @@ constructor(
            mediaHost.visible &&
                !bypassController.bypassEnabled &&
                keyguardOrUserSwitcher &&
                allowMediaPlayerOnLockScreen &&
                shouldBeVisibleForSplitShade()
        if (visible) {
            showMediaPlayer()
+19 −8
Original line number Diff line number Diff line
@@ -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)

@@ -462,6 +462,7 @@ constructor(
                    }
                    mediaCarouselController.mediaCarouselScrollHandler.visibleToUser =
                        isVisibleToUser()
                    mediaCarouselController.updateHostVisibility()
                }

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

        panelEventsEvents.addShadeStateEventsListener(
            object : ShadeStateEventsListener {
                override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {
@@ -552,12 +552,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()
                    }
                }
            }
@@ -568,6 +564,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(
@@ -607,6 +611,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(
+3 −1
Original line number Diff line number Diff line
@@ -199,7 +199,9 @@ constructor(
     */
    fun updateViewVisibility() {
        state.visible =
            if (showsOnlyActiveMedia) {
            if (mediaHierarchyManager.isLockedAndHidden()) {
                false
            } else if (showsOnlyActiveMedia) {
                mediaDataManager.hasActiveMediaOrRecommendation()
            } else {
                mediaDataManager.hasAnyMediaOrRecommendation()
+0 −28
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -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)
+50 −0
Original line number Diff line number Diff line
@@ -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)
@@ -470,6 +471,55 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
            )
    }

    @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()