From 8cd40128927103f85216891a72082b8bf67b3bbb Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Sun, 8 May 2016 14:47:52 +0300 Subject: [PATCH 1/7] added RxTimePicker --- .../rxbinding/widget/RxTimePicker.java | 98 +++++++++++++++++++ .../widget/TimePickerTimeChangeEvent.java | 62 ++++++++++++ .../TimePickerTimeChangeOnSubscribe.java | 47 +++++++++ 3 files changed, 207 insertions(+) create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java 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..a966bff9 --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java @@ -0,0 +1,98 @@ +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 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 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 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..c54aea70 --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java @@ -0,0 +1,62 @@ +package com.jakewharton.rxbinding.widget; + +import android.support.annotation.CheckResult; +import android.support.annotation.NonNull; +import android.widget.RatingBar; +import android.widget.TimePicker; + +import com.jakewharton.rxbinding.view.ViewEvent; + +/** + * Created by CLP STUDIO + */ +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; + } + + public int getHourOfDay() { + return hourOfDay; + } + + 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 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..6b2736db --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java @@ -0,0 +1,47 @@ +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; + +public class TimePickerTimeChangeOnSubscribe implements Observable.OnSubscribe { + + private TimePicker timePicker; + + protected TimePickerTimeChangeOnSubscribe(TimePicker timePicker) { + this.timePicker = timePicker; + } + + @Override + public void call(final Subscriber 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())); + } + } +} From 5d127a7452b5048e353688fae7c161af8e9e9ad7 Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Tue, 10 May 2016 18:57:21 +0300 Subject: [PATCH 2/7] added tests for RxTimePicker --- rxbinding/src/androidTest/AndroidManifest.xml | 1 + .../rxbinding/widget/RxRatingBarTest.java | 4 +- .../rxbinding/widget/RxTimePickerTest.java | 115 ++++++++++++++++++ .../widget/RxTimePickerTestActivity.java | 18 +++ .../widget/TimePickerTimeChangeEvent.java | 25 +++- .../TimePickerTimeChangeOnSubscribe.java | 5 + 6 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java create mode 100644 rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTestActivity.java diff --git a/rxbinding/src/androidTest/AndroidManifest.xml b/rxbinding/src/androidTest/AndroidManifest.xml index 5e20ebed..f0b321ae 100644 --- a/rxbinding/src/androidTest/AndroidManifest.xml +++ b/rxbinding/src/androidTest/AndroidManifest.xml @@ -12,6 +12,7 @@ + o = new RecordingObserver<>(); - Subscription subscription = RxRatingBar.ratingChangeEvents(view) // - .subscribeOn(AndroidSchedulers.mainThread()) // + Subscription subscription = RxRatingBar.ratingChangeEvents(view) + .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(o); assertThat(o.takeNext()).isEqualTo(RatingBarChangeEvent.create(view, 0f, false)); diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java new file mode 100644 index 00000000..0aabe854 --- /dev/null +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java @@ -0,0 +1,115 @@ +package com.jakewharton.rxbinding.widget; + +import android.app.Instrumentation; +import android.support.test.InstrumentationRegistry; +import android.support.test.annotation.UiThreadTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.widget.TimePicker; + +import com.jakewharton.rxbinding.RecordingObserver; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; + +import static com.google.common.truth.Truth.assertThat; + +@RunWith(AndroidJUnit4.class) +public class RxTimePickerTest { + @Rule + public final ActivityTestRule activityRule = + new ActivityTestRule<>(RxTimePickerTestActivity.class); + + /** + * The time picker view + */ + private TimePicker timePicker; + + /** + * The instrumentation object + */ + private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + + @Before + public void setUp() { + timePicker = activityRule.getActivity().timePicker; + } + + @Test + public void testTimeChanges() { + RecordingObserver o = new RecordingObserver<>(); + Subscription subscription = RxTimePicker.timeChange(timePicker) // + .subscribeOn(AndroidSchedulers.mainThread()) // + .subscribe(o); + assertThat(o.takeNext()).isNotNull(); + + instrumentation.runOnMainSync(new Runnable() { + @Override + public void run() { + timePicker.setCurrentMinute(59); + timePicker.setCurrentHour(11); + timePicker.setCurrentMinute(23); + } + }); + TimePickerTimeChangeEvent event = o.takeNext(); + assertThat(event).isEqualTo(TimePickerTimeChangeEvent.create(timePicker, event.getHourOfDay(), 59)); + + + //there is a bug in the android system that calls onTimeChange twice + o.takeNext(); + event = o.takeNext(); + assertThat(event).isEqualTo(TimePickerTimeChangeEvent.create(timePicker, 11, event.getMinute())); + + //there is a bug in the android system that calls onTimeChange twice + o.takeNext(); + event = o.takeNext(); + assertThat(event).isEqualTo(TimePickerTimeChangeEvent.create(timePicker, event.getHourOfDay(), 23)); + + subscription.unsubscribe(); + } + + @Test + @UiThreadTest + public void testIs24HourMode() { + Action1 action = RxTimePicker.is24HourView(timePicker); + action.call(true); + assertThat(timePicker.is24HourView()).isTrue(); + action.call(false); + assertThat(timePicker.is24HourView()).isFalse(); + } + + + @Test + @UiThreadTest + public void testHour() { + Action1 action = RxTimePicker.hour(timePicker); + action.call(12); + assertThat(timePicker.getCurrentHour()).isEqualTo(12); + action.call(13); + assertThat(timePicker.getCurrentHour()).isEqualTo(13); + action.call(1); + assertThat(timePicker.getCurrentHour()).isEqualTo(1); + action.call(23); + assertThat(timePicker.getCurrentHour()).isEqualTo(23); + } + + @Test + @UiThreadTest + public void testMinute() { + Action1 action = RxTimePicker.minute(timePicker); + action.call(59); + assertThat(timePicker.getCurrentMinute()).isEqualTo(59); + action.call(13); + assertThat(timePicker.getCurrentMinute()).isEqualTo(13); + action.call(45); + assertThat(timePicker.getCurrentMinute()).isEqualTo(45); + action.call(33); + assertThat(timePicker.getCurrentMinute()).isEqualTo(33); + } +} diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTestActivity.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTestActivity.java new file mode 100644 index 00000000..f5de27d6 --- /dev/null +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTestActivity.java @@ -0,0 +1,18 @@ +package com.jakewharton.rxbinding.widget; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.TimePicker; + +public final class RxTimePickerTestActivity extends Activity { + + TimePicker timePicker; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + timePicker = new TimePicker(this); + setContentView(timePicker); + } +} diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java index c54aea70..6cc58049 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java @@ -8,7 +8,7 @@ import com.jakewharton.rxbinding.view.ViewEvent; /** - * Created by CLP STUDIO + * Class that wraps a time change event */ public class TimePickerTimeChangeEvent extends ViewEvent { @@ -34,15 +34,24 @@ private TimePickerTimeChangeEvent(@NonNull TimePicker view, int hourOfDay, int m 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() { + @Override + public int hashCode() { int result = 17; result = result * 37 + view().hashCode(); result = result * 37 + hourOfDay; @@ -50,7 +59,17 @@ public int getMinute() { return result; } - @Override public String toString() { + @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=" diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java index 6b2736db..e65b9c31 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java @@ -10,6 +10,9 @@ public class TimePickerTimeChangeOnSubscribe implements Observable.OnSubscribe { + /** + * The time picker that emits events + */ private TimePicker timePicker; protected TimePickerTimeChangeOnSubscribe(TimePicker timePicker) { @@ -24,6 +27,8 @@ public void call(final Subscriber subscriber) @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { if (!subscriber.isUnsubscribed()) { + int h = hourOfDay; + int m = minute; subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, hourOfDay, minute)); } } From a4defc4669761c8e08ed8de566ab0a4e9807340f Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Tue, 10 May 2016 19:37:43 +0300 Subject: [PATCH 3/7] added RxDatePicker --- .../widget/DatePickerChangeEvent.java | 77 ++++++++++++ .../widget/DatePickerChangeOnSubscribe.java | 60 ++++++++++ .../rxbinding/widget/RxDatePicker.java | 113 ++++++++++++++++++ .../TimePickerTimeChangeOnSubscribe.java | 9 +- 4 files changed, 255 insertions(+), 4 deletions(-) create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java new file mode 100644 index 00000000..5a500f44 --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java @@ -0,0 +1,77 @@ +package com.jakewharton.rxbinding.widget; + +import android.support.annotation.CheckResult; +import android.support.annotation.NonNull; +import android.widget.DatePicker; +import android.widget.TimePicker; + +import com.jakewharton.rxbinding.view.ViewEvent; + +import rx.Observable; + +public class DatePickerChangeEvent extends ViewEvent { + + @CheckResult + @NonNull + public static DatePickerChangeEvent create(@NonNull DatePicker view, int year, int monthOfYear, int dayOfMonth) { + return new DatePickerChangeEvent(view, year, monthOfYear, dayOfMonth); + } + + private int year; + + private int monthOfYear; + + private int dayOfMonth; + + private DatePickerChangeEvent(@NonNull DatePicker view, int year, int monthOfYear, int dayOfMonth) { + super(view); + this.year = year; + this.monthOfYear = monthOfYear; + this.dayOfMonth = dayOfMonth; + } + + public int getYear() { + return year; + } + + public int getMonthOfYear() { + return monthOfYear; + } + + public int getDayOfMonth() { + return dayOfMonth; + } + + @Override + public int hashCode() { + int result = 17; + result = result * 37 + view().hashCode(); + result = result * 37 + year; + result = result * 37 + monthOfYear; + result = result * 37 + dayOfMonth; + return result; + } + + @Override + public boolean equals(Object o) { + if (o instanceof DatePickerChangeEvent) { + DatePickerChangeEvent other = (DatePickerChangeEvent) o; + return this == other || this.year == other.getYear() && this.monthOfYear == other.getMonthOfYear() + && this.dayOfMonth == other.getDayOfMonth(); + } + return false; + } + + @Override + public String toString() { + return "DatePickerChangeEvent{view=" + + view() + + ", year=" + + year + + ", monthOfYear=" + + monthOfYear + + ", dayOfMonth " + + dayOfMonth + + '}'; + } +} diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java new file mode 100644 index 00000000..f2b92ff9 --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java @@ -0,0 +1,60 @@ +package com.jakewharton.rxbinding.widget; + +import android.widget.DatePicker; + +import rx.Observable; +import rx.Subscriber; + +import static rx.android.MainThreadSubscription.verifyMainThread; + +/** + * Observable that emits date change events + */ +public class DatePickerChangeOnSubscribe implements Observable.OnSubscribe { + + /** + * The current year + */ + private int year; + + /** + * The current month of the year + */ + private int monthOfYear; + + /** + * The current day of the month + */ + private int dayOfMonth; + + /** + * The DatePicker object that emits + */ + private DatePicker datePicker; + + public DatePickerChangeOnSubscribe(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) { + this.datePicker = datePicker; + this.year = year; + this.monthOfYear = monthOfYear; + this.dayOfMonth = dayOfMonth; + } + + @Override + public void call(final Subscriber subscriber) { + verifyMainThread(); + + DatePicker.OnDateChangedListener onDateChangedListener = new DatePicker.OnDateChangedListener() { + @Override + public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + if (!subscriber.isUnsubscribed()) { + subscriber.onNext(DatePickerChangeEvent.create(view, year, monthOfYear, dayOfMonth)); + } + } + }; + + datePicker.init(year, monthOfYear, dayOfMonth, onDateChangedListener); + + // Emit initial value + subscriber.onNext(DatePickerChangeEvent.create(datePicker, datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth())); + } +} diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java new file mode 100644 index 00000000..2f768c4c --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java @@ -0,0 +1,113 @@ +package com.jakewharton.rxbinding.widget; + +import android.annotation.TargetApi; +import android.support.annotation.CheckResult; +import android.support.annotation.NonNull; +import android.widget.DatePicker; +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.DatePicker}. + */ +public class RxDatePicker { + + private RxDatePicker() { + 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 init(@NonNull DatePicker view, int year, int monthOfYear, int dayOfMonth) { + checkNotNull(view, "view == null"); + return Observable.create(new DatePickerChangeOnSubscribe(view, year, monthOfYear, dayOfMonth)); + } + + /** + * An action which sets the first day of week + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + @TargetApi(21) + public static Action1 firstDayOfWeek(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Integer value) { + view.setFirstDayOfWeek(value); + } + }; + } + + /** + * An action which sets the maximal date supported by this {@link DatePicker} in + * milliseconds since January 1, 1970 00:00:00 in + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + public static Action1 maxDate(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Long value) { + view.setMaxDate(value); + } + }; + } + + /** + * An action which sets the minimal date supported by this {@link DatePicker} in + * milliseconds since January 1, 1970 00:00:00 in + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + public static Action1 minDate(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Long value) { + view.setMinDate(value); + } + }; + } + + /** + * An action which sets whether {@code view} show spinners. + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + public static Action1 areSpinnersShown(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Boolean value) { + view.setSpinnersShown(value); + } + }; + } +} diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java index e65b9c31..078604cf 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java @@ -8,6 +8,9 @@ import static rx.android.MainThreadSubscription.verifyMainThread; +/** + * Observable that emits time change events + */ public class TimePickerTimeChangeOnSubscribe implements Observable.OnSubscribe { /** @@ -27,8 +30,6 @@ public void call(final Subscriber subscriber) @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { if (!subscriber.isUnsubscribed()) { - int h = hourOfDay; - int m = minute; subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, hourOfDay, minute)); } } @@ -43,9 +44,9 @@ protected void onUnsubscribe() { }); // Emit initial value - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M){ + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) { subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, timePicker.getCurrentHour(), timePicker.getCurrentMinute())); - }else{ + } else { subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, timePicker.getHour(), timePicker.getMinute())); } } From b3de6e12316026ee274cd30fc19043bc0d0a6439 Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Tue, 10 May 2016 20:21:08 +0300 Subject: [PATCH 4/7] added tests for RxDatePicker --- rxbinding/src/androidTest/AndroidManifest.xml | 1 + .../rxbinding/widget/RxDatePickerTest.java | 135 ++++++++++++++++++ .../widget/RxDatePickerTestActivity.java | 19 +++ .../rxbinding/widget/RxTimePickerTest.java | 2 + .../rxbinding/widget/RxDatePicker.java | 59 +++++++- 5 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxDatePickerTest.java create mode 100644 rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxDatePickerTestActivity.java diff --git a/rxbinding/src/androidTest/AndroidManifest.xml b/rxbinding/src/androidTest/AndroidManifest.xml index f0b321ae..0d438f24 100644 --- a/rxbinding/src/androidTest/AndroidManifest.xml +++ b/rxbinding/src/androidTest/AndroidManifest.xml @@ -13,6 +13,7 @@ + activityRule = + new ActivityTestRule<>(RxDatePickerTestActivity.class); + + /** + * The time picker view + */ + private DatePicker datePicker; + + /** + * The instrumentation object + */ + private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + + @Before + public void setUp() { + datePicker = activityRule.getActivity().datePicker; + } + + @Test + public void testDateChanges() { + RecordingObserver o = new RecordingObserver<>(); + Subscription subscription = RxDatePicker.init(datePicker, 2016, 5, 10) // + .subscribeOn(AndroidSchedulers.mainThread()) // + .subscribe(o); + assertThat(o.takeNext()).isEqualTo(DatePickerChangeEvent.create(datePicker, 2016, 5, 10)); + + instrumentation.runOnMainSync(new Runnable() { + @Override + public void run() { + datePicker.updateDate(2016, 1, 1); + datePicker.updateDate(2016, 1, 2); + datePicker.updateDate(2016, 2, 2); + datePicker.updateDate(2017, 11, 25); + } + }); + assertThat(o.takeNext()).isEqualTo(DatePickerChangeEvent.create(datePicker, 2016, 1, 1)); + assertThat(o.takeNext()).isEqualTo(DatePickerChangeEvent.create(datePicker, 2016, 1, 2)); + assertThat(o.takeNext()).isEqualTo(DatePickerChangeEvent.create(datePicker, 2016, 2, 2)); + assertThat(o.takeNext()).isEqualTo(DatePickerChangeEvent.create(datePicker, 2017, 11, 25)); + + subscription.unsubscribe(); + } + + @Test + @UiThreadTest + public void testUpdateDate(){ + Action1 action = RxDatePicker.updateYear(datePicker); + action.call(1); + assertThat(datePicker.getYear()).isEqualTo(1); + action.call(12); + assertThat(datePicker.getYear()).isEqualTo(12); + + Action1 action2 = RxDatePicker.updateDayOfMonth(datePicker); + action2.call(25); + assertThat(datePicker.getDayOfMonth()).isEqualTo(25); + action2.call(2); + assertThat(datePicker.getDayOfMonth()).isEqualTo(2); + + Action1 action3 = RxDatePicker.updateMonthOfYear(datePicker); + action3.call(11); + assertThat(datePicker.getMonth()).isEqualTo(11); + action3.call(5); + assertThat(datePicker.getMonth()).isEqualTo(5); + } + + @Test + @UiThreadTest + @TargetApi(21) + public void testSetFirstDayOfWeek(){ + Action1 action = RxDatePicker.firstDayOfWeek(datePicker); + action.call(1); + assertThat(datePicker.getFirstDayOfWeek()).isEqualTo(1); + action.call(7); + assertThat(datePicker.getFirstDayOfWeek()).isEqualTo(7); + assertThat(datePicker.getFirstDayOfWeek()).isNotEqualTo(5); + } + + @Test + @UiThreadTest + public void testMaxMinDate(){ + Action1 action = RxDatePicker.maxDate(datePicker); + action.call(1L); + assertThat(datePicker.getMaxDate()).isEqualTo(1L); + action.call(1232131232131L); + assertThat(datePicker.getMaxDate()).isEqualTo(1232131232131L); + + Action1 action2 = RxDatePicker.minDate(datePicker); + action2.call(12L); + assertThat(datePicker.getMinDate()).isEqualTo(12L); + action2.call(3232L); + assertThat(datePicker.getMinDate()).isEqualTo(3232L); + } + + @Test + @UiThreadTest + public void testShownSpinners(){ + Action1 action = RxDatePicker.spinnersShown(datePicker); +// action.call(true); + datePicker.setSpinnersShown(true); + //it is false because the spinners are not shown on calendar mode + assertThat(datePicker.getSpinnersShown()).isFalse(); + action.call(false); + assertThat(datePicker.getSpinnersShown()).isFalse(); + + } + +} diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxDatePickerTestActivity.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxDatePickerTestActivity.java new file mode 100644 index 00000000..15c971cb --- /dev/null +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxDatePickerTestActivity.java @@ -0,0 +1,19 @@ +package com.jakewharton.rxbinding.widget; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.DatePicker; + +public class RxDatePickerTestActivity extends Activity { + + DatePicker datePicker; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + datePicker = new DatePicker(this); + setContentView(datePicker); + } + +} diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java index 0aabe854..eff6e4f0 100644 --- a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java @@ -3,6 +3,7 @@ import android.app.Instrumentation; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; +import android.support.test.espresso.core.deps.guava.primitives.Booleans; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.widget.TimePicker; @@ -112,4 +113,5 @@ public void testMinute() { action.call(33); assertThat(timePicker.getCurrentMinute()).isEqualTo(33); } + } diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java index 2f768c4c..365ce9ac 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java @@ -36,6 +36,63 @@ public static Observable init(@NonNull DatePicker view, i return Observable.create(new DatePickerChangeOnSubscribe(view, year, monthOfYear, dayOfMonth)); } + /** + * An action which updates the year + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + @TargetApi(21) + public static Action1 updateYear(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Integer newYear) { + view.updateDate(newYear, view.getMonth(), view.getDayOfMonth()); + } + }; + } + + /** + * An action which updates the month of the year + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + @TargetApi(21) + public static Action1 updateMonthOfYear(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Integer newMonth) { + view.updateDate(view.getYear(), newMonth, view.getDayOfMonth()); + } + }; + } + + /** + * An action which updates the day of the month + *

+ * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe + * to free this reference. + */ + @CheckResult + @NonNull + @TargetApi(21) + public static Action1 updateDayOfMonth(@NonNull final DatePicker view) { + checkNotNull(view, "view == null"); + return new Action1() { + @Override + public void call(Integer newDay) { + view.updateDate(view.getYear(), view.getMonth(), newDay); + } + }; + } + /** * An action which sets the first day of week *

@@ -101,7 +158,7 @@ public void call(Long value) { */ @CheckResult @NonNull - public static Action1 areSpinnersShown(@NonNull final DatePicker view) { + public static Action1 spinnersShown(@NonNull final DatePicker view) { checkNotNull(view, "view == null"); return new Action1() { @Override From df2488e941d714a784e097c42ff3543fe7a0eb1f Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Tue, 10 May 2016 20:34:27 +0300 Subject: [PATCH 5/7] change javadocs --- .../rxbinding/widget/RxDatePicker.java | 1 - .../rxbinding/widget/RxTimePicker.java | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java index 365ce9ac..c95b199d 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java @@ -4,7 +4,6 @@ import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import android.widget.DatePicker; -import android.widget.TimePicker; import rx.Observable; import rx.functions.Action1; diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java index a966bff9..6fc5ce92 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java @@ -21,8 +21,8 @@ private RxTimePicker() { /** * 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. + * 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. */ @@ -36,8 +36,8 @@ public static Observable timeChange(@NonNull TimePick /** * 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. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -54,8 +54,8 @@ public void call(Boolean 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. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -76,8 +76,8 @@ public void call(Integer 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. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull From 11b0c506a4eca86eba39e5df660352be6f802b40 Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Tue, 10 May 2016 20:49:35 +0300 Subject: [PATCH 6/7] solve checkstyle errors --- .../rxbinding/widget/RxTimePickerTest.java | 1 - .../widget/DatePickerChangeEvent.java | 12 +++--- .../widget/DatePickerChangeOnSubscribe.java | 12 ++++-- .../rxbinding/widget/RxDatePicker.java | 41 ++++++++++--------- .../rxbinding/widget/RxTimePicker.java | 3 +- .../widget/TimePickerTimeChangeEvent.java | 7 ++-- .../TimePickerTimeChangeOnSubscribe.java | 15 ++++--- 7 files changed, 52 insertions(+), 39 deletions(-) diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java index eff6e4f0..3420f947 100644 --- a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding/widget/RxTimePickerTest.java @@ -3,7 +3,6 @@ import android.app.Instrumentation; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; -import android.support.test.espresso.core.deps.guava.primitives.Booleans; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.widget.TimePicker; diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java index 5a500f44..be234c11 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeEvent.java @@ -3,17 +3,15 @@ import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import android.widget.DatePicker; -import android.widget.TimePicker; import com.jakewharton.rxbinding.view.ViewEvent; -import rx.Observable; - public class DatePickerChangeEvent extends ViewEvent { @CheckResult @NonNull - public static DatePickerChangeEvent create(@NonNull DatePicker view, int year, int monthOfYear, int dayOfMonth) { + public static DatePickerChangeEvent create(@NonNull DatePicker view, int year, int monthOfYear, + int dayOfMonth) { return new DatePickerChangeEvent(view, year, monthOfYear, dayOfMonth); } @@ -23,7 +21,8 @@ public static DatePickerChangeEvent create(@NonNull DatePicker view, int year, i private int dayOfMonth; - private DatePickerChangeEvent(@NonNull DatePicker view, int year, int monthOfYear, int dayOfMonth) { + private DatePickerChangeEvent(@NonNull DatePicker view, int year, int monthOfYear, + int dayOfMonth) { super(view); this.year = year; this.monthOfYear = monthOfYear; @@ -56,7 +55,8 @@ public int hashCode() { public boolean equals(Object o) { if (o instanceof DatePickerChangeEvent) { DatePickerChangeEvent other = (DatePickerChangeEvent) o; - return this == other || this.year == other.getYear() && this.monthOfYear == other.getMonthOfYear() + return this == other || this.year == other.getYear() + && this.monthOfYear == other.getMonthOfYear() && this.dayOfMonth == other.getDayOfMonth(); } return false; diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java index f2b92ff9..f0601630 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java @@ -32,7 +32,8 @@ public class DatePickerChangeOnSubscribe implements Observable.OnSubscribe subscriber) { verifyMainThread(); - DatePicker.OnDateChangedListener onDateChangedListener = new DatePicker.OnDateChangedListener() { + DatePicker.OnDateChangedListener onDateChangedListener + = new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (!subscriber.isUnsubscribed()) { - subscriber.onNext(DatePickerChangeEvent.create(view, year, monthOfYear, dayOfMonth)); + subscriber.onNext(DatePickerChangeEvent.create(view, year, monthOfYear, + dayOfMonth)); } } }; @@ -55,6 +58,7 @@ public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfM datePicker.init(year, monthOfYear, dayOfMonth, onDateChangedListener); // Emit initial value - subscriber.onNext(DatePickerChangeEvent.create(datePicker, datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth())); + subscriber.onNext(DatePickerChangeEvent.create(datePicker, datePicker.getYear(), + datePicker.getMonth(), datePicker.getDayOfMonth())); } } diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java index c95b199d..ab1e0eb1 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxDatePicker.java @@ -11,7 +11,8 @@ import static com.jakewharton.rxbinding.internal.Preconditions.checkNotNull; /** - * Static factory methods for creating {@linkplain Observable observables} for {@link android.widget.DatePicker}. + * Static factory methods for creating {@linkplain Observable observables} for + * {@link android.widget.DatePicker}. */ public class RxDatePicker { @@ -23,23 +24,25 @@ private RxDatePicker() { /** * 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. + * 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 init(@NonNull DatePicker view, int year, int monthOfYear, int dayOfMonth) { + public static Observable init(@NonNull DatePicker view, int year, + int monthOfYear, int dayOfMonth) { checkNotNull(view, "view == null"); - return Observable.create(new DatePickerChangeOnSubscribe(view, year, monthOfYear, dayOfMonth)); + return Observable.create(new DatePickerChangeOnSubscribe(view, year, monthOfYear, + dayOfMonth)); } /** * An action which updates the year *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -57,8 +60,8 @@ public void call(Integer newYear) { /** * An action which updates the month of the year *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -76,8 +79,8 @@ public void call(Integer newMonth) { /** * An action which updates the day of the month *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -95,8 +98,8 @@ public void call(Integer newDay) { /** * An action which sets the first day of week *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -115,8 +118,8 @@ public void call(Integer value) { * An action which sets the maximal date supported by this {@link DatePicker} in * milliseconds since January 1, 1970 00:00:00 in *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -134,8 +137,8 @@ public void call(Long value) { * An action which sets the minimal date supported by this {@link DatePicker} in * milliseconds since January 1, 1970 00:00:00 in *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull @@ -152,8 +155,8 @@ public void call(Long value) { /** * An action which sets whether {@code view} show spinners. *

- * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe - * to free this reference. + * Warning: The created observable keeps a strong reference to {@code view}. + * Unsubscribe to free this reference. */ @CheckResult @NonNull diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java index 6fc5ce92..ade45160 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/RxTimePicker.java @@ -10,7 +10,8 @@ import static com.jakewharton.rxbinding.internal.Preconditions.checkNotNull; /** - * Static factory methods for creating {@linkplain Observable observables} for {@link android.widget.TimePicker}. + * Static factory methods for creating {@linkplain Observable observables} for + * {@link android.widget.TimePicker}. */ public final class RxTimePicker { diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java index 6cc58049..99cc811f 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeEvent.java @@ -2,7 +2,6 @@ import android.support.annotation.CheckResult; import android.support.annotation.NonNull; -import android.widget.RatingBar; import android.widget.TimePicker; import com.jakewharton.rxbinding.view.ViewEvent; @@ -14,7 +13,8 @@ public class TimePickerTimeChangeEvent extends ViewEvent { @CheckResult @NonNull - public static TimePickerTimeChangeEvent create(@NonNull TimePicker view, int hourOfDay, int minute) { + public static TimePickerTimeChangeEvent create(@NonNull TimePicker view, int hourOfDay, + int minute) { return new TimePickerTimeChangeEvent(view, hourOfDay, minute); } @@ -63,7 +63,8 @@ public int hashCode() { 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 this == other || this.hourOfDay == other.getHourOfDay() + && this.minute == other.getMinute(); } return false; } diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java index 078604cf..9bed4e45 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/TimePickerTimeChangeOnSubscribe.java @@ -11,7 +11,8 @@ /** * Observable that emits time change events */ -public class TimePickerTimeChangeOnSubscribe implements Observable.OnSubscribe { +public class TimePickerTimeChangeOnSubscribe + implements Observable.OnSubscribe { /** * The time picker that emits events @@ -26,11 +27,13 @@ protected TimePickerTimeChangeOnSubscribe(TimePicker timePicker) { public void call(final Subscriber subscriber) { verifyMainThread(); - TimePicker.OnTimeChangedListener onTimeChangedListener = new TimePicker.OnTimeChangedListener() { + 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)); + subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, hourOfDay, + minute)); } } }; @@ -45,9 +48,11 @@ protected void onUnsubscribe() { // 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())); + subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, + timePicker.getCurrentHour(), timePicker.getCurrentMinute())); } else { - subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, timePicker.getHour(), timePicker.getMinute())); + subscriber.onNext(TimePickerTimeChangeEvent.create(timePicker, timePicker.getHour(), + timePicker.getMinute())); } } } From 6f0050460774933010fa001de918a56985f77439 Mon Sep 17 00:00:00 2001 From: Clapa Lucian Date: Tue, 10 May 2016 20:59:32 +0300 Subject: [PATCH 7/7] remove callback for RxDateTime on unsubscribe --- .../rxbinding/widget/DatePickerChangeOnSubscribe.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java index f0601630..4aaccdda 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding/widget/DatePickerChangeOnSubscribe.java @@ -4,6 +4,7 @@ import rx.Observable; import rx.Subscriber; +import rx.android.MainThreadSubscription; import static rx.android.MainThreadSubscription.verifyMainThread; @@ -54,9 +55,16 @@ public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfM } } }; - datePicker.init(year, monthOfYear, dayOfMonth, onDateChangedListener); + subscriber.add(new MainThreadSubscription() { + @Override + protected void onUnsubscribe() { + datePicker.init(datePicker.getYear(), datePicker.getMonth(), + datePicker.getDayOfMonth(), null); + } + }); + // Emit initial value subscriber.onNext(DatePickerChangeEvent.create(datePicker, datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth()));