diff options
| author | Menny Even Danan <menny@evendanan.net> | 2018-01-18 20:20:00 +0000 |
|---|---|---|
| committer | Menny Even Danan <menny@evendanan.net> | 2018-01-18 20:20:00 +0000 |
| commit | c36ac34e76f10e0e6bbb578c9715d6b33b52ae7b (patch) | |
| tree | 5fb17cee01ba51527de6754b9a21288ae5edc34e | |
| parent | 1733f4ab5f4758056df6d025ef042d2d725bf0c2 (diff) | |
| download | AnySoftKeyboard-c36ac34e76f10e0e6bbb578c9715d6b33b52ae7b.tar.gz AnySoftKeyboard-c36ac34e76f10e0e6bbb578c9715d6b33b52ae7b.tar.bz2 | |
Normalizing RX-Schedulers for Android
And using main-thread for tests
| -rw-r--r-- | app/build.gradle | 7 | ||||
| -rw-r--r-- | app/src/main/java/com/anysoftkeyboard/ui/dev/DeveloperToolsFragment.java | 19 | ||||
| -rw-r--r-- | app/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java | 23 | ||||
| -rw-r--r-- | app/src/test/java/com/anysoftkeyboard/dictionaries/prefsprovider/UserDictionaryPrefsProviderTest.java | 1 | ||||
| -rw-r--r-- | app/src/test/java/com/menny/android/anysoftkeyboard/AnyRoboApplication.java | 3 | ||||
| -rw-r--r-- | base-rx/build.gradle | 27 | ||||
| -rw-r--r-- | base-rx/src/main/AndroidManifest.xml | 1 | ||||
| -rw-r--r-- | base-rx/src/main/java/com/anysoftkeyboard/RxSchedulers.java | 28 | ||||
| -rw-r--r-- | base-test/build.gradle | 2 | ||||
| -rw-r--r-- | configs/checkstyle/checkstyle.xml | 16 | ||||
| -rw-r--r-- | configs/checkstyle/suppressions.xml | 6 | ||||
| -rw-r--r-- | prefs/build.gradle | 4 | ||||
| -rw-r--r-- | settings.gradle | 2 |
13 files changed, 104 insertions, 35 deletions
diff --git a/app/build.gradle b/app/build.gradle index 74d8cf207..b2b44a186 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,6 +152,7 @@ if (playStoreWhatsNewFile.text.length() > 500) { dependencies { implementation project(':base') + implementation project(':base-rx') implementation project(':nextword') implementation project(':jnidictionaryv1') implementation project(':jnidictionaryv2') @@ -169,12 +170,11 @@ dependencies { implementation('com.github.menny.Chauffeur:permissions:0.1.1') { exclude group: 'com.android.support' } - implementation fileTree(dir: 'libs', include: '*.jar') - implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' - implementation 'io.reactivex.rxjava2:rxjava:2.1.8' + implementation fileTree(dir: 'libs', include: '*.jar') testImplementation project(path: ':base-test') + testImplementation 'com.github.triplet.simpleprovider:simpleprovider:1.1.0' canaryImplementation('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { @@ -183,7 +183,6 @@ dependencies { canaryImplementation('com.crashlytics.sdk.android:crashlytics-ndk:1.1.5@aar') { transitive = true } - } crashlytics { diff --git a/app/src/main/java/com/anysoftkeyboard/ui/dev/DeveloperToolsFragment.java b/app/src/main/java/com/anysoftkeyboard/ui/dev/DeveloperToolsFragment.java index 00f4fc3e2..10d318acc 100644 --- a/app/src/main/java/com/anysoftkeyboard/ui/dev/DeveloperToolsFragment.java +++ b/app/src/main/java/com/anysoftkeyboard/ui/dev/DeveloperToolsFragment.java @@ -25,7 +25,6 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.util.Pair; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,6 +33,7 @@ import android.widget.TextView; import android.widget.Toast; import com.anysoftkeyboard.base.utils.Logger; +import com.anysoftkeyboard.rx.RxSchedulers; import com.anysoftkeyboard.ui.settings.MainSettingsActivity; import com.menny.android.anysoftkeyboard.R; @@ -43,10 +43,8 @@ import net.evendanan.pushingpixels.RxProgressDialog; import java.io.File; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposables; -import io.reactivex.schedulers.Schedulers; @SuppressLint("SetTextI18n") public class DeveloperToolsFragment extends Fragment implements View.OnClickListener { @@ -78,13 +76,10 @@ public class DeveloperToolsFragment extends Fragment implements View.OnClickList view.findViewById(com.menny.android.anysoftkeyboard.R.id.show_logcat_button).setOnClickListener(this); view.findViewById(com.menny.android.anysoftkeyboard.R.id.share_logcat_button).setOnClickListener(this); - TextView textWithListener = (TextView) view.findViewById(com.menny.android.anysoftkeyboard.R.id.actionDoneWithListener); - textWithListener.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - Toast.makeText(getContext().getApplicationContext(), "OnEditorActionListener i:" + i, Toast.LENGTH_SHORT).show(); - return true; - } + TextView textWithListener = view.findViewById(com.menny.android.anysoftkeyboard.R.id.actionDoneWithListener); + textWithListener.setOnEditorActionListener((textView, i, keyEvent) -> { + Toast.makeText(getContext().getApplicationContext(), "OnEditorActionListener i:" + i, Toast.LENGTH_SHORT).show(); + return true; }); } @@ -147,9 +142,9 @@ public class DeveloperToolsFragment extends Fragment implements View.OnClickList mDisposible.dispose(); mDisposible = RxProgressDialog.create(this, getActivity()) - .subscribeOn(Schedulers.io()) + .subscribeOn(RxSchedulers.background()) .map(fragment -> Pair.create(fragment, DeveloperUtils.createMemoryDump())) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(RxSchedulers.mainThread()) .subscribe(pair -> { Toast.makeText(applicationContext, getString(R.string.created_mem_dump_file, pair.second.getAbsolutePath()), Toast.LENGTH_LONG).show(); View shareMemFile = pair.first.getView().findViewById(R.id.dev_share_mem_file); diff --git a/app/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java b/app/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java index 2a93d134b..8a39d2491 100644 --- a/app/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java +++ b/app/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java @@ -56,6 +56,7 @@ import com.anysoftkeyboard.dictionaries.prefsprovider.UserDictionaryPrefsProvide import com.anysoftkeyboard.dictionaries.sqlite.FallbackUserDictionary; import com.anysoftkeyboard.prefs.backup.PrefsRoot; import com.anysoftkeyboard.prefs.backup.PrefsXmlStorage; +import com.anysoftkeyboard.rx.RxSchedulers; import com.anysoftkeyboard.ui.settings.MainSettingsActivity; import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.R; @@ -73,9 +74,7 @@ import java.util.List; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; public class UserDictionaryEditorFragment extends Fragment implements EditorWordsAdapter.DictionaryCallbacks { @@ -178,7 +177,7 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord UserDictionaryPrefsProvider provider = new UserDictionaryPrefsProvider(getContext()); mDisposable.add(RxProgressDialog.create(Pair.create(storage, provider), getActivity()) - .subscribeOn(Schedulers.io()) + .subscribeOn(RxSchedulers.background()) .map(pair -> { if (mCurrentDictionary != null) { mCurrentDictionary.close(); @@ -188,7 +187,7 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord pair.second.storePrefsRoot(prefsRoot); return Boolean.TRUE; }) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(RxSchedulers.mainThread()) .subscribe( o -> { showDialog(UserDictionaryEditorFragment.DIALOG_LOAD_SUCCESS); @@ -208,14 +207,14 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord UserDictionaryPrefsProvider provider = new UserDictionaryPrefsProvider(getContext()); mDisposable.add(RxProgressDialog.create(Pair.create(storage, provider), getActivity()) - .subscribeOn(Schedulers.io()) + .subscribeOn(RxSchedulers.background()) .map(pair -> { final PrefsRoot prefsRoot = pair.second.getPrefsRoot(); pair.first.store(prefsRoot); return Boolean.TRUE; }) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(RxSchedulers.mainThread()) .subscribe( o -> showDialog(UserDictionaryEditorFragment.DIALOG_SAVE_SUCCESS), throwable -> { @@ -314,7 +313,7 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord mCurrentDictionary.close(); } mDisposable.add(RxProgressDialog.create(editableDictionary, getActivity()) - .subscribeOn(Schedulers.io()) + .subscribeOn(RxSchedulers.background()) .map(newDictionary -> { newDictionary.loadDictionary(); List<LoadedWord> words = ((MyEditableDictionary) newDictionary).getLoadedWords(); @@ -323,7 +322,7 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord return Pair.create(newDictionary, words); }) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(RxSchedulers.mainThread()) .subscribe(pair -> { mCurrentDictionary = pair.first; RecyclerView.Adapter adapter = createAdapterForWords(pair.second); @@ -356,12 +355,12 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord @Override public void onWordDeleted(final LoadedWord word) { mDisposable.add(RxProgressDialog.create(word, getActivity()) - .subscribeOn(Schedulers.io()) + .subscribeOn(RxSchedulers.background()) .map(loadedWord -> { deleteWord(loadedWord.word); return Boolean.TRUE; }) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(RxSchedulers.mainThread()) .subscribe(aBoolean -> { })); } @@ -373,7 +372,7 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord @Override public void onWordUpdated(final String oldWord, final LoadedWord newWord) { mDisposable.add(RxProgressDialog.create(Pair.create(oldWord, newWord), getActivity()) - .subscribeOn(Schedulers.io()) + .subscribeOn(RxSchedulers.background()) .map(pair -> { //it can be empty in case it's a new word. if (!TextUtils.isEmpty(pair.first)) @@ -382,7 +381,7 @@ public class UserDictionaryEditorFragment extends Fragment implements EditorWord mCurrentDictionary.addWord(pair.second.word, pair.second.freq); return Boolean.TRUE; }) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(RxSchedulers.mainThread()) .subscribe(aBoolean -> { })); } diff --git a/app/src/test/java/com/anysoftkeyboard/dictionaries/prefsprovider/UserDictionaryPrefsProviderTest.java b/app/src/test/java/com/anysoftkeyboard/dictionaries/prefsprovider/UserDictionaryPrefsProviderTest.java index 42050d809..4f8bf9294 100644 --- a/app/src/test/java/com/anysoftkeyboard/dictionaries/prefsprovider/UserDictionaryPrefsProviderTest.java +++ b/app/src/test/java/com/anysoftkeyboard/dictionaries/prefsprovider/UserDictionaryPrefsProviderTest.java @@ -87,7 +87,6 @@ public class UserDictionaryPrefsProviderTest { verifyLocale("en", "hello", "Avoir"); verifyLocale("fr", "Avoir", "shalom"); - verifyLocale(null, "WHAT", "Avoir"); } private void verifyLocale(String locale, String validWord, String invalidWord) { diff --git a/app/src/test/java/com/menny/android/anysoftkeyboard/AnyRoboApplication.java b/app/src/test/java/com/menny/android/anysoftkeyboard/AnyRoboApplication.java index fc58a0f01..08223e30a 100644 --- a/app/src/test/java/com/menny/android/anysoftkeyboard/AnyRoboApplication.java +++ b/app/src/test/java/com/menny/android/anysoftkeyboard/AnyRoboApplication.java @@ -7,9 +7,11 @@ import com.anysoftkeyboard.dictionaries.TextEntryState; import com.anysoftkeyboard.keyboardextensions.KeyboardExtensionFactory; import com.anysoftkeyboard.keyboards.KeyboardFactory; import com.anysoftkeyboard.quicktextkeys.QuickTextKeyFactory; +import com.anysoftkeyboard.rx.RxSchedulers; import com.anysoftkeyboard.theme.KeyboardThemeFactory; import org.mockito.Mockito; +import org.robolectric.util.ReflectionHelpers; public class AnyRoboApplication extends AnyApplication { private ExternalDictionaryFactory mDictionaryFactory; @@ -22,6 +24,7 @@ public class AnyRoboApplication extends AnyApplication { @Override public void onCreate() { + ReflectionHelpers.setStaticField(RxSchedulers.class, "msBackground", io.reactivex.android.schedulers.AndroidSchedulers.mainThread()); TextEntryState.restartSession(); super.onCreate(); } diff --git a/base-rx/build.gradle b/base-rx/build.gradle new file mode 100644 index 000000000..c5547096f --- /dev/null +++ b/base-rx/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion sdkCompileVersion + buildToolsVersion androidBuildTools + + defaultConfig { + minSdkVersion sdkMinimumVersion + targetSdkVersion sdkTargetVersion + versionCode 1 + versionName "1.0" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation "com.android.support:support-annotations:$supportLibVersion" + //so I can use SuppressFBWarnings + implementation 'com.google.code.findbugs:annotations:3.0.0' + + api 'io.reactivex.rxjava2:rxandroid:2.0.1' + api 'io.reactivex.rxjava2:rxjava:2.1.8' +} diff --git a/base-rx/src/main/AndroidManifest.xml b/base-rx/src/main/AndroidManifest.xml new file mode 100644 index 000000000..d3ede9952 --- /dev/null +++ b/base-rx/src/main/AndroidManifest.xml @@ -0,0 +1 @@ +<manifest package="com.anysoftkeyboard.rx"/> diff --git a/base-rx/src/main/java/com/anysoftkeyboard/RxSchedulers.java b/base-rx/src/main/java/com/anysoftkeyboard/RxSchedulers.java new file mode 100644 index 000000000..b0b92d01e --- /dev/null +++ b/base-rx/src/main/java/com/anysoftkeyboard/RxSchedulers.java @@ -0,0 +1,28 @@ +package com.anysoftkeyboard.rx; + +import android.support.annotation.NonNull; + +import io.reactivex.Scheduler; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class RxSchedulers { + + static { + msBackground = Schedulers.io(); + } + + private static Scheduler msBackground; + + private RxSchedulers() {} + + @NonNull + public static Scheduler mainThread() { + return AndroidSchedulers.mainThread(); + } + + @NonNull + public static Scheduler background() { + return msBackground; + } +} diff --git a/base-test/build.gradle b/base-test/build.gradle index 2c4a89893..87fb87c6c 100644 --- a/base-test/build.gradle +++ b/base-test/build.gradle @@ -29,6 +29,6 @@ dependencies { api 'junit:junit:4.12' api "org.robolectric:robolectric:$robolectricVersion" api "org.robolectric:shadows-supportv4:$robolectricVersion" - api 'org.mockito:mockito-core:2.11.0' + api 'org.mockito:mockito-core:2.13.0' api 'com.github.menny:JUnitTestsGrouping:0.2.0' } diff --git a/configs/checkstyle/checkstyle.xml b/configs/checkstyle/checkstyle.xml index bd0afc1c4..433cd2805 100644 --- a/configs/checkstyle/checkstyle.xml +++ b/configs/checkstyle/checkstyle.xml @@ -62,7 +62,21 @@ <property name="id" value="Use ASK test runner"/> <property name="format" value="RunWith(\s*RobolectricTestRunner.class\s*)" /> <property name="message" - value="Don\'t use Robolectric test-runner, use AnySoftKeyboardRobolectricTestRunner or AnySoftKeyboardPlainTestRunner" /> + value="Don not use Robolectric test-runner, use AnySoftKeyboardRobolectricTestRunner or AnySoftKeyboardPlainTestRunner" /> + </module> + + <module name="RegexpSinglelineJava"> + <property name="id" value="NotNativeRxSchedulers"/> + <property name="format" value="\W+Schedulers\W+" /> + <property name="message" + value="Do not use the native RX Schedulers for RX stuff, this will be problematic to test" /> + </module> + + <module name="RegexpSinglelineJava"> + <property name="id" value="NotAndroidRxSchedulers"/> + <property name="format" value="\W+AndroidSchedulers\W+" /> + <property name="message" + value="Do not use AndroidSchedulers for RX stuff, this will be problematic to test" /> </module> <module name="OuterTypeFilename"/> diff --git a/configs/checkstyle/suppressions.xml b/configs/checkstyle/suppressions.xml index 77275fc76..e10ec9931 100644 --- a/configs/checkstyle/suppressions.xml +++ b/configs/checkstyle/suppressions.xml @@ -14,4 +14,10 @@ <suppress files="AnyApplication.java" id="KeyboardThemeFactoryCreation" /> <suppress files="AnyApplication.java" id="QuickTextKeyFactoryCreation" /> + + <suppress files="RxSchedulers.java" id="NotNativeRxSchedulers" /> + + <suppress files="RxSchedulers.java" id="NotAndroidRxSchedulers" /> + + <suppress files="AnyRoboApplication.java" id="NotAndroidRxSchedulers" /> </suppressions>
\ No newline at end of file diff --git a/prefs/build.gradle b/prefs/build.gradle index e0607c0c3..a18cfc51a 100644 --- a/prefs/build.gradle +++ b/prefs/build.gradle @@ -20,12 +20,10 @@ android { } dependencies { implementation project(':base') + implementation project(':base-rx') implementation "com.android.support:preference-v7:$supportLibVersion" - implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' - implementation 'io.reactivex.rxjava2:rxjava:2.1.8' - api 'com.f2prateek.rx.preferences2:rx-preferences:2.0.0-RC3' testImplementation project(':base-test') diff --git a/settings.gradle b/settings.gradle index 3b8be2dd7..026fc2315 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':base', ':jnidictionaryv1', ':jnidictionaryv2', ':nextword', ':prefs', ':base-test' +include ':app', ':base', ':base-rx', ':jnidictionaryv1', ':jnidictionaryv2', ':nextword', ':prefs', ':base-test' |
