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 Original line Diff line number Diff line
@@ -189,17 +189,15 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
    final protected SharedElementListener mListener;
    final protected SharedElementListener mListener;
    protected ResultReceiver mResultReceiver;
    protected ResultReceiver mResultReceiver;
    final private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback();
    final private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback();
    final protected boolean mIsReturning;


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


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

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


    private static class FixedEpicenterCallback extends Transition.EpicenterCallback {
    private static class FixedEpicenterCallback extends Transition.EpicenterCallback {
        private Rect mEpicenter;
        private Rect mEpicenter;
+23 −1
Original line number Original line Diff line number Diff line
@@ -55,13 +55,15 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private boolean mHasStopped;
    private boolean mHasStopped;
    private Handler mHandler;
    private Handler mHandler;
    private boolean mIsCanceled;
    private boolean mIsCanceled;
    private boolean mIsReturning;


    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames,
            ArrayList<String> sharedElementNames,
            ArrayList<String> acceptedNames, ArrayList<String> mappedNames) {
            ArrayList<String> acceptedNames, ArrayList<String> mappedNames) {
        super(activity.getWindow(), sharedElementNames, acceptedNames, mappedNames,
        super(activity.getWindow(), sharedElementNames, acceptedNames, mappedNames,
                getListener(activity, acceptedNames), acceptedNames != null);
                getListener(activity, acceptedNames));
        mActivity = activity;
        mActivity = activity;
        mIsReturning = acceptedNames != null;
        setResultReceiver(resultReceiver);
        setResultReceiver(resultReceiver);
        prepareEnter();
        prepareEnter();
        Bundle resultReceiverBundle = new Bundle();
        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) {
    protected void onTakeSharedElements(Bundle sharedElementState) {
        setEpicenter();
        setEpicenter();
        // Remove rejected shared elements
        // Remove rejected shared elements
@@ -397,6 +416,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            return null;
            return null;
        }
        }
        Bundle bundle = transitionArgs.getBundle(name);
        Bundle bundle = transitionArgs.getBundle(name);
        if (bundle == null) {
            return null;
        }
        int scaleTypeInt = bundle.getInt(KEY_SCALE_TYPE, -1);
        int scaleTypeInt = bundle.getInt(KEY_SCALE_TYPE, -1);
        if (scaleTypeInt < 0) {
        if (scaleTypeInt < 0) {
            return null;
            return null;
+29 −5
Original line number Original line Diff line number Diff line
@@ -57,11 +57,13 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {


    private Handler mHandler;
    private Handler mHandler;


    private boolean mIsReturning;

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


@@ -155,8 +157,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        Transition sharedElementTransition = configureTransition(getSharedElementTransition());
        Transition sharedElementTransition = configureTransition(getSharedElementTransition());
        Transition viewsTransition = configureTransition(getViewsTransition());
        Transition viewsTransition = configureTransition(getViewsTransition());
        viewsTransition = addTargets(viewsTransition, mTransitioningViews);
        viewsTransition = addTargets(viewsTransition, mTransitioningViews);
        if (sharedElementTransition == null) {
        if (sharedElementTransition == null || mSharedElements.isEmpty()) {
            sharedElementTransitionComplete();
            sharedElementTransitionComplete();
            sharedElementTransition = null;
        } else {
        } else {
            sharedElementTransition.addListener(new Transition.TransitionListenerAdapter() {
            sharedElementTransition.addListener(new Transition.TransitionListenerAdapter() {
                @Override
                @Override
@@ -165,8 +168,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                }
                }
            });
            });
        }
        }
        if (viewsTransition == null) {
        if (viewsTransition == null || mTransitioningViews.isEmpty()) {
            exitTransitionComplete();
            exitTransitionComplete();
            viewsTransition = null;
        } else {
        } else {
            viewsTransition.addListener(new Transition.TransitionListenerAdapter() {
            viewsTransition.addListener(new Transition.TransitionListenerAdapter() {
                @Override
                @Override
@@ -178,6 +182,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {


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


    private void exitTransitionComplete() {
    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
     * Captures placement information for Views with a shared element name for
     * Activity Transitions.
     * Activity Transitions.