package licola.demo.com.huabandemo.Observable;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Looper;
import licola.demo.com.huabandemo.Util.Logger;
import rx.Observable;
import rx.Scheduler;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.subscriptions.Subscriptions;
/**
* Created by hanks on 15-11-29.
*/
public class BroadcastObservable implements Observable.OnSubscribe<Boolean> {
private final Context context;
public static Observable<Boolean> fromConnectivityManager(Context context) {
return Observable.create(new BroadcastObservable(context))
.share();
}
public BroadcastObservable(Context context) {
this.context = context;
}
@Override
public void call(Subscriber<? super Boolean> subscriber) {
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Logger.d();
subscriber.onNext(isConnectedToInternet());
}
};
context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
subscriber.add(unsubscribeInUiThread(() -> context.unregisterReceiver(receiver)));
}
private boolean isConnectedToInternet() {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
Logger.d("isConnectedToInternet ="+networkInfo.isConnected() );
return networkInfo != null && networkInfo.isConnected();
}
private static Subscription unsubscribeInUiThread(final Action0 unsubscribe) {
return Subscriptions.create(() -> {
if (Looper.getMainLooper() == Looper.myLooper()) {
unsubscribe.call();
} else {
final Scheduler.Worker inner = AndroidSchedulers.mainThread().createWorker();
inner.schedule(() -> {
unsubscribe.call();
inner.unsubscribe();
});
}
});
}
}