package co.smartreceipts.android.sync.network;
import android.content.Context;
import android.support.annotation.NonNull;
import com.google.common.base.Preconditions;
import javax.inject.Inject;
import co.smartreceipts.android.di.scopes.ApplicationScope;
import co.smartreceipts.android.settings.UserPreferenceManager;
import co.smartreceipts.android.settings.catalog.UserPreference;
import co.smartreceipts.android.utils.log.Logger;
@ApplicationScope
public class NetworkManager extends CompositeNetworkProviderImpl {
private final NetworkProviderFactory mNetworkProviderFactory;
private final UserPreferenceManager mPreferences;
@Inject
public NetworkManager(Context context, UserPreferenceManager preferences) {
this(new NetworkProviderFactory(context), preferences);
}
private NetworkManager(@NonNull NetworkProviderFactory networkProviderFactory, @NonNull UserPreferenceManager preferences) {
super(networkProviderFactory.get(preferences.get(UserPreference.Misc.AutoBackupOnWifiOnly) ? SupportedNetworkType.WifiOnly : SupportedNetworkType.AllNetworks));
mNetworkProviderFactory = Preconditions.checkNotNull(networkProviderFactory);
mPreferences = Preconditions.checkNotNull(preferences);
initialize();
}
public synchronized void setAndInitializeNetworkProviderType(@NonNull SupportedNetworkType supportedNetworkType) {
Logger.info(this, "Updating network provider type to: {}", supportedNetworkType);
final NetworkProvider newNetworkProvider = mNetworkProviderFactory.get(supportedNetworkType);
Logger.info(this, "De-initializing the old network type");
for (final NetworkProvider networkProvider : mNetworkProviders) {
networkProvider.deinitialize();
networkProvider.unregisterListener(this);
}
// Updating
Logger.info(this, "Updating network type references");
mNetworkProviders.clear();
mNetworkProviders.add(newNetworkProvider);
Logger.info(this, "Initializing the new provider");
for (final NetworkProvider networkProvider : mNetworkProviders) {
networkProvider.initialize();
networkProvider.registerListener(this);
}
checkForConnectionChange();
}
@NonNull
public synchronized SupportedNetworkType getSupportedNetworkType() {
return mPreferences.get(UserPreference.Misc.AutoBackupOnWifiOnly) ? SupportedNetworkType.WifiOnly : SupportedNetworkType.AllNetworks;
}
}