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

Commit f9c4b57b authored by George Mount's avatar George Mount
Browse files

Fix blink of final position in activity transitions.

Bug 33059372

When implementing OneShotPreDrawListener, one of the onPreDraw()
calls was supposed to return false. This CL restores that behavior.

Test: manual against Play Movies app

Change-Id: I416da3bb3e84efb009f0efbacad71d0a2f66fe18
parent d5f70891
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            public void onSharedElementsReady() {
                final View decorView = getDecor();
                if (decorView != null) {
                    OneShotPreDrawListener.add(decorView, () -> {
                    OneShotPreDrawListener.add(decorView, false, () -> {
                        startTransition(() -> {
                                startSharedElementTransition(sharedElementState);
                        });
+21 −6
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ import android.view.ViewTreeObserver;
 *     OneShotPreDrawListener.add(view, () -> { view.doSomething(); })
 * </code></pre>
 * <p>
 * The onPreDraw always returns true.
 * <p>
 * The listener will also remove itself from the ViewTreeObserver when the view
 * is detached from the view hierarchy. In that case, the Runnable will never be
 * executed.
@@ -36,22 +34,39 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
    private final View mView;
    private ViewTreeObserver mViewTreeObserver;
    private final Runnable mRunnable;
    private final boolean mReturnValue;

    private OneShotPreDrawListener(View view, Runnable runnable) {
    private OneShotPreDrawListener(View view, boolean returnValue, Runnable runnable) {
        mView = view;
        mViewTreeObserver = view.getViewTreeObserver();
        mRunnable = runnable;
        mReturnValue = returnValue;
    }

    /**
     * Creates a OneShotPreDrawListener and adds it to view's ViewTreeObserver.
     * Creates a OneShotPreDrawListener and adds it to view's ViewTreeObserver. The
     * return value from the OnPreDrawListener is {@code true}.
     *
     * @param view The view whose ViewTreeObserver the OnPreDrawListener should listen.
     * @param runnable The Runnable to execute in the OnPreDraw (once)
     * @return The added OneShotPreDrawListener. It can be removed prior to
     * the onPreDraw by calling {@link #removeListener()}.
     */
    public static OneShotPreDrawListener add(View view, Runnable runnable) {
        OneShotPreDrawListener listener = new OneShotPreDrawListener(view, runnable);
        return add(view, true, runnable);
    }

    /**
     * Creates a OneShotPreDrawListener and adds it to view's ViewTreeObserver.
     *
     * @param view The view whose ViewTreeObserver the OnPreDrawListener should listen.
     * @param returnValue The value to be returned from the OnPreDrawListener.
     * @param runnable The Runnable to execute in the OnPreDraw (once)
     * @return The added OneShotPreDrawListener. It can be removed prior to
     * the onPreDraw by calling {@link #removeListener()}.
     */
    public static OneShotPreDrawListener add(View view, boolean returnValue, Runnable runnable) {
        OneShotPreDrawListener listener = new OneShotPreDrawListener(view, returnValue, runnable);
        view.getViewTreeObserver().addOnPreDrawListener(listener);
        view.addOnAttachStateChangeListener(listener);
        return listener;
@@ -61,7 +76,7 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
    public boolean onPreDraw() {
        removeListener();
        mRunnable.run();
        return true;
        return mReturnValue;
    }

    /**