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

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

Merge "Fixed: getDecor() NullPointeExceptions." into lmp-dev

parents 48766577 48bd13c9
Loading
Loading
Loading
Loading
+34 −21
Original line number Diff line number Diff line
@@ -223,7 +223,10 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        mSharedElementNames.addAll(sharedElements.keySet());
        mSharedElements.addAll(sharedElements.values());
        if (getViewsTransition() != null) {
            getDecor().captureTransitioningViews(mTransitioningViews);
            ViewGroup decorView = getDecor();
            if (decorView != null) {
                decorView.captureTransitioningViews(mTransitioningViews);
            }
            mTransitioningViews.removeAll(mSharedElements);
        }
        setEpicenter();
@@ -351,7 +354,10 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
                sharedElements.put(accepted.get(i), localViews.get(i));
            }
        } else {
            getDecor().findNamedViews(sharedElements);
            ViewGroup decorView = getDecor();
            if (decorView != null) {
                decorView.findNamedViews(sharedElements);
            }
        }
        return sharedElements;
    }
@@ -472,6 +478,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {

    protected void scheduleSetSharedElementEnd(final ArrayList<View> snapshots) {
        final View decorView = getDecor();
        if (decorView != null) {
            decorView.getViewTreeObserver().addOnPreDrawListener(
                    new ViewTreeObserver.OnPreDrawListener() {
                        @Override
@@ -483,6 +490,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
                    }
            );
        }
    }

    private static SharedElementOriginalState getOldSharedElementState(View view, String name,
            Bundle transitionArgs) {
@@ -524,7 +532,10 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        ArrayList<View> snapshots = new ArrayList<View>(numSharedElements);
        Context context = getWindow().getContext();
        int[] decorLoc = new int[2];
        getDecor().getLocationOnScreen(decorLoc);
        ViewGroup decorView = getDecor();
        if (decorView != null) {
            decorView.getLocationOnScreen(decorLoc);
        }
        for (String name: names) {
            Bundle sharedElementBundle = state.getBundle(name);
            if (sharedElementBundle != null) {
@@ -750,6 +761,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {

    protected void scheduleGhostVisibilityChange(final int visibility) {
        final View decorView = getDecor();
        if (decorView != null) {
            decorView.getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        @Override
@@ -760,6 +772,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
                        }
                    });
        }
    }

    protected class ContinueTransitionListener extends Transition.TransitionListenerAdapter {
        @Override
+77 −55
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        resultReceiverBundle.putParcelable(KEY_REMOTE_RECEIVER, this);
        mResultReceiver.send(MSG_SET_REMOTE_RECEIVER, resultReceiverBundle);
        final View decorView = getDecor();
        if (decorView != null) {
            decorView.getViewTreeObserver().addOnPreDrawListener(
                    new ViewTreeObserver.OnPreDrawListener() {
                        @Override
@@ -81,6 +82,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                        }
                    });
        }
    }

    public void viewInstancesReady(ArrayList<String> accepted, ArrayList<String> localNames,
            ArrayList<View> localViews) {
@@ -152,7 +154,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private ArrayMap<String, View> mapNamedElements(ArrayList<String> accepted,
            ArrayList<String> localNames) {
        ArrayMap<String, View> sharedElements = new ArrayMap<String, View>();
        getDecor().findNamedViews(sharedElements);
        ViewGroup decorView = getDecor();
        if (decorView != null) {
            decorView.findNamedViews(sharedElements);
        }
        if (accepted != null) {
            for (int i = 0; i < localNames.size(); i++) {
                String localName = localNames.get(i);
@@ -170,10 +175,13 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {

    private void sendSharedElementDestination() {
        boolean allReady;
        final View decorView = getDecor();
        if (allowOverlappingTransitions() && getEnterViewsTransition() != null) {
            allReady = false;
        } else if (decorView == null) {
            allReady = true;
        } else {
            allReady = !getDecor().isLayoutRequested();
            allReady = !decorView.isLayoutRequested();
            if (allReady) {
                for (int i = 0; i < mSharedElements.size(); i++) {
                    if (mSharedElements.get(i).isLayoutRequested()) {
@@ -188,8 +196,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            setSharedElementMatrices();
            moveSharedElementsToOverlay();
            mResultReceiver.send(MSG_SHARED_ELEMENT_DESTINATION, state);
        } else {
            final View decorView = getDecor();
        } else if (decorView != null) {
            decorView.getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        @Override
@@ -291,6 +298,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    private void startSharedElementTransition(Bundle sharedElementState) {
        ViewGroup decorView = getDecor();
        if (decorView == null) {
            return;
        }
        // Remove rejected shared elements
        ArrayList<String> rejectedNames = new ArrayList<String>(mAllSharedElementNames);
        rejectedNames.removeAll(mSharedElementNames);
@@ -311,7 +322,8 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        boolean startSharedElementTransition = true;
        setGhostVisibility(View.INVISIBLE);
        scheduleGhostVisibilityChange(View.INVISIBLE);
        Transition transition = beginTransition(startEnterTransition, startSharedElementTransition);
        Transition transition = beginTransition(decorView, startEnterTransition,
                startSharedElementTransition);
        scheduleGhostVisibilityChange(View.VISIBLE);
        setGhostVisibility(View.VISIBLE);

@@ -324,8 +336,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        if (mResultReceiver != null) {
            // We can't trust that the view will disappear on the same frame that the shared
            // element appears here. Assure that we get at least 2 frames for double-buffering.
            getDecor().postOnAnimation(new Runnable() {
            decorView.postOnAnimation(new Runnable() {
                int mAnimations;

                @Override
                public void run() {
                    if (mAnimations++ < MIN_ANIMATION_FRAMES) {
@@ -349,6 +362,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        final Bundle sharedElementState = mSharedElementsBundle;
        mSharedElementsBundle = null;
        final View decorView = getDecor();
        if (decorView != null) {
            decorView.getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        @Override
@@ -365,6 +379,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                    });
            decorView.invalidate();
        }
    }

    private void requestLayoutForSharedElements() {
        int numSharedElements = mSharedElements.size();
@@ -373,7 +388,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    private Transition beginTransition(boolean startEnterTransition,
    private Transition beginTransition(ViewGroup decorView, boolean startEnterTransition,
            boolean startSharedElementTransition) {
        Transition sharedElementTransition = null;
        if (startSharedElementTransition) {
@@ -433,7 +448,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        Transition transition = mergeTransitions(sharedElementTransition, viewsTransition);
        if (transition != null) {
            transition.addListener(new ContinueTransitionListener());
            TransitionManager.beginDelayedTransition(getDecor(), transition);
            TransitionManager.beginDelayedTransition(decorView, transition);
            if (startSharedElementTransition && !mSharedElementNames.isEmpty()) {
                mSharedElements.get(0).invalidate();
            } else if (startEnterTransition && !mTransitioningViews.isEmpty()) {
@@ -467,8 +482,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    private void startEnterTransition(Transition transition) {
        if (!mIsReturning) {
            Drawable background = getDecor().getBackground();
        ViewGroup decorView = getDecor();
        if (!mIsReturning && decorView != null) {
            Drawable background = decorView.getBackground();
            if (background != null) {
                background = background.mutate();
                getWindow().setBackgroundDrawable(background);
@@ -539,7 +555,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        if (rejectedSnapshots == null || rejectedSnapshots.isEmpty()) {
            return;
        }
        ViewGroupOverlay overlay = getDecor().getOverlay();
        final ViewGroup decorView = getDecor();
        if (decorView != null) {
            ViewGroupOverlay overlay = decorView.getOverlay();
            ObjectAnimator animator = null;
            int numRejected = rejectedSnapshots.size();
            for (int i = 0; i < numRejected; i++) {
@@ -551,7 +569,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            animator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                ViewGroupOverlay overlay = getDecor().getOverlay();
                    ViewGroupOverlay overlay = decorView.getOverlay();
                    int numRejected = rejectedSnapshots.size();
                    for (int i = 0; i < numRejected; i++) {
                        overlay.remove(rejectedSnapshots.get(i));
@@ -559,6 +577,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                }
            });
        }
    }

    protected void onRemoteExitTransitionComplete() {
        if (!allowOverlappingTransitions()) {
@@ -572,10 +591,13 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            public void run() {
                boolean startEnterTransition = true;
                boolean startSharedElementTransition = false;
                Transition transition = beginTransition(startEnterTransition,
                ViewGroup decorView = getDecor();
                if (decorView != null) {
                    Transition transition = beginTransition(decorView, startEnterTransition,
                            startSharedElementTransition);
                    startEnterTransition(transition);
                }
            }
        });
    }

+29 −22
Original line number Diff line number Diff line
@@ -129,22 +129,25 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        showViews(mTransitioningViews, true);
        showViews(mSharedElements, true);
        mIsHidden = true;
        if (!mIsReturning && getDecor() != null) {
            getDecor().suppressLayout(false);
        ViewGroup decorView = getDecor();
        if (!mIsReturning && decorView != null) {
            decorView.suppressLayout(false);
        }
        moveSharedElementsFromOverlay();
        clearState();
    }

    private void sharedElementExitBack() {
        if (getDecor() != null) {
            getDecor().suppressLayout(true);
        final ViewGroup decorView = getDecor();
        if (decorView != null) {
            decorView.suppressLayout(true);
        }
        if (mExitSharedElementBundle != null && !mExitSharedElementBundle.isEmpty() &&
        if (decorView != null && mExitSharedElementBundle != null &&
                !mExitSharedElementBundle.isEmpty() &&
                !mSharedElements.isEmpty() && getSharedElementTransition() != null) {
            startTransition(new Runnable() {
                public void run() {
                    startSharedElementExit();
                    startSharedElementExit(decorView);
                }
            });
        } else {
@@ -152,7 +155,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    private void startSharedElementExit() {
    private void startSharedElementExit(final ViewGroup decorView) {
        Transition transition = getSharedElementExitTransition();
        transition.addListener(new Transition.TransitionListenerAdapter() {
            @Override
@@ -165,7 +168,6 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        });
        final ArrayList<View> sharedElementSnapshots = createSnapshots(mExitSharedElementBundle,
                mSharedElementNames);
        final View decorView = getDecor();
        decorView.getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
@@ -178,10 +180,10 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        setGhostVisibility(View.INVISIBLE);
        scheduleGhostVisibilityChange(View.INVISIBLE);
        mListener.onSharedElementEnd(mSharedElementNames, mSharedElements, sharedElementSnapshots);
        TransitionManager.beginDelayedTransition(getDecor(), transition);
        TransitionManager.beginDelayedTransition(decorView, transition);
        scheduleGhostVisibilityChange(View.VISIBLE);
        setGhostVisibility(View.VISIBLE);
        getDecor().invalidate();
        decorView.invalidate();
    }

    private void hideSharedElements() {
@@ -196,8 +198,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    public void startExit() {
        if (!mIsExitStarted) {
            mIsExitStarted = true;
            if (getDecor() != null) {
                getDecor().suppressLayout(true);
            ViewGroup decorView = getDecor();
            if (decorView != null) {
                decorView.suppressLayout(true);
            }
            moveSharedElementsToOverlay();
            startTransition(new Runnable() {
@@ -212,8 +215,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    public void startExit(int resultCode, Intent data) {
        if (!mIsExitStarted) {
            mIsExitStarted = true;
            if (getDecor() != null) {
                getDecor().suppressLayout(true);
            ViewGroup decorView = getDecor();
            if (decorView != null) {
                decorView.suppressLayout(true);
            }
            mHandler = new Handler() {
                @Override
@@ -224,7 +228,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
            };
            delayCancel();
            moveSharedElementsToOverlay();
            if (getDecor().getBackground() == null) {
            if (decorView != null && decorView.getBackground() == null) {
                getWindow().setBackgroundDrawable(new ColorDrawable(Color.BLACK));
            }
            ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(mActivity, this,
@@ -248,8 +252,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private void startExitTransition() {
        Transition transition = getExitTransition();
        if (transition != null) {
            TransitionManager.beginDelayedTransition(getDecor(), transition);
        ViewGroup decorView = getDecor();
        if (transition != null && decorView != null) {
            TransitionManager.beginDelayedTransition(decorView, transition);
            mTransitioningViews.get(0).invalidate();
        } else {
            transitionStarted();
@@ -337,13 +342,14 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        Transition viewsTransition = getExitTransition();

        Transition transition = mergeTransitions(sharedElementTransition, viewsTransition);
        if (transition != null) {
        ViewGroup decorView = getDecor();
        if (transition != null && decorView != null) {
            setGhostVisibility(View.INVISIBLE);
            scheduleGhostVisibilityChange(View.INVISIBLE);
            TransitionManager.beginDelayedTransition(getDecor(), transition);
            TransitionManager.beginDelayedTransition(decorView, transition);
            scheduleGhostVisibilityChange(View.VISIBLE);
            setGhostVisibility(View.VISIBLE);
            getDecor().invalidate();
            decorView.invalidate();
        } else {
            transitionStarted();
        }
@@ -392,8 +398,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                mExitNotified = true;
                mResultReceiver.send(MSG_EXIT_TRANSITION_COMPLETE, null);
                mResultReceiver = null; // done talking
                if (!mIsReturning && getDecor() != null) {
                    getDecor().suppressLayout(false);
                ViewGroup decorView = getDecor();
                if (!mIsReturning && decorView != null) {
                    decorView.suppressLayout(false);
                }
                finishIfNecessary();
            }