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

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

Don't set animation pending when gaining fake control

There are 2 cases that an insets source control doesn't have a leash:
1. The server hasn't applied the transaction of the initialization of a
   leash yet.
2. The control is a fake control. It is dispatched when the insets
   source is shown transiently by the server and we don't want the
   client to change its layout.

We should only defer the insets animation for case 1. This CL uses
the insetsHint to tell if a control is fake or not.

Fix: 227083463
Test: atest --iterations 10 OpenAppNonResizeableTest
Change-Id: I45f75d8013f5723b782857101d070729cf082166
parent 174c5ebb
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static android.view.InsetsSourceConsumerProto.IS_REQUESTED_VISIBLE;
import static android.view.InsetsSourceConsumerProto.PENDING_FRAME;
import static android.view.InsetsSourceConsumerProto.PENDING_VISIBLE_FRAME;
import static android.view.InsetsSourceConsumerProto.SOURCE_CONTROL;
import static android.view.InsetsSourceControl.INVALID_HINTS;
import static android.view.InsetsState.ITYPE_IME;
import static android.view.InsetsState.getDefaultVisibility;
import static android.view.InsetsState.toPublicType;
@@ -163,8 +164,10 @@ public class InsetsSourceConsumer {
            // We are gaining control, and need to run an animation since previous state
            // didn't match
            final boolean requestedVisible = isRequestedVisibleAwaitingControl();
            final boolean needAnimation = requestedVisible != mState.getSource(mType).isVisible();
            if (control.getLeash() != null && (needAnimation || mIsAnimationPending)) {
            final boolean fakeControl = INVALID_HINTS.equals(control.getInsetsHint());
            final boolean needsAnimation = requestedVisible != mState.getSource(mType).isVisible()
                    && !fakeControl;
            if (control.getLeash() != null && (needsAnimation || mIsAnimationPending)) {
                if (DEBUG) Log.d(TAG, String.format("Gaining control in %s, requestedVisible: %b",
                        mController.getHost().getRootViewTitle(), requestedVisible));
                if (requestedVisible) {
@@ -174,7 +177,7 @@ public class InsetsSourceConsumer {
                }
                mIsAnimationPending = false;
            } else {
                if (needAnimation) {
                if (needsAnimation) {
                    // We need animation but we haven't had a leash yet. Set this flag that when we
                    // get the leash we can play the deferred animation.
                    mIsAnimationPending = true;
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ import java.util.function.Consumer;
 */
public class InsetsSourceControl implements Parcelable {

    public static final Insets INVALID_HINTS = Insets.of(-1, -1, -1, -1);

    private final @InternalInsetsType int mType;
    private final @Nullable SurfaceControl mLeash;
    private final Point mSurfacePosition;
+1 −1
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ abstract class InsetsSourceProvider {
        mDisplayContent = displayContent;
        mStateController = stateController;
        mFakeControl = new InsetsSourceControl(
                source.getType(), null /* leash */, new Point(), Insets.NONE);
                source.getType(), null /* leash */, new Point(), InsetsSourceControl.INVALID_HINTS);
        mControllable = InsetsPolicy.isInsetsTypeControllable(source.getType());
    }