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

Commit b11f2830 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Use safe access to OnPreDrawListener."

parents ac4a8b7f f0b46b95
Loading
Loading
Loading
Loading
+34 −23
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ import android.view.ViewTreeObserver;
import android.view.Window;
import android.widget.ImageView;

import com.android.internal.view.OneShotPreDrawListener;

import java.util.ArrayList;
import java.util.Collection;

@@ -570,16 +572,9 @@ 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
                        public boolean onPreDraw() {
                            decorView.getViewTreeObserver().removeOnPreDrawListener(this);
            OneShotPreDrawListener.add(decorView, () -> {
                notifySharedElementEnd(snapshots);
                            return true;
                        }
                    }
            );
            });
        }
    }

@@ -816,6 +811,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
                if (moveWithParent && !isInTransitionGroup(parent, decor)) {
                    GhostViewListeners listener = new GhostViewListeners(view, parent, decor);
                    parent.getViewTreeObserver().addOnPreDrawListener(listener);
                    parent.addOnAttachStateChangeListener(listener);
                    mGhostViewListeners.add(listener);
                }
            }
@@ -842,8 +838,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        int numListeners = mGhostViewListeners.size();
        for (int i = 0; i < numListeners; i++) {
            GhostViewListeners listener = mGhostViewListeners.get(i);
            ViewGroup parent = (ViewGroup) listener.getView().getParent();
            parent.getViewTreeObserver().removeOnPreDrawListener(listener);
            listener.removeListener();
        }
        mGhostViewListeners.clear();

@@ -874,14 +869,8 @@ 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
                        public boolean onPreDraw() {
                            decorView.getViewTreeObserver().removeOnPreDrawListener(this);
            OneShotPreDrawListener.add(decorView, () -> {
                setGhostVisibility(visibility);
                            return true;
                        }
            });
        }
    }
@@ -988,16 +977,19 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        }
    }

    private static class GhostViewListeners implements ViewTreeObserver.OnPreDrawListener {
    private static class GhostViewListeners implements ViewTreeObserver.OnPreDrawListener,
            View.OnAttachStateChangeListener {
        private View mView;
        private ViewGroup mDecor;
        private View mParent;
        private Matrix mMatrix = new Matrix();
        private ViewTreeObserver mViewTreeObserver;

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

        public View getView() {
@@ -1008,13 +1000,32 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        public boolean onPreDraw() {
            GhostView ghostView = GhostView.getGhost(mView);
            if (ghostView == null) {
                mParent.getViewTreeObserver().removeOnPreDrawListener(this);
                removeListener();
            } else {
                GhostView.calculateMatrix(mView, mDecor, mMatrix);
                ghostView.setMatrix(mMatrix);
            }
            return true;
        }

        public void removeListener() {
            if (mViewTreeObserver.isAlive()) {
                mViewTreeObserver.removeOnPreDrawListener(this);
            } else {
                mParent.getViewTreeObserver().removeOnPreDrawListener(this);
            }
            mParent.removeOnAttachStateChangeListener(this);
        }

        @Override
        public void onViewAttachedToWindow(View v) {
            mViewTreeObserver = v.getViewTreeObserver();
        }

        @Override
        public void onViewDetachedFromWindow(View v) {
            removeListener();
        }
    }

    static class SharedElementOriginalState {
+8 −13
Original line number Diff line number Diff line
@@ -22,9 +22,10 @@ import android.transition.Transition;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;

import com.android.internal.view.OneShotPreDrawListener;

import java.lang.ref.WeakReference;
import java.util.ArrayList;

@@ -321,17 +322,11 @@ class ActivityTransitionState {
                }
                if (delayExitBack && decor != null) {
                    final ViewGroup finalDecor = decor;
                    decor.getViewTreeObserver().addOnPreDrawListener(
                            new ViewTreeObserver.OnPreDrawListener() {
                                @Override
                                public boolean onPreDraw() {
                                    finalDecor.getViewTreeObserver().removeOnPreDrawListener(this);
                    OneShotPreDrawListener.add(decor, () -> {
                        if (mReturnExitCoordinator != null) {
                            mReturnExitCoordinator.startExit(activity.mResultCode,
                                    activity.mResultData);
                        }
                                    return true;
                                }
                    });
                } else {
                    mReturnExitCoordinator.startExit(activity.mResultCode, activity.mResultData);
+27 −42
Original line number Diff line number Diff line
@@ -30,10 +30,11 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroupOverlay;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.view.Window;
import android.view.accessibility.AccessibilityEvent;

import com.android.internal.view.OneShotPreDrawListener;

import java.util.ArrayList;

/**
@@ -58,7 +59,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private boolean mAreViewsReady;
    private boolean mIsViewsTransitionStarted;
    private Transition mEnterViewsTransition;
    private OnPreDrawListener mViewsReadyListener;
    private OneShotPreDrawListener mViewsReadyListener;
    private final boolean mIsCrossTask;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
@@ -74,13 +75,18 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        mResultReceiver.send(MSG_SET_REMOTE_RECEIVER, resultReceiverBundle);
        final View decorView = getDecor();
        if (decorView != null) {
            decorView.getViewTreeObserver().addOnPreDrawListener(
            final ViewTreeObserver viewTreeObserver = decorView.getViewTreeObserver();
            viewTreeObserver.addOnPreDrawListener(
                    new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            if (mIsReadyForTransition) {
                                if (viewTreeObserver.isAlive()) {
                                    viewTreeObserver.removeOnPreDrawListener(this);
                                } else {
                                    decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                                }
                            }
                            return mIsReadyForTransition;
                        }
                    });
@@ -147,16 +153,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
                (sharedElements.isEmpty() || !sharedElements.valueAt(0).isLayoutRequested()))) {
            viewsReady(sharedElements);
        } else {
            mViewsReadyListener = new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
            mViewsReadyListener = OneShotPreDrawListener.add(decor, () -> {
                mViewsReadyListener = null;
                    decor.getViewTreeObserver().removeOnPreDrawListener(this);
                viewsReady(sharedElements);
                    return true;
                }
            };
            decor.getViewTreeObserver().addOnPreDrawListener(mViewsReadyListener);
            });
            decor.invalidate();
        }
    }
@@ -206,18 +206,12 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            moveSharedElementsToOverlay();
            mResultReceiver.send(MSG_SHARED_ELEMENT_DESTINATION, state);
        } else if (decorView != null) {
            decorView.getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            decorView.getViewTreeObserver().removeOnPreDrawListener(this);
            OneShotPreDrawListener.add(decorView, () -> {
                if (mResultReceiver != null) {
                    Bundle state = captureSharedElementState();
                    moveSharedElementsToOverlay();
                    mResultReceiver.send(MSG_SHARED_ELEMENT_DESTINATION, state);
                }
                            return true;
                        }
            });
        }
        if (allowOverlappingTransitions()) {
@@ -271,7 +265,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            mIsReadyForTransition = true;
            final ViewGroup decor = getDecor();
            if (decor != null && mViewsReadyListener != null) {
                decor.getViewTreeObserver().removeOnPreDrawListener(mViewsReadyListener);
                mViewsReadyListener.removeListener();
                mViewsReadyListener = null;
            }
            showViews(mTransitioningViews, true);
@@ -457,19 +451,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            public void onSharedElementsReady() {
                final View decorView = getDecor();
                if (decorView != null) {
                    decorView.getViewTreeObserver()
                            .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                                @Override
                                public boolean onPreDraw() {
                                    decorView.getViewTreeObserver().removeOnPreDrawListener(this);
                                    startTransition(new Runnable() {
                                        @Override
                                        public void run() {
                    OneShotPreDrawListener.add(decorView, () -> {
                        startTransition(() -> {
                                startSharedElementTransition(sharedElementState);
                                        }
                        });
                                    return false;
                                }
                    });
                    decorView.invalidate();
                }
+5 −10
Original line number Diff line number Diff line
@@ -34,9 +34,10 @@ import android.transition.Transition;
import android.transition.TransitionManager;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;

import com.android.internal.view.OneShotPreDrawListener;

import java.util.ArrayList;

/**
@@ -168,14 +169,8 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        });
        final ArrayList<View> sharedElementSnapshots = createSnapshots(mExitSharedElementBundle,
                mSharedElementNames);
        decorView.getViewTreeObserver()
                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        decorView.getViewTreeObserver().removeOnPreDrawListener(this);
        OneShotPreDrawListener.add(decorView, () -> {
            setSharedElementState(mExitSharedElementBundle, sharedElementSnapshots);
                        return true;
                    }
        });
        setGhostVisibility(View.INVISIBLE);
        scheduleGhostVisibilityChange(View.INVISIBLE);
+50 −76
Original line number Diff line number Diff line
@@ -24,7 +24,8 @@ import android.util.ArrayMap;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;

import com.android.internal.view.OneShotPreDrawListener;

import java.util.ArrayList;
import java.util.Collection;
@@ -320,15 +321,8 @@ class FragmentTransition {
                && exitingFragment.mHidden && exitingFragment.mHiddenChanged) {
            exitingFragment.setHideReplaced(true);
            final View fragmentView = exitingFragment.getView();
            final ViewGroup container = exitingFragment.mContainer;
            container.getViewTreeObserver().addOnPreDrawListener(
                    new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            container.getViewTreeObserver().removeOnPreDrawListener(this);
            OneShotPreDrawListener.add(exitingFragment.mContainer, () -> {
                setViewVisibility(exitingViews, View.INVISIBLE);
                            return true;
                        }
            });
            exitTransition.addListener(new Transition.TransitionListenerAdapter() {
                @Override
@@ -364,12 +358,7 @@ class FragmentTransition {
            final Transition enterTransition, final ArrayList<View> enteringViews,
            final Transition exitTransition, final ArrayList<View> exitingViews) {

        sceneRoot.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);

        OneShotPreDrawListener.add(sceneRoot, () -> {
            if (enterTransition != null) {
                enterTransition.removeTarget(nonExistentView);
                ArrayList<View> views = configureEnteringExitingViews(
@@ -384,9 +373,6 @@ class FragmentTransition {
                exitingViews.clear();
                exitingViews.add(nonExistentView);
            }

                        return true;
                    }
        });
    }

@@ -541,18 +527,12 @@ class FragmentTransition {
            epicenterView = null;
        }

        sceneRoot.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
        OneShotPreDrawListener.add(sceneRoot, () -> {
            callSharedElementStartEnd(inFragment, outFragment, inIsPop,
                    inSharedElements, false);
            if (epicenterView != null) {
                epicenterView.getBoundsOnScreen(epicenter);
            }
                        return true;
                    }
        });
        return sharedElementTransition;
    }
@@ -643,11 +623,7 @@ class FragmentTransition {

        TransitionSet finalSharedElementTransition = sharedElementTransition;

        sceneRoot.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
        OneShotPreDrawListener.add(sceneRoot, () -> {
            ArrayMap<String, View> inSharedElements = captureInSharedElements(
                    nameOverrides, finalSharedElementTransition, fragments);

@@ -670,8 +646,6 @@ class FragmentTransition {
                    inEpicenterView.getBoundsOnScreen(inEpicenter);
                }
            }
                        return true;
                    }
        });
        return sharedElementTransition;
    }
Loading