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

Commit e5a93aa8 authored by George Mount's avatar George Mount
Browse files

Don't cause requestLayout when transition changes Visibility.

Bug 21400515

When a Visibility transition temporarily changes a View's
visibility, it should not cause a requestLayout or any other
action, such as focus change. This adds a hidden method to
View to allow it to tweak the visibility without causing
other side-effects.

Change-Id: I5a06149983051319080130e5b5e7cc7edda8dd3e
parent 44fdcf26
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -445,7 +445,7 @@ public abstract class Visibility extends Transition {
                    mForcedEndVisibility != -1;
            if (!isForcedVisibility) {
                originalVisibility = viewToKeep.getVisibility();
                viewToKeep.setVisibility(View.VISIBLE);
                viewToKeep.setTransitionVisibility(View.VISIBLE);
            }
            Animator animator = onDisappear(sceneRoot, viewToKeep, startValues, endValues);
            if (animator != null) {
@@ -454,7 +454,7 @@ public abstract class Visibility extends Transition {
                animator.addListener(disappearListener);
                addListener(disappearListener);
            } else if (!isForcedVisibility) {
                viewToKeep.setVisibility(originalVisibility);
                viewToKeep.setTransitionVisibility(originalVisibility);
            }
            return animator;
        }
@@ -516,14 +516,14 @@ public abstract class Visibility extends Transition {
        @Override
        public void onAnimationPause(Animator animation) {
            if (!mCanceled && !mIsForcedVisibility) {
                mView.setVisibility(mFinalVisibility);
                mView.setTransitionVisibility(mFinalVisibility);
            }
        }

        @Override
        public void onAnimationResume(Animator animation) {
            if (!mCanceled && !mIsForcedVisibility) {
                mView.setVisibility(View.VISIBLE);
                mView.setTransitionVisibility(View.VISIBLE);
            }
        }

@@ -557,7 +557,7 @@ public abstract class Visibility extends Transition {
                if (mIsForcedVisibility) {
                    mView.setTransitionAlpha(0);
                } else {
                    mView.setVisibility(mFinalVisibility);
                    mView.setTransitionVisibility(mFinalVisibility);
                }
            }
        }
+3 −7
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ public class GhostView extends View {
        mView = view;
        mView.mGhostView = this;
        final ViewGroup parent = (ViewGroup) mView.getParent();
        setGhostedVisibility(View.INVISIBLE);
        mView.setTransitionVisibility(View.INVISIBLE);
        parent.invalidate();
    }

@@ -66,19 +66,15 @@ public class GhostView extends View {
        super.setVisibility(visibility);
        if (mView.mGhostView == this) {
            int inverseVisibility = (visibility == View.VISIBLE) ? View.INVISIBLE : View.VISIBLE;
            setGhostedVisibility(inverseVisibility);
            mView.setTransitionVisibility(inverseVisibility);
        }
    }

    private void setGhostedVisibility(int visibility) {
        mView.mViewFlags = (mView.mViewFlags & ~View.VISIBILITY_MASK) | visibility;
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (!mBeingMoved) {
            setGhostedVisibility(View.VISIBLE);
            mView.setTransitionVisibility(View.VISIBLE);
            mView.mGhostView = null;
            final ViewGroup parent = (ViewGroup) mView.getParent();
            if (parent != null) {
+14 −0
Original line number Diff line number Diff line
@@ -8785,6 +8785,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        }
    }
    /**
     * Change the visibility of the View without triggering any other changes. This is
     * important for transitions, where visibility changes should not adjust focus or
     * trigger a new layout. This is only used when the visibility has already been changed
     * and we need a transient value during an animation. When the animation completes,
     * the original visibility value is always restored.
     *
     * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
     * @hide
     */
    public void setTransitionVisibility(@Visibility int visibility) {
        mViewFlags = (mViewFlags & ~View.VISIBILITY_MASK) | visibility;
    }
    /**
     * Reset the flag indicating the accessibility state of the subtree rooted
     * at this view changed.