{"record":{"id":"302e0e7e848a0006","repo":"material-components/material-components-android","slug":"no-button-data-for-mode-mode","errorCode":null,"errorMessage":"no button data for mode: > mode <","messagePattern":"no button data for mode: > mode <","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"lib/java/com/google/android/material/timepicker/MaterialTimePicker.java","lineNumber":458,"sourceCode":"    timePickerTextInputPresenter.clearCheck();\n\n    return timePickerTextInputPresenter;\n  }\n\n  private ModeButtonData getModeButtonData(@InputMode int mode) {\n    switch (mode) {\n      case INPUT_MODE_KEYBOARD:\n        return new ModeButtonData(\n            clockIcon,\n            R.string.material_timepicker_clock_mode_description,\n            R.string.material_timepicker_clock_mode_tooltip);\n      case INPUT_MODE_CLOCK:\n        return new ModeButtonData(\n            keyboardIcon,\n            R.string.material_timepicker_text_input_mode_description,\n            R.string.material_timepicker_text_input_mode_tooltip);\n      default:\n        throw new IllegalArgumentException(\"no button data for mode: \" + mode);\n    }\n  }\n\n  @Nullable\n  TimePickerClockPresenter getTimePickerClockPresenter() {\n    return timePickerClockPresenter;\n  }\n\n  @VisibleForTesting\n  void setActivePresenter(@Nullable TimePickerPresenter presenter) {\n    activePresenter = presenter;\n  }\n\n  /** The supplied listener is called when the user confirms a valid selection. */\n  public boolean addOnPositiveButtonClickListener(@NonNull OnClickListener listener) {\n    return positiveButtonListeners.add(listener);\n  }\n","sourceCodeStart":440,"sourceCodeEnd":476,"githubUrl":"https://github.com/material-components/material-components-android/blob/ac7e18efeefb331850c561faf9ab8bf81d27ba68/lib/java/com/google/android/material/timepicker/MaterialTimePicker.java#L440-L476","documentation":"MaterialTimePicker.getButtonDataForMode (MaterialTimePicker.java:458) maps the picker's input mode to icon/tooltip data for the mode-toggle button. The switch only handles INPUT_MODE_KEYBOARD (0) and INPUT_MODE_CLOCK (1); any other int falls through to the default branch and throws IllegalArgumentException. This indicates the mode value was never produced by the library's own constants.","triggerScenarios":"Calling materialTimePicker.setMode(someInt) with a value outside 0/1 and then showing the picker (the mode-toggle button is built when the picker UI is constructed); passing a mode read from bundle/state that was corrupted or hand-computed; reflection or a custom saved-state round-trip writing an invalid mode.","commonSituations":"Hardcoding a mode int instead of using MaterialTimePicker.INPUT_MODE_CLOCK / INPUT_MODE_KEYBOARD; persisting mode in savedInstanceState with a stale value after a library constant change; passing a value obtained from an enum ordinal of the wrong enum.","solutions":["Always use the constants MaterialTimePicker.INPUT_MODE_KEYBOARD or MaterialTimePicker.INPUT_MODE_CLOCK.","Validate any dynamically sourced mode: if (mode != INPUT_MODE_KEYBOARD && mode != INPUT_MODE_CLOCK) mode = INPUT_MODE_CLOCK;","When persisting/restoring mode, sanitize on read with Math.max(0, Math.min(1, mode)) or an explicit whitelist check."],"exampleFix":"// before\npicker.setMode(prefs.getInt(\"time_mode\", 3)); // 3 is invalid\n\n// after\nint mode = prefs.getInt(\"time_mode\", MaterialTimePicker.INPUT_MODE_CLOCK);\nif (mode != MaterialTimePicker.INPUT_MODE_CLOCK && mode != MaterialTimePicker.INPUT_MODE_KEYBOARD) {\n  mode = MaterialTimePicker.INPUT_MODE_CLOCK;\n}\npicker.setMode(mode);","handlingStrategy":"validation","validationCode":"static int sanitizeTimePickerMode(int mode) {\n  return (mode == MaterialTimePicker.INPUT_MODE_KEYBOARD\n          || mode == MaterialTimePicker.INPUT_MODE_CLOCK)\n      ? mode\n      : MaterialTimePicker.INPUT_MODE_CLOCK;\n}\npicker.setMode(sanitizeTimePickerMode(rawMode));","typeGuard":null,"tryCatchPattern":"try { picker.setMode(mode); } catch (IllegalArgumentException e) { picker.setMode(MaterialTimePicker.INPUT_MODE_CLOCK); } // last-resort only; prefer pre-validation","preventionTips":["Never hardcode mode ints; use MaterialTimePicker.INPUT_MODE_* constants.","Sanitize persisted/bundled modes on read.","Wrap picker construction behind one factory that validates mode centrally."],"tags":["android","material-components","timepicker","enum-validation","input-mode"],"backgroundTag":null,"analyzedSha":"ac7e18efeefb331850c561faf9ab8bf81d27ba68","analyzedAt":"2026-08-14T15:35:35.735Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}