From 941f54d615a7152ac78cd715937d44e510a65b2d Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Fri, 5 Feb 2016 21:54:45 -0500 Subject: [PATCH] Renamed OnSubscribe/Subscriber, moved anonymous class to static class, added --stacktrace to gradle build to capture build crash --- .travis.yml | 2 +- .../lightning/activity/BrowserActivity.java | 4 +- .../lightning/activity/IncognitoActivity.java | 6 +- .../lightning/activity/MainActivity.java | 6 +- .../lightning/activity/ReadingActivity.java | 18 +- .../lightning/activity/TabsManager.java | 20 +-- .../acr/browser/lightning/react/Action.java | 10 +- .../browser/lightning/react/Observable.java | 160 ++++++++++-------- .../browser/lightning/react/OnSubscribe.java | 34 ++-- .../browser/lightning/react/Subscriber.java | 26 +-- .../browser/lightning/view/LightningView.java | 14 +- 11 files changed, 149 insertions(+), 151 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1e468da..f0e1d31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,4 +18,4 @@ before_install: install: - ./gradlew script: - - ./gradlew assembleRelease + - ./gradlew assembleRelease --stacktrace diff --git a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java index 1809a90..0e32eca 100644 --- a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java @@ -110,8 +110,8 @@ import acr.browser.lightning.dialog.LightningDialogBuilder; import acr.browser.lightning.fragment.BookmarksFragment; import acr.browser.lightning.fragment.TabsFragment; import acr.browser.lightning.object.SearchAdapter; +import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.react.Schedulers; -import acr.browser.lightning.react.Subscriber; import acr.browser.lightning.receiver.NetworkReceiver; import com.anthonycr.grant.PermissionsManager; @@ -360,7 +360,7 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements } mTabsManager.initializeTabs(this, getIntent(), isIncognito()) - .subscribe(new Subscriber() { + .subscribe(new OnSubscribe() { @Override public void onNext(Void item) {} diff --git a/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java b/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java index 075237c..e05512d 100644 --- a/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java @@ -11,7 +11,7 @@ import android.webkit.CookieSyncManager; import acr.browser.lightning.R; import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.OnSubscribe; +import acr.browser.lightning.react.Subscriber; @SuppressWarnings("deprecation") public class IncognitoActivity extends BrowserActivity { @@ -20,13 +20,13 @@ public class IncognitoActivity extends BrowserActivity { public Observable updateCookiePreference() { return Observable.create(new Action() { @Override - public void onSubscribe(@NonNull OnSubscribe onSubscribe) { + public void onSubscribe(@NonNull Subscriber subscriber) { CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { CookieSyncManager.createInstance(IncognitoActivity.this); } cookieManager.setAcceptCookie(mPreferences.getIncognitoCookiesEnabled()); - onSubscribe.onComplete(); + subscriber.onComplete(); } }); } diff --git a/app/src/main/java/acr/browser/lightning/activity/MainActivity.java b/app/src/main/java/acr/browser/lightning/activity/MainActivity.java index a011161..e0eeb79 100644 --- a/app/src/main/java/acr/browser/lightning/activity/MainActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/MainActivity.java @@ -11,7 +11,7 @@ import android.webkit.CookieSyncManager; import acr.browser.lightning.R; import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.OnSubscribe; +import acr.browser.lightning.react.Subscriber; @SuppressWarnings("deprecation") public class MainActivity extends BrowserActivity { @@ -20,13 +20,13 @@ public class MainActivity extends BrowserActivity { public Observable updateCookiePreference() { return Observable.create(new Action() { @Override - public void onSubscribe(@NonNull OnSubscribe onSubscribe) { + public void onSubscribe(@NonNull Subscriber subscriber) { CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { CookieSyncManager.createInstance(MainActivity.this); } cookieManager.setAcceptCookie(mPreferences.getCookiesEnabled()); - onSubscribe.onComplete(); + subscriber.onComplete(); } }); } diff --git a/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java b/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java index ba8ba08..7d30a16 100644 --- a/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java @@ -1,14 +1,12 @@ package acr.browser.lightning.activity; import android.animation.ObjectAnimator; -import android.app.Activity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; -import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -23,8 +21,6 @@ import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; -import java.lang.ref.WeakReference; - import javax.inject.Inject; import acr.browser.lightning.R; @@ -34,8 +30,8 @@ import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.OnSubscribe; -import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.react.Subscriber; +import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.react.Subscription; import acr.browser.lightning.reading.HtmlFetcher; import acr.browser.lightning.reading.JResult; @@ -151,7 +147,7 @@ public class ReadingActivity extends AppCompatActivity { getSupportActionBar().setTitle(Utils.getDomainName(mUrl)); mPageLoaderSubscription = loadPage(mUrl).subscribeOn(Schedulers.worker()) .observeOn(Schedulers.main()) - .subscribe(new Subscriber() { + .subscribe(new OnSubscribe() { @Override public void onStart() { mProgressDialog = new ProgressDialog(ReadingActivity.this); @@ -194,20 +190,20 @@ public class ReadingActivity extends AppCompatActivity { private static Observable loadPage(@NonNull final String url) { return Observable.create(new Action() { @Override - public void onSubscribe(@NonNull OnSubscribe onSubscribe) { + public void onSubscribe(@NonNull Subscriber subscriber) { HtmlFetcher fetcher = new HtmlFetcher(); try { JResult result = fetcher.fetchAndExtract(url, 2500, true); - onSubscribe.onNext(new ReaderInfo(result.getTitle(), result.getText())); + subscriber.onNext(new ReaderInfo(result.getTitle(), result.getText())); } catch (Exception e) { - onSubscribe.onError(new Throwable("Encountered exception")); + subscriber.onError(new Throwable("Encountered exception")); e.printStackTrace(); } catch (OutOfMemoryError e) { System.gc(); - onSubscribe.onError(new Throwable("Out of memory")); + subscriber.onError(new Throwable("Out of memory")); e.printStackTrace(); } - onSubscribe.onComplete(); + subscriber.onComplete(); } }); } diff --git a/app/src/main/java/acr/browser/lightning/activity/TabsManager.java b/app/src/main/java/acr/browser/lightning/activity/TabsManager.java index bcf9392..fe3e6ca 100644 --- a/app/src/main/java/acr/browser/lightning/activity/TabsManager.java +++ b/app/src/main/java/acr/browser/lightning/activity/TabsManager.java @@ -25,8 +25,8 @@ import acr.browser.lightning.constant.Constants; import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.react.Action; import acr.browser.lightning.react.OnSubscribe; -import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.react.Subscriber; +import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.utils.FileUtils; import acr.browser.lightning.react.Observable; import acr.browser.lightning.view.LightningView; @@ -66,14 +66,14 @@ public class TabsManager { final boolean incognito) { return Observable.create(new Action() { @Override - public void onSubscribe(@NonNull final OnSubscribe onSubscribe) { + public void onSubscribe(@NonNull final Subscriber subscriber) { // If incognito, only create one tab, do not handle intent // in order to protect user privacy if (incognito && mTabList.isEmpty()) { newTab(activity, null, true); - onSubscribe.onComplete(); + subscriber.onComplete(); return; } @@ -85,7 +85,7 @@ public class TabsManager { mTabList.clear(); mCurrentTab = null; if (mPreferenceManager.getRestoreLostTabsEnabled()) { - restoreLostTabs(url, activity, onSubscribe); + restoreLostTabs(url, activity, subscriber); } } @@ -94,9 +94,9 @@ public class TabsManager { } private void restoreLostTabs(final String url, final Activity activity, - final OnSubscribe onSubscribe) { + final Subscriber subscriber) { restoreState().subscribeOn(Schedulers.worker()) - .observeOn(Schedulers.main()).subscribe(new Subscriber() { + .observeOn(Schedulers.main()).subscribe(new OnSubscribe() { @Override public void onNext(Bundle item) { LightningView tab = newTab(activity, "", false); @@ -127,7 +127,7 @@ public class TabsManager { if (mTabList.size() == 0) { newTab(activity, null, false); } - onSubscribe.onComplete(); + subscriber.onComplete(); } }); } @@ -331,17 +331,17 @@ public class TabsManager { private Observable restoreState() { return Observable.create(new Action() { @Override - public void onSubscribe(@NonNull OnSubscribe onSubscribe) { + public void onSubscribe(@NonNull Subscriber subscriber) { Bundle savedState = FileUtils.readBundleFromStorage(mApp, BUNDLE_STORAGE); if (savedState != null) { Log.d(Constants.TAG, "Restoring previous WebView state now"); for (String key : savedState.keySet()) { if (key.startsWith(BUNDLE_KEY)) { - onSubscribe.onNext(savedState.getBundle(key)); + subscriber.onNext(savedState.getBundle(key)); } } } - onSubscribe.onComplete(); + subscriber.onComplete(); } }); } diff --git a/app/src/main/java/acr/browser/lightning/react/Action.java b/app/src/main/java/acr/browser/lightning/react/Action.java index 461e04d..0c1a22e 100644 --- a/app/src/main/java/acr/browser/lightning/react/Action.java +++ b/app/src/main/java/acr/browser/lightning/react/Action.java @@ -4,13 +4,13 @@ import android.support.annotation.NonNull; public interface Action { /** - * Should be overridden to send the onSubscribe - * events such as {@link OnSubscribe#onNext(Object)} - * or {@link OnSubscribe#onComplete()}. + * Should be overridden to send the subscriber + * events such as {@link Subscriber#onNext(Object)} + * or {@link Subscriber#onComplete()}. * - * @param onSubscribe the onSubscribe that is sent in + * @param subscriber the subscriber that is sent in * when the user of the Observable * subscribes. */ - void onSubscribe(@NonNull OnSubscribe onSubscribe); + void onSubscribe(@NonNull Subscriber subscriber); } diff --git a/app/src/main/java/acr/browser/lightning/react/Observable.java b/app/src/main/java/acr/browser/lightning/react/Observable.java index 0935102..89a0b8f 100644 --- a/app/src/main/java/acr/browser/lightning/react/Observable.java +++ b/app/src/main/java/acr/browser/lightning/react/Observable.java @@ -39,7 +39,7 @@ public class Observable { * must not be null. * * @param action the Action to perform - * @param the type that will be emitted to the subscriber + * @param the type that will be emitted to the onSubscribe * @return a valid non-null Observable. */ @NonNull @@ -49,7 +49,7 @@ public class Observable { } /** - * Tells the Observable what Executor that the subscriber + * Tells the Observable what Executor that the onSubscribe * work should run on. * * @param subscribeExecutor the Executor to run the work on. @@ -61,7 +61,7 @@ public class Observable { } /** - * Tells the Observable what Executor the subscriber should observe + * Tells the Observable what Executor the onSubscribe should observe * the work on. * * @param observerExecutor the Executor to run to callback on. @@ -80,7 +80,7 @@ public class Observable { executeOnSubscriberThread(new Runnable() { @Override public void run() { - mAction.onSubscribe(new OnSubscribe(null) { + mAction.onSubscribe(new Subscriber() { @Override public void unsubscribe() {} @@ -88,7 +88,7 @@ public class Observable { public void onComplete() {} @Override - public void start() {} + public void onStart() {} @Override public void onError(@NonNull Throwable throwable) {} @@ -102,73 +102,27 @@ public class Observable { /** * Immediately subscribes to the Observable and starts - * sending events from the Observable to the {@link Subscriber}. + * sending events from the Observable to the {@link OnSubscribe}. * - * @param subscriber the class that wishes to receive onNext and - * onComplete callbacks from the Observable. + * @param onSubscribe the class that wishes to receive onNext and + * onComplete callbacks from the Observable. */ - public Subscription subscribe(@NonNull Subscriber subscriber) { + public Subscription subscribe(@NonNull OnSubscribe onSubscribe) { - Preconditions.checkNonNull(subscriber); + Preconditions.checkNonNull(onSubscribe); - final OnSubscribe onSubscribe = new OnSubscribe(subscriber) { + final Subscriber subscriber = new SubscriberImpl<>(onSubscribe, this); - @Override - public void unsubscribe() { - setSubscriber(null); - } - - private boolean mOnCompleteExecuted = false; - - @Override - public void onComplete() { - Subscriber subscription = getSubscriber(); - if (!mOnCompleteExecuted && subscription != null) { - mOnCompleteExecuted = true; - executeOnObserverThread(new OnCompleteRunnable<>(subscription)); - } else { - Log.e(TAG, "onComplete called more than once"); - throw new RuntimeException("onComplete called more than once"); - } - } - - @Override - public void start() { - Subscriber subscription = getSubscriber(); - executeOnObserverThread(new OnStartRunnable<>(subscription)); - } - - @Override - public void onError(@NonNull final Throwable throwable) { - Subscriber subscription = getSubscriber(); - if (!mOnCompleteExecuted && subscription != null) { - mOnCompleteExecuted = true; - executeOnObserverThread(new OnErrorRunnable<>(subscription, throwable)); - } else { - Log.e(TAG, "onComplete already called"); - throw new RuntimeException("onComplete already called"); - } - } + subscriber.onStart(); - @Override - public void onNext(final T item) { - Subscriber subscription = getSubscriber(); - if (!mOnCompleteExecuted && subscription != null) { - executeOnObserverThread(new OnNextRunnable<>(subscription, item)); - } else { - Log.e(TAG, "onComplete has been already called, onNext should not be called"); - throw new RuntimeException("onNext should not be called after onComplete has been called"); - } - } - }; executeOnSubscriberThread(new Runnable() { - @Override public void run() { - mAction.onSubscribe(onSubscribe); + mAction.onSubscribe(subscriber); } }); - return onSubscribe; + + return subscriber; } private void executeOnObserverThread(@NonNull Runnable runnable) { @@ -187,55 +141,111 @@ public class Observable { } } + private static class SubscriberImpl implements Subscriber { + + @Nullable private OnSubscribe mOnSubscribe; + @NonNull private Observable mObservable; + private boolean mOnCompleteExecuted = false; + + public SubscriberImpl(@NonNull OnSubscribe onSubscribe, @NonNull Observable observable) { + mOnSubscribe = onSubscribe; + mObservable = observable; + } + + @Override + public void unsubscribe() { + mOnSubscribe = null; + } + + @Override + public void onComplete() { + if (!mOnCompleteExecuted && mOnSubscribe != null) { + mOnCompleteExecuted = true; + mObservable.executeOnObserverThread(new OnCompleteRunnable<>(mOnSubscribe)); + } else { + Log.e(TAG, "onComplete called more than once"); + throw new RuntimeException("onComplete called more than once"); + } + } + + @Override + public void onStart() { + if (mOnSubscribe != null) { + mObservable.executeOnObserverThread(new OnStartRunnable<>(mOnSubscribe)); + } + } + + @Override + public void onError(@NonNull final Throwable throwable) { + if (!mOnCompleteExecuted && mOnSubscribe != null) { + mOnCompleteExecuted = true; + mObservable.executeOnObserverThread(new OnErrorRunnable<>(mOnSubscribe, throwable)); + } else { + Log.e(TAG, "onComplete already called"); + throw new RuntimeException("onComplete already called"); + } + } + + @Override + public void onNext(final T item) { + if (!mOnCompleteExecuted && mOnSubscribe != null) { + mObservable.executeOnObserverThread(new OnNextRunnable<>(mOnSubscribe, item)); + } else { + Log.e(TAG, "onComplete has been already called, onNext should not be called"); + throw new RuntimeException("onNext should not be called after onComplete has been called"); + } + } + } + private static class OnCompleteRunnable implements Runnable { - private final Subscriber subscriber; + private final OnSubscribe onSubscribe; - public OnCompleteRunnable(Subscriber subscriber) {this.subscriber = subscriber;} + public OnCompleteRunnable(OnSubscribe onSubscribe) {this.onSubscribe = onSubscribe;} @Override public void run() { - subscriber.onComplete(); + onSubscribe.onComplete(); } } private static class OnNextRunnable implements Runnable { - private final Subscriber subscriber; + private final OnSubscribe onSubscribe; private final T item; - public OnNextRunnable(Subscriber subscriber, T item) { - this.subscriber = subscriber; + public OnNextRunnable(OnSubscribe onSubscribe, T item) { + this.onSubscribe = onSubscribe; this.item = item; } @Override public void run() { - subscriber.onNext(item); + onSubscribe.onNext(item); } } private static class OnErrorRunnable implements Runnable { - private final Subscriber subscriber; + private final OnSubscribe onSubscribe; private final Throwable throwable; - public OnErrorRunnable(Subscriber subscriber, Throwable throwable) { - this.subscriber = subscriber; + public OnErrorRunnable(OnSubscribe onSubscribe, Throwable throwable) { + this.onSubscribe = onSubscribe; this.throwable = throwable; } @Override public void run() { - subscriber.onError(throwable); + onSubscribe.onError(throwable); } } private static class OnStartRunnable implements Runnable { - private final Subscriber subscriber; + private final OnSubscribe onSubscribe; - public OnStartRunnable(Subscriber subscriber) {this.subscriber = subscriber;} + public OnStartRunnable(OnSubscribe onSubscribe) {this.onSubscribe = onSubscribe;} @Override public void run() { - subscriber.onStart(); + onSubscribe.onStart(); } } } diff --git a/app/src/main/java/acr/browser/lightning/react/OnSubscribe.java b/app/src/main/java/acr/browser/lightning/react/OnSubscribe.java index a236661..fb65d7f 100644 --- a/app/src/main/java/acr/browser/lightning/react/OnSubscribe.java +++ b/app/src/main/java/acr/browser/lightning/react/OnSubscribe.java @@ -3,25 +3,7 @@ package acr.browser.lightning.react; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -public abstract class OnSubscribe implements Subscription { - - @Nullable private Subscriber mSubscriber; - - public OnSubscribe(@Nullable Subscriber subscriber) { - mSubscriber = subscriber; - start(); - } - - public abstract void start(); - - @Nullable - public Subscriber getSubscriber() { - return mSubscriber; - } - - public void setSubscriber(@Nullable Subscriber subscriber) { - mSubscriber = subscriber; - } +public abstract class OnSubscribe { /** * Called when the observable @@ -35,7 +17,13 @@ public abstract class OnSubscribe implements Subscription { * @param throwable an optional throwable that could * be sent. */ - public abstract void onError(@NonNull Throwable throwable); + public void onError(@NonNull Throwable throwable) {} + + /** + * Called before the observer begins + * to process and emit items or complete. + */ + public void onStart() {} /** * Called when the Observer emits an @@ -46,14 +34,14 @@ public abstract class OnSubscribe implements Subscription { * @param item the item that has been emitted, * can be null. */ - public abstract void onNext(@Nullable T item); + public void onNext(@Nullable T item) {} /** * This method is called when the observer is * finished sending the subscriber events. It * is guaranteed that no other methods will be - * called on the Subscriber after this method + * called on the OnSubscribe after this method * has been called. */ - public abstract void onComplete(); + public void onComplete() {} } diff --git a/app/src/main/java/acr/browser/lightning/react/Subscriber.java b/app/src/main/java/acr/browser/lightning/react/Subscriber.java index d996abd..72920f1 100644 --- a/app/src/main/java/acr/browser/lightning/react/Subscriber.java +++ b/app/src/main/java/acr/browser/lightning/react/Subscriber.java @@ -3,7 +3,17 @@ package acr.browser.lightning.react; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -public abstract class Subscriber { +public interface Subscriber extends Subscription { + + /** + * Called immediately upon subscribing + * and before the Observable begins + * emitting items. This should not be + * called by the creator of the Observable + * and is rather called internally by the + * Observable class itself. + */ + void onStart(); /** * Called when the observable @@ -17,13 +27,7 @@ public abstract class Subscriber { * @param throwable an optional throwable that could * be sent. */ - public void onError(@NonNull Throwable throwable) {} - - /** - * Called before the observer begins - * to process and emit items or complete. - */ - public void onStart() {} + void onError(@NonNull Throwable throwable); /** * Called when the Observer emits an @@ -34,14 +38,14 @@ public abstract class Subscriber { * @param item the item that has been emitted, * can be null. */ - public void onNext(@Nullable T item) {} + void onNext(@Nullable T item); /** * This method is called when the observer is * finished sending the subscriber events. It * is guaranteed that no other methods will be - * called on the Subscriber after this method + * called on the OnSubscribe after this method * has been called. */ - public void onComplete() {} + void onComplete(); } diff --git a/app/src/main/java/acr/browser/lightning/view/LightningView.java b/app/src/main/java/acr/browser/lightning/view/LightningView.java index 9d19100..86734fc 100644 --- a/app/src/main/java/acr/browser/lightning/view/LightningView.java +++ b/app/src/main/java/acr/browser/lightning/view/LightningView.java @@ -55,8 +55,8 @@ import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Schedulers; -import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.react.Subscriber; +import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.utils.ProxyUtils; import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.UrlUtils; @@ -375,7 +375,7 @@ public class LightningView { getPathObservable("appcache") .subscribeOn(Schedulers.worker()) - .subscribe(new Subscriber() { + .subscribe(new OnSubscribe() { @Override public void onNext(File item) { settings.setAppCachePath(item.getPath()); @@ -387,7 +387,7 @@ public class LightningView { getPathObservable("geolocation") .subscribeOn(Schedulers.worker()) - .subscribe(new Subscriber() { + .subscribe(new OnSubscribe() { @Override public void onNext(File item) { settings.setGeolocationDatabasePath(item.getPath()); @@ -399,7 +399,7 @@ public class LightningView { getPathObservable("databases") .subscribeOn(Schedulers.worker()) - .subscribe(new Subscriber() { + .subscribe(new OnSubscribe() { @Override public void onNext(File item) { if (API < Build.VERSION_CODES.KITKAT) { @@ -417,10 +417,10 @@ public class LightningView { private Observable getPathObservable(final String subFolder) { return Observable.create(new Action() { @Override - public void onSubscribe(@NonNull OnSubscribe onSubscribe) { + public void onSubscribe(@NonNull Subscriber subscriber) { File file = BrowserApp.get(mActivity).getDir(subFolder, 0); - onSubscribe.onNext(file); - onSubscribe.onComplete(); + subscriber.onNext(file); + subscriber.onComplete(); } }); }