code: void scrollByInternal(int x, int y) {
          int overscrollX = 0, overscrollY = 0;
          consumePendingUpdateOperations();
          if (mAdapter != null) {
              eatRequestLayout();
              if (x != 0) {
                  final int hresult = mLayout.scrollHorizontallyBy(x, mRecycler, mState);
                  overscrollX = x - hresult;
              }
              if (y != 0) {
                  final int vresult = mLayout.scrollVerticallyBy(y, mRecycler, mState);
                  overscrollY = y - vresult;
              }
              resumeRequestLayout(false);
          }
  
          if (!mItemDecorations.isEmpty()) {
              invalidate();
          }
          if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) {
              pullGlows(overscrollX, overscrollY);
          }
          if (mScrollListener != null && (x != 0 || y != 0)) {
              mScrollListener.onScrolled(x, y);
          }
          if (!awakenScrollBars()) {
              invalidate();
          }
      }
docs: Does not perform bounds checking. Used by internal methods that have already validated input.