summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBilal Alsharifi <bilal.alsharifi@gmail.com>2020-06-09 11:33:41 -0400
committerBilal Alsharifi <bilal.alsharifi@gmail.com>2020-06-09 11:33:41 -0400
commite6498f057b86c21310fd5e9d1ba2c593e31ef5a5 (patch)
tree0ef4855517765995facb84bf04fbab6f23879bc2
parent97ecbfab51b1e61788565dc328eaa039b6f6f857 (diff)
downloadsdl_android-e6498f057b86c21310fd5e9d1ba2c593e31ef5a5.tar.gz
Add cycle proxy logic to LCM
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java63
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/BaseSdlManager.java10
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java39
-rw-r--r--javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java14
4 files changed, 92 insertions, 34 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
index eb6ab2fd9..d29029aaf 100644
--- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
@@ -35,20 +35,27 @@ package com.smartdevicelink.managers.lifecycle;
import android.app.Service;
import android.content.Context;
import android.support.annotation.RestrictTo;
+import android.util.Log;
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.SdlConnection.SdlSession2;
+import com.smartdevicelink.exception.SdlException;
+import com.smartdevicelink.exception.SdlExceptionCause;
import com.smartdevicelink.protocol.enums.SessionType;
import com.smartdevicelink.proxy.interfaces.ISdlServiceListener;
+import com.smartdevicelink.proxy.rpc.enums.SdlDisconnectedReason;
import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
import com.smartdevicelink.security.SdlSecurityBase;
import com.smartdevicelink.streaming.video.VideoStreamingParameters;
import com.smartdevicelink.transport.BaseTransportConfig;
import com.smartdevicelink.transport.MultiplexTransportConfig;
import com.smartdevicelink.transport.TCPTransportConfig;
+import com.smartdevicelink.transport.USBTransportConfig;
import com.smartdevicelink.transport.enums.TransportType;
import com.smartdevicelink.util.DebugTool;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
@@ -77,13 +84,45 @@ public class LifecycleManager extends BaseLifecycleManager {
}
@Override
- void createSession(BaseTransportConfig config) {
- if (config != null && config.getTransportType().equals(TransportType.MULTIPLEX)) {
- this.session = new SdlSession2(sdlConnectionListener, (MultiplexTransportConfig) config);
- } else if (config != null && config.getTransportType().equals(TransportType.TCP)) {
- this.session = new SdlSession2(sdlConnectionListener, (TCPTransportConfig) config);
+ void initializeProxy() {
+ super.initializeProxy();
+
+ //Handle legacy USB connections
+ if (_transportConfig != null && TransportType.USB.equals(_transportConfig.getTransportType())) {
+ //A USB transport config was provided
+ USBTransportConfig usbTransportConfig = (USBTransportConfig) _transportConfig;
+ if (usbTransportConfig.getUsbAccessory() == null) {
+ DebugTool.logInfo("Legacy USB transport config was used, but received null for accessory. Attempting to connect with router service");
+ //The accessory was null which means it came from a router service
+ MultiplexTransportConfig multiplexTransportConfig = new MultiplexTransportConfig(usbTransportConfig.getUSBContext(), appConfig.getAppID());
+ multiplexTransportConfig.setRequiresHighBandwidth(true);
+ multiplexTransportConfig.setSecurityLevel(MultiplexTransportConfig.FLAG_MULTI_SECURITY_OFF);
+ multiplexTransportConfig.setPrimaryTransports(Collections.singletonList(TransportType.USB));
+ multiplexTransportConfig.setSecondaryTransports(new ArrayList<TransportType>());
+ _transportConfig = multiplexTransportConfig;
+ }
+ }
+
+ if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.MULTIPLEX)) {
+ this.session = new SdlSession2(sdlConnectionListener, (MultiplexTransportConfig) _transportConfig);
+ } else if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.TCP)) {
+ this.session = new SdlSession2(sdlConnectionListener, (TCPTransportConfig) _transportConfig);
} else {
- this.session = SdlSession.createSession((byte) getProtocolVersion().getMajor(), sdlConnectionListener, config);
+ this.session = SdlSession.createSession((byte) getProtocolVersion().getMajor(), sdlConnectionListener, _transportConfig);
+ }
+ }
+
+ private void cycleProxy(SdlDisconnectedReason disconnectedReason) {
+ cleanProxy();
+ initializeProxy();
+ if(!SdlDisconnectedReason.LEGACY_BLUETOOTH_MODE_ENABLED.equals(disconnectedReason) && !SdlDisconnectedReason.PRIMARY_TRANSPORT_CYCLE_REQUEST.equals(disconnectedReason)){
+ //We don't want to alert higher if we are just cycling for legacy bluetooth
+ onClose("Sdl Proxy Cycled", new SdlException("Sdl Proxy Cycled", SdlExceptionCause.SDL_PROXY_CYCLED));
+ }
+ try {
+ session.startSession();
+ } catch (SdlException e) {
+ e.printStackTrace();
}
}
@@ -114,6 +153,18 @@ public class LifecycleManager extends BaseLifecycleManager {
}
@Override
+ void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig){
+ super.onTransportDisconnected(info, availablePrimary, transportConfig);
+ if (availablePrimary) {
+ _transportConfig = transportConfig;
+ Log.d(TAG, "notifying RPC session ended, but potential primary transport available");
+ cycleProxy(SdlDisconnectedReason.PRIMARY_TRANSPORT_CYCLE_REQUEST);
+ } else {
+ onClose(info, null);
+ }
+ }
+
+ @Override
void onProtocolSessionStartedNACKed(SessionType sessionType) {
super.onProtocolSessionStartedNACKed(sessionType);
if (sessionType.eq(SessionType.NAV)) {
diff --git a/base/src/main/java/com/smartdevicelink/managers/BaseSdlManager.java b/base/src/main/java/com/smartdevicelink/managers/BaseSdlManager.java
index 0f96d7b1c..14e1eae49 100644
--- a/base/src/main/java/com/smartdevicelink/managers/BaseSdlManager.java
+++ b/base/src/main/java/com/smartdevicelink/managers/BaseSdlManager.java
@@ -120,17 +120,13 @@ abstract class BaseSdlManager {
// Initialize with anonymous lifecycleListener
final LifecycleManager.LifecycleListener lifecycleListener = new LifecycleManager.LifecycleListener() {
- boolean initStarted = false;
@Override
public void onProxyConnected(LifecycleManager lifeCycleManager) {
Log.i(TAG,"Proxy is connected. Now initializing.");
synchronized (this){
- if(!initStarted){
- changeRegistrationRetry = 0;
- checkLifecycleConfiguration();
- initialize();
- initStarted = true;
- }
+ changeRegistrationRetry = 0;
+ checkLifecycleConfiguration();
+ initialize();
}
}
@Override
diff --git a/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java b/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java
index 4be04d403..4a12c18c1 100644
--- a/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java
+++ b/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java
@@ -103,7 +103,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
abstract class BaseLifecycleManager {
- private static final String TAG = "Lifecycle Manager";
+ static final String TAG = "Lifecycle Manager";
public static final Version MAX_SUPPORTED_RPC_VERSION = new Version(6, 0, 0);
// Protected Correlation IDs
@@ -133,27 +133,19 @@ abstract class BaseLifecycleManager {
private String authToken;
Version minimumProtocolVersion;
Version minimumRPCVersion;
+ BaseTransportConfig _transportConfig;
BaseLifecycleManager(AppConfig appConfig, BaseTransportConfig config, LifecycleListener listener){
- this.lifecycleListener = listener;
-
- this.rpcListeners = new HashMap<>();
- this.rpcResponseListeners = new HashMap<>();
- this.rpcNotificationListeners = new HashMap<>();
- this.rpcRequestListeners = new HashMap<>();
-
this.appConfig = appConfig;
+ this._transportConfig = config;
+ this.lifecycleListener = listener;
this.minimumProtocolVersion = appConfig.getMinimumProtocolVersion();
this.minimumRPCVersion = appConfig.getMinimumRPCVersion();
-
- this.systemCapabilityManager = new SystemCapabilityManager(internalInterface);
-
- createSession(config);
+ initializeProxy();
}
public void start(){
try {
- setupInternalRpcListeners();
session.startSession();
} catch (SdlException e) {
e.printStackTrace();
@@ -333,7 +325,7 @@ abstract class BaseLifecycleManager {
return currentHMIStatus;
}
- private void onClose(String info, Exception e){
+ void onClose(String info, Exception e){
Log.i(TAG, "onClose");
if(lifecycleListener != null){
lifecycleListener.onProxyClosed((LifecycleManager) this, info,e,null);
@@ -864,9 +856,7 @@ abstract class BaseLifecycleManager {
@Override
public void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig) {
- if (!availablePrimary) {
- onClose(info, null);
- }
+ BaseLifecycleManager.this.onTransportDisconnected(info, availablePrimary, transportConfig);
}
@@ -1377,7 +1367,9 @@ abstract class BaseLifecycleManager {
return null;
}
- private void cleanProxy(){
+ void cleanProxy(){
+ firstTimeFull = true;
+ currentHMIStatus = null;
if (rpcListeners != null) {
rpcListeners.clear();
}
@@ -1454,7 +1446,14 @@ abstract class BaseLifecycleManager {
********************************** Platform specific methods - START *************************************
*********************************************************************************************************/
- abstract void createSession(BaseTransportConfig config);
+ void initializeProxy(){
+ this.rpcListeners = new HashMap<>();
+ this.rpcResponseListeners = new HashMap<>();
+ this.rpcNotificationListeners = new HashMap<>();
+ this.rpcRequestListeners = new HashMap<>();
+ this.systemCapabilityManager = new SystemCapabilityManager(internalInterface);
+ setupInternalRpcListeners();
+ }
void onProtocolSessionStarted (SessionType sessionType) {
if (sessionType != null) {
@@ -1498,6 +1497,8 @@ abstract class BaseLifecycleManager {
}
}
+ void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig) {}
+
void onProtocolSessionStartedNACKed (SessionType sessionType) {}
void onProtocolSessionEnded (SessionType sessionType) {}
diff --git a/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
index 47ed40727..4a5e3747d 100644
--- a/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
+++ b/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
@@ -47,7 +47,17 @@ public class LifecycleManager extends BaseLifecycleManager {
super(appConfig, config, listener);
}
- void createSession(BaseTransportConfig config) {
- this.session = new SdlSession(sdlConnectionListener, config);
+ @Override
+ void initializeProxy() {
+ super.initializeProxy();
+ this.session = new SdlSession(sdlConnectionListener, _transportConfig);
+ }
+
+ @Override
+ void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig) {
+ super.onTransportDisconnected(info, availablePrimary, transportConfig);
+ if (!availablePrimary) {
+ onClose(info, null);
+ }
}
}