summaryrefslogtreecommitdiff
path: root/android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java
diff options
context:
space:
mode:
Diffstat (limited to 'android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java')
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java103
1 files changed, 95 insertions, 8 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java
index 23cdd9857..41ada091d 100644
--- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/utl/SdlDeviceListener.java
@@ -42,13 +42,22 @@ import android.os.Message;
import androidx.annotation.NonNull;
+import com.smartdevicelink.protocol.SdlPacket;
+import com.smartdevicelink.protocol.SdlPacketFactory;
+import com.smartdevicelink.protocol.enums.ControlFrameTags;
+import com.smartdevicelink.protocol.enums.SessionType;
+import com.smartdevicelink.proxy.rpc.VehicleType;
import com.smartdevicelink.transport.MultiplexBaseTransport;
import com.smartdevicelink.transport.MultiplexBluetoothTransport;
import com.smartdevicelink.transport.SdlRouterService;
+import com.smartdevicelink.util.AndroidTools;
+import com.smartdevicelink.util.BitConverter;
import com.smartdevicelink.util.DebugTool;
import com.smartdevicelink.util.SdlAppInfo;
+import com.smartdevicelink.util.Version;
import java.lang.ref.WeakReference;
+import java.util.Hashtable;
import java.util.List;
@@ -59,6 +68,9 @@ public class SdlDeviceListener {
private static final String SDL_DEVICE_STATUS_SHARED_PREFS = "sdl.device.status";
private static final Object LOCK = new Object(), RUNNING_LOCK = new Object();
+ // If increasing MAX PROTOCOL VERSION major version, make sure to alter it in SdlProtocolBase
+ private static final Version MAX_PROTOCOL_VERSION = new Version(5, 4, 0);
+
private final WeakReference<Context> contextWeakReference;
private final Callback callback;
private BluetoothDevice connectedDevice;
@@ -152,16 +164,10 @@ public class SdlDeviceListener {
case SdlRouterService.MESSAGE_STATE_CHANGE:
switch (msg.arg1) {
case MultiplexBaseTransport.STATE_CONNECTED:
- if(sdlListener.connectedDevice == null) {
+ if (sdlListener.connectedDevice == null) {
sdlListener.connectedDevice = sdlListener.bluetoothTransport.getConnectedDevice();
}
- sdlListener.setSDLConnectedStatus(sdlListener.contextWeakReference.get(), sdlListener.connectedDevice.getAddress(), true);
- boolean keepConnectionOpen = sdlListener.callback.onTransportConnected(sdlListener.contextWeakReference.get(), sdlListener.connectedDevice);
- if (!keepConnectionOpen) {
- sdlListener.bluetoothTransport.stop();
- sdlListener.bluetoothTransport = null;
- sdlListener.timeoutHandler.removeCallbacks(sdlListener.timeoutRunner);
- }
+ sendStartService();
break;
case MultiplexBaseTransport.STATE_NONE:
// We've just lost the connection
@@ -174,9 +180,90 @@ public class SdlDeviceListener {
break;
case com.smartdevicelink.transport.SdlRouterService.MESSAGE_READ:
+ onPacketRead((SdlPacket) msg.obj);
break;
}
}
+
+ /**
+ * This method will start the RPC service so that we can retrieve vehicle info
+ */
+ public void sendStartService() {
+ SdlDeviceListener sdlListener = this.provider.get();
+ SdlPacket serviceProbe = SdlPacketFactory.createStartSession(SessionType.RPC, 0x00, (byte)0x01, (byte)0x00, false);
+ serviceProbe.putTag(ControlFrameTags.RPC.StartService.PROTOCOL_VERSION, MAX_PROTOCOL_VERSION.toString());
+ byte[] constructed = serviceProbe.constructPacket();
+ if (sdlListener.bluetoothTransport != null && sdlListener.bluetoothTransport.getState() == MultiplexBluetoothTransport.STATE_CONNECTED) {
+ sdlListener.bluetoothTransport.write(constructed, 0, constructed.length);
+ } else {
+ sdlListener.callback.onTransportError(sdlListener.connectedDevice);
+ }
+ }
+
+ /**
+ * This method will pull vehicle data out of a StartServiceACK and then end the RPC session
+ *
+ * @param packet - info received from connected module
+ */
+ public void onPacketRead(SdlPacket packet) {
+ SdlDeviceListener sdlListener = this.provider.get();
+ VehicleType vehicleType = null;
+ if (packet.getFrameInfo() == SdlPacket.FRAME_INFO_START_SERVICE_ACK) {
+ int hashID;
+ if (packet.getVersion() >= 5) {
+ vehicleType = getVehicleType(packet);
+ hashID = (Integer) packet.getTag(ControlFrameTags.RPC.StartServiceACK.HASH_ID);
+ } else {
+ hashID = BitConverter.intFromByteArray(packet.getPayload(), 0);
+ }
+ byte[] stopService = SdlPacketFactory.createEndSession(SessionType.RPC, (byte)packet.getSessionId(), 0, (byte)packet.getVersion(), hashID).constructPacket();
+ if (sdlListener.bluetoothTransport != null && sdlListener.bluetoothTransport.getState() == MultiplexBluetoothTransport.STATE_CONNECTED) {
+ sdlListener.bluetoothTransport.write(stopService, 0, stopService.length);
+ }
+ notifyConnection(vehicleType);
+ }
+ }
+
+ /**
+ * Retrieves vehicle type from the StartServiceACK
+ *
+ * @param packet - info received from connected module
+ * @return vehicle type of connected module
+ */
+ private VehicleType getVehicleType(SdlPacket packet) {
+ String make = (String) packet.getTag(ControlFrameTags.RPC.StartServiceACK.MAKE);
+ String model = (String) packet.getTag(ControlFrameTags.RPC.StartServiceACK.MODEL);
+ String modelYear = (String) packet.getTag(ControlFrameTags.RPC.StartServiceACK.MODEL_YEAR);
+ String vehicleTrim = (String) packet.getTag(ControlFrameTags.RPC.StartServiceACK.TRIM);
+ if (make != null) {
+ // checking if tags have come from core
+ VehicleType type = new VehicleType();
+ type.setMake(make);
+ type.setModel(model);
+ type.setModelYear(modelYear);
+ type.setTrim(vehicleTrim);
+ return type;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Notify connection about vehicle type.
+ *
+ * @param vehicleType the information about the type of vehicle
+ */
+ public void notifyConnection(VehicleType vehicleType) {
+ SdlDeviceListener sdlListener = this.provider.get();
+ sdlListener.setSDLConnectedStatus(sdlListener.contextWeakReference.get(), sdlListener.connectedDevice.getAddress(), true);
+ AndroidTools.saveVehicleType(sdlListener.contextWeakReference.get(), vehicleType, sdlListener.connectedDevice.getAddress());
+ boolean keepConnectionOpen = sdlListener.callback.onTransportConnected(sdlListener.contextWeakReference.get(), sdlListener.connectedDevice);
+ if (!keepConnectionOpen) {
+ sdlListener.bluetoothTransport.stop();
+ sdlListener.bluetoothTransport = null;
+ sdlListener.timeoutHandler.removeCallbacks(sdlListener.timeoutRunner);
+ }
+ }
}