diff --git a/gradle.properties b/gradle.properties index 9f27758..6577a25 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=com.f2prateek.rx.preferences2 -VERSION_NAME=2.0.2-SNAPSHOT +VERSION_NAME=issue~141-SNAPSHOT POM_DESCRIPTION=Reactive SharedPreferences for Android diff --git a/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RealPreference.java b/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RealPreference.java index 9c33ee5..2a4cc70 100644 --- a/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RealPreference.java +++ b/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RealPreference.java @@ -50,7 +50,11 @@ interface Adapter { .startWith("") // Dummy value to trigger initial load. .map(new Function() { @Override public T apply(String s) { - return get(); + if(s.equals(RxSharedPreferences.NULL_KEY_EMISSION)) { + return defaultValue; + } else { + return get(); + } } }); } diff --git a/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RxSharedPreferences.java b/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RxSharedPreferences.java index 1ebac22..7abdbd5 100644 --- a/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RxSharedPreferences.java +++ b/rx-preferences/src/main/java/com/f2prateek/rx/preferences2/RxSharedPreferences.java @@ -26,6 +26,8 @@ public final class RxSharedPreferences { private static final Long DEFAULT_LONG = 0L; private static final String DEFAULT_STRING = ""; + static final String NULL_KEY_EMISSION = "null_key_emission"; + /** Create an instance of {@link RxSharedPreferences} for {@code preferences}. */ @CheckResult @NonNull public static RxSharedPreferences create(@NonNull SharedPreferences preferences) { @@ -43,7 +45,11 @@ private RxSharedPreferences(final SharedPreferences preferences) { final OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { - emitter.onNext(key); + if(key == null) { + emitter.onNext(NULL_KEY_EMISSION); + } else { + emitter.onNext(key); + } } }; diff --git a/rx-preferences/src/test/java/com/f2prateek/rx/preferences2/PreferenceTest.java b/rx-preferences/src/test/java/com/f2prateek/rx/preferences2/PreferenceTest.java index 0b97d28..3b086c1 100644 --- a/rx-preferences/src/test/java/com/f2prateek/rx/preferences2/PreferenceTest.java +++ b/rx-preferences/src/test/java/com/f2prateek/rx/preferences2/PreferenceTest.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Set; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -266,6 +267,21 @@ public class PreferenceTest { observer.assertValue("bar"); } + @Ignore("Robolectric needs to be updated to support API 30") + @Test public void asObservableWhenBackingPrefsCleared() { + Preference preference = rxPreferences.getString("foo", "bar"); + + RecordingObserver observer = observerRule.create(); + preference.asObservable().subscribe(observer); + observer.assertValue("bar"); + + preferences.edit().putString("foo", "baz").commit(); + observer.assertValue("baz"); + + preferences.edit().clear().commit(); + observer.assertValue("bar"); + } + @Test public void asConsumer() throws Exception { Preference preference = rxPreferences.getString("foo"); Consumer consumer = preference.asConsumer();