Skip to content

Commit 0c4dac6

Browse files
committed
Make Android ViewObservable.input observe TextView instead of String
1 parent a7953e6 commit 0c4dac6

File tree

3 files changed

+104
-45
lines changed

3 files changed

+104
-45
lines changed

rxjava-contrib/rxjava-android/src/main/java/rx/android/observables/ViewObservable.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,21 @@
1717

1818
import rx.Observable;
1919
import rx.operators.OperatorCompoundButtonInput;
20-
import rx.operators.OperatorEditTextInput;
20+
import rx.operators.OperatorTextViewInput;
2121
import rx.operators.OperatorViewClick;
2222

2323
import android.view.View;
2424
import android.widget.CompoundButton;
25-
import android.widget.EditText;
25+
import android.widget.TextView;
2626

2727
public class ViewObservable {
2828

2929
public static <T extends View> Observable<T> clicks(final T view, final boolean emitInitialValue) {
3030
return Observable.create(new OperatorViewClick<T>(view, emitInitialValue));
3131
}
3232

33-
public static Observable<String> input(final EditText input, final boolean emitInitialValue) {
34-
return Observable.create(new OperatorEditTextInput(input, emitInitialValue));
33+
public static <T extends TextView> Observable<T> input(final T input, final boolean emitInitialValue) {
34+
return Observable.create(new OperatorTextViewInput<T>(input, emitInitialValue));
3535
}
3636

3737
public static Observable<Boolean> input(final CompoundButton button, final boolean emitInitialValue) {

rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorEditTextInput.java renamed to rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorTextViewInput.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,27 @@
2323
import rx.functions.Action0;
2424
import android.text.Editable;
2525
import android.text.TextWatcher;
26-
import android.widget.EditText;
26+
import android.widget.TextView;
2727

28-
public class OperatorEditTextInput implements Observable.OnSubscribe<String> {
29-
private final EditText input;
28+
public class OperatorTextViewInput<T extends TextView> implements Observable.OnSubscribe<T> {
29+
private final T input;
3030
private final boolean emitInitialValue;
3131

32-
public OperatorEditTextInput(final EditText input, final boolean emitInitialValue) {
32+
public OperatorTextViewInput(final T input, final boolean emitInitialValue) {
3333
this.input = input;
3434
this.emitInitialValue = emitInitialValue;
3535
}
3636

3737
@Override
38-
public void call(final Subscriber<? super String> observer) {
38+
public void call(final Subscriber<? super T> observer) {
3939
Assertions.assertUiThread();
4040
final TextWatcher watcher = new SimpleTextWatcher() {
4141
@Override
4242
public void afterTextChanged(final Editable editable) {
43-
observer.onNext(editable.toString());
43+
observer.onNext(input);
4444
}
4545
};
46-
46+
4747
final Subscription subscription = AndroidSubscriptions.unsubscribeInUiThread(new Action0() {
4848
@Override
4949
public void call() {
@@ -52,7 +52,7 @@ public void call() {
5252
});
5353

5454
if (emitInitialValue) {
55-
observer.onNext(input.getEditableText().toString());
55+
observer.onNext(input);
5656
}
5757

5858
input.addTextChangedListener(watcher);

rxjava-contrib/rxjava-android/src/test/java/rx/android/operators/OperatorEditTextInputTest.java renamed to rxjava-contrib/rxjava-android/src/test/java/rx/android/operators/OperatorTextViewInputTest.java

Lines changed: 92 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import android.app.Activity;
2222
import android.widget.EditText;
23+
import android.widget.TextView;
2324
import org.junit.Test;
2425
import org.junit.runner.RunWith;
2526
import org.mockito.InOrder;
@@ -29,10 +30,22 @@
2930
import rx.Observer;
3031
import rx.Subscription;
3132
import rx.android.observables.ViewObservable;
33+
import rx.functions.Func1;
3234
import rx.observers.TestObserver;
3335

3436
@RunWith(RobolectricTestRunner.class)
35-
public class OperatorEditTextInputTest {
37+
public class OperatorTextViewInputTest {
38+
39+
private static TextView createTextView(final String value) {
40+
final Activity activity = Robolectric.buildActivity(Activity.class).create().get();
41+
final TextView text = new TextView(activity);
42+
43+
if (value != null) {
44+
text.setText(value);
45+
}
46+
47+
return text;
48+
}
3649

3750
private static EditText createEditText(final String value) {
3851
final Activity activity = Robolectric.buildActivity(Activity.class).create().get();
@@ -48,27 +61,27 @@ private static EditText createEditText(final String value) {
4861
@Test
4962
@SuppressWarnings("unchecked")
5063
public void testWithoutInitialValue() {
51-
final EditText input = createEditText("initial");
52-
final Observable<String> observable = ViewObservable.input(input, false);
53-
final Observer<String> observer = mock(Observer.class);
54-
final Subscription subscription = observable.subscribe(new TestObserver<String>(observer));
64+
final TextView input = createTextView("initial");
65+
final Observable<TextView> observable = ViewObservable.input(input, false);
66+
final Observer<TextView> observer = mock(Observer.class);
67+
final Subscription subscription = observable.subscribe(new TestObserver<TextView>(observer));
5568

5669
final InOrder inOrder = inOrder(observer);
5770

58-
inOrder.verify(observer, never()).onNext(anyString());
71+
inOrder.verify(observer, never()).onNext(any(TextView.class));
5972

6073
input.setText("1");
61-
inOrder.verify(observer, times(1)).onNext("1");
74+
inOrder.verify(observer, times(1)).onNext(input);
6275

6376
input.setText("2");
64-
inOrder.verify(observer, times(1)).onNext("2");
77+
inOrder.verify(observer, times(1)).onNext(input);
6578

6679
input.setText("3");
67-
inOrder.verify(observer, times(1)).onNext("3");
80+
inOrder.verify(observer, times(1)).onNext(input);
6881

6982
subscription.unsubscribe();
7083
input.setText("4");
71-
inOrder.verify(observer, never()).onNext(anyString());
84+
inOrder.verify(observer, never()).onNext(any(TextView.class));
7285

7386
inOrder.verify(observer, never()).onError(any(Throwable.class));
7487
inOrder.verify(observer, never()).onCompleted();
@@ -77,27 +90,27 @@ public void testWithoutInitialValue() {
7790
@Test
7891
@SuppressWarnings("unchecked")
7992
public void testWithInitialValue() {
80-
final EditText input = createEditText("initial");
81-
final Observable<String> observable = ViewObservable.input(input, true);
82-
final Observer<String> observer = mock(Observer.class);
83-
final Subscription subscription = observable.subscribe(new TestObserver<String>(observer));
93+
final TextView input = createTextView("initial");
94+
final Observable<TextView> observable = ViewObservable.input(input, true);
95+
final Observer<TextView> observer = mock(Observer.class);
96+
final Subscription subscription = observable.subscribe(new TestObserver<TextView>(observer));
8497

8598
final InOrder inOrder = inOrder(observer);
8699

87-
inOrder.verify(observer, times(1)).onNext("initial");
100+
inOrder.verify(observer, times(1)).onNext(input);
88101

89102
input.setText("one");
90-
inOrder.verify(observer, times(1)).onNext("one");
103+
inOrder.verify(observer, times(1)).onNext(input);
91104

92105
input.setText("two");
93-
inOrder.verify(observer, times(1)).onNext("two");
106+
inOrder.verify(observer, times(1)).onNext(input);
94107

95108
input.setText("three");
96-
inOrder.verify(observer, times(1)).onNext("three");
109+
inOrder.verify(observer, times(1)).onNext(input);
97110

98111
subscription.unsubscribe();
99112
input.setText("four");
100-
inOrder.verify(observer, never()).onNext(anyString());
113+
inOrder.verify(observer, never()).onNext(any(TextView.class));
101114

102115
inOrder.verify(observer, never()).onError(any(Throwable.class));
103116
inOrder.verify(observer, never()).onCompleted();
@@ -106,40 +119,86 @@ public void testWithInitialValue() {
106119
@Test
107120
@SuppressWarnings("unchecked")
108121
public void testMultipleSubscriptions() {
109-
final EditText input = createEditText("initial");
110-
final Observable<String> observable = ViewObservable.input(input, false);
122+
final TextView input = createTextView("initial");
123+
final Observable<TextView> observable = ViewObservable.input(input, false);
111124

112-
final Observer<String> observer1 = mock(Observer.class);
113-
final Observer<String> observer2 = mock(Observer.class);
125+
final Observer<TextView> observer1 = mock(Observer.class);
126+
final Observer<TextView> observer2 = mock(Observer.class);
114127

115-
final Subscription subscription1 = observable.subscribe(new TestObserver<String>(observer1));
116-
final Subscription subscription2 = observable.subscribe(new TestObserver<String>(observer2));
128+
final Subscription subscription1 = observable.subscribe(new TestObserver<TextView>(observer1));
129+
final Subscription subscription2 = observable.subscribe(new TestObserver<TextView>(observer2));
117130

118131
final InOrder inOrder1 = inOrder(observer1);
119132
final InOrder inOrder2 = inOrder(observer2);
120133

121134
input.setText("1");
122-
inOrder1.verify(observer1, times(1)).onNext("1");
123-
inOrder2.verify(observer2, times(1)).onNext("1");
135+
inOrder1.verify(observer1, times(1)).onNext(input);
136+
inOrder2.verify(observer2, times(1)).onNext(input);
124137

125138
input.setText("2");
126-
inOrder1.verify(observer1, times(1)).onNext("2");
127-
inOrder2.verify(observer2, times(1)).onNext("2");
139+
inOrder1.verify(observer1, times(1)).onNext(input);
140+
inOrder2.verify(observer2, times(1)).onNext(input);
128141
subscription1.unsubscribe();
129142

130143
input.setText("3");
131-
inOrder1.verify(observer1, never()).onNext(anyString());
132-
inOrder2.verify(observer2, times(1)).onNext("3");
144+
inOrder1.verify(observer1, never()).onNext(any(TextView.class));
145+
inOrder2.verify(observer2, times(1)).onNext(input);
133146
subscription2.unsubscribe();
134147

135148
input.setText("4");
136-
inOrder1.verify(observer1, never()).onNext(anyString());
137-
inOrder2.verify(observer2, never()).onNext(anyString());
149+
inOrder1.verify(observer1, never()).onNext(any(TextView.class));
150+
inOrder2.verify(observer2, never()).onNext(any(TextView.class));
138151

139152
inOrder1.verify(observer1, never()).onError(any(Throwable.class));
140153
inOrder2.verify(observer2, never()).onError(any(Throwable.class));
141154

142155
inOrder1.verify(observer1, never()).onCompleted();
143156
inOrder2.verify(observer2, never()).onCompleted();
144157
}
158+
159+
@Test
160+
@SuppressWarnings("unchecked")
161+
public void testTextViewSubclass() {
162+
final EditText input = createEditText("initial");
163+
final Observable<EditText> observable = ViewObservable.input(input, false);
164+
final Observer<EditText> observer = mock(Observer.class);
165+
observable.subscribe(new TestObserver<EditText>(observer));
166+
167+
final InOrder inOrder = inOrder(observer);
168+
169+
inOrder.verify(observer, never()).onNext(any(EditText.class));
170+
171+
input.setText("1");
172+
inOrder.verify(observer, times(1)).onNext(input);
173+
}
174+
175+
@Test
176+
@SuppressWarnings("unchecked")
177+
public void testLegacyStringObservableCompatibility() {
178+
final EditText input = createEditText("initial");
179+
final Observable<String> observable = ViewObservable.input(input, false)
180+
.map(new Func1<EditText, String>() {
181+
182+
@Override
183+
public String call(EditText view) {
184+
return view.getText().toString();
185+
}
186+
});
187+
final Observer<String> observer = mock(Observer.class);
188+
observable.subscribe(new TestObserver<String>(observer));
189+
190+
final InOrder inOrder = inOrder(observer);
191+
192+
inOrder.verify(observer, never()).onNext(anyString());
193+
194+
input.setText("1");
195+
inOrder.verify(observer, times(1)).onNext("1");
196+
197+
input.setText("2");
198+
inOrder.verify(observer, times(1)).onNext("2");
199+
200+
input.setText("3");
201+
inOrder.verify(observer, times(1)).onNext("3");
202+
}
203+
145204
}

0 commit comments

Comments
 (0)