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

Commit 8cab50af authored by George Mount's avatar George Mount
Browse files

Fix for quick "back" in Activity Transitions.

Bug 14990153

Stops two potential animators working against the background
drawable. Forces the entering views to become visible onResume.

Change-Id: I2da66b54a16c6c69533eebbeff6db7f5a7794a89
parent a712e8cc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1197,6 +1197,7 @@ public class Activity extends ContextThemeWrapper
    protected void onResume() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
        getApplication().dispatchActivityResumed(this);
        mActivityTransitionState.onResume();
        mCalled = true;
    }

+13 −8
Original line number Diff line number Diff line
@@ -138,10 +138,7 @@ class ActivityTransitionState {
        ArrayList<String> sharedElementNames = mEnterActivityOptions.getSharedElementNames();
        ResultReceiver resultReceiver = mEnterActivityOptions.getResultReceiver();
        if (mEnterActivityOptions.isReturning()) {
            if (mCalledActivityOptions != null) {
                mCalledActivityOptions.dispatchActivityStopped();
                mCalledActivityOptions = null;
            }
            restoreExitedViews();
            activity.getWindow().getDecorView().setVisibility(View.VISIBLE);
            mEnterTransitionCoordinator = new EnterTransitionCoordinator(activity,
                    resultReceiver, sharedElementNames, mExitingFrom, mExitingTo);
@@ -158,16 +155,24 @@ class ActivityTransitionState {
    }

    public void onStop() {
        if (mCalledActivityOptions != null) {
            mCalledActivityOptions.dispatchActivityStopped();
            mCalledActivityOptions = null;
        }
        restoreExitedViews();
        if (mEnterTransitionCoordinator != null) {
            mEnterTransitionCoordinator.stop();
            mEnterTransitionCoordinator = null;
        }
    }

    public void onResume() {
        restoreExitedViews();
    }

    private void restoreExitedViews() {
        if (mCalledActivityOptions != null) {
            mCalledActivityOptions.dispatchActivityStopped();
            mCalledActivityOptions = null;
        }
    }

    public boolean startExitBackTransition(Activity activity) {
        if (mEnteringNames == null) {
            return false;
+10 −5
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ import java.util.Collection;
class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private static final String TAG = "EnterTransitionCoordinator";

    private static final long MAX_WAIT_MS = 1500;
    private static final long MAX_WAIT_MS = 1000;

    private boolean mSharedElementTransitionStarted;
    private Activity mActivity;
@@ -56,6 +56,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private Handler mHandler;
    private boolean mIsCanceled;
    private boolean mIsReturning;
    private ObjectAnimator mBackgroundAnimator;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames,
@@ -231,15 +232,15 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            Drawable background = getDecor().getBackground();
            if (background != null) {
                background = background.mutate();
                ObjectAnimator animator = ObjectAnimator.ofInt(background, "alpha", 255);
                animator.setDuration(FADE_BACKGROUND_DURATION_MS);
                animator.addListener(new AnimatorListenerAdapter() {
                mBackgroundAnimator = ObjectAnimator.ofInt(background, "alpha", 255);
                mBackgroundAnimator.setDuration(FADE_BACKGROUND_DURATION_MS);
                mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        makeOpaque();
                    }
                });
                animator.start();
                mBackgroundAnimator.start();
            } else if (transition != null) {
                transition.addListener(new Transition.TransitionListenerAdapter() {
                    @Override
@@ -259,6 +260,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        mActivity = null;
        mIsCanceled = true;
        mResultReceiver = null;
        if (mBackgroundAnimator != null) {
            mBackgroundAnimator.cancel();
            mBackgroundAnimator = null;
        }
    }

    private void makeOpaque() {
+26 −12
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -39,7 +40,7 @@ import java.util.ArrayList;
 */
class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    private static final String TAG = "ExitTransitionCoordinator";
    private static final long MAX_WAIT_MS = 1500;
    private static final long MAX_WAIT_MS = 1000;

    private boolean mExitComplete;

@@ -59,6 +60,10 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private boolean mIsReturning;

    private ObjectAnimator mBackgroundAnimator;

    private boolean mIsHidden;

    public ExitTransitionCoordinator(Activity activity, ArrayList<String> names,
            ArrayList<String> accepted, ArrayList<String> mapped, boolean isReturning) {
        super(activity.getWindow(), names, accepted, mapped, getListener(activity, isReturning));
@@ -97,6 +102,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
            case MSG_ACTIVITY_STOPPED:
                setViewVisibility(mTransitioningViews, View.VISIBLE);
                setViewVisibility(mSharedElements, View.VISIBLE);
                mIsHidden = true;
                break;
        }
    }
@@ -140,17 +146,22 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    private void fadeOutBackground() {
        ObjectAnimator animator = ObjectAnimator.ofInt(getDecor().getBackground(),
                "alpha", 0);
        animator.addListener(new AnimatorListenerAdapter() {
        if (mBackgroundAnimator == null) {
            Drawable background = getDecor().getBackground();
            mBackgroundAnimator = ObjectAnimator.ofInt(background, "alpha", 0);
            mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mBackgroundAnimator = null;
                    if (!mIsCanceled) {
                        mIsBackgroundReady = true;
                        notifyComplete();
                    }
                }
            });
        animator.setDuration(FADE_BACKGROUND_DURATION_MS);
        animator.start();
            mBackgroundAnimator.setDuration(FADE_BACKGROUND_DURATION_MS);
            mBackgroundAnimator.start();
        }
    }

    private void beginTransition() {
@@ -176,6 +187,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                @Override
                public void onTransitionEnd(Transition transition) {
                    exitTransitionComplete();
                    if (mIsHidden) {
                        setViewVisibility(mTransitioningViews, View.VISIBLE);
                    }
                }
            });
        }
+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ public class ChangeTransform extends Transition {
        public void set(View view, float[] values) {
            for (int i = 0; i < values.length; i++) {
                float value = values[i];
                if (value != Float.NaN) {
                if (!Float.isNaN(value)) {
                    sChangedProperties[i].setValue(view, value);
                }
            }