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:
@@ -19,6 +19,8 @@ package com.android.systemui.statusbar
|
|||||||
import android.animation.Animator
|
import android.animation.Animator
|
||||||
import android.animation.AnimatorListenerAdapter
|
import android.animation.AnimatorListenerAdapter
|
||||||
import android.animation.ValueAnimator
|
import android.animation.ValueAnimator
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Configuration
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import android.os.Trace
|
import android.os.Trace
|
||||||
import android.util.IndentingPrintWriter
|
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.DozeParameters
|
||||||
import com.android.systemui.statusbar.phone.ScrimController
|
import com.android.systemui.statusbar.phone.ScrimController
|
||||||
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener
|
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.statusbar.policy.KeyguardStateController
|
||||||
|
import com.android.systemui.util.LargeScreenUtils
|
||||||
import com.android.systemui.util.WallpaperController
|
import com.android.systemui.util.WallpaperController
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -61,7 +65,9 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
private val wallpaperController: WallpaperController,
|
private val wallpaperController: WallpaperController,
|
||||||
private val notificationShadeWindowController: NotificationShadeWindowController,
|
private val notificationShadeWindowController: NotificationShadeWindowController,
|
||||||
private val dozeParameters: DozeParameters,
|
private val dozeParameters: DozeParameters,
|
||||||
dumpManager: DumpManager
|
private val context: Context,
|
||||||
|
dumpManager: DumpManager,
|
||||||
|
configurationController: ConfigurationController
|
||||||
) : PanelExpansionListener, Dumpable {
|
) : PanelExpansionListener, Dumpable {
|
||||||
companion object {
|
companion object {
|
||||||
private const val WAKE_UP_ANIMATION_ENABLED = true
|
private const val WAKE_UP_ANIMATION_ENABLED = true
|
||||||
@@ -84,6 +90,7 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
private var isOpen: Boolean = false
|
private var isOpen: Boolean = false
|
||||||
private var isBlurred: Boolean = false
|
private var isBlurred: Boolean = false
|
||||||
private var listeners = mutableListOf<DepthListener>()
|
private var listeners = mutableListOf<DepthListener>()
|
||||||
|
private var inSplitShade: Boolean = false
|
||||||
|
|
||||||
private var prevTracking: Boolean = false
|
private var prevTracking: Boolean = false
|
||||||
private var prevTimestamp: Long = -1
|
private var prevTimestamp: Long = -1
|
||||||
@@ -208,6 +215,10 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
var zoomOut = MathUtils.saturate(blurUtils.ratioOfBlurRadius(shadeRadius))
|
var zoomOut = MathUtils.saturate(blurUtils.ratioOfBlurRadius(shadeRadius))
|
||||||
var blur = shadeRadius.toInt()
|
var blur = shadeRadius.toInt()
|
||||||
|
|
||||||
|
if (inSplitShade) {
|
||||||
|
zoomOut = 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) {
|
||||||
blur = 0
|
blur = 0
|
||||||
@@ -306,6 +317,16 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
}
|
}
|
||||||
shadeAnimation.setStiffness(SpringForce.STIFFNESS_LOW)
|
shadeAnimation.setStiffness(SpringForce.STIFFNESS_LOW)
|
||||||
shadeAnimation.setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY)
|
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) {
|
fun addListener(listener: DepthListener) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import android.view.Choreographer
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewRootImpl
|
import android.view.ViewRootImpl
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.animation.ShadeInterpolation
|
import com.android.systemui.animation.ShadeInterpolation
|
||||||
import com.android.systemui.dump.DumpManager
|
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.BiometricUnlockController
|
||||||
import com.android.systemui.statusbar.phone.DozeParameters
|
import com.android.systemui.statusbar.phone.DozeParameters
|
||||||
import com.android.systemui.statusbar.phone.ScrimController
|
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.statusbar.policy.KeyguardStateController
|
||||||
import com.android.systemui.util.WallpaperController
|
import com.android.systemui.util.WallpaperController
|
||||||
import com.android.systemui.util.mockito.eq
|
import com.android.systemui.util.mockito.eq
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
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
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.mockito.ArgumentCaptor
|
import org.mockito.ArgumentCaptor
|
||||||
import org.mockito.ArgumentMatchers.anyInt
|
import org.mockito.ArgumentMatchers.anyInt
|
||||||
|
import org.mockito.ArgumentMatchers.floatThat
|
||||||
import org.mockito.Captor
|
import org.mockito.Captor
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito
|
||||||
import org.mockito.Mockito.`when`
|
import org.mockito.Mockito.`when`
|
||||||
import org.mockito.Mockito.any
|
import org.mockito.Mockito.any
|
||||||
import org.mockito.Mockito.anyFloat
|
import org.mockito.Mockito.anyFloat
|
||||||
@@ -51,7 +56,6 @@ import org.mockito.Mockito.never
|
|||||||
import org.mockito.Mockito.reset
|
import org.mockito.Mockito.reset
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
import org.mockito.junit.MockitoJUnit
|
import org.mockito.junit.MockitoJUnit
|
||||||
import java.util.function.Consumer
|
|
||||||
|
|
||||||
@RunWith(AndroidTestingRunner::class)
|
@RunWith(AndroidTestingRunner::class)
|
||||||
@RunWithLooper
|
@RunWithLooper
|
||||||
@@ -80,6 +84,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
private var statusBarState = StatusBarState.SHADE
|
private var statusBarState = StatusBarState.SHADE
|
||||||
private val maxBlur = 150
|
private val maxBlur = 150
|
||||||
private lateinit var notificationShadeDepthController: NotificationShadeDepthController
|
private lateinit var notificationShadeDepthController: NotificationShadeDepthController
|
||||||
|
private val configurationController = FakeConfigurationController()
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setup() {
|
fun setup() {
|
||||||
@@ -97,10 +102,19 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
`when`(blurUtils.maxBlurRadius).thenReturn(maxBlur)
|
`when`(blurUtils.maxBlurRadius).thenReturn(maxBlur)
|
||||||
`when`(blurUtils.maxBlurRadius).thenReturn(maxBlur)
|
`when`(blurUtils.maxBlurRadius).thenReturn(maxBlur)
|
||||||
|
|
||||||
notificationShadeDepthController = NotificationShadeDepthController(
|
notificationShadeDepthController =
|
||||||
statusBarStateController, blurUtils, biometricUnlockController,
|
NotificationShadeDepthController(
|
||||||
keyguardStateController, choreographer, wallpaperController,
|
statusBarStateController,
|
||||||
notificationShadeWindowController, dozeParameters, dumpManager)
|
blurUtils,
|
||||||
|
biometricUnlockController,
|
||||||
|
keyguardStateController,
|
||||||
|
choreographer,
|
||||||
|
wallpaperController,
|
||||||
|
notificationShadeWindowController,
|
||||||
|
dozeParameters,
|
||||||
|
context,
|
||||||
|
dumpManager,
|
||||||
|
configurationController)
|
||||||
notificationShadeDepthController.shadeAnimation = shadeAnimation
|
notificationShadeDepthController.shadeAnimation = shadeAnimation
|
||||||
notificationShadeDepthController.brightnessMirrorSpring = brightnessSpring
|
notificationShadeDepthController.brightnessMirrorSpring = brightnessSpring
|
||||||
notificationShadeDepthController.root = root
|
notificationShadeDepthController.root = root
|
||||||
@@ -110,6 +124,8 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
statusBarStateListener = captor.value
|
statusBarStateListener = captor.value
|
||||||
verify(notificationShadeWindowController)
|
verify(notificationShadeWindowController)
|
||||||
.setScrimsVisibilityListener(scrimVisibilityCaptor.capture())
|
.setScrimsVisibilityListener(scrimVisibilityCaptor.capture())
|
||||||
|
|
||||||
|
disableSplitShade()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -225,6 +241,46 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
eq(ShadeInterpolation.getNotificationScrimAlpha(0.25f)))
|
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
|
@Test
|
||||||
fun setFullShadeTransition_appliesBlur() {
|
fun setFullShadeTransition_appliesBlur() {
|
||||||
notificationShadeDepthController.transitionToFullShadeProgress = 1f
|
notificationShadeDepthController.transitionToFullShadeProgress = 1f
|
||||||
@@ -369,4 +425,17 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
notificationShadeDepthController.blursDisabledForAppLaunch = true
|
notificationShadeDepthController.blursDisabledForAppLaunch = true
|
||||||
verify(shadeAnimation, never()).animateTo(anyInt(), any())
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user