Merge "Activity Transition: fix quick back after enter." into lmp-mr1-dev

This commit is contained in:
George Mount
2015-01-27 15:13:29 +00:00
committed by Android (Google) Code Review
3 changed files with 37 additions and 5 deletions

View File

@@ -799,6 +799,15 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
mIsStartingTransition = false; mIsStartingTransition = false;
} }
/**
* Cancels any pending transitions and returns true if there is a transition is in
* the middle of starting.
*/
protected boolean cancelPendingTransitions() {
mPendingTransition = null;
return mIsStartingTransition;
}
protected void moveSharedElementsToOverlay() { protected void moveSharedElementsToOverlay() {
if (mWindow == null || !mWindow.getSharedElementsUseOverlay()) { if (mWindow == null || !mWindow.getSharedElementsUseOverlay()) {
return; return;

View File

@@ -22,6 +22,7 @@ import android.util.ArrayMap;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window; import android.view.Window;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@@ -252,7 +253,7 @@ class ActivityTransitionState {
} }
} }
public boolean startExitBackTransition(Activity activity) { public boolean startExitBackTransition(final Activity activity) {
if (mEnteringNames == null) { if (mEnteringNames == null) {
return false; return false;
} else { } else {
@@ -260,10 +261,11 @@ class ActivityTransitionState {
mHasExited = true; mHasExited = true;
Transition enterViewsTransition = null; Transition enterViewsTransition = null;
ViewGroup decor = null; ViewGroup decor = null;
boolean delayExitBack = false;
if (mEnterTransitionCoordinator != null) { if (mEnterTransitionCoordinator != null) {
enterViewsTransition = mEnterTransitionCoordinator.getEnterViewsTransition(); enterViewsTransition = mEnterTransitionCoordinator.getEnterViewsTransition();
decor = mEnterTransitionCoordinator.getDecor(); decor = mEnterTransitionCoordinator.getDecor();
mEnterTransitionCoordinator.cancelEnter(); delayExitBack = mEnterTransitionCoordinator.cancelEnter();
mEnterTransitionCoordinator = null; mEnterTransitionCoordinator = null;
if (enterViewsTransition != null && decor != null) { if (enterViewsTransition != null && decor != null) {
enterViewsTransition.pause(decor); enterViewsTransition.pause(decor);
@@ -275,8 +277,24 @@ class ActivityTransitionState {
if (enterViewsTransition != null && decor != null) { if (enterViewsTransition != null && decor != null) {
enterViewsTransition.resume(decor); enterViewsTransition.resume(decor);
} }
if (delayExitBack && decor != null) {
final ViewGroup finalDecor = decor;
decor.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
finalDecor.getViewTreeObserver().removeOnPreDrawListener(this);
if (mReturnExitCoordinator != null) {
mReturnExitCoordinator.startExit(activity.mResultCode,
activity.mResultData);
}
return true;
}
});
} else {
mReturnExitCoordinator.startExit(activity.mResultCode, activity.mResultData); mReturnExitCoordinator.startExit(activity.mResultCode, activity.mResultData);
} }
}
return true; return true;
} }
} }

View File

@@ -18,7 +18,6 @@ package android.app;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.ResultReceiver; import android.os.ResultReceiver;
@@ -565,7 +564,12 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
clearState(); clearState();
} }
public void cancelEnter() { /**
* Cancels the enter transition.
* @return True if the enter transition is still pending capturing the target state. If so,
* any transition started on the decor will do nothing.
*/
public boolean cancelEnter() {
setGhostVisibility(View.INVISIBLE); setGhostVisibility(View.INVISIBLE);
mHasStopped = true; mHasStopped = true;
mIsCanceled = true; mIsCanceled = true;
@@ -576,6 +580,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
} }
mActivity = null; mActivity = null;
clearState(); clearState();
return super.cancelPendingTransitions();
} }
private void makeOpaque() { private void makeOpaque() {