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

Commit 045c9008 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato Committed by Nicolò Mazzucato
Browse files

Disable zoom out effect when the shade is on an external display

The zoom out effect currently only supports the default display, but is triggered at every shade expansion (also when the shade is in an external display).

This looked unexpected. With this cl, the zoom out is only applied when the shade is in the default display.

Supporting the zoom out on the external display requires some refactor of AppZoomOutController (tracked in b/403573903)

Bug: 362719719
Bug: 401606287
Bug: 403573903
Test: NotificationShadeDepthControllerTest
Flag: com.android.systemui.shade_window_goes_around
Change-Id: I1d82dbc074ca2c23af03cb9414b13d685a9259bc
parent 40ed1d02
Loading
Loading
Loading
Loading
+38 −5
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.shade.ShadeExpansionChangeEvent
import com.android.systemui.shade.ShadeExpansionChangeEvent
import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.phone.DozeParameters
@@ -45,6 +46,8 @@ import com.android.systemui.wallpapers.domain.interactor.WallpaperInteractor
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import com.android.wm.shell.appzoomout.AppZoomOut
import com.android.wm.shell.appzoomout.AppZoomOut
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import java.util.function.Consumer
import org.junit.Before
import org.junit.Before
import org.junit.Rule
import org.junit.Rule
import org.junit.Test
import org.junit.Test
@@ -65,8 +68,6 @@ import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoJUnit
import java.util.Optional
import java.util.function.Consumer


@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
@RunWithLooper
@RunWithLooper
@@ -75,6 +76,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos = testKosmos()


    private val applicationScope = kosmos.testScope.backgroundScope
    private val applicationScope = kosmos.testScope.backgroundScope
    private val shadeDisplayRepository = kosmos.fakeShadeDisplaysRepository
    @Mock private lateinit var statusBarStateController: StatusBarStateController
    @Mock private lateinit var statusBarStateController: StatusBarStateController
    @Mock private lateinit var blurUtils: BlurUtils
    @Mock private lateinit var blurUtils: BlurUtils
    @Mock private lateinit var biometricUnlockController: BiometricUnlockController
    @Mock private lateinit var biometricUnlockController: BiometricUnlockController
@@ -135,7 +137,8 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
                windowRootViewBlurInteractor,
                windowRootViewBlurInteractor,
                appZoomOutOptional,
                appZoomOutOptional,
                applicationScope,
                applicationScope,
                dumpManager
                dumpManager,
                { shadeDisplayRepository },
            )
            )
        notificationShadeDepthController.shadeAnimation = shadeAnimation
        notificationShadeDepthController.shadeAnimation = shadeAnimation
        notificationShadeDepthController.brightnessMirrorSpring = brightnessSpring
        notificationShadeDepthController.brightnessMirrorSpring = brightnessSpring
@@ -354,6 +357,36 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
        verify(blurUtils).applyBlur(any(), anyInt(), eq(false))
        verify(blurUtils).applyBlur(any(), anyInt(), eq(false))
    }
    }


    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun updateBlurCallback_shadeInExternalDisplay_doesSetZeroZoom() {
        notificationShadeDepthController.onPanelExpansionChanged(
            ShadeExpansionChangeEvent(fraction = 1f, expanded = true, tracking = false)
        )
        notificationShadeDepthController.addListener(listener)
        shadeDisplayRepository.setDisplayId(1) // not default display.

        notificationShadeDepthController.updateBlurCallback.doFrame(0)

        verify(wallpaperController).setNotificationShadeZoom(eq(0f))
        verify(listener).onWallpaperZoomOutChanged(eq(0f))
    }

    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun updateBlurCallback_shadeInDefaultDisplay_doesNotSetZeroZoom() {
        notificationShadeDepthController.onPanelExpansionChanged(
            ShadeExpansionChangeEvent(fraction = 1f, expanded = true, tracking = false)
        )
        notificationShadeDepthController.addListener(listener)
        shadeDisplayRepository.setDisplayId(0) // shade is in default display

        notificationShadeDepthController.updateBlurCallback.doFrame(0)

        verify(wallpaperController).setNotificationShadeZoom(floatThat { it != 0f })
        verify(listener).onWallpaperZoomOutChanged(floatThat { it != 0f })
    }

    @Test
    @Test
    @DisableFlags(Flags.FLAG_NOTIFICATION_SHADE_BLUR)
    @DisableFlags(Flags.FLAG_NOTIFICATION_SHADE_BLUR)
    fun updateBlurCallback_setsOpaque_whenScrim() {
    fun updateBlurCallback_setsOpaque_whenScrim() {
+21 −3
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.util.IndentingPrintWriter
import android.util.Log
import android.util.Log
import android.util.MathUtils
import android.util.MathUtils
import android.view.Choreographer
import android.view.Choreographer
import android.view.Display
import android.view.View
import android.view.View
import androidx.annotation.VisibleForTesting
import androidx.annotation.VisibleForTesting
import androidx.dynamicanimation.animation.FloatPropertyCompat
import androidx.dynamicanimation.animation.FloatPropertyCompat
@@ -42,7 +43,9 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.shade.ShadeExpansionChangeEvent
import com.android.systemui.shade.ShadeExpansionChangeEvent
import com.android.systemui.shade.ShadeExpansionListener
import com.android.systemui.shade.ShadeExpansionListener
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.phone.DozeParameters
@@ -52,6 +55,7 @@ import com.android.systemui.util.WallpaperController
import com.android.systemui.wallpapers.domain.interactor.WallpaperInteractor
import com.android.systemui.wallpapers.domain.interactor.WallpaperInteractor
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import com.android.wm.shell.appzoomout.AppZoomOut
import com.android.wm.shell.appzoomout.AppZoomOut
import dagger.Lazy
import java.io.PrintWriter
import java.io.PrintWriter
import java.util.Optional
import java.util.Optional
import javax.inject.Inject
import javax.inject.Inject
@@ -83,6 +87,7 @@ constructor(
    private val appZoomOutOptional: Optional<AppZoomOut>,
    private val appZoomOutOptional: Optional<AppZoomOut>,
    @Application private val applicationScope: CoroutineScope,
    @Application private val applicationScope: CoroutineScope,
    dumpManager: DumpManager,
    dumpManager: DumpManager,
    private val shadeDisplaysRepository: Lazy<ShadeDisplaysRepository>,
) : ShadeExpansionListener, Dumpable {
) : ShadeExpansionListener, Dumpable {
    companion object {
    companion object {
        private const val WAKE_UP_ANIMATION_ENABLED = true
        private const val WAKE_UP_ANIMATION_ENABLED = true
@@ -228,6 +233,14 @@ constructor(


    private data class WakeAndUnlockBlurData(val radius: Float, val useZoom: Boolean = true)
    private data class WakeAndUnlockBlurData(val radius: Float, val useZoom: Boolean = true)


    private val isShadeOnDefaultDisplay: Boolean
        get() =
            if (ShadeWindowGoesAround.isEnabled) {
                shadeDisplaysRepository.get().displayId.value == Display.DEFAULT_DISPLAY
            } else {
                true
            }

    /** Blur radius of the wake and unlock animation on this frame, and whether to zoom out. */
    /** Blur radius of the wake and unlock animation on this frame, and whether to zoom out. */
    private var wakeAndUnlockBlurData = WakeAndUnlockBlurData(0f)
    private var wakeAndUnlockBlurData = WakeAndUnlockBlurData(0f)
        set(value) {
        set(value) {
@@ -265,9 +278,14 @@ constructor(
        var blur = shadeRadius.toInt()
        var blur = shadeRadius.toInt()
        // If the blur comes from waking up, we don't want to zoom out the background
        // If the blur comes from waking up, we don't want to zoom out the background
        val zoomOut =
        val zoomOut =
            if (shadeRadius != wakeAndUnlockBlurData.radius || wakeAndUnlockBlurData.useZoom)
            when {
                // When the shade is in another display, we don't want to zoom out the background.
                // Only the default display is supported right now.
                !isShadeOnDefaultDisplay -> 0f
                shadeRadius != wakeAndUnlockBlurData.radius || wakeAndUnlockBlurData.useZoom ->
                    blurRadiusToZoomOut(blurRadius = shadeRadius)
                    blurRadiusToZoomOut(blurRadius = shadeRadius)
            else 0f
                else -> 0f
            }
        // Make blur be 0 if it is necessary to stop blur effect.
        // Make blur be 0 if it is necessary to stop blur effect.
        if (scrimsVisible) {
        if (scrimsVisible) {
            if (!Flags.notificationShadeBlur()) {
            if (!Flags.notificationShadeBlur()) {