code: private boolean scrollAndFocus(int directionY, int top, int bottom, int directionX, int left, int right) {
          boolean handled = true;
          int height = getHeight();
          int containerTop = getScrollY();
          int containerBottom = containerTop + height;
          boolean up = directionY == View.FOCUS_UP;
          int width = getWidth();
          int containerLeft = getScrollX();
          int containerRight = containerLeft + width;
          boolean leftwards = directionX == View.FOCUS_UP;
          View newFocused = findFocusableViewInBounds(up, top, bottom, leftwards, left, right);
          if (newFocused == null) {
              newFocused = this;
          }
          if ((top >= containerTop && bottom <= containerBottom) || (left >= containerLeft && right <= containerRight)) {
              handled = false;
          } else {
              int deltaY = up ? (top - containerTop) : (bottom - containerBottom);
              int deltaX = leftwards ? (left - containerLeft) : (right - containerRight);
              doScroll(deltaX, deltaY);
          }
          if (newFocused != findFocus() && newFocused.requestFocus(directionY)) {
              mTwoDScrollViewMovedFocus = true;
              mTwoDScrollViewMovedFocus = false;
          }
          return handled;
      }
docs: <p>Scrolls the view to make the area defined by <code>top</code> and
  <code>bottom</code> visible. This method attempts to give the focus
  to a component visible in this area. If no component can be focused in
  the new visible area, the focus is reclaimed by this scrollview.</p>
  
  @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
  to go upward
  {@link android.view.View#FOCUS_DOWN} to downward
  @param top       the top offset of the new area to be made visible
  @param bottom    the bottom offset of the new area to be made visible
  @return true if the key event is consumed by this method, false otherwise