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

Commit c84947db authored by George Mount's avatar George Mount Committed by Android (Google) Code Review
Browse files

Merge changes I2da66b54,I8a65428d

* changes:
  Fix for quick "back" in Activity Transitions.
  Enter and exit transitions are inverted in calling Activity.
parents efb5d8d3 8cab50af
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1197,6 +1197,7 @@ public class Activity extends ContextThemeWrapper
    protected void onResume() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
        getApplication().dispatchActivityResumed(this);
        mActivityTransitionState.onResume();
        mCalled = true;
    }

+2 −18
Original line number Diff line number Diff line
@@ -189,17 +189,15 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
    final protected SharedElementListener mListener;
    protected ResultReceiver mResultReceiver;
    final private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback();
    final protected boolean mIsReturning;

    public ActivityTransitionCoordinator(Window window,
            ArrayList<String> allSharedElementNames,
            ArrayList<String> accepted, ArrayList<String> localNames,
            SharedElementListener listener, boolean isReturning) {
            SharedElementListener listener) {
        super(new Handler());
        mWindow = window;
        mListener = listener;
        mAllSharedElementNames = allSharedElementNames;
        mIsReturning = isReturning;
        setSharedElements(accepted, localNames);
        if (getViewsTransition() != null) {
            getDecor().captureTransitioningViews(mTransitioningViews);
@@ -332,21 +330,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        mResultReceiver = resultReceiver;
    }

    protected Transition getViewsTransition() {
        if (mIsReturning) {
            return getWindow().getExitTransition();
        } else {
            return getWindow().getEnterTransition();
        }
    }

    protected Transition getSharedElementTransition() {
        if (mIsReturning) {
            return getWindow().getSharedElementExitTransition();
        } else {
            return getWindow().getSharedElementEnterTransition();
        }
    }
    protected abstract Transition getViewsTransition();

    private static class FixedEpicenterCallback extends Transition.EpicenterCallback {
        private Rect mEpicenter;
+13 −8
Original line number Diff line number Diff line
@@ -138,10 +138,7 @@ class ActivityTransitionState {
        ArrayList<String> sharedElementNames = mEnterActivityOptions.getSharedElementNames();
        ResultReceiver resultReceiver = mEnterActivityOptions.getResultReceiver();
        if (mEnterActivityOptions.isReturning()) {
            if (mCalledActivityOptions != null) {
                mCalledActivityOptions.dispatchActivityStopped();
                mCalledActivityOptions = null;
            }
            restoreExitedViews();
            activity.getWindow().getDecorView().setVisibility(View.VISIBLE);
            mEnterTransitionCoordinator = new EnterTransitionCoordinator(activity,
                    resultReceiver, sharedElementNames, mExitingFrom, mExitingTo);
@@ -158,16 +155,24 @@ class ActivityTransitionState {
    }

    public void onStop() {
        if (mCalledActivityOptions != null) {
            mCalledActivityOptions.dispatchActivityStopped();
            mCalledActivityOptions = null;
        }
        restoreExitedViews();
        if (mEnterTransitionCoordinator != null) {
            mEnterTransitionCoordinator.stop();
            mEnterTransitionCoordinator = null;
        }
    }

    public void onResume() {
        restoreExitedViews();
    }

    private void restoreExitedViews() {
        if (mCalledActivityOptions != null) {
            mCalledActivityOptions.dispatchActivityStopped();
            mCalledActivityOptions = null;
        }
    }

    public boolean startExitBackTransition(Activity activity) {
        if (mEnteringNames == null) {
            return false;
+33 −6
Original line number Diff line number Diff line
@@ -48,20 +48,23 @@ import java.util.Collection;
class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private static final String TAG = "EnterTransitionCoordinator";

    private static final long MAX_WAIT_MS = 1500;
    private static final long MAX_WAIT_MS = 1000;

    private boolean mSharedElementTransitionStarted;
    private Activity mActivity;
    private boolean mHasStopped;
    private Handler mHandler;
    private boolean mIsCanceled;
    private boolean mIsReturning;
    private ObjectAnimator mBackgroundAnimator;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames,
            ArrayList<String> acceptedNames, ArrayList<String> mappedNames) {
        super(activity.getWindow(), sharedElementNames, acceptedNames, mappedNames,
                getListener(activity, acceptedNames), acceptedNames != null);
                getListener(activity, acceptedNames));
        mActivity = activity;
        mIsReturning = acceptedNames != null;
        setResultReceiver(resultReceiver);
        prepareEnter();
        Bundle resultReceiverBundle = new Bundle();
@@ -150,6 +153,23 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    @Override
    protected Transition getViewsTransition() {
        if (mIsReturning) {
            return getWindow().getExitTransition();
        } else {
            return getWindow().getEnterTransition();
        }
    }

    protected Transition getSharedElementTransition() {
        if (mIsReturning) {
            return getWindow().getSharedElementExitTransition();
        } else {
            return getWindow().getSharedElementEnterTransition();
        }
    }

    protected void onTakeSharedElements(Bundle sharedElementState) {
        setEpicenter();
        // Remove rejected shared elements
@@ -212,15 +232,15 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            Drawable background = getDecor().getBackground();
            if (background != null) {
                background = background.mutate();
                ObjectAnimator animator = ObjectAnimator.ofInt(background, "alpha", 255);
                animator.setDuration(FADE_BACKGROUND_DURATION_MS);
                animator.addListener(new AnimatorListenerAdapter() {
                mBackgroundAnimator = ObjectAnimator.ofInt(background, "alpha", 255);
                mBackgroundAnimator.setDuration(FADE_BACKGROUND_DURATION_MS);
                mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        makeOpaque();
                    }
                });
                animator.start();
                mBackgroundAnimator.start();
            } else if (transition != null) {
                transition.addListener(new Transition.TransitionListenerAdapter() {
                    @Override
@@ -240,6 +260,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        mActivity = null;
        mIsCanceled = true;
        mResultReceiver = null;
        if (mBackgroundAnimator != null) {
            mBackgroundAnimator.cancel();
            mBackgroundAnimator = null;
        }
    }

    private void makeOpaque() {
@@ -397,6 +421,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            return null;
        }
        Bundle bundle = transitionArgs.getBundle(name);
        if (bundle == null) {
            return null;
        }
        int scaleTypeInt = bundle.getInt(KEY_SCALE_TYPE, -1);
        if (scaleTypeInt < 0) {
            return null;
+55 −17
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -39,7 +40,7 @@ import java.util.ArrayList;
 */
class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    private static final String TAG = "ExitTransitionCoordinator";
    private static final long MAX_WAIT_MS = 1500;
    private static final long MAX_WAIT_MS = 1000;

    private boolean mExitComplete;

@@ -57,11 +58,17 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private Handler mHandler;

    private boolean mIsReturning;

    private ObjectAnimator mBackgroundAnimator;

    private boolean mIsHidden;

    public ExitTransitionCoordinator(Activity activity, ArrayList<String> names,
            ArrayList<String> accepted, ArrayList<String> mapped, boolean isReturning) {
        super(activity.getWindow(), names, accepted, mapped, getListener(activity, isReturning),
                isReturning);
        mIsBackgroundReady = !mIsReturning;
        super(activity.getWindow(), names, accepted, mapped, getListener(activity, isReturning));
        mIsReturning = isReturning;
        mIsBackgroundReady = !isReturning;
        mActivity = activity;
    }

@@ -95,6 +102,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
            case MSG_ACTIVITY_STOPPED:
                setViewVisibility(mTransitioningViews, View.VISIBLE);
                setViewVisibility(mSharedElements, View.VISIBLE);
                mIsHidden = true;
                break;
        }
    }
@@ -138,25 +146,31 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    private void fadeOutBackground() {
        ObjectAnimator animator = ObjectAnimator.ofInt(getDecor().getBackground(),
                "alpha", 0);
        animator.addListener(new AnimatorListenerAdapter() {
        if (mBackgroundAnimator == null) {
            Drawable background = getDecor().getBackground();
            mBackgroundAnimator = ObjectAnimator.ofInt(background, "alpha", 0);
            mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mBackgroundAnimator = null;
                    if (!mIsCanceled) {
                        mIsBackgroundReady = true;
                        notifyComplete();
                    }
                }
            });
        animator.setDuration(FADE_BACKGROUND_DURATION_MS);
        animator.start();
            mBackgroundAnimator.setDuration(FADE_BACKGROUND_DURATION_MS);
            mBackgroundAnimator.start();
        }
    }

    private void beginTransition() {
        Transition sharedElementTransition = configureTransition(getSharedElementTransition());
        Transition viewsTransition = configureTransition(getViewsTransition());
        viewsTransition = addTargets(viewsTransition, mTransitioningViews);
        if (sharedElementTransition == null) {
        if (sharedElementTransition == null || mSharedElements.isEmpty()) {
            sharedElementTransitionComplete();
            sharedElementTransition = null;
        } else {
            sharedElementTransition.addListener(new Transition.TransitionListenerAdapter() {
                @Override
@@ -165,19 +179,26 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                }
            });
        }
        if (viewsTransition == null) {
        if (viewsTransition == null || mTransitioningViews.isEmpty()) {
            exitTransitionComplete();
            viewsTransition = null;
        } else {
            viewsTransition.addListener(new Transition.TransitionListenerAdapter() {
                @Override
                public void onTransitionEnd(Transition transition) {
                    exitTransitionComplete();
                    if (mIsHidden) {
                        setViewVisibility(mTransitioningViews, View.VISIBLE);
                    }
                }
            });
        }

        Transition transition = mergeTransitions(sharedElementTransition, viewsTransition);
        TransitionManager.beginDelayedTransition(getDecor(), transition);
        if (viewsTransition == null && sharedElementTransition != null) {
            mSharedElements.get(0).requestLayout();
        }
    }

    private void exitTransitionComplete() {
@@ -220,6 +241,23 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    @Override
    protected Transition getViewsTransition() {
        if (mIsReturning) {
            return getWindow().getEnterTransition();
        } else {
            return getWindow().getExitTransition();
        }
    }

    protected Transition getSharedElementTransition() {
        if (mIsReturning) {
            return getWindow().getSharedElementEnterTransition();
        } else {
            return getWindow().getSharedElementExitTransition();
        }
    }

    /**
     * Captures placement information for Views with a shared element name for
     * Activity Transitions.
Loading