From f0409c08eb20d330437c5b900522ef7df1fe93ac Mon Sep 17 00:00:00 2001 From: kujyp Date: Tue, 20 Feb 2018 11:30:14 +0900 Subject: [PATCH 01/10] Add ViewScrollChangeEventObservableCompat #315 --- .../rxbinding2/view/RxViewTest.java | 2 +- .../jakewharton/rxbinding2/view/RxView.java | 9 +++- ...ViewScrollChangeEventObservableCompat.java | 50 +++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java index 52e9a2cf..29998bbc 100644 --- a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java @@ -223,7 +223,7 @@ public final class RxViewTest { o.assertNoMoreEvents(); } - @SdkSuppress(minSdkVersion = 23) + @SdkSuppress(minSdkVersion = 19) @Test @UiThreadTest public void scrollChangeEvents() { RecordingObserver o = new RecordingObserver<>(); RxView.scrollChangeEvents(view).subscribe(o); diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java index 4c168472..8c8b2dd4 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java @@ -1,5 +1,6 @@ package com.jakewharton.rxbinding2.view; +import android.os.Build; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; @@ -295,11 +296,15 @@ public static Observable preDraws(@NonNull View view, * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. */ - @RequiresApi(23) + @RequiresApi(19) @CheckResult @NonNull public static Observable scrollChangeEvents(@NonNull View view) { checkNotNull(view, "view == null"); - return new ViewScrollChangeEventObservable(view); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return new ViewScrollChangeEventObservable(view); + } else { + return new ViewScrollChangeEventObservableCompat(view); + } } /** diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java new file mode 100644 index 00000000..a2de5cee --- /dev/null +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java @@ -0,0 +1,50 @@ +package com.jakewharton.rxbinding2.view; + +import android.support.annotation.RequiresApi; +import android.view.View; +import android.view.View.OnScrollChangeListener; + +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.android.MainThreadDisposable; + +import static com.jakewharton.rxbinding2.internal.Preconditions.checkMainThread; + +@RequiresApi(19) +final class ViewScrollChangeEventObservableCompat extends Observable { + private final View view; + + ViewScrollChangeEventObservableCompat(View view) { + this.view = view; + } + + @Override protected void subscribeActual(Observer observer) { + if (!checkMainThread(observer)) { + return; + } + Listener listener = new Listener(view, observer); + observer.onSubscribe(listener); + view.setOnScrollChangeListener(listener); + } + + static final class Listener extends MainThreadDisposable implements OnScrollChangeListener { + private final View view; + private final Observer observer; + + Listener(View view, Observer observer) { + this.view = view; + this.observer = observer; + } + + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + if (!isDisposed()) { + observer.onNext(ViewScrollChangeEvent.create(v, scrollX, scrollY, oldScrollX, oldScrollY)); + } + } + + @Override protected void onDispose() { + view.setOnScrollChangeListener(null); + } + } +} From 5d55797d4844d8f28a183670a5b2a2e288924aeb Mon Sep 17 00:00:00 2001 From: pjo901018 Date: Sat, 24 Feb 2018 09:51:51 +0900 Subject: [PATCH 02/10] Add RxViewScrollTest, RxViewScrollTestActivity for testing pre-23 devices #315 --- rxbinding/src/androidTest/AndroidManifest.xml | 1 + .../rxbinding2/view/RxViewScrollTest.java | 80 +++++++++++++++++++ .../view/RxViewScrollTestActivity.java | 17 ++++ .../rxbinding2/view/RxViewTest.java | 2 +- 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java create mode 100644 rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTestActivity.java diff --git a/rxbinding/src/androidTest/AndroidManifest.xml b/rxbinding/src/androidTest/AndroidManifest.xml index c1208b19..d904cdc6 100644 --- a/rxbinding/src/androidTest/AndroidManifest.xml +++ b/rxbinding/src/androidTest/AndroidManifest.xml @@ -5,6 +5,7 @@ + diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java new file mode 100644 index 00000000..0933838f --- /dev/null +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java @@ -0,0 +1,80 @@ +package com.jakewharton.rxbinding2.view; + +import android.app.Instrumentation; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SdkSuppress; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.view.View; + +import com.jakewharton.rxbinding2.RecordingObserver; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import io.reactivex.android.schedulers.AndroidSchedulers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; + +@RunWith(AndroidJUnit4.class) +public final class RxViewScrollTest { + @Rule public final ActivityTestRule activityRule = + new ActivityTestRule<>(RxViewScrollTestActivity.class); + + private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + private View view; + + @Before + public void setUp() { + RxViewScrollTestActivity activity = activityRule.getActivity(); + view = activity.view; + } + + @SdkSuppress(minSdkVersion = 19) + @Test public void scrollChangeEvents() { + RecordingObserver o = new RecordingObserver<>(); + RxView.scrollChangeEvents(view) + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(o); + o.assertNoMoreEvents(); + + + instrumentation.runOnMainSync( + new Runnable() { + @Override public void run() { + view.scrollTo(1, 1); + } + }); + ViewScrollChangeEvent event0 = o.takeNext(); + assertSame(view, event0.view()); + assertEquals(1, event0.scrollX()); + assertEquals(1, event0.scrollY()); + assertEquals(0, event0.oldScrollX()); + assertEquals(0, event0.oldScrollY()); + + instrumentation.runOnMainSync( + new Runnable() { + @Override public void run() { + view.scrollTo(2, 2); + } + }); + ViewScrollChangeEvent event1 = o.takeNext(); + assertSame(view, event1.view()); + assertEquals(2, event1.scrollX()); + assertEquals(2, event1.scrollY()); + assertEquals(1, event1.oldScrollX()); + assertEquals(1, event1.oldScrollY()); + + o.dispose(); + instrumentation.runOnMainSync( + new Runnable() { + @Override public void run() { + view.scrollTo(3, 3); + } + }); + o.assertNoMoreEvents(); + } +} diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTestActivity.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTestActivity.java new file mode 100644 index 00000000..2066aede --- /dev/null +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTestActivity.java @@ -0,0 +1,17 @@ +package com.jakewharton.rxbinding2.view; + +import android.app.Activity; +import android.os.Bundle; +import android.view.View; + +public final class RxViewScrollTestActivity extends Activity { + View view; + + @Override protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + view = new View(this); + + setContentView(view); + } +} + diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java index 29998bbc..52e9a2cf 100644 --- a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewTest.java @@ -223,7 +223,7 @@ public final class RxViewTest { o.assertNoMoreEvents(); } - @SdkSuppress(minSdkVersion = 19) + @SdkSuppress(minSdkVersion = 23) @Test @UiThreadTest public void scrollChangeEvents() { RecordingObserver o = new RecordingObserver<>(); RxView.scrollChangeEvents(view).subscribe(o); From 5ea04fcd8ba7861e232dca64d22ee93018af0b1a Mon Sep 17 00:00:00 2001 From: pjo901018 Date: Sat, 24 Feb 2018 09:54:42 +0900 Subject: [PATCH 03/10] Implement ViewScrollChangeEventObservableCompat #315 --- ...ViewScrollChangeEventObservableCompat.java | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java index a2de5cee..9f6b3b9d 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java @@ -2,7 +2,7 @@ import android.support.annotation.RequiresApi; import android.view.View; -import android.view.View.OnScrollChangeListener; +import android.view.ViewTreeObserver; import io.reactivex.Observable; import io.reactivex.Observer; @@ -18,13 +18,30 @@ final class ViewScrollChangeEventObservableCompat extends Observable observer) { + @Override + protected void subscribeActual(Observer observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); - view.setOnScrollChangeListener(listener); + setOnScrollChangeListenerWith(view, listener); + } + + private void setOnScrollChangeListenerWith(final View v, final Listener listener) { + ViewTreeObserver viewTreeObserver = v.getViewTreeObserver(); + viewTreeObserver.addOnScrollChangedListener( + new ViewTreeObserver.OnScrollChangedListener() { + private int oldl, oldt; + + @Override + public void onScrollChanged() { + listener.onScrollChange(v, v.getScrollX(), v.getScrollY(), oldl, oldt); + oldl = v.getScrollX(); + oldt = v.getScrollY(); + } + } + ); } static final class Listener extends MainThreadDisposable implements OnScrollChangeListener { @@ -44,7 +61,20 @@ public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int } @Override protected void onDispose() { - view.setOnScrollChangeListener(null); + view.setOnClickListener(null); } } + + public interface OnScrollChangeListener { + /** + * Called when the scroll position of a view changes. + * + * @param v The view whose scroll position has changed. + * @param scrollX Current horizontal scroll origin. + * @param scrollY Current vertical scroll origin. + * @param oldScrollX Previous horizontal scroll origin. + * @param oldScrollY Previous vertical scroll origin. + */ + void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY); + } } From 6e74782409b6bf0c01a470db11543733f0213d54 Mon Sep 17 00:00:00 2001 From: pjo901018 Date: Sat, 24 Feb 2018 10:08:18 +0900 Subject: [PATCH 04/10] Implement onDispose / Merge ViewTreeObserver.OnScrollChangedListener into Listener #315 --- ...ViewScrollChangeEventObservableCompat.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java index 9f6b3b9d..66210b5f 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java @@ -30,23 +30,13 @@ protected void subscribeActual(Observer observer) private void setOnScrollChangeListenerWith(final View v, final Listener listener) { ViewTreeObserver viewTreeObserver = v.getViewTreeObserver(); - viewTreeObserver.addOnScrollChangedListener( - new ViewTreeObserver.OnScrollChangedListener() { - private int oldl, oldt; - - @Override - public void onScrollChanged() { - listener.onScrollChange(v, v.getScrollX(), v.getScrollY(), oldl, oldt); - oldl = v.getScrollX(); - oldt = v.getScrollY(); - } - } - ); + viewTreeObserver.addOnScrollChangedListener(listener); } - static final class Listener extends MainThreadDisposable implements OnScrollChangeListener { + static final class Listener extends MainThreadDisposable implements OnScrollChangeListener, ViewTreeObserver.OnScrollChangedListener { private final View view; private final Observer observer; + private int oldl, oldt; Listener(View view, Observer observer) { this.view = view; @@ -61,9 +51,17 @@ public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int } @Override protected void onDispose() { - view.setOnClickListener(null); + ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); + viewTreeObserver.removeOnScrollChangedListener(this); + } + + @Override + public void onScrollChanged() { + this.onScrollChange(view, view.getScrollX(), view.getScrollY(), oldl, oldt); + oldl = view.getScrollX(); + oldt = view.getScrollY(); + } } - } public interface OnScrollChangeListener { /** From 2cbb616356766ef4e7e82e092a4c705ee95c0d1f Mon Sep 17 00:00:00 2001 From: kujyp Date: Sun, 25 Feb 2018 15:08:53 +0900 Subject: [PATCH 05/10] Set RequiresApi = 16 #315 --- .../java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java | 2 +- .../src/main/java/com/jakewharton/rxbinding2/view/RxView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java index 0933838f..943bf579 100644 --- a/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java +++ b/rxbinding/src/androidTest/java/com/jakewharton/rxbinding2/view/RxViewScrollTest.java @@ -33,7 +33,7 @@ public void setUp() { view = activity.view; } - @SdkSuppress(minSdkVersion = 19) + @SdkSuppress(minSdkVersion = 16) @Test public void scrollChangeEvents() { RecordingObserver o = new RecordingObserver<>(); RxView.scrollChangeEvents(view) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java index 8c8b2dd4..ed7886fb 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/RxView.java @@ -296,7 +296,7 @@ public static Observable preDraws(@NonNull View view, * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. */ - @RequiresApi(19) + @RequiresApi(16) @CheckResult @NonNull public static Observable scrollChangeEvents(@NonNull View view) { checkNotNull(view, "view == null"); From b504f5f04155caeafdebbb4b736592b0254ed389 Mon Sep 17 00:00:00 2001 From: pjo901018 Date: Sun, 25 Feb 2018 18:16:25 +0900 Subject: [PATCH 06/10] generateKotlin #315 --- .../src/main/kotlin/com/jakewharton/rxbinding2/view/RxView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rxbinding-kotlin/src/main/kotlin/com/jakewharton/rxbinding2/view/RxView.kt b/rxbinding-kotlin/src/main/kotlin/com/jakewharton/rxbinding2/view/RxView.kt index f38ef9a4..f64cce20 100644 --- a/rxbinding-kotlin/src/main/kotlin/com/jakewharton/rxbinding2/view/RxView.kt +++ b/rxbinding-kotlin/src/main/kotlin/com/jakewharton/rxbinding2/view/RxView.kt @@ -234,7 +234,7 @@ inline fun View.preDraws(proceedDrawingPass: Callable): Observable = RxView.scrollChangeEvents(this) From 5339796c09d9d28fd521a3e690fb6daa447e218a Mon Sep 17 00:00:00 2001 From: pjo901018 Date: Sun, 25 Feb 2018 18:52:46 +0900 Subject: [PATCH 07/10] Shorten linelength on ViewScrollChangeEventObservableCompat.java #315 --- .../rxbinding2/view/ViewScrollChangeEventObservableCompat.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java index 66210b5f..27b4b406 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java @@ -33,7 +33,8 @@ private void setOnScrollChangeListenerWith(final View v, final Listener listener viewTreeObserver.addOnScrollChangedListener(listener); } - static final class Listener extends MainThreadDisposable implements OnScrollChangeListener, ViewTreeObserver.OnScrollChangedListener { + static final class Listener extends MainThreadDisposable implements OnScrollChangeListener, + ViewTreeObserver.OnScrollChangedListener { private final View view; private final Observer observer; private int oldl, oldt; From 03685a01e45507eeae7bf06e44529337d173a322 Mon Sep 17 00:00:00 2001 From: pjo901018 Date: Sun, 25 Feb 2018 19:14:15 +0900 Subject: [PATCH 08/10] Set missing RequiresApi = 16 #315 --- .../rxbinding2/view/ViewScrollChangeEventObservableCompat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java index 27b4b406..7afe3049 100644 --- a/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java +++ b/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewScrollChangeEventObservableCompat.java @@ -10,7 +10,7 @@ import static com.jakewharton.rxbinding2.internal.Preconditions.checkMainThread; -@RequiresApi(19) +@RequiresApi(16) final class ViewScrollChangeEventObservableCompat extends Observable { private final View view; From c51083ad2c0550fea409ef7d4cbc6420b59ca64d Mon Sep 17 00:00:00 2001 From: kujyp Date: Wed, 28 Feb 2018 09:34:53 +0900 Subject: [PATCH 09/10] Retry ci-pipeline From 566ecd64cf44505acad19a75cfe820693c8c7318 Mon Sep 17 00:00:00 2001 From: kujyp Date: Wed, 28 Feb 2018 10:05:27 +0900 Subject: [PATCH 10/10] Retry ci-pipeline 2