Skip to content

Instantly share code, notes, and snippets.

@bclymer
Last active December 30, 2015 18:19
Show Gist options
  • Save bclymer/7866891 to your computer and use it in GitHub Desktop.
Save bclymer/7866891 to your computer and use it in GitHub Desktop.
A utility class that removes the need to have a broadcast receiver listening for `ConnectivityManager.CONNECTIVITY_ACTION` in a number of different classes. Now just register with this class and get updated when the connectivity status changes.
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.util.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
/**
* Created by brian.clymer on 12/4/13.
*/
public class NetworkListenerUtility extends BroadcastReceiver {
private boolean mInternetConnection;
private NetworkType mNetworkType;
private ConnectivityManager mConnectivityManager;
private static class SingletonHolder {
public static final NetworkListenerUtility INSTANCE = new NetworkListenerUtility();
}
private NetworkListenerUtility() {
mListeners = new ArrayList<WeakReference<NetworkListener>>();
mConnectivityManager = (ConnectivityManager) MyApplication.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
// Some way to get a valid context to register a broadcast receiver
MyApplication.getContext().registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
private static NetworkListenerUtility getInstance() {
return SingletonHolder.INSTANCE;
}
private List<WeakReference<NetworkListener>> mListeners;
public static void addListener(final NetworkListener networkListener) {
Log.i("NetworkListenerUtility", "Adding new NetworkListener " + networkListener);
getInstance().mListeners.add(new WeakReference<NetworkListener>(networkListener));
networkListener.onInternetStatusChanged(getInstance().mInternetConnection, getInstance().getCurrentNetworkType());
}
public static void removeListener(final NetworkListener networkListener) {
List<WeakReference<NetworkListener>> toRemove = new ArrayList<WeakReference<NetworkListener>>();
for (WeakReference<NetworkListener> listenerWeakReference : getInstance().mListeners) {
if (listenerWeakReference.get() == networkListener) {
toRemove.add(listenerWeakReference);
}
}
getInstance().mListeners.remove(toRemove);
}
public static void requestUpdate(NetworkListener networkListener) {
networkListener.onInternetStatusChanged(getInstance().mInternetConnection, getInstance().mNetworkType);
}
@Override
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
boolean hasInternet = !intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
NetworkType networkType = getCurrentNetworkType();
if (hasInternet == mInternetConnection && networkType == mNetworkType) {
// Status didn't change, don't notify listeners.
return;
}
mInternetConnection = hasInternet;
mNetworkType = networkType;
List<WeakReference<NetworkListener>> toRemove = new ArrayList<WeakReference<NetworkListener>>();
for (WeakReference<NetworkListener> listenerWeakReference : mListeners) {
if (listenerWeakReference.get() == null) {
toRemove.add(listenerWeakReference);
} else {
listenerWeakReference.get().onInternetStatusChanged(mInternetConnection, mNetworkType);
}
}
mListeners.remove(toRemove);
}
}
private NetworkType getCurrentNetworkType() {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
NetworkInfo[] netInfo = mConnectivityManager.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI")) {
haveConnectedWifi = ni.isConnected();
}
if (ni.getTypeName().equalsIgnoreCase("MOBILE")) {
haveConnectedMobile = ni.isConnected();
}
}
if (haveConnectedWifi && haveConnectedMobile) {
return NetworkType.WIFI_AND_MOBILE;
} else if (haveConnectedWifi) {
return NetworkType.WIFI;
} else if (haveConnectedMobile) {
return NetworkType.MOBILE;
} else {
return NetworkType.NONE;
}
}
public interface NetworkListener {
public void onInternetStatusChanged(boolean hasInternetConnection, NetworkType networkType);
}
public enum NetworkType {
WIFI,
MOBILE,
WIFI_AND_MOBILE,
NONE;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment