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

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

Merge "Fix NPE when Window disappears during a transition." into lmp-dev

parents 7f579fda 6e7fb60b
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -467,11 +467,12 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
    }

    protected void scheduleSetSharedElementEnd(final ArrayList<View> snapshots) {
        getDecor().getViewTreeObserver().addOnPreDrawListener(
        final View decorView = getDecor();
        decorView.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                        decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                        notifySharedElementEnd(snapshots);
                        return true;
                    }
@@ -664,8 +665,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
                GhostView.addGhost(view, decor);
                ViewGroup parent = (ViewGroup) view.getParent();
                if (moveWithParent && !isInTransitionGroup(parent, decor)) {
                    GhostViewListeners listener =
                            new GhostViewListeners(view, decor);
                    GhostViewListeners listener = new GhostViewListeners(view, parent, decor);
                    parent.getViewTreeObserver().addOnPreDrawListener(listener);
                    mGhostViewListeners.add(listener);
                }
@@ -723,11 +723,12 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
    }

    protected void scheduleGhostVisibilityChange(final int visibility) {
        getDecor().getViewTreeObserver()
        final View decorView = getDecor();
        decorView.getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                        decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                        setGhostVisibility(visibility);
                        return true;
                    }
@@ -769,10 +770,12 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
    private static class GhostViewListeners implements ViewTreeObserver.OnPreDrawListener {
        private View mView;
        private ViewGroup mDecor;
        private View mParent;
        private Matrix mMatrix = new Matrix();

        public GhostViewListeners(View view, ViewGroup decor) {
        public GhostViewListeners(View view, View parent, ViewGroup decor) {
            mView = view;
            mParent = parent;
            mDecor = decor;
        }

@@ -782,10 +785,9 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {

        @Override
        public boolean onPreDraw() {
            ViewGroup parent = ((ViewGroup) mView.getParent());
            GhostView ghostView = GhostView.getGhost(mView);
            if (ghostView == null) {
                parent.getViewTreeObserver().removeOnPreDrawListener(this);
                mParent.getViewTreeObserver().removeOnPreDrawListener(this);
            } else {
                GhostView.calculateMatrix(mView, mDecor, mMatrix);
                ghostView.setMatrix(mMatrix);
+10 −7
Original line number Diff line number Diff line
@@ -69,12 +69,13 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        Bundle resultReceiverBundle = new Bundle();
        resultReceiverBundle.putParcelable(KEY_REMOTE_RECEIVER, this);
        mResultReceiver.send(MSG_SET_REMOTE_RECEIVER, resultReceiverBundle);
        getDecor().getViewTreeObserver().addOnPreDrawListener(
        final View decorView = getDecor();
        decorView.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        if (mIsReadyForTransition) {
                            getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                            decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                        }
                        return mIsReadyForTransition;
                    }
@@ -187,11 +188,12 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            moveSharedElementsToOverlay();
            mResultReceiver.send(MSG_SHARED_ELEMENT_DESTINATION, state);
        } else {
            getDecor().getViewTreeObserver()
            final View decorView = getDecor();
            decorView.getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                            decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                            if (mResultReceiver != null) {
                                Bundle state = captureSharedElementState();
                                setSharedElementMatrices();
@@ -342,11 +344,12 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
        final Bundle sharedElementState = mSharedElementsBundle;
        mSharedElementsBundle = null;
        getDecor().getViewTreeObserver()
        final View decorView = getDecor();
        decorView.getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                        decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                        startTransition(new Runnable() {
                            @Override
                            public void run() {
@@ -356,7 +359,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                        return false;
                    }
                });
        getDecor().invalidate();
        decorView.invalidate();
    }

    private void requestLayoutForSharedElements() {
+3 −2
Original line number Diff line number Diff line
@@ -165,11 +165,12 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        });
        final ArrayList<View> sharedElementSnapshots = createSnapshots(mExitSharedElementBundle,
                mSharedElementNames);
        getDecor().getViewTreeObserver()
        final View decorView = getDecor();
        decorView.getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
                        decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                        setSharedElementState(mExitSharedElementBundle, sharedElementSnapshots);
                        return true;
                    }