Last active
December 30, 2015 18:19
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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