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:
Nick Chameyev
2022-11-18 11:36:20 +00:00
committed by Automerger Merge Worker
3 changed files with 53 additions and 34 deletions

View File

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

View File

@@ -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,30 +38,25 @@ 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)
@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 =
1f if (enabled) {
} else { 1f
0f } else {
} 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)
} }
} }

View File

@@ -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
}
}
} }