Disable depth effect during split-shade expansion

According to the motion spec for split-shade, there should be no depth effect.

Fixes: 228022043
Test: Manually + NotificationShadeDepthControllerTest.kt
Change-Id: I1b908e17b3084f94578973d53993b47d9ad22ebb
This commit is contained in:
Christian Göllner
2022-04-14 11:13:02 +02:00
parent ea91f5bb91
commit 9bfd60ab82
2 changed files with 97 additions and 7 deletions

View File

@@ -19,6 +19,8 @@ package com.android.systemui.statusbar
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.content.Context
import android.content.res.Configuration
import android.os.SystemClock
import android.os.Trace
import android.util.IndentingPrintWriter
@@ -41,7 +43,9 @@ import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.util.WallpaperController
import java.io.PrintWriter
import javax.inject.Inject
@@ -61,7 +65,9 @@ class NotificationShadeDepthController @Inject constructor(
private val wallpaperController: WallpaperController,
private val notificationShadeWindowController: NotificationShadeWindowController,
private val dozeParameters: DozeParameters,
dumpManager: DumpManager
private val context: Context,
dumpManager: DumpManager,
configurationController: ConfigurationController
) : PanelExpansionListener, Dumpable {
companion object {
private const val WAKE_UP_ANIMATION_ENABLED = true
@@ -84,6 +90,7 @@ class NotificationShadeDepthController @Inject constructor(
private var isOpen: Boolean = false
private var isBlurred: Boolean = false
private var listeners = mutableListOf<DepthListener>()
private var inSplitShade: Boolean = false
private var prevTracking: Boolean = false
private var prevTimestamp: Long = -1
@@ -208,6 +215,10 @@ class NotificationShadeDepthController @Inject constructor(
var zoomOut = MathUtils.saturate(blurUtils.ratioOfBlurRadius(shadeRadius))
var blur = shadeRadius.toInt()
if (inSplitShade) {
zoomOut = 0f
}
// Make blur be 0 if it is necessary to stop blur effect.
if (scrimsVisible) {
blur = 0
@@ -306,6 +317,16 @@ class NotificationShadeDepthController @Inject constructor(
}
shadeAnimation.setStiffness(SpringForce.STIFFNESS_LOW)
shadeAnimation.setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY)
updateResources()
configurationController.addCallback(object : ConfigurationController.ConfigurationListener {
override fun onConfigChanged(newConfig: Configuration?) {
updateResources()
}
})
}
private fun updateResources() {
inSplitShade = LargeScreenUtils.shouldUseSplitNotificationShade(context.resources)
}
fun addListener(listener: DepthListener) {

View File

@@ -23,6 +23,7 @@ import android.view.Choreographer
import android.view.View
import android.view.ViewRootImpl
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.dump.DumpManager
@@ -30,18 +31,22 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.WallpaperController
import com.android.systemui.util.mockito.eq
import com.google.common.truth.Truth.assertThat
import java.util.function.Consumer
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.floatThat
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.Mockito.any
import org.mockito.Mockito.anyFloat
@@ -51,7 +56,6 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.junit.MockitoJUnit
import java.util.function.Consumer
@RunWith(AndroidTestingRunner::class)
@RunWithLooper
@@ -80,6 +84,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
private var statusBarState = StatusBarState.SHADE
private val maxBlur = 150
private lateinit var notificationShadeDepthController: NotificationShadeDepthController
private val configurationController = FakeConfigurationController()
@Before
fun setup() {
@@ -97,10 +102,19 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
`when`(blurUtils.maxBlurRadius).thenReturn(maxBlur)
`when`(blurUtils.maxBlurRadius).thenReturn(maxBlur)
notificationShadeDepthController = NotificationShadeDepthController(
statusBarStateController, blurUtils, biometricUnlockController,
keyguardStateController, choreographer, wallpaperController,
notificationShadeWindowController, dozeParameters, dumpManager)
notificationShadeDepthController =
NotificationShadeDepthController(
statusBarStateController,
blurUtils,
biometricUnlockController,
keyguardStateController,
choreographer,
wallpaperController,
notificationShadeWindowController,
dozeParameters,
context,
dumpManager,
configurationController)
notificationShadeDepthController.shadeAnimation = shadeAnimation
notificationShadeDepthController.brightnessMirrorSpring = brightnessSpring
notificationShadeDepthController.root = root
@@ -110,6 +124,8 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
statusBarStateListener = captor.value
verify(notificationShadeWindowController)
.setScrimsVisibilityListener(scrimVisibilityCaptor.capture())
disableSplitShade()
}
@Test
@@ -225,6 +241,46 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
eq(ShadeInterpolation.getNotificationScrimAlpha(0.25f)))
}
@Test
fun expandPanel_inSplitShade_setsZoomToZero() {
enableSplitShade()
notificationShadeDepthController.onPanelExpansionChanged(
rawFraction = 1f, expanded = true, tracking = false)
notificationShadeDepthController.updateBlurCallback.doFrame(0)
verify(wallpaperController).setNotificationShadeZoom(0f)
}
@Test
fun expandPanel_notInSplitShade_setsZoomValue() {
disableSplitShade()
notificationShadeDepthController.onPanelExpansionChanged(
rawFraction = 1f, expanded = true, tracking = false)
notificationShadeDepthController.updateBlurCallback.doFrame(0)
verify(wallpaperController).setNotificationShadeZoom(floatThat { it > 0 })
}
@Test
fun expandPanel_splitShadeEnabledChanged_setsCorrectZoomValueAfterChange() {
disableSplitShade()
val rawFraction = 1f
val expanded = true
val tracking = false
val inOrder = Mockito.inOrder(wallpaperController)
notificationShadeDepthController.onPanelExpansionChanged(rawFraction, expanded, tracking)
notificationShadeDepthController.updateBlurCallback.doFrame(0)
inOrder.verify(wallpaperController).setNotificationShadeZoom(floatThat { it > 0 })
enableSplitShade()
notificationShadeDepthController.onPanelExpansionChanged(rawFraction, expanded, tracking)
notificationShadeDepthController.updateBlurCallback.doFrame(0)
inOrder.verify(wallpaperController).setNotificationShadeZoom(0f)
}
@Test
fun setFullShadeTransition_appliesBlur() {
notificationShadeDepthController.transitionToFullShadeProgress = 1f
@@ -369,4 +425,17 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
notificationShadeDepthController.blursDisabledForAppLaunch = true
verify(shadeAnimation, never()).animateTo(anyInt(), any())
}
}
private fun enableSplitShade() {
setSplitShadeEnabled(true)
}
private fun disableSplitShade() {
setSplitShadeEnabled(false)
}
private fun setSplitShadeEnabled(enabled: Boolean) {
overrideResource(R.bool.config_use_split_notification_shade, enabled)
configurationController.notifyConfigurationChanged()
}
}