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

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

Don't blink in views that haven't transitioned yet.

Bug 16959262

Views that hadn't animated in during the enter transition were
being stripped from the exit transition. This caused them to
blink in as the enter transition was canceled.

This pauses the entering transition so that the view positions
are properly captured for the exit transition and aren't stripped.

Change-Id: I39cc94ed3bf92a51f8c5fe741f0aa5456b704bf0
parent a5e2e5e4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        return mWindow;
    }

    protected ViewGroup getDecor() {
    public ViewGroup getDecor() {
        return (mWindow == null) ? null : (ViewGroup) mWindow.getDecorView();
    }

+12 −0
Original line number Diff line number Diff line
@@ -17,9 +17,11 @@ package android.app;

import android.os.Bundle;
import android.os.ResultReceiver;
import android.transition.Transition;
import android.util.ArrayMap;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;

import java.lang.ref.WeakReference;
@@ -245,13 +247,23 @@ class ActivityTransitionState {
        } else {
            if (!mHasExited) {
                mHasExited = true;
                Transition enterViewsTransition = null;
                ViewGroup decor = null;
                if (mEnterTransitionCoordinator != null) {
                    enterViewsTransition = mEnterTransitionCoordinator.getEnterViewsTransition();
                    decor = mEnterTransitionCoordinator.getDecor();
                    mEnterTransitionCoordinator.cancelEnter();
                    mEnterTransitionCoordinator = null;
                    if (enterViewsTransition != null && decor != null) {
                        enterViewsTransition.pause(decor);
                    }
                }

                ExitTransitionCoordinator exitCoordinator =
                        new ExitTransitionCoordinator(activity, mEnteringNames, null, null, true);
                if (enterViewsTransition != null && decor != null) {
                    enterViewsTransition.resume(decor);
                }
                exitCoordinator.startExit(activity.mResultCode, activity.mResultData);
            }
            return true;
+13 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private boolean mIsViewsTransitionComplete;
    private boolean mIsSharedElementTransitionComplete;
    private ArrayList<Matrix> mSharedElementParentMatrices;
    private Transition mEnterViewsTransition;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames, boolean isReturning) {
@@ -104,6 +105,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        triggerViewsReady(mapNamedElements(accepted, localNames));
    }

    public Transition getEnterViewsTransition() {
        return mEnterViewsTransition;
    }

    @Override
    protected void viewsReady(ArrayMap<String, View> sharedElements) {
        super.viewsReady(sharedElements);
@@ -399,10 +404,17 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                viewTransitionComplete();
            } else {
                viewsTransition.forceVisibility(View.INVISIBLE, true);
                setTransitionAlpha(mTransitioningViews, 1);
                viewsTransition.addListener(new ContinueTransitionListener() {
                    @Override
                    public void onTransitionStart(Transition transition) {
                        mEnterViewsTransition = transition;
                        setTransitionAlpha(mTransitioningViews, 1);
                        super.onTransitionStart(transition);
                    }

                    @Override
                    public void onTransitionEnd(Transition transition) {
                        mEnterViewsTransition = null;
                        transition.removeListener(this);
                        viewTransitionComplete();
                        super.onTransitionEnd(transition);