| package org.wordpress.android.networking; |
| |
| import android.content.BroadcastReceiver; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| |
| import org.wordpress.android.util.AppLog; |
| import org.wordpress.android.util.AppLog.T; |
| import org.wordpress.android.util.NetworkUtils; |
| |
| import de.greenrobot.event.EventBus; |
| |
| /* |
| * global network connection change receiver - declared in the manifest to monitor |
| * android.net.conn.CONNECTIVITY_CHANGE |
| */ |
| public class ConnectionChangeReceiver extends BroadcastReceiver { |
| private static boolean mIsFirstReceive = true; |
| private static boolean mWasConnected = true; |
| private static boolean mIsEnabled = false; // this value must be synchronized with the ConnectionChangeReceiver |
| // state in our AndroidManifest |
| |
| public static class ConnectionChangeEvent { |
| private final boolean mIsConnected; |
| public ConnectionChangeEvent(boolean isConnected) { |
| mIsConnected = isConnected; |
| } |
| public boolean isConnected() { |
| return mIsConnected; |
| } |
| } |
| |
| /* |
| * note that onReceive occurs when anything about the connection has changed, not just |
| * when the connection has been lost or restated, so it can happen quite often when the |
| * user is on the move. for this reason we only fire the event the first time onReceive |
| * is called, and afterwards only when we know connection availability has changed |
| */ |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| boolean isConnected = NetworkUtils.isNetworkAvailable(context); |
| if (mIsFirstReceive || isConnected != mWasConnected) { |
| postConnectionChangeEvent(isConnected); |
| } |
| } |
| |
| private static void postConnectionChangeEvent(boolean isConnected) { |
| AppLog.i(T.UTILS, "Connection status changed, isConnected=" + isConnected); |
| mWasConnected = isConnected; |
| mIsFirstReceive = false; |
| EventBus.getDefault().post(new ConnectionChangeEvent(isConnected)); |
| } |
| |
| public static void setEnabled(Context context, boolean enabled) { |
| if (mIsEnabled == enabled) { |
| return; |
| } |
| mIsEnabled = enabled; |
| AppLog.i(T.UTILS, "ConnectionChangeReceiver.setEnabled " + enabled); |
| int flag = (enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : |
| PackageManager.COMPONENT_ENABLED_STATE_DISABLED); |
| ComponentName component = new ComponentName(context, ConnectionChangeReceiver.class); |
| context.getPackageManager().setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP); |
| if (mIsEnabled) { |
| postConnectionChangeEvent(NetworkUtils.isNetworkAvailable(context)); |
| } |
| } |
| } |