package mil.nga.giat.asam.connectivity; import java.util.Collection; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; public class NetworkChangeReceiver extends BroadcastReceiver { public interface ConnectivityEventListener { public void onAllDisconnected(); public void onAnyConnected(); } /** * Singleton. */ private static NetworkChangeReceiver mNetworkChangeReceiver; /** * Do not use! */ public NetworkChangeReceiver() { } public static NetworkChangeReceiver getInstance() { if (mNetworkChangeReceiver == null) { mNetworkChangeReceiver = new NetworkChangeReceiver(); } return mNetworkChangeReceiver; } private static final int sleepDelay = 10; // in seconds private static final String LOG_NAME = NetworkChangeReceiver.class.getName(); private static Collection<ConnectivityEventListener> listeners = new CopyOnWriteArrayList<ConnectivityEventListener>(); private static ScheduledExecutorService connectionFutureWorker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture<?> connectionDataFuture = null; private static Boolean oldConnectionAvailabilityState = null; @Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); final NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); final boolean newConnectionAvailabilityState = wifi.isConnected() || mobile.isConnected(); // set the old state if it's the first time through! if (oldConnectionAvailabilityState == null) { oldConnectionAvailabilityState = !newConnectionAvailabilityState; } // was there a change in general connectivity? if (oldConnectionAvailabilityState ^ newConnectionAvailabilityState) { // is mobile data now on? if (newConnectionAvailabilityState) { Runnable task = new Runnable() { public void run() { Log.d(LOG_NAME, "CONNECTIVITY IS ON"); for (ConnectivityEventListener listener : listeners) { listener.onAnyConnected(); } } }; connectionDataFuture = connectionFutureWorker.schedule(task, sleepDelay, TimeUnit.SECONDS); } else { if (connectionDataFuture != null) { connectionDataFuture.cancel(false); connectionDataFuture = null; } Log.d(LOG_NAME, "CONNECTIVITY IS OFF"); for (ConnectivityEventListener listener : listeners) { listener.onAllDisconnected(); } } } // set the old states! oldConnectionAvailabilityState = newConnectionAvailabilityState; } public boolean addListener(ConnectivityEventListener listener) { return listeners.add(listener); } public boolean removeListener(ConnectivityEventListener listener) { return listeners.remove(listener); } }