summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/InsetsAnimationControlImpl.java14
-rw-r--r--core/java/android/view/InsetsAnimationControlRunner.java8
-rw-r--r--core/java/android/view/InsetsAnimationThreadControlRunner.java18
-rw-r--r--core/java/android/view/InsetsController.java6
4 files changed, 45 insertions, 1 deletions
diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java
index b3caac07aa61..17b3020001d4 100644
--- a/core/java/android/view/InsetsAnimationControlImpl.java
+++ b/core/java/android/view/InsetsAnimationControlImpl.java
@@ -44,6 +44,7 @@ import android.annotation.Nullable;
import android.content.res.CompatibilityInfo;
import android.graphics.Insets;
import android.graphics.Matrix;
+import android.graphics.Point;
import android.graphics.Rect;
import android.util.ArraySet;
import android.util.Log;
@@ -204,6 +205,19 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
}
@Override
+ public void updateSurfacePosition(SparseArray<InsetsSourceControl> controls) {
+ for (int i = controls.size() - 1; i >= 0; i--) {
+ final InsetsSourceControl control = controls.valueAt(i);
+ final InsetsSourceControl c = mControls.get(control.getType());
+ if (c == null) {
+ continue;
+ }
+ final Point position = control.getSurfacePosition();
+ c.setSurfacePosition(position.x, position.y);
+ }
+ }
+
+ @Override
public @AnimationType int getAnimationType() {
return mAnimationType;
}
diff --git a/core/java/android/view/InsetsAnimationControlRunner.java b/core/java/android/view/InsetsAnimationControlRunner.java
index 7787af5e133b..1cb00e3ae7af 100644
--- a/core/java/android/view/InsetsAnimationControlRunner.java
+++ b/core/java/android/view/InsetsAnimationControlRunner.java
@@ -16,6 +16,7 @@
package android.view;
+import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.view.InsetsController.AnimationType;
import android.view.InsetsState.InternalInsetsType;
@@ -45,6 +46,13 @@ public interface InsetsAnimationControlRunner {
void notifyControlRevoked(@InsetsType int types);
/**
+ * Updates the surface positions of the controls owned by this runner if there is any.
+ *
+ * @param controls An array of {@link InsetsSourceControl} that the caller newly receives.
+ */
+ void updateSurfacePosition(SparseArray<InsetsSourceControl> controls);
+
+ /**
* Cancels the animation.
*/
void cancel();
diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java
index c6ebc9e52e84..691e638f3669 100644
--- a/core/java/android/view/InsetsAnimationThreadControlRunner.java
+++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java
@@ -62,7 +62,12 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro
@Override
public void scheduleApplyChangeInsets(InsetsAnimationControlRunner runner) {
- mControl.applyChangeInsets(null /* outState */);
+ synchronized (mControl) {
+ // This reads the surface position on the animation thread, but the surface position
+ // would be updated on the UI thread, so we need this critical section.
+ // See: updateSurfacePosition.
+ mControl.applyChangeInsets(null /* outState */);
+ }
}
@Override
@@ -148,12 +153,23 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro
}
@Override
+ @UiThread
public void notifyControlRevoked(@InsetsType int types) {
mControl.notifyControlRevoked(types);
}
@Override
@UiThread
+ public void updateSurfacePosition(SparseArray<InsetsSourceControl> controls) {
+ synchronized (mControl) {
+ // This is called from the UI thread, however, the surface position will be used on the
+ // animation thread, so we need this critical section. See: scheduleApplyChangeInsets.
+ mControl.updateSurfacePosition(controls);
+ }
+ }
+
+ @Override
+ @UiThread
public void cancel() {
InsetsAnimationThread.getHandler().post(mControl::cancel);
}
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index d339c0471125..8080883c2b3e 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -829,7 +829,13 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
requestedStateStale = requestedVisibilityChanged || imeRequestedVisible;
}
+ }
+ if (mTmpControlArray.size() > 0) {
+ // Update surface positions for animations.
+ for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
+ mRunningAnimations.get(i).runner.updateSurfacePosition(mTmpControlArray);
+ }
}
mTmpControlArray.clear();