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

Commit 1349bb9c authored by George Mount's avatar George Mount
Browse files

Disable suppressLayout in Visibility Activity Transitoins.

Bug 27389255

In Idf21542464a13bac7b4d4a17f6b9303f68d550c3, I had removed
a suppressLayout check from forced visibility. Unfortunately,
when the transition ends, it calls layout if there was a
requestLayout during the transition. This prevents the
suppression at the level of the individual views so that it
can be handled at the decor View level as it was before.

Change-Id: I0f016e6356fd1ceff705b122a6b4ac3f3f09600d
parent 9d076242
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.Parcelable;
import android.os.ResultReceiver;
import android.transition.Transition;
import android.transition.TransitionSet;
import android.transition.Visibility;
import android.util.ArrayMap;
import android.view.GhostView;
import android.view.View;
@@ -378,6 +379,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
            transition.setEpicenterCallback(mEpicenterCallback);
            transition = setTargets(transition, includeTransitioningViews);
        }
        noLayoutSuppressionForVisibilityTransitions(transition);
        return transition;
    }

@@ -944,6 +946,24 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        }
    }

    /**
     * Blocks suppressLayout from Visibility transitions. It is ok to suppress the layout,
     * but we don't want to force the layout when suppressLayout becomes false. This leads
     * to visual glitches.
     */
    private static void noLayoutSuppressionForVisibilityTransitions(Transition transition) {
        if (transition instanceof Visibility) {
            final Visibility visibility = (Visibility) transition;
            visibility.setSuppressLayout(false);
        } else if (transition instanceof TransitionSet) {
            final TransitionSet set = (TransitionSet) transition;
            final int count = set.getTransitionCount();
            for (int i = 0; i < count; i++) {
                noLayoutSuppressionForVisibilityTransitions(set.getTransitionAt(i));
            }
        }
    }

    private static class FixedEpicenterCallback extends Transition.EpicenterCallback {
        private Rect mEpicenter;

+15 −3
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ public abstract class Visibility extends Transition {
    }

    private int mMode = MODE_IN | MODE_OUT;
    private boolean mSuppressLayout = true;

    public Visibility() {}

@@ -97,6 +98,15 @@ public abstract class Visibility extends Transition {
        }
    }

    /**
     * This tells the Visibility transition to suppress layout during the transition and release
     * the suppression after the transition.
     * @hide
     */
    public void setSuppressLayout(boolean suppress) {
        this.mSuppressLayout = suppress;
    }

    /**
     * Changes the transition to support appearing and/or disappearing Views, depending
     * on <code>mode</code>.
@@ -428,7 +438,7 @@ public abstract class Visibility extends Transition {
            Animator animator = onDisappear(sceneRoot, viewToKeep, startValues, endValues);
            if (animator != null) {
                DisappearListener disappearListener = new DisappearListener(viewToKeep,
                        finalVisibility);
                        finalVisibility, mSuppressLayout);
                animator.addListener(disappearListener);
                animator.addPauseListener(disappearListener);
                addListener(disappearListener);
@@ -483,14 +493,16 @@ public abstract class Visibility extends Transition {
        private final View mView;
        private final int mFinalVisibility;
        private final ViewGroup mParent;
        private final boolean mSuppressLayout;

        private boolean mLayoutSuppressed;
        boolean mCanceled = false;

        public DisappearListener(View view, int finalVisibility) {
        public DisappearListener(View view, int finalVisibility, boolean suppressLayout) {
            this.mView = view;
            this.mFinalVisibility = finalVisibility;
            this.mParent = (ViewGroup) view.getParent();
            this.mSuppressLayout = suppressLayout;
            // Prevent a layout from including mView in its calculation.
            suppressLayout(true);
        }
@@ -555,7 +567,7 @@ public abstract class Visibility extends Transition {
        }

        private void suppressLayout(boolean suppress) {
            if (mLayoutSuppressed != suppress && mParent != null) {
            if (mSuppressLayout && mLayoutSuppressed != suppress && mParent != null) {
                mLayoutSuppressed = suppress;
                mParent.suppressLayout(suppress);
            }