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

Commit 74f98614 authored by Matt Casey's avatar Matt Casey
Browse files

Move RecyclerView scroll capture to the center

Avoid most floating content by centering the requested content within
the view instead of just scrolling so that it's visible.

Bug: 174571735
Test: atest RecyclerViewCaptureHelperTest, plus manual testing across
      major apps.
Change-Id: Ie275f5c37998a9d88e5ccde7af043443cbc4d94c
parent 0edac713
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -105,6 +105,14 @@ public class RecyclerViewCaptureHelper implements ScrollCaptureViewHelper<ViewGr
        int prevAnchorTop = anchor.getTop();
        // Note: requestChildRectangleOnScreen may modify rectangle, must pass pass in a copy here
        Rect input = new Rect(requestedContentBounds);
        // Expand input rect to get the requested rect to be in the center
        int remainingHeight = recyclerView.getHeight() - recyclerView.getPaddingTop()
                - recyclerView.getPaddingBottom() - input.height();
        if (remainingHeight > 0) {
            input.inset(0, -remainingHeight / 2);
        }
        Log.d(TAG, "input (post center adjustment) = " + input);

        if (recyclerView.requestChildRectangleOnScreen(anchor, input, true)) {
            int scrolled = prevAnchorTop - anchor.getTop(); // inverse of movement
            Log.d(TAG, "RecyclerView scrolled by " + scrolled + " px");
+9 −4
Original line number Diff line number Diff line
@@ -145,7 +145,9 @@ public class RecyclerViewCaptureHelperTest {
        ScrollResult scrollResult = rvc.onScrollRequested(mTarget, scrollBounds, request);
        assertThat(request).isEqualTo(scrollResult.requestedArea);
        assertThat(request).isEqualTo(scrollResult.availableArea);
        assertThat(scrollResult.scrollDelta).isEqualTo(CAPTURE_HEIGHT);
        // Capture height centered in the window
        assertThat(scrollResult.scrollDelta).isEqualTo(
                CAPTURE_HEIGHT + (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2);
        assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
    }

@@ -163,7 +165,8 @@ public class RecyclerViewCaptureHelperTest {
        ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
        assertThat(request).isEqualTo(scrollResult.requestedArea);
        assertThat(request).isEqualTo(scrollResult.availableArea);
        assertThat(scrollResult.scrollDelta).isEqualTo(-CAPTURE_HEIGHT);
        assertThat(scrollResult.scrollDelta).isEqualTo(
                -CAPTURE_HEIGHT - (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2);
        assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
    }

@@ -182,7 +185,8 @@ public class RecyclerViewCaptureHelperTest {
        ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
        assertThat(request).isEqualTo(scrollResult.requestedArea);
        assertThat(request).isEqualTo(scrollResult.availableArea);
        assertThat(scrollResult.scrollDelta).isEqualTo(CAPTURE_HEIGHT);
        assertThat(scrollResult.scrollDelta).isEqualTo(
                CAPTURE_HEIGHT + (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2);
        assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
    }

@@ -200,7 +204,8 @@ public class RecyclerViewCaptureHelperTest {
        ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
        assertThat(request).isEqualTo(scrollResult.requestedArea);
        assertThat(request).isEqualTo(scrollResult.availableArea);
        assertThat(scrollResult.scrollDelta).isEqualTo(-CAPTURE_HEIGHT);
        assertThat(scrollResult.scrollDelta).isEqualTo(
                -CAPTURE_HEIGHT - (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2);
        assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
    }