Skip to content

Commit e6498f0

Browse files
Add cycle proxy logic to LCM
1 parent 97ecbfa commit e6498f0

4 files changed

Lines changed: 92 additions & 34 deletions

File tree

android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,27 @@
3535
import android.app.Service;
3636
import android.content.Context;
3737
import android.support.annotation.RestrictTo;
38+
import android.util.Log;
3839

3940
import com.smartdevicelink.SdlConnection.SdlSession;
4041
import com.smartdevicelink.SdlConnection.SdlSession2;
42+
import com.smartdevicelink.exception.SdlException;
43+
import com.smartdevicelink.exception.SdlExceptionCause;
4144
import com.smartdevicelink.protocol.enums.SessionType;
4245
import com.smartdevicelink.proxy.interfaces.ISdlServiceListener;
46+
import com.smartdevicelink.proxy.rpc.enums.SdlDisconnectedReason;
4347
import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
4448
import com.smartdevicelink.security.SdlSecurityBase;
4549
import com.smartdevicelink.streaming.video.VideoStreamingParameters;
4650
import com.smartdevicelink.transport.BaseTransportConfig;
4751
import com.smartdevicelink.transport.MultiplexTransportConfig;
4852
import com.smartdevicelink.transport.TCPTransportConfig;
53+
import com.smartdevicelink.transport.USBTransportConfig;
4954
import com.smartdevicelink.transport.enums.TransportType;
5055
import com.smartdevicelink.util.DebugTool;
5156

57+
import java.util.ArrayList;
58+
import java.util.Collections;
5259
import java.util.concurrent.Callable;
5360
import java.util.concurrent.Executors;
5461
import java.util.concurrent.FutureTask;
@@ -77,13 +84,45 @@ public LifecycleManager(AppConfig appConfig, BaseTransportConfig config, Lifecyc
7784
}
7885

7986
@Override
80-
void createSession(BaseTransportConfig config) {
81-
if (config != null && config.getTransportType().equals(TransportType.MULTIPLEX)) {
82-
this.session = new SdlSession2(sdlConnectionListener, (MultiplexTransportConfig) config);
83-
} else if (config != null && config.getTransportType().equals(TransportType.TCP)) {
84-
this.session = new SdlSession2(sdlConnectionListener, (TCPTransportConfig) config);
87+
void initializeProxy() {
88+
super.initializeProxy();
89+
90+
//Handle legacy USB connections
91+
if (_transportConfig != null && TransportType.USB.equals(_transportConfig.getTransportType())) {
92+
//A USB transport config was provided
93+
USBTransportConfig usbTransportConfig = (USBTransportConfig) _transportConfig;
94+
if (usbTransportConfig.getUsbAccessory() == null) {
95+
DebugTool.logInfo("Legacy USB transport config was used, but received null for accessory. Attempting to connect with router service");
96+
//The accessory was null which means it came from a router service
97+
MultiplexTransportConfig multiplexTransportConfig = new MultiplexTransportConfig(usbTransportConfig.getUSBContext(), appConfig.getAppID());
98+
multiplexTransportConfig.setRequiresHighBandwidth(true);
99+
multiplexTransportConfig.setSecurityLevel(MultiplexTransportConfig.FLAG_MULTI_SECURITY_OFF);
100+
multiplexTransportConfig.setPrimaryTransports(Collections.singletonList(TransportType.USB));
101+
multiplexTransportConfig.setSecondaryTransports(new ArrayList<TransportType>());
102+
_transportConfig = multiplexTransportConfig;
103+
}
104+
}
105+
106+
if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.MULTIPLEX)) {
107+
this.session = new SdlSession2(sdlConnectionListener, (MultiplexTransportConfig) _transportConfig);
108+
} else if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.TCP)) {
109+
this.session = new SdlSession2(sdlConnectionListener, (TCPTransportConfig) _transportConfig);
85110
} else {
86-
this.session = SdlSession.createSession((byte) getProtocolVersion().getMajor(), sdlConnectionListener, config);
111+
this.session = SdlSession.createSession((byte) getProtocolVersion().getMajor(), sdlConnectionListener, _transportConfig);
112+
}
113+
}
114+
115+
private void cycleProxy(SdlDisconnectedReason disconnectedReason) {
116+
cleanProxy();
117+
initializeProxy();
118+
if(!SdlDisconnectedReason.LEGACY_BLUETOOTH_MODE_ENABLED.equals(disconnectedReason) && !SdlDisconnectedReason.PRIMARY_TRANSPORT_CYCLE_REQUEST.equals(disconnectedReason)){
119+
//We don't want to alert higher if we are just cycling for legacy bluetooth
120+
onClose("Sdl Proxy Cycled", new SdlException("Sdl Proxy Cycled", SdlExceptionCause.SDL_PROXY_CYCLED));
121+
}
122+
try {
123+
session.startSession();
124+
} catch (SdlException e) {
125+
e.printStackTrace();
87126
}
88127
}
89128

@@ -113,6 +152,18 @@ void onProtocolSessionStarted(SessionType sessionType) {
113152
}
114153
}
115154

155+
@Override
156+
void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig){
157+
super.onTransportDisconnected(info, availablePrimary, transportConfig);
158+
if (availablePrimary) {
159+
_transportConfig = transportConfig;
160+
Log.d(TAG, "notifying RPC session ended, but potential primary transport available");
161+
cycleProxy(SdlDisconnectedReason.PRIMARY_TRANSPORT_CYCLE_REQUEST);
162+
} else {
163+
onClose(info, null);
164+
}
165+
}
166+
116167
@Override
117168
void onProtocolSessionStartedNACKed(SessionType sessionType) {
118169
super.onProtocolSessionStartedNACKed(sessionType);

base/src/main/java/com/smartdevicelink/managers/BaseSdlManager.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,13 @@ abstract class BaseSdlManager {
120120

121121
// Initialize with anonymous lifecycleListener
122122
final LifecycleManager.LifecycleListener lifecycleListener = new LifecycleManager.LifecycleListener() {
123-
boolean initStarted = false;
124123
@Override
125124
public void onProxyConnected(LifecycleManager lifeCycleManager) {
126125
Log.i(TAG,"Proxy is connected. Now initializing.");
127126
synchronized (this){
128-
if(!initStarted){
129-
changeRegistrationRetry = 0;
130-
checkLifecycleConfiguration();
131-
initialize();
132-
initStarted = true;
133-
}
127+
changeRegistrationRetry = 0;
128+
checkLifecycleConfiguration();
129+
initialize();
134130
}
135131
}
136132
@Override

base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103

104104
abstract class BaseLifecycleManager {
105105

106-
private static final String TAG = "Lifecycle Manager";
106+
static final String TAG = "Lifecycle Manager";
107107
public static final Version MAX_SUPPORTED_RPC_VERSION = new Version(6, 0, 0);
108108

109109
// Protected Correlation IDs
@@ -133,27 +133,19 @@ abstract class BaseLifecycleManager {
133133
private String authToken;
134134
Version minimumProtocolVersion;
135135
Version minimumRPCVersion;
136+
BaseTransportConfig _transportConfig;
136137

137138
BaseLifecycleManager(AppConfig appConfig, BaseTransportConfig config, LifecycleListener listener){
138-
this.lifecycleListener = listener;
139-
140-
this.rpcListeners = new HashMap<>();
141-
this.rpcResponseListeners = new HashMap<>();
142-
this.rpcNotificationListeners = new HashMap<>();
143-
this.rpcRequestListeners = new HashMap<>();
144-
145139
this.appConfig = appConfig;
140+
this._transportConfig = config;
141+
this.lifecycleListener = listener;
146142
this.minimumProtocolVersion = appConfig.getMinimumProtocolVersion();
147143
this.minimumRPCVersion = appConfig.getMinimumRPCVersion();
148-
149-
this.systemCapabilityManager = new SystemCapabilityManager(internalInterface);
150-
151-
createSession(config);
144+
initializeProxy();
152145
}
153146

154147
public void start(){
155148
try {
156-
setupInternalRpcListeners();
157149
session.startSession();
158150
} catch (SdlException e) {
159151
e.printStackTrace();
@@ -333,7 +325,7 @@ public OnHMIStatus getCurrentHMIStatus() {
333325
return currentHMIStatus;
334326
}
335327

336-
private void onClose(String info, Exception e){
328+
void onClose(String info, Exception e){
337329
Log.i(TAG, "onClose");
338330
if(lifecycleListener != null){
339331
lifecycleListener.onProxyClosed((LifecycleManager) this, info,e,null);
@@ -864,9 +856,7 @@ public void onTransportDisconnected(String info) {
864856

865857
@Override
866858
public void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig) {
867-
if (!availablePrimary) {
868-
onClose(info, null);
869-
}
859+
BaseLifecycleManager.this.onTransportDisconnected(info, availablePrimary, transportConfig);
870860

871861
}
872862

@@ -1377,7 +1367,9 @@ private RPCNotification handleButtonNotificationFormatting(RPCMessage notificati
13771367
return null;
13781368
}
13791369

1380-
private void cleanProxy(){
1370+
void cleanProxy(){
1371+
firstTimeFull = true;
1372+
currentHMIStatus = null;
13811373
if (rpcListeners != null) {
13821374
rpcListeners.clear();
13831375
}
@@ -1454,7 +1446,14 @@ private void processRaiResponse(RegisterAppInterfaceResponse rai) {
14541446
********************************** Platform specific methods - START *************************************
14551447
*********************************************************************************************************/
14561448

1457-
abstract void createSession(BaseTransportConfig config);
1449+
void initializeProxy(){
1450+
this.rpcListeners = new HashMap<>();
1451+
this.rpcResponseListeners = new HashMap<>();
1452+
this.rpcNotificationListeners = new HashMap<>();
1453+
this.rpcRequestListeners = new HashMap<>();
1454+
this.systemCapabilityManager = new SystemCapabilityManager(internalInterface);
1455+
setupInternalRpcListeners();
1456+
}
14581457

14591458
void onProtocolSessionStarted (SessionType sessionType) {
14601459
if (sessionType != null) {
@@ -1498,6 +1497,8 @@ void onProtocolSessionStarted (SessionType sessionType) {
14981497
}
14991498
}
15001499

1500+
void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig) {}
1501+
15011502
void onProtocolSessionStartedNACKed (SessionType sessionType) {}
15021503

15031504
void onProtocolSessionEnded (SessionType sessionType) {}

javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,17 @@ public LifecycleManager(AppConfig appConfig, BaseTransportConfig config, Lifecyc
4747
super(appConfig, config, listener);
4848
}
4949

50-
void createSession(BaseTransportConfig config) {
51-
this.session = new SdlSession(sdlConnectionListener, config);
50+
@Override
51+
void initializeProxy() {
52+
super.initializeProxy();
53+
this.session = new SdlSession(sdlConnectionListener, _transportConfig);
54+
}
55+
56+
@Override
57+
void onTransportDisconnected(String info, boolean availablePrimary, BaseTransportConfig transportConfig) {
58+
super.onTransportDisconnected(info, availablePrimary, transportConfig);
59+
if (!availablePrimary) {
60+
onClose(info, null);
61+
}
5262
}
5363
}

0 commit comments

Comments
 (0)