package com.openxc.enabler.preferences;
import android.content.Context;
import android.util.Log;
import com.openxc.remote.VehicleServiceException;
import com.openxc.sources.DataSourceException;
import com.openxc.sources.trace.TraceVehicleDataSource;
import com.openxcplatform.enabler.R;
/**
* Enable or disable receiving vehicle data from a pre-recorded trace file.
*/
public class TraceSourcePreferenceManager extends VehiclePreferenceManager {
private final static String TAG = "TraceSourcePreferenceManager";
private TraceVehicleDataSource mTraceSource;
public TraceSourcePreferenceManager(Context context) {
super(context);
}
public void close() {
super.close();
stopTrace();
}
protected PreferenceListener createPreferenceListener() {
return new PreferenceListener() {
private int[] WATCHED_PREFERENCE_KEY_IDS = {
R.string.vehicle_interface_key,
R.string.trace_source_file_key,
};
protected int[] getWatchedPreferenceKeyIds() {
return WATCHED_PREFERENCE_KEY_IDS;
}
public void readStoredPreferences() {
setTraceSourceStatus(getPreferences().getString(
getString(R.string.vehicle_interface_key), "").equals(
getString(R.string.trace_interface_option_value)));
}
};
}
private synchronized void setTraceSourceStatus(boolean enabled) {
Log.i(TAG, "Setting trace data source to " + enabled);
if(enabled) {
try {
getVehicleManager().setVehicleInterface(null);
} catch(VehicleServiceException e) {
Log.e(TAG, "Unable to remove existing vehicle interface");
}
String traceFile = getPreferenceString(
R.string.trace_source_file_key);
if(traceFile != null ) {
if(mTraceSource == null ||
!mTraceSource.sameFilename(traceFile)) {
stopTrace();
try {
mTraceSource = new TraceVehicleDataSource(
getContext(), traceFile);
} catch(DataSourceException e) {
Log.w(TAG, "Unable to add Trace source", e);
return;
}
getVehicleManager().addSource(mTraceSource);
} else {
Log.d(TAG, "Trace file + " + traceFile + " already playing");
}
} else {
Log.d(TAG, "No trace file set yet (" + traceFile +
"), not starting playback");
}
} else {
stopTrace();
}
}
private synchronized void stopTrace() {
if(getVehicleManager() != null && mTraceSource != null){
getVehicleManager().removeSource(mTraceSource);
mTraceSource = null;
}
}
}