package co.smartreceipts.android.sync.network;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.annotation.NonNull;
import com.google.common.base.Preconditions;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import co.smartreceipts.android.utils.log.Logger;
abstract class AbstractNetworkProvider implements NetworkProvider {
private final Context mContext;
private final List<String> mConnectionChangeIntentActions;
private final ConnectivityChangeBroadcastReceiver mConnectionChangeReceiver;
private final NetworkStateChangeListenerTracker mNetworkStateChangeListenerTracker = new NetworkStateChangeListenerTracker();
private final AtomicBoolean mIsConnected = new AtomicBoolean(false);
public AbstractNetworkProvider(@NonNull Context context, @NonNull String... connectionChangeIntentAction) {
mContext = Preconditions.checkNotNull(context.getApplicationContext());
mConnectionChangeIntentActions = Arrays.asList(Preconditions.checkNotNull(connectionChangeIntentAction));
mConnectionChangeReceiver = new ConnectivityChangeBroadcastReceiver();
}
@Override
public final synchronized void initialize() {
mIsConnected.set(isNetworkAvailable());
final IntentFilter intentFilter = new IntentFilter();
for (final String connectionChangeIntentAction : mConnectionChangeIntentActions) {
intentFilter.addAction(connectionChangeIntentAction);
}
mContext.registerReceiver(mConnectionChangeReceiver, new IntentFilter(intentFilter));
}
@Override
public final synchronized void deinitialize() {
mContext.unregisterReceiver(mConnectionChangeReceiver);
mIsConnected.set(false);
mNetworkStateChangeListenerTracker.clear();
}
@Override
public final synchronized void registerListener(@NonNull NetworkStateChangeListener listener) {
mNetworkStateChangeListenerTracker.registerListener(listener);
}
@Override
public final synchronized void unregisterListener(@NonNull NetworkStateChangeListener listener) {
mNetworkStateChangeListenerTracker.unregisterListener(listener);
}
final class ConnectivityChangeBroadcastReceiver extends BroadcastReceiver {
@Override
public synchronized void onReceive(Context context, Intent intent) {
if (mConnectionChangeIntentActions.contains(intent.getAction())) {
final boolean hasConnection = isNetworkAvailable();
if (mIsConnected.compareAndSet(!hasConnection, hasConnection)) {
Logger.debug(this, "Network connection changed: " + hasConnection);
if (hasConnection) {
mNetworkStateChangeListenerTracker.notifyNetworkConnectivityGained();
} else {
mNetworkStateChangeListenerTracker.notifyNetworkConnectivityLost();
}
}
}
}
}
}