summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrettyWhite <geekman3454@protonmail.com>2019-03-14 14:29:41 -0400
committerBrettyWhite <geekman3454@protonmail.com>2019-03-14 14:29:41 -0400
commit6043bcadd6c26d88ee9731eb547e8916e6d91216 (patch)
treef3dff1256ebb1299e3cb15127e75a94455e66f27
parent5fe91d9f1a8b05c508fd9f17c07342fd4c84327f (diff)
downloadsdl_android-feature/rpc_request_listener.tar.gz
hook up SCM to onRPCListener in proxy basefeature/rpc_request_listener
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java82
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java4
-rw-r--r--javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java1
3 files changed, 64 insertions, 23 deletions
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 4341375de..3088d6edf 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
@@ -158,6 +158,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
OUTGOING_MESSAGE_QUEUE_THREAD_LOCK = new Object(),
INTERNAL_MESSAGE_QUEUE_THREAD_LOCK = new Object(),
ON_UPDATE_LISTENER_LOCK = new Object(),
+ RPC_LISTENER_LOCK = new Object(),
ON_NOTIFICATION_LISTENER_LOCK = new Object();
private final Object APP_INTERFACE_REGISTERED_LOCK = new Object();
@@ -259,6 +260,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
protected SparseArray<OnRPCResponseListener> rpcResponseListeners = null;
protected SparseArray<CopyOnWriteArrayList<OnRPCNotificationListener>> rpcNotificationListeners = null;
protected SparseArray<CopyOnWriteArrayList<OnRPCRequestListener>> rpcRequestListeners = null;
+ protected SparseArray<CopyOnWriteArrayList<OnRPCListener>> rpcListeners = null;
protected VideoStreamingManager manager; //Will move to SdlSession once the class becomes public
@@ -365,14 +367,12 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
@Override
public void addOnRPCListener(FunctionID responseId, OnRPCListener listener) {
- DebugTool.logError("Proxy.addOnRPCResponseListener() is not implemented yet");
-
+ SdlProxyBase.this.addOnRPCListener(responseId, listener);
}
@Override
public boolean removeOnRPCListener(FunctionID responseId, OnRPCListener listener) {
- DebugTool.logError("Proxy.removeOnRPCResponseListener() is not implemented yet");
- return false;
+ return SdlProxyBase.this.removeOnRPCListener(responseId, listener);
}
@Override
@@ -940,6 +940,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
rpcResponseListeners = new SparseArray<OnRPCResponseListener>();
rpcNotificationListeners = new SparseArray<CopyOnWriteArrayList<OnRPCNotificationListener>>();
rpcRequestListeners = new SparseArray<CopyOnWriteArrayList<OnRPCRequestListener>>();
+ rpcListeners = new SparseArray<CopyOnWriteArrayList<OnRPCListener>>();
// Initialize the proxy
try {
@@ -2195,6 +2196,20 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
}
@SuppressWarnings("UnusedReturnValue")
+ public boolean onRPCReceived(RPCMessage message){
+ synchronized(RPC_LISTENER_LOCK){
+ CopyOnWriteArrayList<OnRPCListener> listeners = rpcListeners.get(FunctionID.getFunctionId(message.getFunctionName()));
+ if(listeners!=null && listeners.size()>0) {
+ for (OnRPCListener listener : listeners) {
+ listener.onReceived(message);
+ }
+ return true;
+ }
+ return false;
+ }
+ }
+
+ @SuppressWarnings("UnusedReturnValue")
public boolean onRPCRequestReceived(RPCRequest request){
synchronized(ON_NOTIFICATION_LISTENER_LOCK){
CopyOnWriteArrayList<OnRPCRequestListener> listeners = rpcRequestListeners.get(FunctionID.getFunctionId(request.getFunctionName()));
@@ -2227,7 +2242,37 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
}
/**
- * This will ad a listener for the specific type of request. As of now it will only allow
+ * This will add a listener for the specific type of message. As of now it will only allow
+ * a single listener per request function id
+ * @param messageId The message type that this listener is designated for
+ * @param listener The listener that will be called when a request of the provided type is received
+ */
+ @SuppressWarnings("unused")
+ public void addOnRPCListener(FunctionID messageId, OnRPCListener listener){
+ synchronized(RPC_LISTENER_LOCK){
+ if(messageId != null && listener != null){
+ if(rpcListeners.indexOfKey(messageId.getId()) < 0 ){
+ rpcListeners.put(messageId.getId(),new CopyOnWriteArrayList<OnRPCListener>());
+ }
+ rpcListeners.get(messageId.getId()).add(listener);
+ }
+ }
+ }
+
+ public boolean removeOnRPCListener(FunctionID messageId, OnRPCListener listener){
+ synchronized(RPC_LISTENER_LOCK){
+ if(rpcListeners!= null
+ && messageId != null
+ && listener != null
+ && rpcListeners.indexOfKey(messageId.getId()) >= 0){
+ return rpcListeners.get(messageId.getId()).remove(listener);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * This will add a listener for the specific type of request. As of now it will only allow
* a single listener per request function id
* @param requestId The request type that this listener is designated for
* @param listener The listener that will be called when a request of the provided type is received
@@ -2330,22 +2375,25 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
}
private void handleRPCMessage(Hashtable<String, Object> hash) {
- RPCMessage rpcMsg = new RPCMessage(hash);
- //Call format to ensure the RPC is ready to be handled regardless of RPC spec version
+
+ RPCMessage rpcMsg = RpcConverter.convertTableToRpc(hash);
+
+ SdlTrace.logRPCEvent(InterfaceActivityDirection.Receive, rpcMsg, SDL_LIB_TRACE_KEY);
+
String functionName = rpcMsg.getFunctionName();
String messageType = rpcMsg.getMessageType();
- SdlTrace.logRPCEvent(InterfaceActivityDirection.Receive, rpcMsg, SDL_LIB_TRACE_KEY);
+ if (rpcMsg != null) {
+ rpcMsg.format(rpcSpecVersion, true);
+ onRPCReceived(rpcMsg);
+ }
// Requests need to be listened for using the SDLManager's addOnRPCRequestListener method.
// Requests are not supported by IProxyListenerBase
if (messageType.equals(RPCMessage.KEY_REQUEST)) {
- RPCMessage convertedRPCMsg = RpcConverter.convertTableToRpc(hash);
-
- if (convertedRPCMsg != null) {
- convertedRPCMsg.format(rpcSpecVersion, true);
- onRPCRequestReceived((RPCRequest) convertedRPCMsg);
+ if (rpcMsg != null) {
+ onRPCRequestReceived((RPCRequest) rpcMsg);
}else{
DebugTool.logError("Received a null RPC Request, discarding.");
}
@@ -3089,14 +3137,6 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
// SetDisplayLayout
final SetDisplayLayoutResponse msg = new SetDisplayLayoutResponse(hash);
msg.format(rpcSpecVersion,true);
- // successfully changed display layout - update layout capabilities
- if(msg.getSuccess() && _systemCapabilityManager!=null){
- _systemCapabilityManager.setCapability(SystemCapabilityType.DISPLAY, msg.getDisplayCapabilities());
- _systemCapabilityManager.setCapability(SystemCapabilityType.BUTTON, msg.getButtonCapabilities());
- _systemCapabilityManager.setCapability(SystemCapabilityType.PRESET_BANK, msg.getPresetBankCapabilities());
- _systemCapabilityManager.setCapability(SystemCapabilityType.SOFTBUTTON, msg.getSoftButtonCapabilities());
- }
-
if (_callbackToUIThread) {
// Run in UI thread
_mainUIHandler.post(new Runnable() {
diff --git a/base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java b/base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java
index df8e65837..4f4bb7029 100644
--- a/base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java
+++ b/base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java
@@ -348,7 +348,9 @@ abstract public class BaseScreenManager extends BaseSubManager {
if (!success){
updateSuccessful = false;
}
- listener.onComplete(updateSuccessful);
+ if (listener != null) {
+ listener.onComplete(updateSuccessful);
+ }
}
});
}
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 27cd2cfd4..7424b3672 100644
--- a/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
+++ b/javaSE/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java
@@ -3,7 +3,6 @@ package com.smartdevicelink.managers.lifecycle;
import android.util.Log;
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.exception.SdlException;
-import com.smartdevicelink.exception.SdlExceptionCause;
import com.smartdevicelink.marshal.JsonRPCMarshaller;
import com.smartdevicelink.protocol.ProtocolMessage;
import com.smartdevicelink.protocol.enums.FunctionID;