aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMenny Even Danan <menny@evendanan.net>2018-01-18 20:20:00 +0000
committerMenny Even Danan <menny@evendanan.net>2018-01-18 20:20:00 +0000
commitc36ac34e76f10e0e6bbb578c9715d6b33b52ae7b (patch)
tree5fb17cee01ba51527de6754b9a21288ae5edc34e
parent1733f4ab5f4758056df6d025ef042d2d725bf0c2 (diff)
downloadAnySoftKeyboard-c36ac34e76f10e0e6bbb578c9715d6b33b52ae7b.tar.gz
AnySoftKeyboard-c36ac34e76f10e0e6bbb578c9715d6b33b52ae7b.tar.bz2
Normalizing RX-Schedulers for Android
And using main-thread for tests
-rw-r--r--app/build.gradle7
-rw-r--r--app/src/main/java/com/anysoftkeyboard/ui/dev/DeveloperToolsFragment.java19
-rw-r--r--app/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java23
-rw-r--r--app/src/test/java/com/anysoftkeyboard/dictionaries/prefsprovider/UserDictionaryPrefsProviderTest.java1
-rw-r--r--app/src/test/java/com/menny/android/anysoftkeyboard/AnyRoboApplication.java3
-rw-r--r--base-rx/build.gradle27
-rw-r--r--base-rx/src/main/AndroidManifest.xml1
-rw-r--r--base-rx/src/main/java/com/anysoftkeyboard/RxSchedulers.java28
-rw-r--r--base-test/build.gradle2
-rw-r--r--configs/checkstyle/checkstyle.xml16
-rw-r--r--configs/checkstyle/suppressions.xml6
-rw-r--r--prefs/build.gradle4
-rw-r--r--settings.gradle2
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'