From 629767288a7f551d651f0405fdd9ed04e807d56b Mon Sep 17 00:00:00 2001 From: George Mount Date: Thu, 4 Feb 2016 16:45:53 -0800 Subject: [PATCH] Don't use forceVisibility for Activity Transitions. Bug 22291911 Forced visibility for transitions was introduced to make Activity Transitions force going from INVISIBLE to VISIBLE without triggering focus changes. setTransitionVisibility was later introduced and now allows us to use visibility without triggering focus changes. Change-Id: Idf21542464a13bac7b4d4a17f6b9303f68d550c3 --- .../app/ActivityTransitionCoordinator.java | 11 +++ .../app/EnterTransitionCoordinator.java | 13 ++-- .../app/ExitTransitionCoordinator.java | 23 +++---- core/java/android/transition/Transition.java | 3 - .../android/transition/TransitionSet.java | 9 --- core/java/android/transition/Visibility.java | 69 +++++-------------- 6 files changed, 46 insertions(+), 82 deletions(-) diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index af840d0760e4d..198bfb0a414b4 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -933,6 +933,17 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { return -1; } + protected void setTransitioningViewsVisiblity(int visiblity, boolean invalidate) { + final int numElements = mTransitioningViews == null ? 0 : mTransitioningViews.size(); + for (int i = 0; i < numElements; i++) { + final View view = mTransitioningViews.get(i); + view.setTransitionVisibility(visiblity); + if (invalidate) { + view.invalidate(); + } + } + } + private static class FixedEpicenterCallback extends Transition.EpicenterCallback { private Rect mEpicenter; diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index fe9cc80552627..ddd0ae90fc5cb 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -263,6 +263,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { mViewsReadyListener = null; } showViews(mTransitioningViews, true); + setTransitioningViewsVisiblity(View.VISIBLE, true); mSharedElements.clear(); mAllSharedElementNames.clear(); mTransitioningViews.clear(); @@ -280,6 +281,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { if (!mIsViewsTransitionStarted) { mIsViewsTransitionStarted = true; showViews(mTransitioningViews, true); + setTransitioningViewsVisiblity(View.VISIBLE, true); mTransitioningViews.clear(); viewsTransitionComplete(); } @@ -506,7 +508,6 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { if (viewsTransition == null) { viewsTransitionComplete(); } else { - viewsTransition.forceVisibility(View.INVISIBLE, true); final ArrayList transitioningViews = mTransitioningViews; viewsTransition.addListener(new ContinueTransitionListener() { @Override @@ -532,12 +533,15 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { Transition transition = mergeTransitions(sharedElementTransition, viewsTransition); if (transition != null) { transition.addListener(new ContinueTransitionListener()); + if (startEnterTransition) { + setTransitioningViewsVisiblity(View.INVISIBLE, false); + } TransitionManager.beginDelayedTransition(decorView, transition); if (startSharedElementTransition && !mSharedElementNames.isEmpty()) { mSharedElements.get(0).invalidate(); - } else if (startEnterTransition && mTransitioningViews != null && - !mTransitioningViews.isEmpty()) { - mTransitioningViews.get(0).invalidate(); + } + if (startEnterTransition) { + setTransitioningViewsVisiblity(View.VISIBLE, true); } } else { transitionStarted(); @@ -613,6 +617,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { moveSharedElementsFromOverlay(); if (mTransitioningViews != null) { showViews(mTransitioningViews, true); + setTransitioningViewsVisiblity(View.VISIBLE, true); } showViews(mSharedElements, true); clearState(); diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index e93b40ed7210b..d54ffa0b23f91 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -48,27 +48,16 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { private static final long MAX_WAIT_MS = 1000; private Bundle mSharedElementBundle; - private boolean mExitNotified; - private boolean mSharedElementNotified; - private Activity mActivity; - private boolean mIsBackgroundReady; - private boolean mIsCanceled; - private Handler mHandler; - private ObjectAnimator mBackgroundAnimator; - private boolean mIsHidden; - private Bundle mExitSharedElementBundle; - private boolean mIsExitStarted; - private boolean mSharedElementsHidden; public ExitTransitionCoordinator(Activity activity, ArrayList names, @@ -129,6 +118,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { public void resetViews() { if (mTransitioningViews != null) { showViews(mTransitioningViews, true); + setTransitioningViewsVisiblity(View.VISIBLE, true); } showViews(mSharedElements, true); mIsHidden = true; @@ -276,8 +266,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { Transition transition = getExitTransition(); ViewGroup decorView = getDecor(); if (transition != null && decorView != null && mTransitioningViews != null) { + setTransitioningViewsVisiblity(View.VISIBLE, false); TransitionManager.beginDelayedTransition(decorView, transition); - mTransitioningViews.get(0).invalidate(); + setTransitioningViewsVisiblity(View.INVISIBLE, true); } else { transitionStarted(); } @@ -325,6 +316,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { viewsTransitionComplete(); if (mIsHidden && transitioningViews != null) { showViews(transitioningViews, true); + setTransitioningViewsVisiblity(View.VISIBLE, true); } if (mSharedElementBundle != null) { delayCancel(); @@ -332,7 +324,6 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { super.onTransitionEnd(transition); } }); - viewsTransition.forceVisibility(View.INVISIBLE, false); } return viewsTransition; } @@ -369,9 +360,15 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { if (transition != null && decorView != null) { setGhostVisibility(View.INVISIBLE); scheduleGhostVisibilityChange(View.INVISIBLE); + if (viewsTransition != null) { + setTransitioningViewsVisiblity(View.VISIBLE, false); + } TransitionManager.beginDelayedTransition(decorView, transition); scheduleGhostVisibilityChange(View.VISIBLE); setGhostVisibility(View.VISIBLE); + if (viewsTransition != null) { + setTransitioningViewsVisiblity(View.INVISIBLE, true); + } decorView.invalidate(); } else { transitionStarted(); diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java index 48614c0c10143..4afa9fef99120 100644 --- a/core/java/android/transition/Transition.java +++ b/core/java/android/transition/Transition.java @@ -2191,9 +2191,6 @@ public abstract class Transition implements Cloneable { return mNameOverrides; } - /** @hide */ - public void forceVisibility(int visibility, boolean isStartValue) {} - @Override public String toString() { return toString(""); diff --git a/core/java/android/transition/TransitionSet.java b/core/java/android/transition/TransitionSet.java index 09d2c69138beb..2f4ac95f97486 100644 --- a/core/java/android/transition/TransitionSet.java +++ b/core/java/android/transition/TransitionSet.java @@ -318,15 +318,6 @@ public class TransitionSet extends Transition { } } - /** @hide */ - @Override - public void forceVisibility(int visibility, boolean isStartValue) { - int numTransitions = mTransitions.size(); - for (int i = 0; i < numTransitions; i++) { - mTransitions.get(i).forceVisibility(visibility, isStartValue); - } - } - /** * Removes the specified child transition from this set. * diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java index eb95a02dd75bd..4eaab3748b1ed 100644 --- a/core/java/android/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -85,9 +85,6 @@ public abstract class Visibility extends Transition { private int mMode = MODE_IN | MODE_OUT; - private int mForcedStartVisibility = -1; - private int mForcedEndVisibility = -1; - public Visibility() {} public Visibility(Context context, AttributeSet attrs) { @@ -132,13 +129,8 @@ public abstract class Visibility extends Transition { return sTransitionProperties; } - private void captureValues(TransitionValues transitionValues, int forcedVisibility) { - int visibility; - if (forcedVisibility != -1) { - visibility = forcedVisibility; - } else { - visibility = transitionValues.view.getVisibility(); - } + private void captureValues(TransitionValues transitionValues) { + int visibility = transitionValues.view.getVisibility(); transitionValues.values.put(PROPNAME_VISIBILITY, visibility); transitionValues.values.put(PROPNAME_PARENT, transitionValues.view.getParent()); int[] loc = new int[2]; @@ -148,22 +140,12 @@ public abstract class Visibility extends Transition { @Override public void captureStartValues(TransitionValues transitionValues) { - captureValues(transitionValues, mForcedStartVisibility); + captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { - captureValues(transitionValues, mForcedEndVisibility); - } - - /** @hide */ - @Override - public void forceVisibility(int visibility, boolean isStartValue) { - if (isStartValue) { - mForcedStartVisibility = visibility; - } else { - mForcedEndVisibility = visibility; - } + captureValues(transitionValues); } /** @@ -298,12 +280,6 @@ public abstract class Visibility extends Transition { return null; } } - final boolean isForcedVisibility = mForcedStartVisibility != -1 || - mForcedEndVisibility != -1; - if (isForcedVisibility) { - // Make sure that we reverse the effect of onDisappear's setTransitionAlpha(0) - endValues.view.setTransitionAlpha(1); - } return onAppear(sceneRoot, endValues.view, startValues, endValues); } @@ -447,21 +423,16 @@ public abstract class Visibility extends Transition { } if (viewToKeep != null) { - int originalVisibility = -1; - final boolean isForcedVisibility = mForcedStartVisibility != -1 || - mForcedEndVisibility != -1; - if (!isForcedVisibility) { - originalVisibility = viewToKeep.getVisibility(); - viewToKeep.setTransitionVisibility(View.VISIBLE); - } + int originalVisibility = viewToKeep.getVisibility(); + viewToKeep.setTransitionVisibility(View.VISIBLE); Animator animator = onDisappear(sceneRoot, viewToKeep, startValues, endValues); if (animator != null) { DisappearListener disappearListener = new DisappearListener(viewToKeep, - finalVisibility, isForcedVisibility); + finalVisibility); animator.addListener(disappearListener); animator.addPauseListener(disappearListener); addListener(disappearListener); - } else if (!isForcedVisibility) { + } else { viewToKeep.setTransitionVisibility(originalVisibility); } return animator; @@ -509,18 +480,15 @@ public abstract class Visibility extends Transition { private static class DisappearListener extends TransitionListenerAdapter implements AnimatorListener, AnimatorPauseListener { - private final boolean mIsForcedVisibility; private final View mView; private final int mFinalVisibility; private final ViewGroup mParent; private boolean mLayoutSuppressed; - private boolean mFinalVisibilitySet = false; boolean mCanceled = false; - public DisappearListener(View view, int finalVisibility, boolean isForcedVisibility) { + public DisappearListener(View view, int finalVisibility) { this.mView = view; - this.mIsForcedVisibility = isForcedVisibility; this.mFinalVisibility = finalVisibility; this.mParent = (ViewGroup) view.getParent(); // Prevent a layout from including mView in its calculation. @@ -529,14 +497,14 @@ public abstract class Visibility extends Transition { @Override public void onAnimationPause(Animator animation) { - if (!mCanceled && !mIsForcedVisibility) { + if (!mCanceled) { mView.setTransitionVisibility(mFinalVisibility); } } @Override public void onAnimationResume(Animator animation) { - if (!mCanceled && !mIsForcedVisibility) { + if (!mCanceled) { mView.setTransitionVisibility(View.VISIBLE); } } @@ -576,15 +544,10 @@ public abstract class Visibility extends Transition { private void hideViewWhenNotCanceled() { if (!mCanceled) { - if (mIsForcedVisibility) { - mView.setTransitionAlpha(0); - } else if (!mFinalVisibilitySet) { - // Recreate the parent's display list in case it includes mView. - mView.setTransitionVisibility(mFinalVisibility); - if (mParent != null) { - mParent.invalidate(); - } - mFinalVisibilitySet = true; + // Recreate the parent's display list in case it includes mView. + mView.setTransitionVisibility(mFinalVisibility); + if (mParent != null) { + mParent.invalidate(); } } // Layout is allowed now that the View is in its final state @@ -592,7 +555,7 @@ public abstract class Visibility extends Transition { } private void suppressLayout(boolean suppress) { - if (mLayoutSuppressed != suppress && mParent != null && !mIsForcedVisibility) { + if (mLayoutSuppressed != suppress && mParent != null) { mLayoutSuppressed = suppress; mParent.suppressLayout(suppress); }