package uk.co.imallan.tuchongdaily.service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import java.util.LinkedList;
import java.util.List;
/**
* Services receiver handles the communication between the services and the activities.
*/
public class ServiceReceiver extends ResultReceiver {
public static final int STATUS_RUNNING = 101;
public static final int STATUS_FINISHED = 102;
public static final int STATUS_ERROR = 103;
public static final int STATUS_DATA = 104;
public static final String EXTRA_DATA = "EXTRA_DATA";
public static final String EXTRA_ERROR_MESSAGE = "ERROR_MESSAGE";
public static final String EXTRA_RECEIVER = "EXTRA_RECEIVER";
public static final String EXTRA_ORIGINAL_INTENT = "EXTRA_ORIGINAL_INTENT";
public static final String EXTRA_ERROR_EXCEPTION_NAME = "EXTRA_ERROR_EXCEPTION_NAME";
public static final String EXTRA_ERROR_CODE = "EXTRA_ERROR_CODE";
private final List<StoreResult> storedResults;
private Receiver receiver;
public ServiceReceiver(Handler handler) {
super(handler);
storedResults = new LinkedList<StoreResult>();
}
public static void addServiceReceiver(Intent intent, ServiceReceiver receiver) {
if (receiver != null)
intent.putExtra(ServiceReceiver.EXTRA_RECEIVER, receiver);
}
public void setReceiver(Receiver receiver) {
this.receiver = receiver;
// send the stored results of previous executions
while (this.receiver != null && !storedResults.isEmpty()) {
//noinspection SynchronizeOnNonFinalField
synchronized (this.receiver) {
StoreResult result = storedResults.remove(0);
Intent originalIntent = result.resultData.getParcelable(EXTRA_ORIGINAL_INTENT);
//noinspection ConstantConditions
Bundle originalData = originalIntent.getExtras();
this.receiver.onReceiveResult(result.getResultCode(), result.getResultData(), originalIntent, originalData);
}
}
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (receiver != null) {
Intent originalIntent = resultData.getParcelable(EXTRA_ORIGINAL_INTENT);
//noinspection ConstantConditions
Bundle originalData = originalIntent.getExtras();
receiver.onReceiveResult(resultCode, resultData, originalIntent, originalData);
} else {
// stores the results
storedResults.add(new StoreResult(resultCode, resultData));
}
}
/**
* Common interface to receive a result from a service.
*/
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData, Intent originalIntent, Bundle originalBundle);
}
class StoreResult {
private final int resultCode;
private final Bundle resultData;
protected StoreResult(int resultCode, Bundle resultData) {
this.resultCode = resultCode;
this.resultData = resultData;
}
public int getResultCode() {
return resultCode;
}
public Bundle getResultData() {
return resultData;
}
}
}