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

Commit 13ccb79b authored by George Mount's avatar George Mount
Browse files

Fix when allowExitOverlap is true to start entering as soon as possible

Bug 15474908

Change-Id: I6d2e8f940c9ed8427183b58a712c244c9940d535
parent b963e139
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -572,6 +572,10 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        }
    }

    protected void transitionStarted() {
        mIsStartingTransition = false;
    }

    protected class ContinueTransitionListener extends Transition.TransitionListenerAdapter {
        @Override
        public void onTransitionStart(Transition transition) {
+49 −25
Original line number Diff line number Diff line
@@ -130,6 +130,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                        }
                    });
        }
        if (allowOverlappingTransitions()) {
            startEnterTransitionOnly();
        }
    }

    private static SharedElementListener getListener(Activity activity, boolean isReturning) {
@@ -218,24 +221,6 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    protected void onTakeSharedElements() {
        if (!mIsReadyForTransition || mSharedElementsBundle == null) {
            return;
        }
        final Bundle sharedElementState = mSharedElementsBundle;
        mSharedElementsBundle = null;
        getDecor().getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                        startSharedElementTransition(sharedElementState);
                        return false;
                    }
                });
        getDecor().invalidate();
    }

    private void startSharedElementTransition(Bundle sharedElementState) {
        setEpicenter();
        // Remove rejected shared elements
@@ -253,7 +238,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                setSharedElementState(sharedElementState, sharedElementSnapshots);
        requestLayoutForSharedElements();

        boolean startEnterTransition = allowOverlappingTransitions();
        boolean startEnterTransition = allowOverlappingTransitions() && !mIsReturning;
        boolean startSharedElementTransition = true;
        Transition transition = beginTransition(startEnterTransition, startSharedElementTransition);

@@ -269,6 +254,29 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        mResultReceiver = null; // all done sending messages.
    }

    private void onTakeSharedElements() {
        if (!mIsReadyForTransition || mSharedElementsBundle == null) {
            return;
        }
        final Bundle sharedElementState = mSharedElementsBundle;
        mSharedElementsBundle = null;
        getDecor().getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                        startTransition(new Runnable() {
                            @Override
                            public void run() {
                                startSharedElementTransition(sharedElementState);
                            }
                        });
                        return false;
                    }
                });
        getDecor().invalidate();
    }

    private void requestLayoutForSharedElements() {
        int numSharedElements = mSharedElements.size();
        for (int i = 0; i < numSharedElements; i++) {
@@ -293,9 +301,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            if (transition == null) {
                sharedElementTransitionStarted();
            } else {
                transition.addListener(new Transition.TransitionListenerAdapter() {
                transition.addListener(new ContinueTransitionListener() {
                    @Override
                    public void onTransitionStart(Transition transition) {
                        super.onTransitionStart(transition);
                        transition.removeListener(this);
                        sharedElementTransitionStarted();
                    }
@@ -303,12 +312,17 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            }
        }
        if (transition != null) {
            if (sharedElementTransition == null) {
                transition.addListener(new ContinueTransitionListener());
            }
            TransitionManager.beginDelayedTransition(getDecor(), transition);
            if (startSharedElementTransition && !mSharedElementNames.isEmpty()) {
                mSharedElements.get(0).invalidate();
            } else if (startEnterTransition && !mTransitioningViews.isEmpty()) {
                mTransitioningViews.get(0).invalidate();
            }
        } else {
            transitionStarted();
        }
        return transition;
    }
@@ -399,11 +413,21 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {

    protected void onRemoteExitTransitionComplete() {
        if (!allowOverlappingTransitions()) {
            startEnterTransitionOnly();
        }
    }

    private void startEnterTransitionOnly() {
        startTransition(new Runnable() {
            @Override
            public void run() {
                setEpicenter();
                boolean startEnterTransition = true;
                boolean startSharedElementTransition = false;
                Transition transition = beginTransition(startEnterTransition,
                        startSharedElementTransition);
                startEnterTransition(transition);
            }
        });
    }
}