package triaina.commons.workerservice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.ResultReceiver;
import android.util.Log;
public class NetworkWorkerService extends WorkerService {
private static final String TAG = NetworkWorkerService.class.getSimpleName();
private boolean mIsConnected;
private BroadcastReceiver mNetworkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean lastConnected = mIsConnected;
updateNetworkConnectionStatus();
Log.v(TAG, "network status changed: " + lastConnected + " -> " + mIsConnected);
if (lastConnected != mIsConnected) {
NetworkWorker<?> worker = (NetworkWorker<?>)getCurrentWorker();
if (worker != null) {
worker.onNetworkStatusChanged(mIsConnected);
}
}
}
};
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public boolean onHandleIntent(Intent intent, int retry, int delayAmount) {
Job job = getJob(intent);
NetworkWorker worker;
try {
worker = (NetworkWorker)getWorker(job);
} catch (Exception exp) {
Log.e(TAG, exp.getMessage() + "", exp);
return true;
}
try {
setCurrentWorker(worker);
worker.onNetworkStatusChanged(mIsConnected);
return worker.process(job, retry, delayAmount, (ResultReceiver)intent.getParcelableExtra(EXTRA_RECEIVER), this, getHandler());
} catch (Exception exp) {
Log.e(TAG, exp.getMessage() + "", exp);
return true;
} finally {
setCurrentWorker(null);
}
}
@Override
public void onCreate() {
super.onCreate();
setupNetworkStatusReceiver();
}
@Override
public void onDestroy() {
teardownNetworkStatusReceiver();
super.onDestroy();
}
public static void invoke(Context context, Job job) {
invoke(NetworkWorkerService.class, context, job, null);
}
public static void invoke(Context context, Job job, ResultReceiver receiver) {
invoke(NetworkWorkerService.class, context, job, receiver);
}
public static void buildIntent(Intent intent, Context context, Job job, ResultReceiver receiver) {
buildIntent(NetworkWorkerService.class, intent, context, job, receiver);
}
private void setupNetworkStatusReceiver() {
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
updateNetworkConnectionStatus();
}
private void teardownNetworkStatusReceiver() {
unregisterReceiver(mNetworkStateReceiver);
}
private void updateNetworkConnectionStatus() {
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null) {
mIsConnected = info.isConnected();
} else {
mIsConnected = false;
}
}
}