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

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

Merge "Fix for Activity Transitions restoring views bug."

parents 2d20a4dc d7d0fb3e
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 {
            }
        });
    }

}