summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBilal Alsharifi <599206+bilal-alsharifi@users.noreply.github.com>2019-09-13 13:53:23 -0400
committerGitHub <noreply@github.com>2019-09-13 13:53:23 -0400
commitc5d2e936780f6b9a2e2fa237931dd8f99dd46b5f (patch)
treeb317dc6f0bedda713119831ab35da8de18d7851b
parentc1ac132805464ac0b584f53fbada9c7086e5523a (diff)
parente993a85e0a0056dfbe62d5a55538b4b513777206 (diff)
downloadsdl_android-c5d2e936780f6b9a2e2fa237931dd8f99dd46b5f.tar.gz
Merge pull request #1161 from smartdevicelink/bugfix/resume_secondary_transport
Allow Video Service to restart after secondary transport disconnection
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession2.java10
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java53
-rw-r--r--base/src/main/java/com/smartdevicelink/protocol/SdlProtocolBase.java4
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