title: Customized hour and minutes values inside android Digital timepicker
body: <p>In my app, the user have to choose appointment time using timpepicker But i have to show only available time in the time picker . So far i have customized the timePicker class by extending parent class and maximum and minimum time has been set using function.</p>
  
  <p>Main problem is that unwanted time has been disabled properly by customizing. But i just don't want to show time at which appointment is not available i.e. not showing disabled time.</p>
  
  <p>This is my customized code.</p>
  
  <pre><code>public class RangeTimePickerDialog extends TimePickerDialog {
  
      private int minHour = -1;
      private int minMinute = -1;
  
      private int maxHour = 25;
      private int maxMinute = 25;
  
      private int currentHour = 0;
      private int currentMinute = 0;
  
      private Calendar calendar = Calendar.getInstance();
      private DateFormat dateFormat;
  
  
      public RangeTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) {
          super(context, callBack, hourOfDay, minute, is24HourView);
          currentHour = hourOfDay;
          currentMinute = minute;
          dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
  
          try {
              Class&lt;?&gt; superclass = getClass().getSuperclass();
              Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
              mTimePickerField.setAccessible(true);
              TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
              mTimePicker.setOnTimeChangedListener(this);
          } catch (NoSuchFieldException e) {
          } catch (IllegalArgumentException e) {
          } catch (IllegalAccessException e) {
          }
  
          fixSpinner(context, hourOfDay, minute, is24HourView);
      }
  
      public void setMin(int hour, int minute) {
          minHour = hour;
          minMinute = minute;
      }
  
      public void setMax(int hour, int minute) {
          maxHour = hour;
          maxMinute = minute;
      }
  
  
      @Override
      public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
  
          boolean validTime = true;
          if (hourOfDay &lt; minHour || (hourOfDay == minHour &amp;&amp; minute &lt; minMinute)){
              validTime = false;
          }
  
          if (hourOfDay  &gt; maxHour || (hourOfDay == maxHour &amp;&amp; minute &gt; maxMinute)){
              validTime = false;
          }
  
          if (validTime) {
              currentHour = hourOfDay;
              currentMinute = minute;
          }
  
          updateTime(currentHour, currentMinute);
          updateDialogTitle(view, currentHour, currentMinute);
      }
  
      private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) {
          calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
          calendar.set(Calendar.MINUTE, minute);
          String title = dateFormat.format(calendar.getTime());
          setTitle(title);
      }
  
  
      private void fixSpinner(Context context, int hourOfDay, int minute, boolean is24HourView) {
          if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.LOLLIPOP) { // android:timePickerMode spinner and clock began in Lollipop
              try {
                  // Get the theme's android:timePickerMode
                  final int MODE_SPINNER = 2;
                  Class&lt;?&gt; styleableClass = Class.forName("com.android.internal.R$styleable");
                  Field timePickerStyleableField = styleableClass.getField("TimePicker");
                  int[] timePickerStyleable = (int[]) timePickerStyleableField.get(null);
                  final TypedArray a = context.obtainStyledAttributes(null, timePickerStyleable, android.R.attr.timePickerStyle, 0);
                  Field timePickerModeStyleableField = styleableClass.getField("TimePicker_timePickerMode");
                  int timePickerModeStyleable = timePickerModeStyleableField.getInt(null);
                  final int mode = a.getInt(timePickerModeStyleable, MODE_SPINNER);
                  a.recycle();
                  if (mode == MODE_SPINNER) {
                      TimePicker timePicker = (TimePicker) findField(TimePickerDialog.class, TimePicker.class, "mTimePicker").get(this);
                      Class&lt;?&gt; delegateClass = Class.forName("android.widget.TimePicker$TimePickerDelegate");
                      Field delegateField = findField(TimePicker.class, delegateClass, "mDelegate");
                      Object delegate = delegateField.get(timePicker);
                      Class&lt;?&gt; spinnerDelegateClass;
                      if (Build.VERSION.SDK_INT != Build.VERSION_CODES.LOLLIPOP) {
                          spinnerDelegateClass = Class.forName("android.widget.TimePickerSpinnerDelegate");
                      } else {
                          // TimePickerSpinnerDelegate was initially misnamed TimePickerClockDelegate in API 21!
                          spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate");
                      }
                      // In 7.0 Nougat for some reason the timePickerMode is ignored and the delegate is TimePickerClockDelegate
                      if (delegate.getClass() != spinnerDelegateClass) {
                          delegateField.set(timePicker, null); // throw out the TimePickerClockDelegate!
                          timePicker.removeAllViews(); // remove the TimePickerClockDelegate views
                          Constructor spinnerDelegateConstructor = spinnerDelegateClass.getConstructor(TimePicker.class, Context.class, AttributeSet.class, int.class, int.class);
                          spinnerDelegateConstructor.setAccessible(true);
                          // Instantiate a TimePickerSpinnerDelegate
                          delegate = spinnerDelegateConstructor.newInstance(timePicker, context, null, android.R.attr.timePickerStyle, 0);
                          delegateField.set(timePicker, delegate); // set the TimePicker.mDelegate to the spinner delegate
                          // Set up the TimePicker again, with the TimePickerSpinnerDelegate
                          timePicker.setIs24HourView(is24HourView);
                          timePicker.setCurrentHour(hourOfDay);
                          timePicker.setCurrentMinute(minute);
                          timePicker.setOnTimeChangedListener(this);
                          timePicker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
                      }
                  }
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      }
  
      private static Field findField(Class objectClass, Class fieldClass, String expectedName) {
          try {
              Field field = objectClass.getDeclaredField(expectedName);
              field.setAccessible(true);
              return field;
          } catch (NoSuchFieldException e) {} // ignore
          // search for it if it wasn't found under the expected ivar name
          for (Field searchField : objectClass.getDeclaredFields()) {
              if (searchField.getType() == fieldClass) {
                  searchField.setAccessible(true);
  
                  return searchField;
              }
          }
          return null;
      }
  }  
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/poNUD.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/poNUD.png" alt="enter image description here"></a></p>