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

Commit a712e8cc authored by George Mount's avatar George Mount
Browse files

Enter and exit transitions are inverted in calling Activity.

Bug 15115028

Also fixes NPE when there is shared element name mismatch.

Change-Id: I8a65428d4b215ada532e98a555649c2e046de5ef
parent 646b1db4
Loading
Loading
Loading
Loading
+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;
+23 −1
Original line number Diff line number Diff line
@@ -55,13 +55,15 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private boolean mHasStopped;
    private Handler mHandler;
    private boolean mIsCanceled;
    private boolean mIsReturning;

    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 +152,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
@@ -397,6 +416,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;
+29 −5
Original line number Diff line number Diff line
@@ -57,11 +57,13 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private Handler mHandler;

    private boolean mIsReturning;

    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;
    }

@@ -155,8 +157,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        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,8 +168,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                }
            });
        }
        if (viewsTransition == null) {
        if (viewsTransition == null || mTransitioningViews.isEmpty()) {
            exitTransitionComplete();
            viewsTransition = null;
        } else {
            viewsTransition.addListener(new Transition.TransitionListenerAdapter() {
                @Override
@@ -178,6 +182,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

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

    private void exitTransitionComplete() {
@@ -220,6 +227,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.