diff options
author | Bilal Alsharifi <bilal.alsharifi@gmail.com> | 2020-06-09 11:33:41 -0400 |
---|---|---|
committer | Bilal Alsharifi <bilal.alsharifi@gmail.com> | 2020-06-09 11:33:41 -0400 |
commit | e6498f057b86c21310fd5e9d1ba2c593e31ef5a5 (patch) | |
tree | 0ef4855517765995facb84bf04fbab6f23879bc2 | |
parent | 97ecbfab51b1e61788565dc328eaa039b6f6f857 (diff) | |
download | sdl_android-e6498f057b86c21310fd5e9d1ba2c593e31ef5a5.tar.gz |
Add cycle proxy logic to LCM
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); + } } } |