() {
+ @Override
+ public void call(Boolean value) {
+ view.setSpinnersShown(value);
+ }
+ };
+ }
+}
diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java
new file mode 100644
index 00000000..ade45160
--- /dev/null
+++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java
@@ -0,0 +1,99 @@
+package com.jakewharton.rxbinding.widget;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import android.widget.TimePicker;
+
+import rx.Observable;
+import rx.functions.Action1;
+
+import static com.jakewharton.rxbinding.internal.Preconditions.checkNotNull;
+
+/**
+ * Static factory methods for creating {@linkplain Observable observables} for
+ * {@link android.widget.TimePicker}.
+ */
+public final class RxTimePicker {
+
+ private RxTimePicker() {
+ throw new AssertionError("No instances.");
+ }
+
+ /**
+ * Create an observable of the time change events on {@code view}.
+ *
+ * Warning: The created observable keeps a strong reference to {@code view}.
+ * Unsubscribe to free this reference.
+ *
+ * Note: A value will be emitted immediately on subscribe.
+ */
+ @CheckResult
+ @NonNull
+ public static Observable timeChange(@NonNull TimePicker view) {
+ checkNotNull(view, "view == null");
+ return Observable.create(new TimePickerTimeChangeOnSubscribe(view));
+ }
+
+ /**
+ * An action which sets whether {@code view} is a 24 hour view.
+ *
+ * Warning: The created observable keeps a strong reference to {@code view}.
+ * Unsubscribe to free this reference.
+ */
+ @CheckResult
+ @NonNull
+ public static Action1 super Boolean> is24HourView(@NonNull final TimePicker view) {
+ checkNotNull(view, "view == null");
+ return new Action1() {
+ @Override
+ public void call(Boolean value) {
+ view.setIs24HourView(value);
+ }
+ };
+ }
+
+ /**
+ * An action which sets the hour of {@code view}.
+ *
+ * Warning: The created observable keeps a strong reference to {@code view}.
+ * Unsubscribe to free this reference.
+ */
+ @CheckResult
+ @NonNull
+ public static Action1 super Integer> hour(@NonNull final TimePicker view) {
+ checkNotNull(view, "view == null");
+ return new Action1() {
+ @Override
+ public void call(Integer value) {
+ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
+ view.setCurrentHour(value);
+ } else {
+ view.setHour(value);
+ }
+ }
+ };
+ }
+
+ /**
+ * An action which sets the minute of {@code view}.
+ *
+ * Warning: The created observable keeps a strong reference to {@code view}.
+ * Unsubscribe to free this reference.
+ */
+ @CheckResult
+ @NonNull
+ public static Action1 super Integer> minute(@NonNull final TimePicker view) {
+ checkNotNull(view, "view == null");
+ return new Action1() {
+ @Override
+ public void call(Integer value) {
+ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
+ view.setCurrentMinute(value);
+ } else {
+ view.setMinute(value);
+ }
+ }
+ };
+ }
+
+}
diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java
new file mode 100644
index 00000000..99cc811f
--- /dev/null
+++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java
@@ -0,0 +1,82 @@
+package com.jakewharton.rxbinding.widget;
+
+import android.support.annotation.CheckResult;
+import android.support.annotation.NonNull;
+import android.widget.TimePicker;
+
+import com.jakewharton.rxbinding.view.ViewEvent;
+
+/**
+ * Class that wraps a time change event
+ */
+public class TimePickerTimeChangeEvent extends ViewEvent {
+
+ @CheckResult
+ @NonNull
+ public static TimePickerTimeChangeEvent create(@NonNull TimePicker view, int hourOfDay,
+ int minute) {
+ return new TimePickerTimeChangeEvent(view, hourOfDay, minute);
+ }
+
+ /**
+ * The hour of the day that was selected
+ */
+ private int hourOfDay;
+
+ /**
+ * The minute in hour that was selected
+ */
+ private int minute;
+
+ private TimePickerTimeChangeEvent(@NonNull TimePicker view, int hourOfDay, int minute) {
+ super(view);
+ this.hourOfDay = hourOfDay;
+ this.minute = minute;
+ }
+
+ /**
+ * Get the current hour
+ * @return int
+ */
+ public int getHourOfDay() {
+ return hourOfDay;
+ }
+
+ /**
+ * Get the current minute
+ * @return int
+ */
+ public int getMinute() {
+ return minute;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = result * 37 + view().hashCode();
+ result = result * 37 + hourOfDay;
+ result = result * 37 + minute;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof TimePickerTimeChangeEvent) {
+ TimePickerTimeChangeEvent other = (TimePickerTimeChangeEvent) o;
+ return this == other || this.hourOfDay == other.getHourOfDay()
+ && this.minute == other.getMinute();
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "TimePickerTimeChangeEvenet{view="
+ + view()
+ + ", hourOfDay="
+ + hourOfDay
+ + ", minute="
+ + minute
+ + '}';
+ }
+}
diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java
new file mode 100644
index 00000000..9bed4e45
--- /dev/null
+++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java
@@ -0,0 +1,58 @@
+package com.jakewharton.rxbinding.widget;
+
+import android.widget.TimePicker;
+
+import rx.Observable;
+import rx.Subscriber;
+import rx.android.MainThreadSubscription;
+
+import static rx.android.MainThreadSubscription.verifyMainThread;
+
+/**
+ * Observable that emits time change events
+ */
+public class TimePickerTimeChangeOnSubscribe
+ implements Observable.OnSubscribe {
+
+ /**
+ * The time picker that emits events
+ */
+ private TimePicker timePicker;
+
+ protected TimePickerTimeChangeOnSubscribe(TimePicker timePicker) {
+ this.timePicker = timePicker;
+ }
+
+ @Override
+ public void call(final Subscriber super TimePickerTimeChangeEvent> subscriber) {
+ verifyMainThread();
+
+ TimePicker.OnTimeChangedListener onTimeChangedListener
+ = new TimePicker.OnTimeChangedListener() {
+ @Override
+ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
+ if (!subscriber.isUnsubscribed()) {
+ subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, hourOfDay,
+ minute));
+ }
+ }
+ };
+ timePicker.setOnTimeChangedListener(onTimeChangedListener);
+
+ subscriber.add(new MainThreadSubscription() {
+ @Override
+ protected void onUnsubscribe() {
+ timePicker.setOnTimeChangedListener(null);
+ }
+ });
+
+ // Emit initial value
+ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
+ subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker,
+ timePicker.getCurrentHour(), timePicker.getCurrentMinute()));
+ } else {
+ subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, timePicker.getHour(),
+ timePicker.getMinute()));
+ }
+ }
+}