Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa6f7342 authored by Tiger Huang's avatar Tiger Huang
Browse files

Update the surface position of each control in insets animation

If the surface position is changed during the insets animation,
the surface position of the controls in the animation should be updated.
Otherwise, the cached position in the animation will overwrite the
newly-updated leash position.

Fix: 177925500
Test: Steps in the bug.
Test: 1. Open Window Insets Tests -> Window Insets Controller.
      2. Click on the [IME INVISIBLE] button.
      3. Click on the [STATUS BARS VISIBLE] button during IME animation.
      See if the position of IME (Gborad) is correct.
Change-Id: I7441426a41019996651220e86ca90dd416ef9498
parent ad1cfd0d
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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;
+8 −0
Original line number Diff line number Diff line
@@ -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.
     */
+17 −1
Original line number Diff line number Diff line
@@ -62,8 +62,13 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro

        @Override
        public void scheduleApplyChangeInsets(InsetsAnimationControlRunner runner) {
            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
        public void notifyFinished(InsetsAnimationControlRunner runner, boolean shown) {
@@ -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() {
+6 −0
Original line number Diff line number Diff line
@@ -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();