From a2bbbb3bac464c3a52e33008401fed4a7542744c Mon Sep 17 00:00:00 2001 From: George Mount Date: Tue, 12 Aug 2014 10:16:20 -0700 Subject: [PATCH] Don't blink in views that haven't transitioned yet. Bug 16959262 Views that hadn't animated in during the enter transition were being stripped from the exit transition. This caused them to blink in as the enter transition was canceled. This pauses the entering transition so that the view positions are properly captured for the exit transition and aren't stripped. Change-Id: I39cc94ed3bf92a51f8c5fe741f0aa5456b704bf0 --- .../android/app/ActivityTransitionCoordinator.java | 2 +- core/java/android/app/ActivityTransitionState.java | 12 ++++++++++++ .../android/app/EnterTransitionCoordinator.java | 14 +++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index f7c0d23f94943..7d2f677dbcc82 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -239,7 +239,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { return mWindow; } - protected ViewGroup getDecor() { + public ViewGroup getDecor() { return (mWindow == null) ? null : (ViewGroup) mWindow.getDecorView(); } diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java index 4f3b02c0a86e5..613e24854dbd3 100644 --- a/core/java/android/app/ActivityTransitionState.java +++ b/core/java/android/app/ActivityTransitionState.java @@ -17,9 +17,11 @@ package android.app; import android.os.Bundle; import android.os.ResultReceiver; +import android.transition.Transition; import android.util.ArrayMap; import android.util.SparseArray; import android.view.View; +import android.view.ViewGroup; import android.view.Window; import java.lang.ref.WeakReference; @@ -245,13 +247,23 @@ class ActivityTransitionState { } else { if (!mHasExited) { mHasExited = true; + Transition enterViewsTransition = null; + ViewGroup decor = null; if (mEnterTransitionCoordinator != null) { + enterViewsTransition = mEnterTransitionCoordinator.getEnterViewsTransition(); + decor = mEnterTransitionCoordinator.getDecor(); mEnterTransitionCoordinator.cancelEnter(); mEnterTransitionCoordinator = null; + if (enterViewsTransition != null && decor != null) { + enterViewsTransition.pause(decor); + } } ExitTransitionCoordinator exitCoordinator = new ExitTransitionCoordinator(activity, mEnteringNames, null, null, true); + if (enterViewsTransition != null && decor != null) { + enterViewsTransition.resume(decor); + } exitCoordinator.startExit(activity.mResultCode, activity.mResultData); } return true; diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index 54c5bc441ef54..75ecbd931b5d1 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -59,6 +59,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private boolean mIsViewsTransitionComplete; private boolean mIsSharedElementTransitionComplete; private ArrayList mSharedElementParentMatrices; + private Transition mEnterViewsTransition; public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, ArrayList sharedElementNames, boolean isReturning) { @@ -104,6 +105,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { triggerViewsReady(mapNamedElements(accepted, localNames)); } + public Transition getEnterViewsTransition() { + return mEnterViewsTransition; + } + @Override protected void viewsReady(ArrayMap sharedElements) { super.viewsReady(sharedElements); @@ -399,10 +404,17 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { viewTransitionComplete(); } else { viewsTransition.forceVisibility(View.INVISIBLE, true); - setTransitionAlpha(mTransitioningViews, 1); viewsTransition.addListener(new ContinueTransitionListener() { + @Override + public void onTransitionStart(Transition transition) { + mEnterViewsTransition = transition; + setTransitionAlpha(mTransitioningViews, 1); + super.onTransitionStart(transition); + } + @Override public void onTransitionEnd(Transition transition) { + mEnterViewsTransition = null; transition.removeListener(this); viewTransitionComplete(); super.onTransitionEnd(transition);