package com.gettingmobile.goodnews.sync; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.util.Log; public final class NetworkConnectionStateChangeReceiver extends BroadcastReceiver { private static final String LOG_TAG = "goodnews.NetworkConnectionStateChangeReceiver"; @Override public void onReceive(Context context, Intent intent) { if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { onConnectivityStateChanged(context); } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) { onWifiStateChanged(context, intent); } } private void onConnectivityStateChanged(Context context) { /* * schedule syncs if network is available */ final ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo ni = cm.getActiveNetworkInfo(); if (ni != null && ni.isConnected()) { Log.i(LOG_TAG, "network connection is available"); scheduleSyncsIfApplicable(context); } } private void onWifiStateChanged(Context context, Intent intent) { try { final NetworkInfo ni = (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (ni != null && ni.isConnected()) { Log.i(LOG_TAG, "wifi connection is available"); scheduleSyncsIfApplicable(context); } } catch (RuntimeException error) { /* * I've had cases where intent.getParcelableExtra() failed with a * "ClassNotFoundException when unmarshalling" */ Log.e(LOG_TAG, "Failed to retrieve NetworkInfo", error); } } private void scheduleSyncsIfApplicable(Context context) { context.startService(SyncService.createStartIntent(context, SyncService.ACTION_SCHEDULE_SYNCS)); } }