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

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

Fix for Activity Transitions restoring views bug.

Bug 26426496

When finish() came immediately after finishAfterTransition(),
the Views of the reentering Activity would not be restored
properly. This forces the entering Views to show if they
aren't already transitioning in.

Change-Id: If3ab37be8eb5dd3d7649db75385adb9fa214cb4c
parent 587c19c9
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ class ActivityTransitionState {
    }

    private void startEnter() {
        if (mEnterActivityOptions.isReturning()) {
        if (mEnterTransitionCoordinator.isReturning()) {
            if (mExitingToView != null) {
                mEnterTransitionCoordinator.viewInstancesReady(mExitingFrom, mExitingTo,
                        mExitingToView);
@@ -238,6 +238,7 @@ class ActivityTransitionState {

    public void onResume() {
        restoreExitedViews();
        restoreReenteringViews();
    }

    public void clear() {
@@ -258,6 +259,15 @@ class ActivityTransitionState {
        }
    }

    private void restoreReenteringViews() {
        if (mEnterTransitionCoordinator != null && mEnterTransitionCoordinator.isReturning()) {
            mEnterTransitionCoordinator.forceViewsToAppear();
            mExitingFrom = null;
            mExitingTo = null;
            mExitingToView = null;
        }
    }

    public boolean startExitBackTransition(final Activity activity) {
        if (mEnteringNames == null) {
            return false;
+56 −10
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroupOverlay;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.view.Window;
import android.view.accessibility.AccessibilityEvent;

@@ -57,6 +58,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private boolean mAreViewsReady;
    private boolean mIsViewsTransitionStarted;
    private Transition mEnterViewsTransition;
    private OnPreDrawListener mViewsReadyListener;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames, boolean isReturning) {
@@ -138,15 +140,16 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                (sharedElements.isEmpty() || !sharedElements.valueAt(0).isLayoutRequested()))) {
            viewsReady(sharedElements);
        } else {
            decor.getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            mViewsReadyListener = new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    mViewsReadyListener = null;
                    decor.getViewTreeObserver().removeOnPreDrawListener(this);
                    viewsReady(sharedElements);
                    return true;
                }
                    });
            };
            decor.getViewTreeObserver().addOnPreDrawListener(mViewsReadyListener);
        }
    }

@@ -241,6 +244,50 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    /**
     * This is called onResume. If an Activity is resuming and the transitions
     * haven't started yet, force the views to appear. This is likely to be
     * caused by the top Activity finishing before the transitions started.
     * In that case, we can finish any transition that was started, but we
     * should cancel any pending transition and just bring those Views visible.
     */
    public void forceViewsToAppear() {
        if (!mIsReturning) {
            return;
        }
        if (!mIsReadyForTransition) {
            mIsReadyForTransition = true;
            final ViewGroup decor = getDecor();
            if (decor != null && mViewsReadyListener != null) {
                decor.getViewTreeObserver().removeOnPreDrawListener(mViewsReadyListener);
                mViewsReadyListener = null;
            }
            showViews(mTransitioningViews, true);
            mSharedElements.clear();
            mAllSharedElementNames.clear();
            mTransitioningViews.clear();
            mIsReadyForTransition = true;
            viewsTransitionComplete();
            sharedElementTransitionComplete();
        } else {
            if (!mSharedElementTransitionStarted) {
                moveSharedElementsFromOverlay();
                mSharedElementTransitionStarted = true;
                showViews(mSharedElements, true);
                mSharedElements.clear();
                sharedElementTransitionComplete();
            }
            if (!mIsViewsTransitionStarted) {
                mIsViewsTransitionStarted = true;
                showViews(mTransitioningViews, true);
                mTransitioningViews.clear();
                viewsTransitionComplete();
            }
            cancelPendingTransitions();
        }
        mAreViewsReady = true;
    }

    private void cancel() {
        if (!mIsCanceled) {
            mIsCanceled = true;
@@ -659,5 +706,4 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            }
        });
    }

}