package com.openxc.sources;
import android.os.RemoteException;
import android.util.Log;
import com.google.common.base.MoreObjects;
import com.openxc.messages.VehicleMessage;
import com.openxc.remote.VehicleServiceInterface;
import com.openxc.remote.VehicleServiceListener;
/**
* Pass messages from a VehicleService to an in-process callback.
*
* This source is a bit of a special case - it's used by the
* {@link com.openxc.VehicleManager} to inject message updates from a
* {@link com.openxc.remote.VehicleService} into an in-process data
* pipeline. By using the same workflow as on the remote process side, we can
* share code between remote and in-process data sources and sinks. This makes
* adding new sources and sinks possible for end users, since the
* VehicleService doesn't need to have every possible implementation.
*/
public class RemoteListenerSource extends BaseVehicleDataSource {
private final static String TAG = "RemoteListenerSource";
private VehicleServiceInterface mService;
/**
* Registers a message listener with the remote service.
*/
public RemoteListenerSource(VehicleServiceInterface service) {
mService = service;
if(mService != null) {
try {
mService.register(mRemoteListener);
} catch(RemoteException e) {
Log.w(TAG, "Unable to register to receive " +
"message callbacks", e);
}
} else {
Log.w(TAG, "Remote vehicle service is unexpectedly null");
}
}
@Override
public void stop() {
super.stop();
try {
mService.unregister(mRemoteListener);
} catch(RemoteException e) {
Log.w(TAG, "Unable to register to receive " +
"message callbacks", e);
}
}
@Override
public boolean isConnected() {
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this).toString();
}
private VehicleServiceListener mRemoteListener =
new VehicleServiceListener.Stub() {
@Override
public void receive(VehicleMessage message) {
handleMessage(message);
}
};
}