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

Commit 700db2a3 authored by George Mount's avatar George Mount
Browse files

Fix converting to opaque when "back" hit quickly after entering.

Bug 16044696

Also ensured that there were no memory leaks.

Change-Id: I9b32592a5b57b496903b2c5ede6d742e86ab5fa7
parent b3a04442
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -274,8 +274,8 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        return names;
        return names;
    }
    }


    public ArrayList<View> getMappedViews() {
    public ArrayList<View> copyMappedViews() {
        return mSharedElements;
        return new ArrayList<View>(mSharedElements);
    }
    }


    public ArrayList<String> getAllSharedElementNames() { return mAllSharedElementNames; }
    public ArrayList<String> getAllSharedElementNames() { return mAllSharedElementNames; }
@@ -521,9 +521,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
    protected void clearState() {
    protected void clearState() {
        // Clear the state so that we can't hold any references accidentally and leak memory.
        // Clear the state so that we can't hold any references accidentally and leak memory.
        mWindow = null;
        mWindow = null;
        mAllSharedElementNames.clear();
        mSharedElements.clear();
        mSharedElements.clear();
        mSharedElementNames.clear();
        mTransitioningViews.clear();
        mTransitioningViews.clear();
        mResultReceiver = null;
        mResultReceiver = null;
        mPendingTransition = null;
        mPendingTransition = null;
+2 −2
Original line number Original line Diff line number Diff line
@@ -240,7 +240,7 @@ class ActivityTransitionState {
            if (!mHasExited) {
            if (!mHasExited) {
                mHasExited = true;
                mHasExited = true;
                if (mEnterTransitionCoordinator != null) {
                if (mEnterTransitionCoordinator != null) {
                    mEnterTransitionCoordinator.stop();
                    mEnterTransitionCoordinator.cancelEnter();
                    mEnterTransitionCoordinator = null;
                    mEnterTransitionCoordinator = null;
                }
                }
                ArrayMap<String, View> sharedElements = new ArrayMap<String, View>();
                ArrayMap<String, View> sharedElements = new ArrayMap<String, View>();
@@ -268,7 +268,7 @@ class ActivityTransitionState {
                if (mCalledExitCoordinator != null) {
                if (mCalledExitCoordinator != null) {
                    mExitingFrom = mCalledExitCoordinator.getAcceptedNames();
                    mExitingFrom = mCalledExitCoordinator.getAcceptedNames();
                    mExitingTo = mCalledExitCoordinator.getMappedNames();
                    mExitingTo = mCalledExitCoordinator.getMappedNames();
                    mExitingToView = mCalledExitCoordinator.getMappedViews();
                    mExitingToView = mCalledExitCoordinator.copyMappedViews();
                    mCalledExitCoordinator.startExit();
                    mCalledExitCoordinator.startExit();
                }
                }
            }
            }
+13 −0
Original line number Original line Diff line number Diff line
@@ -433,6 +433,17 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {


    public void stop() {
    public void stop() {
        makeOpaque();
        makeOpaque();
        mIsCanceled = true;
        mResultReceiver = null;
        if (mBackgroundAnimator != null) {
            mBackgroundAnimator.end();
            mBackgroundAnimator = null;
        }
        mActivity = null;
        clearState();
    }

    public void cancelEnter() {
        mHasStopped = true;
        mHasStopped = true;
        mIsCanceled = true;
        mIsCanceled = true;
        mResultReceiver = null;
        mResultReceiver = null;
@@ -440,6 +451,8 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            mBackgroundAnimator.cancel();
            mBackgroundAnimator.cancel();
            mBackgroundAnimator = null;
            mBackgroundAnimator = null;
        }
        }
        mActivity = null;
        clearState();
    }
    }


    private void makeOpaque() {
    private void makeOpaque() {
+60 −48
Original line number Original line Diff line number Diff line
@@ -66,6 +66,8 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {


    private Bundle mExitSharedElementBundle;
    private Bundle mExitSharedElementBundle;


    private boolean mIsExitStarted;

    public ExitTransitionCoordinator(Activity activity, ArrayList<String> names,
    public ExitTransitionCoordinator(Activity activity, ArrayList<String> names,
            ArrayList<String> accepted, ArrayList<View> mapped, boolean isReturning) {
            ArrayList<String> accepted, ArrayList<View> mapped, boolean isReturning) {
        super(activity.getWindow(), names, getListener(activity, isReturning),
        super(activity.getWindow(), names, getListener(activity, isReturning),
@@ -164,6 +166,8 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    }
    }


    public void startExit() {
    public void startExit() {
        if (!mIsExitStarted) {
            mIsExitStarted = true;
            startTransition(new Runnable() {
            startTransition(new Runnable() {
                @Override
                @Override
                public void run() {
                public void run() {
@@ -172,8 +176,11 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
            });
            });
            setViewVisibility(mTransitioningViews, View.INVISIBLE);
            setViewVisibility(mTransitioningViews, View.INVISIBLE);
        }
        }
    }


    public void startExit(int resultCode, Intent data) {
    public void startExit(int resultCode, Intent data) {
        if (!mIsExitStarted) {
            mIsExitStarted = true;
            mHandler = new Handler() {
            mHandler = new Handler() {
                @Override
                @Override
                public void handleMessage(Message msg) {
                public void handleMessage(Message msg) {
@@ -205,6 +212,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                }
                }
            });
            });
        }
        }
    }


    private void startExitTransition() {
    private void startExitTransition() {
        Transition transition = getExitTransition();
        Transition transition = getExitTransition();
@@ -216,7 +224,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {


    private void fadeOutBackground() {
    private void fadeOutBackground() {
        if (mBackgroundAnimator == null) {
        if (mBackgroundAnimator == null) {
            Drawable background = getDecor().getBackground();
            ViewGroup decor = getDecor();
            Drawable background;
            if (decor != null && (background = decor.getBackground()) != null) {
                mBackgroundAnimator = ObjectAnimator.ofInt(background, "alpha", 0);
                mBackgroundAnimator = ObjectAnimator.ofInt(background, "alpha", 0);
                mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
                mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    @Override
@@ -232,6 +242,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                mBackgroundAnimator.start();
                mBackgroundAnimator.start();
            }
            }
        }
        }
    }


    private Transition getExitTransition() {
    private Transition getExitTransition() {
        Transition viewsTransition = null;
        Transition viewsTransition = null;
@@ -346,6 +357,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        }
        }
        if (!mIsReturning && mExitNotified) {
        if (!mIsReturning && mExitNotified) {
            mActivity = null; // don't need it anymore
            mActivity = null; // don't need it anymore
            clearState();
        }
        }
    }
    }