RxPreferences { @NonNull public Observable<Boolean> containsStream(@NonNull String key) { return containsOnce(key) .toObservable() .mergeWith(Observable.create(emitter -> { RxPreferenceContainsListener listener = new RxPreferenceContainsListener(key, emitter); registerRxPreferenceListener(listener, emitter); })); } RxPreferences(@NonNull SharedPreferences preferences); @NonNull Single<Map<String, ?>> getAllOnce(); @NonNull Single<String> getStringOnce(@NonNull String key, @NonNull String defaultValue); @NonNull Single<Set<String>> getStringSetOnce(@NonNull String key, @NonNull Set<String> defaultValues); @NonNull Single<Integer> getIntOnce(@NonNull String key, int defaultValue); @NonNull Single<Long> getLongOnce(@NonNull String key, long defaultValue); @NonNull Single<Float> getFloatOnce(@NonNull String key, float defaultValue); @NonNull Single<Boolean> getBooleanOnce(@NonNull String key, boolean defaultValue); @NonNull Single<Boolean> containsOnce(@NonNull String key); @NonNull Observable<Map<String, ?>> getAllStream(); @NonNull Observable<String> getStringStream(@NonNull String key, @NonNull String defaultValue); @NonNull Observable<Set<String>> getStringSetStream(@NonNull String key, @NonNull Set<String> defaultValue); @NonNull Observable<Integer> getIntStream(@NonNull String key, int defaultValue); @NonNull Observable<Long> getLongStream(@NonNull String key, long defaultValue); @NonNull Observable<Float> getFloatStream(@NonNull String key, float defaultValue); @NonNull Observable<Boolean> getBooleanStream(@NonNull String key, boolean defaultValue); @NonNull Observable<Boolean> containsStream(@NonNull String key); @NonNull Editor edit();  }
@Test public void containsStream_emitsOnListenerUpdate() { final String testKey = "Test contains key"; when(mockSharedPreferences.contains(testKey)).thenReturn(true); final TestObserver<Boolean> subscription = rxPreferences.containsStream(testKey).test(); subscriptions.add(subscription); subscription .assertNotComplete() .assertValueCount(1) .assertValue(true); final ArgumentCaptor<SharedPreferences.OnSharedPreferenceChangeListener> listenerCaptor = ArgumentCaptor.forClass(SharedPreferences.OnSharedPreferenceChangeListener.class); verify(mockSharedPreferences).registerOnSharedPreferenceChangeListener(listenerCaptor.capture()); final SharedPreferences.OnSharedPreferenceChangeListener listener = listenerCaptor.getValue(); listener.onSharedPreferenceChanged(mockSharedPreferences, testKey); subscription .assertNotComplete() .assertValueCount(2) .assertValues(true, true); }
@Test public void containsStream_emitsCurrentValueOnSubscribe() { final String testKey = "Test contains key"; when(mockSharedPreferences.contains(testKey)).thenReturn(true); final Disposable subscription = rxPreferences.containsStream(testKey) .subscribeOn(testScheduler) .subscribe(); subscriptions.add(subscription); verifyGetStreamBeforeSubscribe(subscription); advanceScheduler(); verify(mockSharedPreferences).contains(testKey); verify(mockSharedPreferences).registerOnSharedPreferenceChangeListener(isA(RxPreferenceContainsListener.class)); verifyNoMoreInteractions(mockSharedPreferences); assertFalse(subscription.isDisposed()); }
@Test public void containsStream_unregistersListenerOnUnsubscribe() { final String testKey = "Test contains key"; when(mockSharedPreferences.contains(testKey)).thenReturn(true); final TestObserver<Boolean> subscription = rxPreferences.containsStream(testKey).test(); subscriptions.add(subscription); final ArgumentCaptor<SharedPreferences.OnSharedPreferenceChangeListener> listenerCaptor = ArgumentCaptor.forClass(SharedPreferences.OnSharedPreferenceChangeListener.class); verify(mockSharedPreferences).registerOnSharedPreferenceChangeListener(listenerCaptor.capture()); final SharedPreferences.OnSharedPreferenceChangeListener listener = listenerCaptor.getValue(); verify(mockSharedPreferences, never()).unregisterOnSharedPreferenceChangeListener(any()); subscription.dispose(); verify(mockSharedPreferences).unregisterOnSharedPreferenceChangeListener(listener); }