package com.jdroid.android.service;
import android.content.Intent;
import android.os.Bundle;
import com.google.android.gms.gcm.GcmNetworkManager;
import com.google.android.gms.gcm.Task;
import com.jdroid.android.application.AbstractApplication;
import com.jdroid.java.exception.ConnectionException;
import com.jdroid.java.utils.LoggerUtils;
import com.jdroid.java.utils.ReflectionUtils;
import org.slf4j.Logger;
public class CommandWorkerService extends WorkerService {
private final static Logger LOGGER = LoggerUtils.getLogger(CommandWorkerService.class);
final static String COMMAND_EXTRA = "com.jdroid.android.service.CommandWorkerService.command";
protected static void runService(Bundle bundle, ServiceCommand serviceCommand, Boolean requiresInstantExecution) {
if (requiresInstantExecution) {
startWorkerService(bundle, serviceCommand);
} else {
startGcmTaskService(bundle, serviceCommand);
}
}
@Override
protected String getTrackingLabel(Intent intent) {
String serviceCommandExtra = intent.getStringExtra(COMMAND_EXTRA);
return serviceCommandExtra == null ? getTrackingVariable(intent) : serviceCommandExtra.substring(serviceCommandExtra.lastIndexOf(".") + 1);
}
@Override
protected void doExecute(Intent intent) {
String serviceCommandExtra = intent.getStringExtra(COMMAND_EXTRA);
if (serviceCommandExtra != null) {
ServiceCommand serviceCommand = ReflectionUtils.newInstance(serviceCommandExtra);
int result;
try {
result = serviceCommand.execute(intent.getExtras());
LOGGER.info(serviceCommand.getClass().getSimpleName() + " executed with result " + result);
} catch (ConnectionException e) {
AbstractApplication.get().getExceptionHandler().logHandledException(e);
result = GcmNetworkManager.RESULT_RESCHEDULE;
} catch (Exception e) {
AbstractApplication.get().getExceptionHandler().logHandledException(e);
result = GcmNetworkManager.RESULT_FAILURE;
}
if (result == GcmNetworkManager.RESULT_RESCHEDULE) {
startGcmTaskService(intent.getExtras(), serviceCommand);
}
} else {
AbstractApplication.get().getExceptionHandler().logWarningException("Service command not found on " + getClass().getSimpleName());
}
}
private static void startWorkerService(Bundle bundle, ServiceCommand serviceCommand) {
LOGGER.info("Scheduling Worker Service for " + serviceCommand.getClass().getSimpleName());
Intent intent = new Intent();
if (bundle != null) {
intent.putExtras(bundle);
}
intent.putExtra(CommandWorkerService.COMMAND_EXTRA, serviceCommand.getClass().getName());
WorkerService.runIntentInService(AbstractApplication.get(), intent, CommandWorkerService.class);
}
private static void startGcmTaskService(Bundle bundle, ServiceCommand serviceCommand) {
LOGGER.info("Scheduling GCM Task Service for " + serviceCommand.getClass().getSimpleName());
bundle.putSerializable(CommandWorkerService.COMMAND_EXTRA, serviceCommand.getClass().getName());
Task.Builder builder = serviceCommand.createRetryTaskBuilder();
builder.setExtras(bundle);
builder.setService(CommandGcmTaskService.class);
GcmNetworkManager.getInstance(AbstractApplication.get()).schedule(builder.build());
}
}