diff options
author | Bilal Alsharifi <599206+bilal-alsharifi@users.noreply.github.com> | 2019-09-13 13:53:23 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-13 13:53:23 -0400 |
commit | c5d2e936780f6b9a2e2fa237931dd8f99dd46b5f (patch) | |
tree | b317dc6f0bedda713119831ab35da8de18d7851b | |
parent | c1ac132805464ac0b584f53fbada9c7086e5523a (diff) | |
parent | e993a85e0a0056dfbe62d5a55538b4b513777206 (diff) | |
download | sdl_android-c5d2e936780f6b9a2e2fa237931dd8f99dd46b5f.tar.gz |
Merge pull request #1161 from smartdevicelink/bugfix/resume_secondary_transport
Allow Video Service to restart after secondary transport disconnection
3 files changed, 57 insertions, 10 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession2.java b/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession2.java index e70d5f708..cbd45c49a 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession2.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession2.java @@ -311,7 +311,15 @@ public class SdlSession2 extends SdlSession implements ISdlProtocol{ }else if(SessionType.PCM.equals(serviceType)){ stopAudioStream(); } - + // Notify any listeners of the service being ended + if(serviceListeners != null && serviceListeners.containsKey(serviceType)){ + CopyOnWriteArrayList<ISdlServiceListener> listeners = serviceListeners.get(serviceType); + if (listeners != null && listeners.size() > 0) { + for (ISdlServiceListener listener : listeners) { + listener.onServiceEnded(this, serviceType); + } + } + } } @Override diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java index c6e6d8b6d..ec6c751b8 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java @@ -253,6 +253,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> private OnSystemRequest lockScreenIconRequest = null;
private TelephonyManager telephonyManager = null;
private DeviceInfo deviceInfo = null;
+ private ISdlServiceListener navServiceListener;
/**
* Contains current configuration for the transport that was selected during
@@ -349,6 +350,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> if(isConnected()){
sdlSession.setDesiredVideoParams(parameters);
sdlSession.startService(SessionType.NAV,sdlSession.getSessionId(),encrypted);
+ addNavListener();
}
}
@@ -547,13 +549,13 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> @Override
public void onTransportDisconnected(String info, boolean altTransportAvailable, BaseTransportConfig transportConfig) {
+
notifyPutFileStreamError(null, info);
- if( altTransportAvailable){
+ if (altTransportAvailable){
SdlProxyBase.this._transportConfig = transportConfig;
Log.d(TAG, "notifying RPC session ended, but potential primary transport available");
cycleProxy(SdlDisconnectedReason.PRIMARY_TRANSPORT_CYCLE_REQUEST);
-
}else{
notifyProxyClosed(info, new SdlException("Transport disconnected.", SdlExceptionCause.SDL_UNAVAILABLE), SdlDisconnectedReason.TRANSPORT_DISCONNECT);
}
@@ -1586,9 +1588,9 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> }
}
- if (_transportConfig.getTransportType().equals(TransportType.MULTIPLEX)) {
+ if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.MULTIPLEX)) {
this.sdlSession = new SdlSession2(_interfaceBroker, (MultiplexTransportConfig) _transportConfig);
- }else if(_transportConfig.getTransportType().equals(TransportType.TCP)){
+ }else if(_transportConfig != null &&_transportConfig.getTransportType().equals(TransportType.TCP)){
this.sdlSession = new SdlSession2(_interfaceBroker, (TCPTransportConfig) _transportConfig);
}else {
this.sdlSession = SdlSession.createSession((byte)getProtocolVersion().getMajor(),_interfaceBroker, _transportConfig);
@@ -4928,7 +4930,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> sdlSession.setDesiredVideoParams(emptyParam);
sdlSession.startService(SessionType.NAV, sdlSession.getSessionId(), isEncrypted);
-
+ addNavListener();
FutureTask<Void> fTask = createFutureTask(new CallableMethod(RESPONSE_WAIT_TIME));
ScheduledExecutorService scheduler = createScheduler();
scheduler.execute(fTask);
@@ -4976,7 +4978,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> sdlSession.setDesiredVideoParams(emptyParam);
sdlSession.startService(SessionType.NAV, sdlSession.getSessionId(), isEncrypted);
-
+ addNavListener();
FutureTask<Void> fTask = createFutureTask(new CallableMethod(RESPONSE_WAIT_TIME));
ScheduledExecutorService scheduler = createScheduler();
scheduler.execute(fTask);
@@ -5350,7 +5352,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> navServiceStartRejectedParams = null;
sdlSession.startService(SessionType.NAV, sdlSession.getSessionId(), isEncrypted);
-
+ addNavListener();
FutureTask<Void> fTask = createFutureTask(new CallableMethod(RESPONSE_WAIT_TIME));
ScheduledExecutorService scheduler = createScheduler();
scheduler.execute(fTask);
@@ -5415,6 +5417,35 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> sdlSession.drainEncoder(endOfStream);
}
+ private void addNavListener(){
+
+ // videos may be started and stopped. Only add this once
+ if (navServiceListener == null){
+
+ navServiceListener = new ISdlServiceListener() {
+ @Override
+ public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) { }
+
+ @Override
+ public void onServiceEnded(SdlSession session, SessionType type) {
+ // reset nav flags so nav can start upon the next transport connection
+ resetNavStartFlags();
+ // propagate notification up to proxy listener so the developer will know that the service is ended
+ if (_proxyListener != null) {
+ _proxyListener.onServiceEnded(new OnServiceEnded(type));
+ }
+ }
+
+ @Override
+ public void onServiceError(SdlSession session, SessionType type, String reason) {
+ // if there is an error reset the flags so that there is a chance to restart streaming
+ resetNavStartFlags();
+ }
+ };
+ this.sdlSession.addServiceListener(SessionType.NAV, navServiceListener);
+ }
+ }
+
/**
* Opens a audio service (service type 10) and subsequently provides an IAudioStreamListener
* to the app to send audio data.
@@ -5567,7 +5598,13 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> private void AudioServiceEndedNACK() {
pcmServiceEndResponseReceived = true;
pcmServiceEndResponse = false;
- }
+ }
+
+ private void resetNavStartFlags() {
+ navServiceStartResponseReceived = false;
+ navServiceStartResponse = false;
+ navServiceStartRejectedParams = null;
+ }
public void setAppService(Service mService)
{
diff --git a/base/src/main/java/com/smartdevicelink/protocol/SdlProtocolBase.java b/base/src/main/java/com/smartdevicelink/protocol/SdlProtocolBase.java index 9ccd9d068..6db167567 100644 --- a/base/src/main/java/com/smartdevicelink/protocol/SdlProtocolBase.java +++ b/base/src/main/java/com/smartdevicelink/protocol/SdlProtocolBase.java @@ -529,7 +529,9 @@ public class SdlProtocolBase { public void endSession(byte sessionID, int hashId) { SdlPacket header = SdlPacketFactory.createEndSession(SessionType.RPC, sessionID, hashId, (byte)protocolVersion.getMajor(), hashId); handlePacketToSend(header); - transportManager.close(sessionID); + if(transportManager != null) { + transportManager.close(sessionID); + } } // end-method |