Merge "[Unfold animation] Do not animate first progress value in remote provider" into udc-dev
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt
index f14009aa..70eadce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt
@@ -39,16 +39,36 @@
     }
 
     @Test
-    fun onTransitionProgress_withInterval_propagated() {
-        runOnMainThreadWithInterval(
-            { progressProvider.onTransitionStarted() },
-            { progressProvider.onTransitionProgress(0.5f) }
-        )
+    fun onTransitionProgress_firstProgressEvent_propagatedImmediately() {
+        progressProvider.onTransitionStarted()
+        progressProvider.onTransitionProgress(0.5f)
 
         listener.assertLastProgress(0.5f)
     }
 
     @Test
+    fun onTransitionProgress_secondProgressEvent_isNotPropagatedImmediately() =
+        InstrumentationRegistry.getInstrumentation().runOnMainSync {
+            progressProvider.onTransitionStarted()
+            progressProvider.onTransitionProgress(0.5f)
+            progressProvider.onTransitionProgress(0.8f)
+
+            // 0.8f should be set only later, after the animation
+            listener.assertLastProgress(0.5f)
+        }
+
+    @Test
+    fun onTransitionProgress_severalProgressEventsWithInterval_propagated() {
+        runOnMainThreadWithInterval(
+            { progressProvider.onTransitionStarted() },
+            { progressProvider.onTransitionProgress(0.5f) },
+            { progressProvider.onTransitionProgress(0.8f) }
+        )
+
+        listener.assertLastProgress(0.8f)
+    }
+
+    @Test
     fun onTransitionEnded_propagated() {
         runOnMainThreadWithInterval(
             { progressProvider.onTransitionStarted() },
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt
index 3041888..843cc3b 100644
--- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt
@@ -34,6 +34,7 @@
         }
 
     private var inProgress = false
+    private var receivedProgressEvent = false
 
     private var processedProgress: Float = 1.0f
         set(newProgress) {
@@ -54,7 +55,16 @@
     override fun onTransitionProgress(progress: Float) {
         logCounter({ "$TAG#plain_remote_progress" }, progress)
         if (inProgress) {
-            springAnimation.animateToFinalPosition(progress)
+            if (receivedProgressEvent) {
+                // We have received at least one progress event, animate from the previous
+                // progress to the current
+                springAnimation.animateToFinalPosition(progress)
+            } else {
+                // This is the first progress event after starting the animation, send it
+                // straightaway and set the spring value without animating it
+                processedProgress = progress
+                receivedProgressEvent = true
+            }
         } else {
             Log.e(TAG, "Progress received while not in progress.")
         }
@@ -62,6 +72,7 @@
 
     override fun onTransitionFinished() {
         inProgress = false
+        receivedProgressEvent = false
         listener.onTransitionFinished()
     }