diff options
| author | George Mount <mount@google.com> | 2016-03-22 13:41:57 -0700 |
|---|---|---|
| committer | George Mount <mount@google.com> | 2016-03-22 13:41:57 -0700 |
| commit | 1349bb9c336e33bdb8a7edd3fdec9a7ecf8015d0 (patch) | |
| tree | 1618b2973cce84afaf2c78e545c9fb9b031b68d8 /core/java/android | |
| parent | 9d076242f24e2f809433d968e5f0ecc7e3eac2c5 (diff) | |
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
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/ActivityTransitionCoordinator.java | 20 | ||||
| -rw-r--r-- | core/java/android/transition/Visibility.java | 18 |
2 files changed, 35 insertions, 3 deletions
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index 198bfb0a414b..e589e7c894a3 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -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; diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java index 4eaab3748b1e..6579212ccd2c 100644 --- a/core/java/android/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -84,6 +84,7 @@ public abstract class Visibility extends Transition { } private int mMode = MODE_IN | MODE_OUT; + private boolean mSuppressLayout = true; public Visibility() {} @@ -98,6 +99,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); } |
