package edu.mit.media.funf.probe.builtin;
import java.util.ArrayList;
import java.util.Collection;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import edu.mit.media.funf.Utils;
import edu.mit.media.funf.probe.DefaultProbeScheduler;
import edu.mit.media.funf.probe.Probe;
import edu.mit.media.funf.probe.ProbeCommandServiceConnection;
import edu.mit.media.funf.probe.ProbeScheduler;
public class DelegateProbeScheduler implements ProbeScheduler {
private Class<? extends Probe> delegateProbeClass;
private PendingIntent callback;
public DelegateProbeScheduler(Class<? extends Probe> delegateProbeClass) {
this(delegateProbeClass, null);
}
public DelegateProbeScheduler(Class<? extends Probe> delegateProbeClass, PendingIntent callback) {
this.delegateProbeClass = delegateProbeClass;
this.callback = callback;
}
@Override
public Long scheduleNextRun(Probe probe, Collection<Intent> requests) {
PendingIntent theCallback = callback;
if (theCallback == null) {
Intent callbackIntent = new Intent(probe, probe.getClass());
theCallback = PendingIntent.getService(probe, 0, callbackIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
Intent delegateRequest = new Intent(Probe.ACTION_REQUEST, null, probe, delegateProbeClass);
delegateRequest.putExtra(Probe.CALLBACK_KEY, theCallback);
ArrayList<Bundle> dataRequests = new ArrayList<Bundle>();
for (Intent request : requests) {
ArrayList<Bundle> individualDataRequests = Utils.getArrayList(request.getExtras(), Probe.REQUESTS_KEY);
ArrayList<Bundle> individualDataRequestsWithDefaults = new ArrayList<Bundle>();
for (Bundle individualDataRequest : individualDataRequests) {
Bundle individualDataRequestWithDefaults = DefaultProbeScheduler.getCompleteParams(probe, individualDataRequest);
individualDataRequestsWithDefaults.add(individualDataRequestWithDefaults);
}
dataRequests.addAll(individualDataRequestsWithDefaults);
}
Log.d("TEST_TEST_TEST", "Requests from " + probe.getClass().getName() + " to " + delegateProbeClass.getName() + ": " + dataRequests);
delegateRequest.putExtra(Probe.REQUESTS_KEY, dataRequests);
probe.startService(delegateRequest);
// Figure out the next run time of the delegate probe
// TODO: may want to remove this and return an estimate value, then wait for a status update from the delegate probe
final long[] nextRunTime = new long[] { 0L };
/*
ProbeCommandServiceConnection delegateProbe = new ProbeCommandServiceConnection(probe, delegateProbeClass) {
@Override
public void runCommand() {
nextRunTime[0] = getProbe().getNextRunTime();
}
};
try {
delegateProbe.join();
} catch (InterruptedException e) {
}*/
return nextRunTime[0];
}
@Override
public Bundle startRunningNow(Probe probe, Collection<Intent> requests) {
return null; // Never run directly, always run based off of other data
}
@Override
public boolean shouldBeEnabled(Probe probe, Collection<Intent> requests) {
return true; // Only the delegate needs to be enabled
}
}