Browse Source

Renamed OnSubscribe/Subscriber, moved anonymous class to static class, added --stacktrace to gradle build to capture build crash

master
Anthony Restaino 9 years ago
parent
commit
941f54d615
  1. 2
      .travis.yml
  2. 4
      app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java
  3. 6
      app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java
  4. 6
      app/src/main/java/acr/browser/lightning/activity/MainActivity.java
  5. 18
      app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java
  6. 20
      app/src/main/java/acr/browser/lightning/activity/TabsManager.java
  7. 10
      app/src/main/java/acr/browser/lightning/react/Action.java
  8. 160
      app/src/main/java/acr/browser/lightning/react/Observable.java
  9. 34
      app/src/main/java/acr/browser/lightning/react/OnSubscribe.java
  10. 26
      app/src/main/java/acr/browser/lightning/react/Subscriber.java
  11. 14
      app/src/main/java/acr/browser/lightning/view/LightningView.java

2
.travis.yml

@ -18,4 +18,4 @@ before_install:
install: install:
- ./gradlew - ./gradlew
script: script:
- ./gradlew assembleRelease - ./gradlew assembleRelease --stacktrace

4
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.BookmarksFragment;
import acr.browser.lightning.fragment.TabsFragment; import acr.browser.lightning.fragment.TabsFragment;
import acr.browser.lightning.object.SearchAdapter; import acr.browser.lightning.object.SearchAdapter;
import acr.browser.lightning.react.OnSubscribe;
import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.react.Schedulers;
import acr.browser.lightning.react.Subscriber;
import acr.browser.lightning.receiver.NetworkReceiver; import acr.browser.lightning.receiver.NetworkReceiver;
import com.anthonycr.grant.PermissionsManager; import com.anthonycr.grant.PermissionsManager;
@ -360,7 +360,7 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
} }
mTabsManager.initializeTabs(this, getIntent(), isIncognito()) mTabsManager.initializeTabs(this, getIntent(), isIncognito())
.subscribe(new Subscriber<Void>() { .subscribe(new OnSubscribe<Void>() {
@Override @Override
public void onNext(Void item) {} public void onNext(Void item) {}

6
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.R;
import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Action;
import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Observable;
import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.react.Subscriber;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class IncognitoActivity extends BrowserActivity { public class IncognitoActivity extends BrowserActivity {
@ -20,13 +20,13 @@ public class IncognitoActivity extends BrowserActivity {
public Observable<Void> updateCookiePreference() { public Observable<Void> updateCookiePreference() {
return Observable.create(new Action<Void>() { return Observable.create(new Action<Void>() {
@Override @Override
public void onSubscribe(@NonNull OnSubscribe<Void> onSubscribe) { public void onSubscribe(@NonNull Subscriber<Void> subscriber) {
CookieManager cookieManager = CookieManager.getInstance(); CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(IncognitoActivity.this); CookieSyncManager.createInstance(IncognitoActivity.this);
} }
cookieManager.setAcceptCookie(mPreferences.getIncognitoCookiesEnabled()); cookieManager.setAcceptCookie(mPreferences.getIncognitoCookiesEnabled());
onSubscribe.onComplete(); subscriber.onComplete();
} }
}); });
} }

6
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.R;
import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Action;
import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Observable;
import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.react.Subscriber;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class MainActivity extends BrowserActivity { public class MainActivity extends BrowserActivity {
@ -20,13 +20,13 @@ public class MainActivity extends BrowserActivity {
public Observable<Void> updateCookiePreference() { public Observable<Void> updateCookiePreference() {
return Observable.create(new Action<Void>() { return Observable.create(new Action<Void>() {
@Override @Override
public void onSubscribe(@NonNull OnSubscribe<Void> onSubscribe) { public void onSubscribe(@NonNull Subscriber<Void> subscriber) {
CookieManager cookieManager = CookieManager.getInstance(); CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(MainActivity.this); CookieSyncManager.createInstance(MainActivity.this);
} }
cookieManager.setAcceptCookie(mPreferences.getCookiesEnabled()); cookieManager.setAcceptCookie(mPreferences.getCookiesEnabled());
onSubscribe.onComplete(); subscriber.onComplete();
} }
}); });
} }

18
app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java

@ -1,14 +1,12 @@
package acr.browser.lightning.activity; package acr.browser.lightning.activity;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.Intent; import android.content.Intent;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -23,8 +21,6 @@ import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView; import android.widget.TextView;
import java.lang.ref.WeakReference;
import javax.inject.Inject; import javax.inject.Inject;
import acr.browser.lightning.R; 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.Action;
import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Observable;
import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.react.OnSubscribe;
import acr.browser.lightning.react.Schedulers;
import acr.browser.lightning.react.Subscriber; import acr.browser.lightning.react.Subscriber;
import acr.browser.lightning.react.Schedulers;
import acr.browser.lightning.react.Subscription; import acr.browser.lightning.react.Subscription;
import acr.browser.lightning.reading.HtmlFetcher; import acr.browser.lightning.reading.HtmlFetcher;
import acr.browser.lightning.reading.JResult; import acr.browser.lightning.reading.JResult;
@ -151,7 +147,7 @@ public class ReadingActivity extends AppCompatActivity {
getSupportActionBar().setTitle(Utils.getDomainName(mUrl)); getSupportActionBar().setTitle(Utils.getDomainName(mUrl));
mPageLoaderSubscription = loadPage(mUrl).subscribeOn(Schedulers.worker()) mPageLoaderSubscription = loadPage(mUrl).subscribeOn(Schedulers.worker())
.observeOn(Schedulers.main()) .observeOn(Schedulers.main())
.subscribe(new Subscriber<ReaderInfo>() { .subscribe(new OnSubscribe<ReaderInfo>() {
@Override @Override
public void onStart() { public void onStart() {
mProgressDialog = new ProgressDialog(ReadingActivity.this); mProgressDialog = new ProgressDialog(ReadingActivity.this);
@ -194,20 +190,20 @@ public class ReadingActivity extends AppCompatActivity {
private static Observable<ReaderInfo> loadPage(@NonNull final String url) { private static Observable<ReaderInfo> loadPage(@NonNull final String url) {
return Observable.create(new Action<ReaderInfo>() { return Observable.create(new Action<ReaderInfo>() {
@Override @Override
public void onSubscribe(@NonNull OnSubscribe<ReaderInfo> onSubscribe) { public void onSubscribe(@NonNull Subscriber<ReaderInfo> subscriber) {
HtmlFetcher fetcher = new HtmlFetcher(); HtmlFetcher fetcher = new HtmlFetcher();
try { try {
JResult result = fetcher.fetchAndExtract(url, 2500, true); 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) { } catch (Exception e) {
onSubscribe.onError(new Throwable("Encountered exception")); subscriber.onError(new Throwable("Encountered exception"));
e.printStackTrace(); e.printStackTrace();
} catch (OutOfMemoryError e) { } catch (OutOfMemoryError e) {
System.gc(); System.gc();
onSubscribe.onError(new Throwable("Out of memory")); subscriber.onError(new Throwable("Out of memory"));
e.printStackTrace(); e.printStackTrace();
} }
onSubscribe.onComplete(); subscriber.onComplete();
} }
}); });
} }

20
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.preference.PreferenceManager;
import acr.browser.lightning.react.Action; import acr.browser.lightning.react.Action;
import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.react.OnSubscribe;
import acr.browser.lightning.react.Schedulers;
import acr.browser.lightning.react.Subscriber; import acr.browser.lightning.react.Subscriber;
import acr.browser.lightning.react.Schedulers;
import acr.browser.lightning.utils.FileUtils; import acr.browser.lightning.utils.FileUtils;
import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Observable;
import acr.browser.lightning.view.LightningView; import acr.browser.lightning.view.LightningView;
@ -66,14 +66,14 @@ public class TabsManager {
final boolean incognito) { final boolean incognito) {
return Observable.create(new Action<Void>() { return Observable.create(new Action<Void>() {
@Override @Override
public void onSubscribe(@NonNull final OnSubscribe<Void> onSubscribe) { public void onSubscribe(@NonNull final Subscriber<Void> subscriber) {
// If incognito, only create one tab, do not handle intent // If incognito, only create one tab, do not handle intent
// in order to protect user privacy // in order to protect user privacy
if (incognito && mTabList.isEmpty()) { if (incognito && mTabList.isEmpty()) {
newTab(activity, null, true); newTab(activity, null, true);
onSubscribe.onComplete(); subscriber.onComplete();
return; return;
} }
@ -85,7 +85,7 @@ public class TabsManager {
mTabList.clear(); mTabList.clear();
mCurrentTab = null; mCurrentTab = null;
if (mPreferenceManager.getRestoreLostTabsEnabled()) { 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, private void restoreLostTabs(final String url, final Activity activity,
final OnSubscribe onSubscribe) { final Subscriber subscriber) {
restoreState().subscribeOn(Schedulers.worker()) restoreState().subscribeOn(Schedulers.worker())
.observeOn(Schedulers.main()).subscribe(new Subscriber<Bundle>() { .observeOn(Schedulers.main()).subscribe(new OnSubscribe<Bundle>() {
@Override @Override
public void onNext(Bundle item) { public void onNext(Bundle item) {
LightningView tab = newTab(activity, "", false); LightningView tab = newTab(activity, "", false);
@ -127,7 +127,7 @@ public class TabsManager {
if (mTabList.size() == 0) { if (mTabList.size() == 0) {
newTab(activity, null, false); newTab(activity, null, false);
} }
onSubscribe.onComplete(); subscriber.onComplete();
} }
}); });
} }
@ -331,17 +331,17 @@ public class TabsManager {
private Observable<Bundle> restoreState() { private Observable<Bundle> restoreState() {
return Observable.create(new Action<Bundle>() { return Observable.create(new Action<Bundle>() {
@Override @Override
public void onSubscribe(@NonNull OnSubscribe<Bundle> onSubscribe) { public void onSubscribe(@NonNull Subscriber<Bundle> subscriber) {
Bundle savedState = FileUtils.readBundleFromStorage(mApp, BUNDLE_STORAGE); Bundle savedState = FileUtils.readBundleFromStorage(mApp, BUNDLE_STORAGE);
if (savedState != null) { if (savedState != null) {
Log.d(Constants.TAG, "Restoring previous WebView state now"); Log.d(Constants.TAG, "Restoring previous WebView state now");
for (String key : savedState.keySet()) { for (String key : savedState.keySet()) {
if (key.startsWith(BUNDLE_KEY)) { if (key.startsWith(BUNDLE_KEY)) {
onSubscribe.onNext(savedState.getBundle(key)); subscriber.onNext(savedState.getBundle(key));
} }
} }
} }
onSubscribe.onComplete(); subscriber.onComplete();
} }
}); });
} }

10
app/src/main/java/acr/browser/lightning/react/Action.java

@ -4,13 +4,13 @@ import android.support.annotation.NonNull;
public interface Action<T> { public interface Action<T> {
/** /**
* Should be overridden to send the onSubscribe * Should be overridden to send the subscriber
* events such as {@link OnSubscribe#onNext(Object)} * events such as {@link Subscriber#onNext(Object)}
* or {@link OnSubscribe#onComplete()}. * 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 * when the user of the Observable
* subscribes. * subscribes.
*/ */
void onSubscribe(@NonNull OnSubscribe<T> onSubscribe); void onSubscribe(@NonNull Subscriber<T> subscriber);
} }

160
app/src/main/java/acr/browser/lightning/react/Observable.java

@ -39,7 +39,7 @@ public class Observable<T> {
* must not be null. * must not be null.
* *
* @param action the Action to perform * @param action the Action to perform
* @param <T> the type that will be emitted to the subscriber * @param <T> the type that will be emitted to the onSubscribe
* @return a valid non-null Observable. * @return a valid non-null Observable.
*/ */
@NonNull @NonNull
@ -49,7 +49,7 @@ public class Observable<T> {
} }
/** /**
* Tells the Observable what Executor that the subscriber * Tells the Observable what Executor that the onSubscribe
* work should run on. * work should run on.
* *
* @param subscribeExecutor the Executor to run the work on. * @param subscribeExecutor the Executor to run the work on.
@ -61,7 +61,7 @@ public class Observable<T> {
} }
/** /**
* Tells the Observable what Executor the subscriber should observe * Tells the Observable what Executor the onSubscribe should observe
* the work on. * the work on.
* *
* @param observerExecutor the Executor to run to callback on. * @param observerExecutor the Executor to run to callback on.
@ -80,7 +80,7 @@ public class Observable<T> {
executeOnSubscriberThread(new Runnable() { executeOnSubscriberThread(new Runnable() {
@Override @Override
public void run() { public void run() {
mAction.onSubscribe(new OnSubscribe<T>(null) { mAction.onSubscribe(new Subscriber<T>() {
@Override @Override
public void unsubscribe() {} public void unsubscribe() {}
@ -88,7 +88,7 @@ public class Observable<T> {
public void onComplete() {} public void onComplete() {}
@Override @Override
public void start() {} public void onStart() {}
@Override @Override
public void onError(@NonNull Throwable throwable) {} public void onError(@NonNull Throwable throwable) {}
@ -102,73 +102,27 @@ public class Observable<T> {
/** /**
* Immediately subscribes to the Observable and starts * 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 * @param onSubscribe the class that wishes to receive onNext and
* onComplete callbacks from the Observable. * onComplete callbacks from the Observable.
*/ */
public Subscription subscribe(@NonNull Subscriber<T> subscriber) { public Subscription subscribe(@NonNull OnSubscribe<T> onSubscribe) {
Preconditions.checkNonNull(subscriber); Preconditions.checkNonNull(onSubscribe);
final OnSubscribe<T> onSubscribe = new OnSubscribe<T>(subscriber) { final Subscriber<T> subscriber = new SubscriberImpl<>(onSubscribe, this);
@Override subscriber.onStart();
public void unsubscribe() {
setSubscriber(null);
}
private boolean mOnCompleteExecuted = false;
@Override
public void onComplete() {
Subscriber<T> 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<T> subscription = getSubscriber();
executeOnObserverThread(new OnStartRunnable<>(subscription));
}
@Override
public void onError(@NonNull final Throwable throwable) {
Subscriber<T> 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");
}
}
@Override
public void onNext(final T item) {
Subscriber<T> 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() { executeOnSubscriberThread(new Runnable() {
@Override @Override
public void run() { public void run() {
mAction.onSubscribe(onSubscribe); mAction.onSubscribe(subscriber);
} }
}); });
return onSubscribe;
return subscriber;
} }
private void executeOnObserverThread(@NonNull Runnable runnable) { private void executeOnObserverThread(@NonNull Runnable runnable) {
@ -187,55 +141,111 @@ public class Observable<T> {
} }
} }
private static class SubscriberImpl<T> implements Subscriber<T> {
@Nullable private OnSubscribe<T> mOnSubscribe;
@NonNull private Observable<T> mObservable;
private boolean mOnCompleteExecuted = false;
public SubscriberImpl(@NonNull OnSubscribe<T> onSubscribe, @NonNull Observable<T> 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<T> implements Runnable { private static class OnCompleteRunnable<T> implements Runnable {
private final Subscriber<T> subscriber; private final OnSubscribe<T> onSubscribe;
public OnCompleteRunnable(Subscriber<T> subscriber) {this.subscriber = subscriber;} public OnCompleteRunnable(OnSubscribe<T> onSubscribe) {this.onSubscribe = onSubscribe;}
@Override @Override
public void run() { public void run() {
subscriber.onComplete(); onSubscribe.onComplete();
} }
} }
private static class OnNextRunnable<T> implements Runnable { private static class OnNextRunnable<T> implements Runnable {
private final Subscriber<T> subscriber; private final OnSubscribe<T> onSubscribe;
private final T item; private final T item;
public OnNextRunnable(Subscriber<T> subscriber, T item) { public OnNextRunnable(OnSubscribe<T> onSubscribe, T item) {
this.subscriber = subscriber; this.onSubscribe = onSubscribe;
this.item = item; this.item = item;
} }
@Override @Override
public void run() { public void run() {
subscriber.onNext(item); onSubscribe.onNext(item);
} }
} }
private static class OnErrorRunnable<T> implements Runnable { private static class OnErrorRunnable<T> implements Runnable {
private final Subscriber<T> subscriber; private final OnSubscribe<T> onSubscribe;
private final Throwable throwable; private final Throwable throwable;
public OnErrorRunnable(Subscriber<T> subscriber, Throwable throwable) { public OnErrorRunnable(OnSubscribe<T> onSubscribe, Throwable throwable) {
this.subscriber = subscriber; this.onSubscribe = onSubscribe;
this.throwable = throwable; this.throwable = throwable;
} }
@Override @Override
public void run() { public void run() {
subscriber.onError(throwable); onSubscribe.onError(throwable);
} }
} }
private static class OnStartRunnable<T> implements Runnable { private static class OnStartRunnable<T> implements Runnable {
private final Subscriber<T> subscriber; private final OnSubscribe<T> onSubscribe;
public OnStartRunnable(Subscriber<T> subscriber) {this.subscriber = subscriber;} public OnStartRunnable(OnSubscribe<T> onSubscribe) {this.onSubscribe = onSubscribe;}
@Override @Override
public void run() { public void run() {
subscriber.onStart(); onSubscribe.onStart();
} }
} }
} }

34
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.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
public abstract class OnSubscribe<T> implements Subscription { public abstract class OnSubscribe<T> {
@Nullable private Subscriber<T> mSubscriber;
public OnSubscribe(@Nullable Subscriber<T> subscriber) {
mSubscriber = subscriber;
start();
}
public abstract void start();
@Nullable
public Subscriber<T> getSubscriber() {
return mSubscriber;
}
public void setSubscriber(@Nullable Subscriber<T> subscriber) {
mSubscriber = subscriber;
}
/** /**
* Called when the observable * Called when the observable
@ -35,7 +17,13 @@ public abstract class OnSubscribe<T> implements Subscription {
* @param throwable an optional throwable that could * @param throwable an optional throwable that could
* be sent. * 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 * Called when the Observer emits an
@ -46,14 +34,14 @@ public abstract class OnSubscribe<T> implements Subscription {
* @param item the item that has been emitted, * @param item the item that has been emitted,
* can be null. * can be null.
*/ */
public abstract void onNext(@Nullable T item); public void onNext(@Nullable T item) {}
/** /**
* This method is called when the observer is * This method is called when the observer is
* finished sending the subscriber events. It * finished sending the subscriber events. It
* is guaranteed that no other methods will be * 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. * has been called.
*/ */
public abstract void onComplete(); public void onComplete() {}
} }

26
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.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
public abstract class Subscriber<T> { public interface Subscriber<T> 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 * Called when the observable
@ -17,13 +27,7 @@ public abstract class Subscriber<T> {
* @param throwable an optional throwable that could * @param throwable an optional throwable that could
* be sent. * be sent.
*/ */
public void onError(@NonNull Throwable throwable) {} 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 * Called when the Observer emits an
@ -34,14 +38,14 @@ public abstract class Subscriber<T> {
* @param item the item that has been emitted, * @param item the item that has been emitted,
* can be null. * can be null.
*/ */
public void onNext(@Nullable T item) {} void onNext(@Nullable T item);
/** /**
* This method is called when the observer is * This method is called when the observer is
* finished sending the subscriber events. It * finished sending the subscriber events. It
* is guaranteed that no other methods will be * 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. * has been called.
*/ */
public void onComplete() {} void onComplete();
} }

14
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.Action;
import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Observable;
import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.react.Schedulers;
import acr.browser.lightning.react.OnSubscribe;
import acr.browser.lightning.react.Subscriber; import acr.browser.lightning.react.Subscriber;
import acr.browser.lightning.react.OnSubscribe;
import acr.browser.lightning.utils.ProxyUtils; import acr.browser.lightning.utils.ProxyUtils;
import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.ThemeUtils;
import acr.browser.lightning.utils.UrlUtils; import acr.browser.lightning.utils.UrlUtils;
@ -375,7 +375,7 @@ public class LightningView {
getPathObservable("appcache") getPathObservable("appcache")
.subscribeOn(Schedulers.worker()) .subscribeOn(Schedulers.worker())
.subscribe(new Subscriber<File>() { .subscribe(new OnSubscribe<File>() {
@Override @Override
public void onNext(File item) { public void onNext(File item) {
settings.setAppCachePath(item.getPath()); settings.setAppCachePath(item.getPath());
@ -387,7 +387,7 @@ public class LightningView {
getPathObservable("geolocation") getPathObservable("geolocation")
.subscribeOn(Schedulers.worker()) .subscribeOn(Schedulers.worker())
.subscribe(new Subscriber<File>() { .subscribe(new OnSubscribe<File>() {
@Override @Override
public void onNext(File item) { public void onNext(File item) {
settings.setGeolocationDatabasePath(item.getPath()); settings.setGeolocationDatabasePath(item.getPath());
@ -399,7 +399,7 @@ public class LightningView {
getPathObservable("databases") getPathObservable("databases")
.subscribeOn(Schedulers.worker()) .subscribeOn(Schedulers.worker())
.subscribe(new Subscriber<File>() { .subscribe(new OnSubscribe<File>() {
@Override @Override
public void onNext(File item) { public void onNext(File item) {
if (API < Build.VERSION_CODES.KITKAT) { if (API < Build.VERSION_CODES.KITKAT) {
@ -417,10 +417,10 @@ public class LightningView {
private Observable<File> getPathObservable(final String subFolder) { private Observable<File> getPathObservable(final String subFolder) {
return Observable.create(new Action<File>() { return Observable.create(new Action<File>() {
@Override @Override
public void onSubscribe(@NonNull OnSubscribe<File> onSubscribe) { public void onSubscribe(@NonNull Subscriber<File> subscriber) {
File file = BrowserApp.get(mActivity).getDir(subFolder, 0); File file = BrowserApp.get(mActivity).getDir(subFolder, 0);
onSubscribe.onNext(file); subscriber.onNext(file);
onSubscribe.onComplete(); subscriber.onComplete();
} }
}); });
} }

Loading…
Cancel
Save