From e3edb0a7a7136ec9094edc5dc6f7566cc2ac164d Mon Sep 17 00:00:00 2001 From: Anton Domnikov Date: Tue, 19 Sep 2017 18:18:28 +0300 Subject: [PATCH] added network connection observable --- .../ru/touchin/templates/DeviceUtils.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/main/java/ru/touchin/templates/DeviceUtils.java b/src/main/java/ru/touchin/templates/DeviceUtils.java index 2bd5a48..07ae9dd 100644 --- a/src/main/java/ru/touchin/templates/DeviceUtils.java +++ b/src/main/java/ru/touchin/templates/DeviceUtils.java @@ -19,7 +19,9 @@ package ru.touchin.templates; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.ConnectivityManager; @@ -27,13 +29,16 @@ import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.provider.Settings; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.telephony.TelephonyManager; import android.text.TextUtils; import java.io.UnsupportedEncodingException; import java.util.UUID; +import java.util.concurrent.TimeUnit; import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; import ru.touchin.roboswag.core.log.Lc; import ru.touchin.roboswag.core.observables.RxAndroidUtils; @@ -171,6 +176,42 @@ public final class DeviceUtils { .distinctUntilChanged(); } + /** + * Returns observable to observe is device connected to the internet. + * + * @param context Context to register BroadcastReceiver to check connection to the internet; + * @return Observable of internet connection status. + */ + @NonNull + public static Observable observeIsNetworkConnected(@NonNull final Context context) { + return Observable.switchOnNext(Observable.fromCallable(() -> { + final NetworkStateReceiver networkStateReceiver = new NetworkStateReceiver(); + return Observable + .create(subscriber -> { + subscriber.onNext(isNetworkConnected(context)); + networkStateReceiver.setEmitter(subscriber); + context.registerReceiver(networkStateReceiver, NetworkStateReceiver.INTENT_FILTER); + }) + .doOnDispose(() -> context.unregisterReceiver(networkStateReceiver)) + .onErrorReturnItem(false) + .distinctUntilChanged(); + })); + } + + /** + * Create an Observable that depends on network connection + * + * @param processObservable - Observable to which we subscribe in the availability of the Internet + */ + @NonNull + public static Observable createNetworkDependentObservable(@NonNull final Context context, @NonNull final Observable processObservable) { + return DeviceUtils.observeIsNetworkConnected(context) + .debounce(100, TimeUnit.MILLISECONDS) + .switchMap(connected -> !connected + ? Observable.empty() + : processObservable); + } + private DeviceUtils() { } @@ -220,4 +261,27 @@ public final class DeviceUtils { } + private static class NetworkStateReceiver extends BroadcastReceiver { + + private static final IntentFilter INTENT_FILTER = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); + @Nullable + private ConnectivityManager connectivityManager; + + @Nullable + private ObservableEmitter emitter; + + public void setEmitter(@Nullable final ObservableEmitter emitter) { + this.emitter = emitter; + } + + public void onReceive(@NonNull final Context context, @NonNull final Intent intent) { + if (connectivityManager == null) { + connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + } + if (emitter != null) { + emitter.onNext(isNetworkConnected(context)); + } + } + } + } \ No newline at end of file