summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnil Dahiya <adahiya@ford.com>2015-07-13 18:28:28 +0530
committerAnil Dahiya <adahiya@ford.com>2015-07-13 19:02:15 +0530
commit7bc1d81a77b9fb0f53fb4e0033029197d8dca02a (patch)
tree8c4b8e172e956de473e7ce89d259c9349ac1de95
parentd0388f42c38c7247b737c58d9379df3b9cc7ae25 (diff)
downloadsdl_android-7bc1d81a77b9fb0f53fb4e0033029197d8dca02a.tar.gz
Changing for fixing Heartbeat and adding Additional Timers
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java7
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java71
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java51
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java27
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java11
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java24
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/protocol/enums/FrameDataControlFrameType.java4
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/protocol/heartbeat/HeartbeatMonitor.java46
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java85
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/proxy/interfaces/IProxyListenerBase.java8
10 files changed, 295 insertions, 39 deletions
diff --git a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java
index 8e0170447..2d6dffb3b 100644
--- a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java
+++ b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java
@@ -24,4 +24,11 @@ public interface ISdlConnectionListener {
public void onHeartbeatTimedOut(byte sessionID);
+ public void onProtocolServiceDataACK(SessionType sessionType, byte sessionID);
+
+ public void onProtocolHeartbeat(SessionType sessionType, byte sessionID);
+
+ public void onProtocolHeartbeatACK(SessionType sessionType, byte sessionID);
+
+ public void onProtocolSendHeartbeat(SdlSession mySession);
}
diff --git a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java
index 600b3d553..998e35341 100644
--- a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java
+++ b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java
@@ -332,6 +332,8 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt
public void sendHeartbeat(SdlSession mySession) {
if(_protocol != null && mySession != null)
_protocol.SendHeartBeat(mySession.getSessionId());
+
+ _connectionListener.onProtocolSendHeartbeat(mySession);
}
public void unregisterSession(SdlSession registerListener) {
@@ -415,31 +417,90 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt
}
}
+
+ @Override
+ public void onProtocolServiceDataACK(SessionType sessionType,
+ byte sessionID) {
+ SdlSession session = findSessionById(sessionID);
+ if (session != null) {
+ session.onProtocolServiceDataACK(sessionType, sessionID);
+ }
+ }
+
+ @Override
+ public void onProtocolHeartbeat(SessionType sessionType, byte sessionID) {
+ SdlSession session = findSessionById(sessionID);
+ if (session != null) {
+ session.onProtocolHeartbeat(sessionType, sessionID);
+ }
+ }
+
+ @Override
+ public void onProtocolHeartbeatACK(SessionType sessionType,
+ byte sessionID) {
+ SdlSession session = findSessionById(sessionID);
+ if (session != null) {
+ session.onProtocolHeartbeatACK(sessionType, sessionID);
+ }
+ }
+
+ @Override
+ public void onProtocolSendHeartbeat(SdlSession mySession) {
+ if (mySession != null) {
+ mySession.onProtocolSendHeartbeat(mySession);
+ }
+ }
}
public int getRegisterCount() {
return listenerList.size();
}
+ @Override
+ public void onProtocolHeartbeat(SessionType sessionType, byte sessionID) {
+ _connectionListener.onProtocolHeartbeat(sessionType, sessionID);
+ }
+
@Override
public void onProtocolHeartbeatACK(SessionType sessionType, byte sessionID) {
SdlSession mySession = findSessionById(sessionID);
if (mySession == null) return;
- if (mySession._heartbeatMonitor != null) {
- mySession._heartbeatMonitor.heartbeatACKReceived();
+ if (mySession._outgoingHeartbeatMonitor != null) {
+ mySession._outgoingHeartbeatMonitor.heartbeatACKReceived();
+ }
+ if (mySession._incomingHeartbeatMonitor != null) {
+ mySession._incomingHeartbeatMonitor.heartbeatACKReceived();
+ }
+
+ _connectionListener.onProtocolHeartbeatACK(sessionType, sessionID);
+ }
+
+ @Override
+ public void onResetOutgoingHeartbeat(SessionType sessionType, byte sessionID){
+
+ SdlSession mySession = findSessionById(sessionID);
+ if (mySession == null) return;
+
+ if (mySession._outgoingHeartbeatMonitor != null) {
+ mySession._outgoingHeartbeatMonitor.notifyTransportActivity();
}
}
@Override
- public void onResetHeartbeat(SessionType sessionType, byte sessionID){
+ public void onResetIncomingHeartbeat(SessionType sessionType, byte sessionID){
SdlSession mySession = findSessionById(sessionID);
if (mySession == null) return;
- if (mySession._heartbeatMonitor != null) {
- mySession._heartbeatMonitor.notifyTransportActivity();
+ if (mySession._incomingHeartbeatMonitor != null) {
+ mySession._incomingHeartbeatMonitor.notifyTransportActivity();
}
}
+
+ @Override
+ public void onProtocolServiceDataACK(SessionType sessionType, byte sessionID) {
+ _connectionListener.onProtocolServiceDataACK(sessionType, sessionID);
+ }
}
diff --git a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java
index 42841ce0b..038ae35f0 100644
--- a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java
+++ b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java
@@ -22,7 +22,8 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList
private byte wiproProcolVer;
private ISdlConnectionListener sessionListener;
private BaseTransportConfig transportConfig;
- IHeartbeatMonitor _heartbeatMonitor = null;
+ IHeartbeatMonitor _outgoingHeartbeatMonitor = null;
+ IHeartbeatMonitor _incomingHeartbeatMonitor = null;
private static final String TAG = "SdlSession";
private LockScreenManager lockScreenMan = new LockScreenManager();
@@ -50,13 +51,22 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList
private SdlSession() {
}
- public IHeartbeatMonitor getHeartbeatMonitor() {
- return _heartbeatMonitor;
+ public IHeartbeatMonitor getOutgoingHeartbeatMonitor() {
+ return _outgoingHeartbeatMonitor;
+ }
+
+ public IHeartbeatMonitor getIncomingHeartbeatMonitor() {
+ return _incomingHeartbeatMonitor;
}
- public void setHeartbeatMonitor(IHeartbeatMonitor heartbeatMonitor) {
- this._heartbeatMonitor = heartbeatMonitor;
- _heartbeatMonitor.setListener(this);
+ public void setOutgoingHeartbeatMonitor(IHeartbeatMonitor outgoingHeartbeatMonitor) {
+ this._outgoingHeartbeatMonitor = outgoingHeartbeatMonitor;
+ _outgoingHeartbeatMonitor.setListener(this);
+ }
+
+ public void setIncomingHeartbeatMonitor(IHeartbeatMonitor incomingHeartbeatMonitor) {
+ this._incomingHeartbeatMonitor = incomingHeartbeatMonitor;
+ _incomingHeartbeatMonitor.setListener(this);
}
@@ -113,8 +123,11 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList
}
private void initialiseSession() {
- if (_heartbeatMonitor != null) {
- _heartbeatMonitor.start();
+ if (_outgoingHeartbeatMonitor != null) {
+ _outgoingHeartbeatMonitor.start();
+ }
+ if (_incomingHeartbeatMonitor != null) {
+ _incomingHeartbeatMonitor.start();
}
}
@@ -212,6 +225,26 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList
@Override
public void onProtocolSessionNACKed(SessionType sessionType,
byte sessionID, byte version, String correlationID) {
- this.sessionListener.onProtocolSessionNACKed(sessionType, sessionID, version, correlationID);
+ this.sessionListener.onProtocolSessionNACKed(sessionType, sessionID, version, correlationID);
+ }
+
+ @Override
+ public void onProtocolServiceDataACK(SessionType sessionType, byte sessionID) {
+ this.sessionListener.onProtocolServiceDataACK(sessionType, sessionID);
+ }
+
+ @Override
+ public void onProtocolHeartbeat(SessionType sessionType, byte sessionID) {
+ this.sessionListener.onProtocolHeartbeat(sessionType, sessionID);
+ }
+
+ @Override
+ public void onProtocolHeartbeatACK(SessionType sessionType, byte sessionID) {
+ this.sessionListener.onProtocolHeartbeatACK(sessionType, sessionID);
+ }
+
+ @Override
+ public void onProtocolSendHeartbeat(SdlSession mySession) {
+ this.sessionListener.onProtocolSendHeartbeat(mySession);
}
}
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java b/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java
index 8a58b51c8..52bd70968 100644
--- a/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java
+++ b/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java
@@ -57,6 +57,8 @@ public abstract class AbstractProtocol {
public abstract void SetHeartbeatReceiveInterval(int heartbeatReceiveInterval_ms);
public abstract void SendHeartBeat(byte sessionID);
+
+ public abstract void SendHeartBeatACK(byte sessionID);
// This method is called whenever the protocol receives a complete frame
protected void handleProtocolFrameReceived(ProtocolFrameHeader header, byte[] data, MessageFrameAssembler assembler) {
@@ -66,9 +68,15 @@ public abstract class AbstractProtocol {
assembler.handleFrame(header, data);
}
- private synchronized void resetHeartbeat(SessionType sessionType, byte sessionID) {
+ private synchronized void resetOutgoingHeartbeat(SessionType sessionType, byte sessionID) {
+ if (_protocolListener != null) {
+ _protocolListener.onResetOutgoingHeartbeat(sessionType,sessionID);
+ }
+ }
+
+ private synchronized void resetIncomingHeartbeat(SessionType sessionType, byte sessionID) {
if (_protocolListener != null) {
- _protocolListener.onResetHeartbeat(sessionType,sessionID);
+ _protocolListener.onResetIncomingHeartbeat(sessionType,sessionID);
}
}
@@ -76,7 +84,7 @@ public abstract class AbstractProtocol {
protected void handleProtocolFrameToSend(ProtocolFrameHeader header, byte[] data, int offset, int length) {
SdlTrace.logProtocolEvent(InterfaceActivityDirection.Transmit, header, data,
offset, length, SDL_LIB_TRACE_KEY);
- resetHeartbeat(header.getSessionType(), header.getSessionID());
+ resetOutgoingHeartbeat(header.getSessionType(), header.getSessionID());
synchronized(_frameLock) {
byte[] frameHeader = header.assembleHeaderBytes();
handleProtocolMessageBytesToSend(frameHeader, 0, frameHeader.length);
@@ -96,9 +104,6 @@ public abstract class AbstractProtocol {
// This method handles received protocol messages.
protected void handleProtocolMessageReceived(ProtocolMessage message) {
-
- //uncomment when SDL Core supports
- //resetHeartbeat(message.getSessionType(), message.getSessionID());
_protocolListener.onProtocolMessageReceived(message);
}
@@ -126,7 +131,17 @@ public abstract class AbstractProtocol {
protected void handleProtocolError(String string, Exception ex) {
_protocolListener.onProtocolError(string, ex);
}
+ protected void handleProtocolHeartbeat(SessionType sessionType, byte sessionID) {
+ _protocolListener.onProtocolHeartbeat(sessionType, sessionID);
+ SendHeartBeatACK(sessionID);
+ }
protected void handleProtocolHeartbeatACK(SessionType sessionType, byte sessionID) {
_protocolListener.onProtocolHeartbeatACK(sessionType, sessionID);
}
+ protected void handleProtocolServiceDataACK(SessionType sessionType, byte sessionID) {
+ _protocolListener.onProtocolServiceDataACK(sessionType, sessionID);
+ }
+ protected void onResetIncomingHeartbeat(SessionType sessionType, byte sessionID) {
+ resetIncomingHeartbeat(sessionType, sessionID);
+ }
} // end-class
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java b/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java
index c9613dcfa..118095212 100644
--- a/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java
+++ b/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java
@@ -18,12 +18,19 @@ public interface IProtocolListener {
// Called to indicate that a protocol session has ended (from either side)
void onProtocolSessionEnded(SessionType sessionType, byte sessionID, String correlationID /*, String info, Exception ex*/);
- /**
+
+ void onProtocolHeartbeat(SessionType sessionType, byte sessionID);
+
+ /**
* Called when a protocol heartbeat ACK message has been received from SDL.
*/
void onProtocolHeartbeatACK(SessionType sessionType, byte sessionID);
+
+ void onProtocolServiceDataACK(SessionType sessionType, byte sessionID);
+
+ void onResetOutgoingHeartbeat(SessionType sessionType, byte sessionID);
- void onResetHeartbeat(SessionType sessionType, byte sessionID);
+ void onResetIncomingHeartbeat(SessionType sessionType, byte sessionID);
// Called to indicate that a protocol error was detected in received data.
void onProtocolError(String info, Exception e);
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java b/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java
index 7a214fb72..aef0a7d31 100644
--- a/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java
+++ b/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java
@@ -53,7 +53,7 @@ public class WiProProtocol extends AbstractProtocol {
public void setVersion(byte version) {
this._version = version;
if (version > 1) {
- this._version = 2;
+ this._version = version;
HEADER_SIZE = 12;
MAX_DATA_SIZE = MTU_SIZE - HEADER_SIZE;
_headerBuf = new byte[HEADER_SIZE];
@@ -265,6 +265,8 @@ public class WiProProtocol extends AbstractProtocol {
new SdlException("Error handling protocol message from sdl, data buffer is null.", SdlExceptionCause.DATA_BUFFER_NULL));
return null;
}
+
+ onResetIncomingHeartbeat(_currentHeader.getSessionType(), _currentHeader.getSessionID());
int bytesLeft = receivedBytesLength - receivedBytesReadPos;
int bytesNeeded = _dataBuf.length - _dataBufWritePos;
@@ -412,16 +414,22 @@ public class WiProProtocol extends AbstractProtocol {
} // end-if
} // end-method
+ private void handleProtocolHeartbeat(ProtocolFrameHeader header,
+ byte[] data) {
+ WiProProtocol.this.handleProtocolHeartbeat(header.getSessionType(),header.getSessionID());
+ } // end-method
+
private void handleProtocolHeartbeatACK(ProtocolFrameHeader header,
byte[] data) {
WiProProtocol.this.handleProtocolHeartbeatACK(header.getSessionType(),header.getSessionID());
} // end-method
private void handleControlFrame(ProtocolFrameHeader header, byte[] data) {
- if (header.getFrameData() == FrameDataControlFrameType.HeartbeatACK.getValue()) {
+ if (header.getFrameData() == FrameDataControlFrameType.Heartbeat.getValue()) {
+ handleProtocolHeartbeat(header, data);
+ } else if (header.getFrameData() == FrameDataControlFrameType.HeartbeatACK.getValue()) {
handleProtocolHeartbeatACK(header, data);
- }
- else if (header.getFrameData() == FrameDataControlFrameType.StartSession.getValue()) {
+ } else if (header.getFrameData() == FrameDataControlFrameType.StartSession.getValue()) {
sendStartProtocolSessionACK(header.getSessionType(), header.getSessionID());
} else if (header.getFrameData() == FrameDataControlFrameType.StartSessionACK.getValue()) {
// Use this sessionID to create a message lock
@@ -447,6 +455,8 @@ public class WiProProtocol extends AbstractProtocol {
} else handleProtocolSessionEnded(header.getSessionType(), header.getSessionID(), "");
} else if (header.getFrameData() == FrameDataControlFrameType.EndSessionACK.getValue()) {
handleProtocolSessionEnded(header.getSessionType(), header.getSessionID(), "");
+ } else if (header.getFrameData() == FrameDataControlFrameType.ServiceDataACK.getValue()) {
+ handleProtocolServiceDataACK(header.getSessionType(), header.getSessionID());
}
} // end-method
@@ -506,4 +516,10 @@ public class WiProProtocol extends AbstractProtocol {
final ProtocolFrameHeader heartbeat = ProtocolFrameHeaderFactory.createHeartbeat(SessionType.CONTROL, sessionID, _version);
sendFrameToTransport(heartbeat);
}
+
+ @Override
+ public void SendHeartBeatACK(byte sessionID) {
+ final ProtocolFrameHeader heartbeat = ProtocolFrameHeaderFactory.createHeartbeatACK(SessionType.CONTROL, sessionID, _version);
+ sendFrameToTransport(heartbeat);
+ }
} // end-class \ No newline at end of file
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/enums/FrameDataControlFrameType.java b/sdl_android_lib/src/com/smartdevicelink/protocol/enums/FrameDataControlFrameType.java
index b9296fdfb..88c92b716 100644
--- a/sdl_android_lib/src/com/smartdevicelink/protocol/enums/FrameDataControlFrameType.java
+++ b/sdl_android_lib/src/com/smartdevicelink/protocol/enums/FrameDataControlFrameType.java
@@ -19,6 +19,7 @@ public class FrameDataControlFrameType extends ByteEnumer {
public final static FrameDataControlFrameType EndSession = new FrameDataControlFrameType((byte)0x04, "EndSession");
public final static FrameDataControlFrameType EndSessionACK = new FrameDataControlFrameType((byte)0x05, "EndSessionACK");
public final static FrameDataControlFrameType EndSessionNACK = new FrameDataControlFrameType((byte)0x06, "EndSessionNACK");
+ public final static FrameDataControlFrameType ServiceDataACK = new FrameDataControlFrameType((byte)0xFE, "ServiceDataACK");
public final static FrameDataControlFrameType HeartbeatACK = new FrameDataControlFrameType((byte)0xFF, "HeartbeatACK");
static {
@@ -29,6 +30,7 @@ public class FrameDataControlFrameType extends ByteEnumer {
theList.addElement(EndSession);
theList.addElement(EndSessionACK);
theList.addElement(EndSessionNACK);
+ theList.addElement(ServiceDataACK);
theList.addElement(HeartbeatACK);
}
@@ -40,4 +42,4 @@ public class FrameDataControlFrameType extends ByteEnumer {
return theList.toArray(new FrameDataControlFrameType[theList.size()]);
}
-} \ No newline at end of file
+}
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/heartbeat/HeartbeatMonitor.java b/sdl_android_lib/src/com/smartdevicelink/protocol/heartbeat/HeartbeatMonitor.java
index f5d4e9c84..d4336599f 100644
--- a/sdl_android_lib/src/com/smartdevicelink/protocol/heartbeat/HeartbeatMonitor.java
+++ b/sdl_android_lib/src/com/smartdevicelink/protocol/heartbeat/HeartbeatMonitor.java
@@ -1,5 +1,10 @@
package com.smartdevicelink.protocol.heartbeat;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.ScheduledExecutorService;
+
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
@@ -16,6 +21,9 @@ public class HeartbeatMonitor implements IHeartbeatMonitor {
private Looper heartbeatThreadLooper;
private Handler heartbeatThreadHandler;
+ FutureTask<Void> fTask;
+ ScheduledExecutorService scheduler;
+
private Runnable heartbeatTimeoutRunnable = new Runnable() {
@Override
public void run() {
@@ -26,20 +34,22 @@ public class HeartbeatMonitor implements IHeartbeatMonitor {
if (ackReceived) {
Log.d(TAG,
"ACK has been received, sending and scheduling heartbeat");
+ ackReceived = false;
if (listener != null) {
+ fTask = createFutureTask(new CallableMethod(2000));
+ scheduler = createScheduler();
+ scheduler.execute(fTask);
listener.sendHeartbeat(HeartbeatMonitor.this);
} else {
Log.w(TAG,
"Delegate is not set, scheduling heartbeat anyway");
}
- ackReceived = false;
} else {
Log.d(TAG, "ACK has not been received");
+ stop();
if (listener != null) {
- stop();
listener.heartbeatTimedOut(HeartbeatMonitor.this);
}
- // TODO stop?
}
}
rescheduleHeartbeat();
@@ -174,4 +184,34 @@ public class HeartbeatMonitor implements IHeartbeatMonitor {
ackReceived = true;
}
}
+
+ private class CallableMethod implements Callable<Void> {
+ private long waitTime;
+
+ public CallableMethod(int timeInMillis){
+ this.waitTime=timeInMillis;
+ }
+ @Override
+ public Void call() {
+ try {
+ Thread.sleep(waitTime);
+ if (!ackReceived) {
+ Log.d(TAG, "ACK has not been received");
+ stop();
+ if (listener != null) {
+ listener.heartbeatTimedOut(HeartbeatMonitor.this);
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ }
+ public FutureTask<Void> createFutureTask(CallableMethod callMethod){
+ return new FutureTask<Void>(callMethod);
+ }
+ public ScheduledExecutorService createScheduler(){
+ return Executors.newSingleThreadScheduledExecutor();
+ }
}
diff --git a/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java b/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java
index 421989c8e..f8e64af95 100644
--- a/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java
+++ b/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java
@@ -282,16 +282,21 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
updateBroadcastIntent(sendIntent, "COMMENT2", " SessionType: " + sessionType.getName());
sendBroadcastIntent(sendIntent);
- setWiProVersion(version);
-
- if ( (_transportConfig.getHeartBeatTimeout() != Integer.MAX_VALUE) && (version > 2) )
- {
- HeartbeatMonitor heartbeatMonitor = new HeartbeatMonitor();
- heartbeatMonitor.setInterval(_transportConfig.getHeartBeatTimeout());
- sdlSession.setHeartbeatMonitor(heartbeatMonitor);
- }
+ setWiProVersion(version);
- if (sessionType.eq(SessionType.RPC)) {
+ if (sessionType.eq(SessionType.RPC)) {
+
+ if ( (_transportConfig.getHeartBeatTimeout() != Integer.MAX_VALUE) && (version >= 2) )
+ {
+ HeartbeatMonitor outgoingHeartbeatMonitor = new HeartbeatMonitor();
+ outgoingHeartbeatMonitor.setInterval(_transportConfig.getHeartBeatTimeout());
+ sdlSession.setOutgoingHeartbeatMonitor(outgoingHeartbeatMonitor);
+
+ HeartbeatMonitor incomingHeartbeatMonitor = new HeartbeatMonitor();
+ incomingHeartbeatMonitor.setInterval(_transportConfig.getHeartBeatTimeout());
+ sdlSession.setIncomingHeartbeatMonitor(incomingHeartbeatMonitor);
+ }
+
startRPCProtocolSession(sessionID, correlationID);
} else if (sessionType.eq(SessionType.NAV)) {
NavServiceStarted();
@@ -337,6 +342,68 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
notifyProxyClosed(msg, new SdlException(msg, SdlExceptionCause.HEARTBEAT_PAST_DUE), SdlDisconnectedReason.HB_TIMEOUT);
}
+
+ @Override
+ public void onProtocolServiceDataACK(SessionType sessionType,
+ byte sessionID) {
+ if (_callbackToUIThread) {
+ // Run in UI thread
+ _mainUIHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ _proxyListener.onServiceDataACK();
+ }
+ });
+ } else {
+ _proxyListener.onServiceDataACK();
+ }
+ }
+
+ @Override
+ public void onProtocolHeartbeat(SessionType sessionType, byte sessionID) {
+ if (_callbackToUIThread) {
+ // Run in UI thread
+ _mainUIHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ _proxyListener.onHeartbeat();
+ }
+ });
+ } else {
+ _proxyListener.onHeartbeat();
+ }
+ }
+
+ @Override
+ public void onProtocolHeartbeatACK(SessionType sessionType,
+ byte sessionID) {
+ if (_callbackToUIThread) {
+ // Run in UI thread
+ _mainUIHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ _proxyListener.onHeartbeatACK();
+ }
+ });
+ } else {
+ _proxyListener.onHeartbeatACK();
+ }
+ }
+
+ @Override
+ public void onProtocolSendHeartbeat(SdlSession mySession) {
+ if (_callbackToUIThread) {
+ // Run in UI thread
+ _mainUIHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ _proxyListener.onSendHeartbeat();
+ }
+ });
+ } else {
+ _proxyListener.onSendHeartbeat();
+ }
+ }
}
/**
diff --git a/sdl_android_lib/src/com/smartdevicelink/proxy/interfaces/IProxyListenerBase.java b/sdl_android_lib/src/com/smartdevicelink/proxy/interfaces/IProxyListenerBase.java
index 7d112fc14..7172255e8 100644
--- a/sdl_android_lib/src/com/smartdevicelink/proxy/interfaces/IProxyListenerBase.java
+++ b/sdl_android_lib/src/com/smartdevicelink/proxy/interfaces/IProxyListenerBase.java
@@ -308,4 +308,12 @@ public interface IProxyListenerBase {
public void onDialNumberResponse(DialNumberResponse response);
public void onSendLocationResponse(SendLocationResponse response);
+
+ public void onServiceDataACK();
+
+ public void onHeartbeat();
+
+ public void onHeartbeatACK();
+
+ public void onSendHeartbeat();
}