Merge "Update the surface position of each control in insets animation" into sc-dev

This commit is contained in:
Tiger Huang
2021-05-31 14:07:04 +00:00
committed by Android (Google) Code Review
4 changed files with 45 additions and 1 deletions

View File

@@ -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;
@@ -203,6 +204,19 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
mControllingTypes &= ~types;
}
@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;

View File

@@ -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;
@@ -44,6 +45,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.
*/

View File

@@ -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,10 +153,21 @@ 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() {

View File

@@ -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();