Merge "[Unfold animation] Get animation scale from content provider" into tm-qpr-dev am: 9768ceeb8c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20501767 Change-Id: I25c5bb5e841a5255dc2b007a6ec984cce6f6ac14 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.systemui.unfold
|
package com.android.systemui.unfold
|
||||||
|
|
||||||
import android.animation.ValueAnimator
|
import android.content.ContentResolver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.PixelFormat
|
import android.graphics.PixelFormat
|
||||||
import android.hardware.devicestate.DeviceStateManager
|
import android.hardware.devicestate.DeviceStateManager
|
||||||
@@ -39,6 +39,7 @@ import com.android.systemui.statusbar.LightRevealScrim
|
|||||||
import com.android.systemui.statusbar.LinearLightRevealEffect
|
import com.android.systemui.statusbar.LinearLightRevealEffect
|
||||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
|
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
|
||||||
import com.android.systemui.unfold.updates.RotationChangeProvider
|
import com.android.systemui.unfold.updates.RotationChangeProvider
|
||||||
|
import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider.Companion.areAnimationsEnabled
|
||||||
import com.android.systemui.util.traceSection
|
import com.android.systemui.util.traceSection
|
||||||
import com.android.wm.shell.displayareahelper.DisplayAreaHelper
|
import com.android.wm.shell.displayareahelper.DisplayAreaHelper
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
@@ -52,6 +53,7 @@ class UnfoldLightRevealOverlayAnimation
|
|||||||
constructor(
|
constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val deviceStateManager: DeviceStateManager,
|
private val deviceStateManager: DeviceStateManager,
|
||||||
|
private val contentResolver: ContentResolver,
|
||||||
private val displayManager: DisplayManager,
|
private val displayManager: DisplayManager,
|
||||||
private val unfoldTransitionProgressProvider: UnfoldTransitionProgressProvider,
|
private val unfoldTransitionProgressProvider: UnfoldTransitionProgressProvider,
|
||||||
private val displayAreaHelper: Optional<DisplayAreaHelper>,
|
private val displayAreaHelper: Optional<DisplayAreaHelper>,
|
||||||
@@ -117,7 +119,7 @@ constructor(
|
|||||||
Trace.beginSection("UnfoldLightRevealOverlayAnimation#onScreenTurningOn")
|
Trace.beginSection("UnfoldLightRevealOverlayAnimation#onScreenTurningOn")
|
||||||
try {
|
try {
|
||||||
// Add the view only if we are unfolding and this is the first screen on
|
// Add the view only if we are unfolding and this is the first screen on
|
||||||
if (!isFolded && !isUnfoldHandled && ValueAnimator.areAnimatorsEnabled()) {
|
if (!isFolded && !isUnfoldHandled && contentResolver.areAnimationsEnabled()) {
|
||||||
addView(onOverlayReady)
|
addView(onOverlayReady)
|
||||||
isUnfoldHandled = true
|
isUnfoldHandled = true
|
||||||
} else {
|
} else {
|
||||||
@@ -162,11 +164,10 @@ constructor(
|
|||||||
// blocker (turn on the brightness) only when the content is actually visible as it
|
// blocker (turn on the brightness) only when the content is actually visible as it
|
||||||
// might be presented only in the next frame.
|
// might be presented only in the next frame.
|
||||||
// See b/197538198
|
// See b/197538198
|
||||||
transaction
|
transaction.setFrameTimelineVsync(vsyncId).apply()
|
||||||
.setFrameTimelineVsync(vsyncId)
|
|
||||||
.apply()
|
|
||||||
|
|
||||||
transaction.setFrameTimelineVsync(vsyncId + 1)
|
transaction
|
||||||
|
.setFrameTimelineVsync(vsyncId + 1)
|
||||||
.addTransactionCommittedListener(backgroundExecutor) {
|
.addTransactionCommittedListener(backgroundExecutor) {
|
||||||
Trace.endAsyncSection("UnfoldLightRevealOverlayAnimation#relayout", 0)
|
Trace.endAsyncSection("UnfoldLightRevealOverlayAnimation#relayout", 0)
|
||||||
callback.run()
|
callback.run()
|
||||||
@@ -218,8 +219,7 @@ constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getUnfoldedDisplayInfo(): DisplayInfo =
|
private fun getUnfoldedDisplayInfo(): DisplayInfo =
|
||||||
displayManager
|
displayManager.displays
|
||||||
.displays
|
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.map { DisplayInfo().apply { it.getDisplayInfo(this) } }
|
.map { DisplayInfo().apply { it.getDisplayInfo(this) } }
|
||||||
.filter { it.type == Display.TYPE_INTERNAL }
|
.filter { it.type == Display.TYPE_INTERNAL }
|
||||||
@@ -266,5 +266,6 @@ constructor(
|
|||||||
isUnfoldHandled = false
|
isUnfoldHandled = false
|
||||||
}
|
}
|
||||||
this.isFolded = isFolded
|
this.isFolded = isFolded
|
||||||
})
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,14 +15,13 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.systemui.unfold.util
|
package com.android.systemui.unfold.util
|
||||||
|
|
||||||
import android.animation.ValueAnimator
|
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
||||||
import android.database.ContentObserver
|
import android.database.ContentObserver
|
||||||
|
import android.provider.Settings
|
||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.unfold.TestUnfoldTransitionProvider
|
import com.android.systemui.unfold.TestUnfoldTransitionProvider
|
||||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider
|
|
||||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
|
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
@@ -30,6 +29,7 @@ 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.Mock
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito.spy
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
import org.mockito.Mockito.verifyNoMoreInteractions
|
import org.mockito.Mockito.verifyNoMoreInteractions
|
||||||
import org.mockito.MockitoAnnotations
|
import org.mockito.MockitoAnnotations
|
||||||
@@ -38,15 +38,12 @@ import org.mockito.MockitoAnnotations
|
|||||||
@SmallTest
|
@SmallTest
|
||||||
class ScaleAwareUnfoldProgressProviderTest : SysuiTestCase() {
|
class ScaleAwareUnfoldProgressProviderTest : SysuiTestCase() {
|
||||||
|
|
||||||
@Mock
|
@Mock lateinit var sinkProvider: TransitionProgressListener
|
||||||
lateinit var contentResolver: ContentResolver
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
lateinit var sinkProvider: TransitionProgressListener
|
|
||||||
|
|
||||||
private val sourceProvider = TestUnfoldTransitionProvider()
|
private val sourceProvider = TestUnfoldTransitionProvider()
|
||||||
|
|
||||||
lateinit var progressProvider: ScaleAwareTransitionProgressProvider
|
private lateinit var contentResolver: ContentResolver
|
||||||
|
private lateinit var progressProvider: ScaleAwareTransitionProgressProvider
|
||||||
|
|
||||||
private val animatorDurationScaleListenerCaptor =
|
private val animatorDurationScaleListenerCaptor =
|
||||||
ArgumentCaptor.forClass(ContentObserver::class.java)
|
ArgumentCaptor.forClass(ContentObserver::class.java)
|
||||||
@@ -54,14 +51,12 @@ class ScaleAwareUnfoldProgressProviderTest : SysuiTestCase() {
|
|||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
MockitoAnnotations.initMocks(this)
|
MockitoAnnotations.initMocks(this)
|
||||||
|
contentResolver = spy(context.contentResolver)
|
||||||
|
|
||||||
progressProvider = ScaleAwareTransitionProgressProvider(
|
progressProvider = ScaleAwareTransitionProgressProvider(sourceProvider, contentResolver)
|
||||||
sourceProvider,
|
|
||||||
contentResolver
|
|
||||||
)
|
|
||||||
|
|
||||||
verify(contentResolver).registerContentObserver(any(), any(),
|
verify(contentResolver)
|
||||||
animatorDurationScaleListenerCaptor.capture())
|
.registerContentObserver(any(), any(), animatorDurationScaleListenerCaptor.capture())
|
||||||
|
|
||||||
progressProvider.addCallback(sinkProvider)
|
progressProvider.addCallback(sinkProvider)
|
||||||
}
|
}
|
||||||
@@ -121,12 +116,20 @@ class ScaleAwareUnfoldProgressProviderTest : SysuiTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setAnimationsEnabled(enabled: Boolean) {
|
private fun setAnimationsEnabled(enabled: Boolean) {
|
||||||
val durationScale = if (enabled) {
|
val durationScale =
|
||||||
|
if (enabled) {
|
||||||
1f
|
1f
|
||||||
} else {
|
} else {
|
||||||
0f
|
0f
|
||||||
}
|
}
|
||||||
ValueAnimator.setDurationScale(durationScale)
|
|
||||||
|
// It uses [TestableSettingsProvider] and it will be cleared after the test
|
||||||
|
Settings.Global.putString(
|
||||||
|
contentResolver,
|
||||||
|
Settings.Global.ANIMATOR_DURATION_SCALE,
|
||||||
|
durationScale.toString()
|
||||||
|
)
|
||||||
|
|
||||||
animatorDurationScaleListenerCaptor.value.dispatchChange(/* selfChange= */false)
|
animatorDurationScaleListenerCaptor.value.dispatchChange(/* selfChange= */false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.systemui.unfold.util
|
package com.android.systemui.unfold.util
|
||||||
|
|
||||||
import android.animation.ValueAnimator
|
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
||||||
import android.database.ContentObserver
|
import android.database.ContentObserver
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
@@ -46,13 +45,15 @@ constructor(
|
|||||||
contentResolver.registerContentObserver(
|
contentResolver.registerContentObserver(
|
||||||
Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE),
|
Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE),
|
||||||
/* notifyForDescendants= */ false,
|
/* notifyForDescendants= */ false,
|
||||||
animatorDurationScaleObserver)
|
animatorDurationScaleObserver
|
||||||
|
)
|
||||||
onAnimatorScaleChanged()
|
onAnimatorScaleChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onAnimatorScaleChanged() {
|
private fun onAnimatorScaleChanged() {
|
||||||
val animationsEnabled = ValueAnimator.areAnimatorsEnabled()
|
scopedUnfoldTransitionProgressProvider.setReadyToHandleTransition(
|
||||||
scopedUnfoldTransitionProgressProvider.setReadyToHandleTransition(animationsEnabled)
|
contentResolver.areAnimationsEnabled()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun addCallback(listener: TransitionProgressListener) {
|
override fun addCallback(listener: TransitionProgressListener) {
|
||||||
@@ -74,4 +75,18 @@ constructor(
|
|||||||
progressProvider: UnfoldTransitionProgressProvider
|
progressProvider: UnfoldTransitionProgressProvider
|
||||||
): ScaleAwareTransitionProgressProvider
|
): ScaleAwareTransitionProgressProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun ContentResolver.areAnimationsEnabled(): Boolean {
|
||||||
|
val animationScale =
|
||||||
|
Settings.Global.getStringForUser(
|
||||||
|
this,
|
||||||
|
Settings.Global.ANIMATOR_DURATION_SCALE,
|
||||||
|
this.userId
|
||||||
|
)
|
||||||
|
?.toFloatOrNull()
|
||||||
|
?: 1f
|
||||||
|
return animationScale != 0f
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user