package com.f2prateek.rx.receivers.wifi; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.NetworkInfo; import android.net.wifi.SupplicantState; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import com.f2prateek.rx.receivers.RxBroadcastReceiver; import com.f2prateek.rx.receivers.internal.Preconditions; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; import static android.net.wifi.WifiManager.EXTRA_WIFI_STATE; import static com.f2prateek.rx.receivers.internal.Preconditions.checkNotNull; public final class RxWifiManager { private RxWifiManager() { throw new AssertionError("no instances"); } /** TODO: docs. */ @CheckResult @NonNull // public static Observable<Integer> wifiStateChanges(@NonNull final Context context) { checkNotNull(context, "context == null"); IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); return RxBroadcastReceiver.create(context, filter).map(new Func1<Intent, Integer>() { @Override public Integer call(Intent intent) { return intent.getIntExtra(EXTRA_WIFI_STATE, -1); } }); } /** TODO: docs. */ @CheckResult @NonNull // public static Action1<? super Boolean> wifiState(@NonNull final WifiManager wifiManager) { checkNotNull(wifiManager, "wifiManager == null"); return new Action1<Boolean>() { @Override public void call(Boolean enabled) { //noinspection MissingPermission wifiManager.setWifiEnabled(enabled); } }; } /** TODO: docs. */ @CheckResult @NonNull // public static Observable<NetworkStateChangedEvent> // networkStateChanges(@NonNull final Context context) { checkNotNull(context, "context == null"); IntentFilter filter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); return RxBroadcastReceiver.create(context, filter) .map(new Func1<Intent, NetworkStateChangedEvent>() { @Override public NetworkStateChangedEvent call(Intent intent) { NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); String bssid = intent.getStringExtra(WifiManager.EXTRA_BSSID); WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); return NetworkStateChangedEvent.create(networkInfo, bssid, wifiInfo); } }); } /** TODO: docs. */ @CheckResult @NonNull // public static Observable<Boolean> // supplicantConnectionChanges(@NonNull final Context context) { checkNotNull(context, "context == null"); IntentFilter filter = new IntentFilter(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); return RxBroadcastReceiver.create(context, filter).map(new Func1<Intent, Boolean>() { @Override public Boolean call(Intent intent) { return intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false); } }); } /** TODO: docs. */ @CheckResult @NonNull // public static Observable<SupplicantStateChangedEvent> // supplicantStateChanges(@NonNull final Context context) { checkNotNull(context, "context == null"); IntentFilter filter = new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); return RxBroadcastReceiver.create(context, filter) .map(new Func1<Intent, SupplicantStateChangedEvent>() { @Override public SupplicantStateChangedEvent call(Intent intent) { SupplicantState newState = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); int error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0); return SupplicantStateChangedEvent.create(newState, error); } }); } }