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

Commit ddff1fb0 authored by Ben Lin's avatar Ben Lin Committed by Android (Google) Code Review
Browse files

Merge "Disable pull-to-refresh for all mouse inputs and only if page already on top." into arc-apps

parents 390cd78b d79edd10
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -207,9 +207,6 @@ public class DirectoryFragment extends Fragment
        mProgressBar = view.findViewById(R.id.progressbar);
        assert(mProgressBar != null);

        mRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh_layout);
        mRefreshLayout.setOnRefreshListener(this);

        mRecView = (RecyclerView) view.findViewById(R.id.dir_list);
        mRecView.setRecyclerListener(
                new RecyclerListener() {
@@ -219,6 +216,9 @@ public class DirectoryFragment extends Fragment
                    }
                });

        mRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh_layout);
        mRefreshLayout.setOnRefreshListener(this);

        Resources resources = getContext().getResources();
        new FastScroller(mRecView,
                (StateListDrawable) resources.getDrawable(R.drawable.fast_scroll_thumb_drawable),
@@ -373,6 +373,7 @@ public class DirectoryFragment extends Fragment
                this.getContext(),
                mRecView,
                mDragStartListener::onMouseDragEvent,
                mRefreshLayout::setEnabled,
                gestureSel,
                mInputHandler,
                mBandController,
+3 −4
Original line number Diff line number Diff line
@@ -23,11 +23,10 @@ import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.android.documentsui.base.Events;

/**
 * A {@link SwipeRefreshLayout} that does not intercept any touch events. This relies on its nested
 * view to scroll in order to cause a refresh.
 * view to scroll in order to cause a refresh. It is possible that it gets disabled by
 * {@link ListeningGestureDetector} .
 */
public class DocumentsSwipeRefreshLayout extends SwipeRefreshLayout {

+21 −2
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;

import com.android.documentsui.base.DebugFlags;
import com.android.documentsui.base.BooleanConsumer;
import com.android.documentsui.base.EventHandler;
import com.android.documentsui.base.Events;
import com.android.documentsui.base.Events.InputEvent;
@@ -49,6 +49,7 @@ final class ListeningGestureDetector extends GestureDetector implements OnItemTo
    private final Features mFeatures;
    private final GestureSelector mGestureSelector;
    private final EventHandler<InputEvent> mMouseDragListener;
    private final BooleanConsumer mRefreshLayoutEnabler;
    private final BandController mBandController;
    private final MouseDelegate mMouseDelegate = new MouseDelegate();
    private final TouchDelegate mTouchDelegate = new TouchDelegate();
@@ -56,12 +57,12 @@ final class ListeningGestureDetector extends GestureDetector implements OnItemTo
    // Currently only initialized on IS_DEBUGGABLE builds.
    private final @Nullable ScaleGestureDetector mScaleDetector;


    public ListeningGestureDetector(
            Features features,
            Context context,
            RecyclerView recView,
            EventHandler<InputEvent> mouseDragListener,
            BooleanConsumer refreshLayoutEnabler,
            GestureSelector gestureSelector,
            UserInputHandler<? extends InputEvent> handler,
            @Nullable BandController bandController,
@@ -71,6 +72,7 @@ final class ListeningGestureDetector extends GestureDetector implements OnItemTo

        mFeatures = features;
        mMouseDragListener = mouseDragListener;
        mRefreshLayoutEnabler = refreshLayoutEnabler;
        mGestureSelector = gestureSelector;
        mBandController = bandController;
        recView.addOnItemTouchListener(this);
@@ -104,10 +106,23 @@ final class ListeningGestureDetector extends GestureDetector implements OnItemTo

        try (InputEvent event = MotionInputEvent.obtain(e, rv)) {
            if (event.isMouseEvent()) {
                if (event.isActionDown()) {
                    mRefreshLayoutEnabler.accept(false);
                }
                handled |= mMouseDelegate.onInterceptTouchEvent(event);
            } else {
                // If user has started some gesture while RecyclerView is not at the top, disable
                // refresh
                if (event.isActionDown() && rv.computeVerticalScrollOffset() != 0) {
                    mRefreshLayoutEnabler.accept(false);
                }
                handled |= mTouchDelegate.onInterceptTouchEvent(event);
            }


            if (event.isActionUp()) {
                mRefreshLayoutEnabler.accept(true);
            }
        }

        // Forward all events to UserInputHandler.
@@ -126,6 +141,10 @@ final class ListeningGestureDetector extends GestureDetector implements OnItemTo
            } else {
                mTouchDelegate.onTouchEvent(rv, event);
            }

            if (event.isActionUp()) {
                mRefreshLayoutEnabler.accept(true);
            }
        }

        // Note: even though this event is being handled as part of gestures such as drag and band,