docs: @Override
      public boolean performAccessibilityAction(int action, Bundle arguments) {
          if (super.performAccessibilityAction(action, arguments)) {
              return true;
          }
  
          int changeMultiplier = 0;
          int forward;
          int backward;
          if (Build.VERSION.SDK_INT >= 16) {
              forward = AccessibilityNodeInfo.ACTION_SCROLL_FORWARD;
              backward = AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD;
          } else {
              forward = AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD;
              backward = AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD;
          }
          if (action == forward) {
              changeMultiplier = 1;
          } else if (action == backward) {
              changeMultiplier = -1;
          }
          if (changeMultiplier != 0) {
              int value = getCurrentlyShowingValue();
              int stepSize = 0;
              int currentItemShowing = getCurrentItemShowing();
              if (currentItemShowing == HOUR_INDEX) {
                  stepSize = HOUR_VALUE_TO_DEGREES_STEP_SIZE;
                  value %= 12;
              } else if (currentItemShowing == MINUTE_INDEX) {
                  stepSize = MINUTE_VALUE_TO_DEGREES_STEP_SIZE;
              } else if (currentItemShowing == SECOND_INDEX) {
                  stepSize = SECOND_VALUE_TO_DEGREES_STEP_SIZE;
              }
  
              int degrees = value * stepSize;
              degrees = snapOnly30s(degrees, changeMultiplier);
              value = degrees / stepSize;
              int maxValue = 0;
              int minValue = 0;
              if (currentItemShowing == HOUR_INDEX) {
                  if (mIs24HourMode) {
                      maxValue = 23;
                  } else {
                      maxValue = 12;
                      minValue = 1;
                  }
              } else {
                  maxValue = 55;
              }
              if (value > maxValue) {
                  // If we scrolled forward past the highest number, wrap around to the lowest.
                  value = minValue;
              } else if (value < minValue) {
                  // If we scrolled backward past the lowest number, wrap around to the highest.
                  value = maxValue;
              }
  
              Timepoint newSelection;
              switch(currentItemShowing) {
                  case HOUR_INDEX:
                      newSelection = new Timepoint(
                              value,
                              mCurrentTime.getMinute(),
                              mCurrentTime.getSecond()
                      );
                      break;
                  case MINUTE_INDEX:
                      newSelection = new Timepoint(
                              mCurrentTime.getHour(),
                              value,
                              mCurrentTime.getSecond()
                      );
                      break;
                  case SECOND_INDEX:
                      newSelection = new Timepoint(
                              mCurrentTime.getHour(),
                              mCurrentTime.getMinute(),
                              value
                      );
                      break;
                  default:
                      newSelection = mCurrentTime;
              }
  
              setItem(currentItemShowing, newSelection);
              mListener.onValueSelected(newSelection);
              return true;
          }
  
          return false;
      }