summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBilal Alsharifi <599206+bilal-alsharifi@users.noreply.github.com>2020-06-30 11:38:25 -0400
committerGitHub <noreply@github.com>2020-06-30 11:38:25 -0400
commit3a2800d55a150510749e2758ef72c95b7ecc5640 (patch)
treea204e895205d18f49b09a0e2b9580ea9e3e2976b
parentc367dd8c2ed58b7ba1a134e513886aca2e549060 (diff)
parenta1fbaa6f9f1ab37ed64e4f326ac415e05e94cfee (diff)
downloadsdl_android-3a2800d55a150510749e2758ef72c95b7ecc5640.tar.gz
Merge pull request #1391 from smartdevicelink/feature/subscribe_buttons
Feature/subscribe buttons
-rwxr-xr-xandroid/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java35
-rw-r--r--android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/screen/SubscribeButtonManagerTest.java158
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java17
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java23
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/screen/BaseSubscribeButtonManager.java193
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/screen/OnButtonListener.java32
-rw-r--r--hello_sdl_java/src/main/java/com/smartdevicelink/java/SdlService.java36
-rw-r--r--javaSE/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java11
8 files changed, 498 insertions, 7 deletions
diff --git a/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java b/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java
index ec8afa812..893525b97 100755
--- a/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java
+++ b/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java
@@ -12,6 +12,7 @@ import android.os.IBinder;
import android.util.Log;
import com.smartdevicelink.managers.CompletionListener;
+import com.smartdevicelink.managers.screen.OnButtonListener;
import com.smartdevicelink.managers.SdlManager;
import com.smartdevicelink.managers.SdlManagerListener;
import com.smartdevicelink.managers.file.filetypes.SdlArtwork;
@@ -27,9 +28,12 @@ import com.smartdevicelink.protocol.enums.FunctionID;
import com.smartdevicelink.proxy.RPCNotification;
import com.smartdevicelink.proxy.TTSChunkFactory;
import com.smartdevicelink.proxy.rpc.Alert;
+import com.smartdevicelink.proxy.rpc.OnButtonEvent;
+import com.smartdevicelink.proxy.rpc.OnButtonPress;
import com.smartdevicelink.proxy.rpc.OnHMIStatus;
import com.smartdevicelink.proxy.rpc.Speak;
import com.smartdevicelink.proxy.rpc.enums.AppHMIType;
+import com.smartdevicelink.proxy.rpc.enums.ButtonName;
import com.smartdevicelink.proxy.rpc.enums.FileType;
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
import com.smartdevicelink.proxy.rpc.enums.InteractionMode;
@@ -183,6 +187,7 @@ public class SdlService extends Service {
performWelcomeSpeak();
performWelcomeShow();
preloadChoices();
+ subscribeToButtons();
}
}
});
@@ -371,6 +376,36 @@ public class SdlService extends Service {
}
/**
+ * Attempts to Subscribe to all preset buttons
+ */
+ private void subscribeToButtons() {
+ ButtonName[] buttonNames = {ButtonName.PLAY_PAUSE, ButtonName.SEEKLEFT, ButtonName.SEEKRIGHT, ButtonName.AC_MAX, ButtonName.AC, ButtonName.RECIRCULATE,
+ ButtonName.FAN_UP, ButtonName.FAN_DOWN, ButtonName.TEMP_UP, ButtonName.TEMP_DOWN, ButtonName.FAN_DOWN, ButtonName.DEFROST_MAX, ButtonName.DEFROST_REAR, ButtonName.DEFROST,
+ ButtonName.UPPER_VENT, ButtonName.LOWER_VENT, ButtonName.VOLUME_UP, ButtonName.VOLUME_DOWN, ButtonName.EJECT, ButtonName.SOURCE, ButtonName.SHUFFLE, ButtonName.REPEAT};
+
+ OnButtonListener onButtonListener = new OnButtonListener() {
+ @Override
+ public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
+ sdlManager.getScreenManager().setTextField1(buttonName + " pressed");
+ }
+
+ @Override
+ public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
+ sdlManager.getScreenManager().setTextField2(buttonName + " " + buttonEvent.getButtonEventMode());
+ }
+
+ @Override
+ public void onError(String info) {
+ Log.i(TAG, "onError: " + info);
+ }
+ };
+
+ for (ButtonName buttonName : buttonNames) {
+ sdlManager.getScreenManager().addButtonListener(buttonName, onButtonListener);
+ }
+ }
+
+ /**
* Will show a sample test message on screen as well as speak a sample test message
*/
private void showTest(){
diff --git a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/screen/SubscribeButtonManagerTest.java b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/screen/SubscribeButtonManagerTest.java
new file mode 100644
index 000000000..edca41770
--- /dev/null
+++ b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/screen/SubscribeButtonManagerTest.java
@@ -0,0 +1,158 @@
+package com.smartdevicelink.managers.screen;
+
+import com.smartdevicelink.AndroidTestCase2;
+import com.smartdevicelink.managers.BaseSubManager;
+import com.smartdevicelink.proxy.RPCMessage;
+import com.smartdevicelink.proxy.RPCRequest;
+import com.smartdevicelink.proxy.interfaces.ISdl;
+import com.smartdevicelink.proxy.rpc.OnButtonEvent;
+import com.smartdevicelink.proxy.rpc.OnButtonPress;
+import com.smartdevicelink.proxy.rpc.SubscribeButton;
+import com.smartdevicelink.proxy.rpc.SubscribeButtonResponse;
+import com.smartdevicelink.proxy.rpc.UnsubscribeButton;
+import com.smartdevicelink.proxy.rpc.UnsubscribeButtonResponse;
+import com.smartdevicelink.proxy.rpc.enums.ButtonName;
+import com.smartdevicelink.proxy.rpc.enums.Result;
+
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+
+public class SubscribeButtonManagerTest extends AndroidTestCase2 {
+ private SubscribeButtonManager subscribeButtonManager;
+ private ISdl internalInterface;
+
+ private Answer<Void> onSubscribe_UnsubscribeSuccess = new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) {
+ Object[] args = invocation.getArguments();
+ RPCRequest message = (RPCRequest) args[0];
+ if(message instanceof SubscribeButton){
+ SubscribeButtonResponse subscribeButtonResponse = new SubscribeButtonResponse();
+ subscribeButtonResponse.setSuccess(true);
+ message.getOnRPCResponseListener().onResponse(message.getCorrelationID(),subscribeButtonResponse);
+ }
+ if(message instanceof UnsubscribeButton) {
+ UnsubscribeButtonResponse unsubscribeButtonResponse = new UnsubscribeButtonResponse();
+ unsubscribeButtonResponse.setSuccess(true);
+ message.getOnRPCResponseListener().onResponse(message.getCorrelationID(), unsubscribeButtonResponse);
+ }
+ return null;
+ }
+ };
+
+
+ private Answer<Void> onSubscribeFail = new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) {
+ Object[] args = invocation.getArguments();
+ RPCRequest message = (RPCRequest) args[0];
+ if(message instanceof SubscribeButton){
+ SubscribeButtonResponse subscribeButtonResponse = new SubscribeButtonResponse();
+ subscribeButtonResponse.setSuccess(false);
+ message.getOnRPCResponseListener().onError(message.getCorrelationID(), Result.GENERIC_ERROR, "Fail");
+ }
+ return null;
+ }
+ };
+ private OnButtonListener listener = new OnButtonListener() {
+ @Override
+ public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
+
+ }
+
+ @Override
+ public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
+
+ }
+
+ @Override
+ public void onError(String info) {
+
+ }
+ };
+
+ private OnButtonListener listener2 = new OnButtonListener() {
+ @Override
+ public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
+
+ }
+
+ @Override
+ public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
+
+ }
+
+ @Override
+ public void onError(String info) {
+
+ }
+ };
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ internalInterface = mock(ISdl.class);
+ subscribeButtonManager = new SubscribeButtonManager(internalInterface);
+ }
+
+ public void testInstantiation(){
+ assertNotNull(subscribeButtonManager.onButtonListeners);
+ assertEquals(subscribeButtonManager.getState(), BaseSubManager.SETTING_UP);
+ }
+
+ public void testDispose() {
+ subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
+ subscribeButtonManager.dispose();
+ assertTrue(subscribeButtonManager.onButtonListeners.size() == 0);
+ }
+
+ public void testAddButtonListener() {
+ doAnswer(onSubscribe_UnsubscribeSuccess).when(internalInterface).sendRPC(any(RPCMessage.class));
+
+ subscribeButtonManager.addButtonListener(null, null);
+ assertTrue(subscribeButtonManager.onButtonListeners.size() == 0);
+
+ subscribeButtonManager.addButtonListener(null, listener);
+ assertTrue(subscribeButtonManager.onButtonListeners.size() == 0);
+
+ subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
+ assertTrue(subscribeButtonManager.onButtonListeners.containsKey(ButtonName.VOLUME_UP));
+
+ }
+
+ public void testAddButtonListenerError(){
+ doAnswer(onSubscribeFail).when(internalInterface).sendRPC(any(RPCMessage.class));
+ subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
+ assertFalse(subscribeButtonManager.onButtonListeners.containsKey(ButtonName.VOLUME_UP));
+ }
+
+ public void testRemoveButtonListener() {
+ doAnswer(onSubscribe_UnsubscribeSuccess).when(internalInterface).sendRPC(any(RPCMessage.class));
+
+ subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_DOWN, listener);
+ assertFalse(subscribeButtonManager.onButtonListeners.containsKey(ButtonName.VOLUME_DOWN));
+
+ subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
+ assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
+
+ subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_UP, listener2);
+ assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
+
+ subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
+ assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
+
+ subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener2);
+ assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 2);
+
+
+ subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_UP, listener);
+ assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
+
+ subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_UP, listener2);
+ assertNull(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP));
+ }
+}
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java
new file mode 100644
index 000000000..f38cf79d0
--- /dev/null
+++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java
@@ -0,0 +1,17 @@
+package com.smartdevicelink.managers.screen;
+
+import android.support.annotation.NonNull;
+import com.smartdevicelink.proxy.interfaces.ISdl;
+
+/**
+ * <strong>SubscribeButtonManager</strong> <br>
+ *
+ * Note: This class must be accessed through the SdlManager. Do not instantiate it by itself. <br>
+ *
+ */
+class SubscribeButtonManager extends BaseSubscribeButtonManager {
+
+ SubscribeButtonManager(@NonNull ISdl internalInterface) {
+ super(internalInterface);
+ }
+}
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 dac4df830..8ab2caecd 100644
--- a/base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java
+++ b/base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java
@@ -51,6 +51,7 @@ import com.smartdevicelink.managers.screen.menu.VoiceCommand;
import com.smartdevicelink.managers.screen.menu.VoiceCommandManager;
import com.smartdevicelink.proxy.interfaces.ISdl;
import com.smartdevicelink.proxy.rpc.KeyboardProperties;
+import com.smartdevicelink.proxy.rpc.enums.ButtonName;
import com.smartdevicelink.proxy.rpc.enums.InteractionMode;
import com.smartdevicelink.proxy.rpc.enums.MetadataType;
import com.smartdevicelink.proxy.rpc.enums.TextAlignment;
@@ -74,19 +75,23 @@ abstract class BaseScreenManager extends BaseSubManager {
private VoiceCommandManager voiceCommandManager;
private MenuManager menuManager;
private ChoiceSetManager choiceSetManager;
+ private SubscribeButtonManager subscribeButtonManager;
// Sub manager listener
private final CompletionListener subManagerListener = new CompletionListener() {
@Override
public synchronized void onComplete(boolean success) {
- if (softButtonManager != null && textAndGraphicManager != null && voiceCommandManager != null && menuManager != null && choiceSetManager != null) {
- if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY && voiceCommandManager.getState() == BaseSubManager.READY && menuManager.getState() == BaseSubManager.READY) {
+ if (softButtonManager != null && textAndGraphicManager != null && voiceCommandManager != null && menuManager != null && choiceSetManager != null && subscribeButtonManager != null) {
+ if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY && voiceCommandManager.getState() == BaseSubManager.READY && menuManager.getState() == BaseSubManager.READY
+ && subscribeButtonManager.getState() == BaseSubManager.READY) {
DebugTool.logInfo("Starting screen manager, all sub managers are in ready state");
transitionToState(READY);
- } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR && voiceCommandManager.getState() == BaseSubManager.ERROR && menuManager.getState() == BaseSubManager.ERROR && choiceSetManager.getState() == BaseSubManager.ERROR) {
+ } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR && voiceCommandManager.getState() == BaseSubManager.ERROR && menuManager.getState() == BaseSubManager.ERROR
+ && choiceSetManager.getState() == BaseSubManager.ERROR && subscribeButtonManager.getState() == BaseSubManager.ERROR) {
Log.e(TAG, "ERROR starting screen manager, all sub managers are in error state");
transitionToState(ERROR);
- } else if (textAndGraphicManager.getState() == BaseSubManager.SETTING_UP || softButtonManager.getState() == BaseSubManager.SETTING_UP || voiceCommandManager.getState() == BaseSubManager.SETTING_UP || menuManager.getState() == BaseSubManager.SETTING_UP || choiceSetManager.getState() == BaseSubManager.SETTING_UP) {
+ } else if (textAndGraphicManager.getState() == BaseSubManager.SETTING_UP || softButtonManager.getState() == BaseSubManager.SETTING_UP || voiceCommandManager.getState() == BaseSubManager.SETTING_UP || menuManager.getState() == BaseSubManager.SETTING_UP
+ || choiceSetManager.getState() == BaseSubManager.SETTING_UP || subscribeButtonManager.getState() == BaseSubManager.SETTING_UP) {
DebugTool.logInfo("SETTING UP screen manager, at least one sub manager is still setting up");
transitionToState(SETTING_UP);
} else {
@@ -115,6 +120,7 @@ abstract class BaseScreenManager extends BaseSubManager {
this.voiceCommandManager.start(subManagerListener);
this.menuManager.start(subManagerListener);
this.choiceSetManager.start(subManagerListener);
+ this.subscribeButtonManager.start(subManagerListener);
}
private void initialize(){
@@ -124,6 +130,7 @@ abstract class BaseScreenManager extends BaseSubManager {
this.menuManager = new MenuManager(internalInterface, fileManager.get());
this.choiceSetManager = new ChoiceSetManager(internalInterface, fileManager.get());
}
+ this.subscribeButtonManager = new SubscribeButtonManager(internalInterface);
this.voiceCommandManager = new VoiceCommandManager(internalInterface);
}
@@ -137,6 +144,7 @@ abstract class BaseScreenManager extends BaseSubManager {
voiceCommandManager.dispose();
menuManager.dispose();
choiceSetManager.dispose();
+ subscribeButtonManager.dispose();
super.dispose();
}
@@ -578,4 +586,11 @@ abstract class BaseScreenManager extends BaseSubManager {
}
});
}
+
+ public void addButtonListener(@NonNull ButtonName buttonName, @NonNull OnButtonListener listener){
+ subscribeButtonManager.addButtonListener(buttonName,listener);
+ }
+ public void removeButtonListener(@NonNull ButtonName buttonName, @NonNull OnButtonListener listener){
+ subscribeButtonManager.removeButtonListener(buttonName, listener);
+ }
}
diff --git a/base/src/main/java/com/smartdevicelink/managers/screen/BaseSubscribeButtonManager.java b/base/src/main/java/com/smartdevicelink/managers/screen/BaseSubscribeButtonManager.java
new file mode 100644
index 000000000..70996db4c
--- /dev/null
+++ b/base/src/main/java/com/smartdevicelink/managers/screen/BaseSubscribeButtonManager.java
@@ -0,0 +1,193 @@
+package com.smartdevicelink.managers.screen;
+
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import com.smartdevicelink.managers.BaseSubManager;
+import com.smartdevicelink.managers.CompletionListener;
+import com.smartdevicelink.protocol.enums.FunctionID;
+import com.smartdevicelink.proxy.RPCNotification;
+import com.smartdevicelink.proxy.RPCResponse;
+import com.smartdevicelink.proxy.interfaces.ISdl;
+import com.smartdevicelink.proxy.rpc.OnButtonEvent;
+import com.smartdevicelink.proxy.rpc.OnButtonPress;
+import com.smartdevicelink.proxy.rpc.SubscribeButton;
+import com.smartdevicelink.proxy.rpc.UnsubscribeButton;
+import com.smartdevicelink.proxy.rpc.enums.ButtonName;
+import com.smartdevicelink.proxy.rpc.enums.Result;
+import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener;
+import com.smartdevicelink.proxy.rpc.listeners.OnRPCResponseListener;
+
+import java.util.HashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * <strong>SubscribeButtonManager</strong> <br>
+ * <p>
+ * Note: This class must be accessed through the SdlManager. Do not instantiate it by itself. <br>
+ */
+abstract class BaseSubscribeButtonManager extends BaseSubManager {
+
+ private static final String TAG = "SubscribeButtonManager";
+ HashMap<ButtonName, CopyOnWriteArrayList<OnButtonListener>> onButtonListeners;
+ private OnRPCNotificationListener onButtonPressListener;
+ private OnRPCNotificationListener onButtonEventListener;
+
+ BaseSubscribeButtonManager(@NonNull ISdl internalInterface) {
+ super(internalInterface);
+ setRpcNotificationListeners();
+ onButtonListeners = new HashMap<>();
+ }
+
+ @Override
+ public void start(CompletionListener listener) {
+ transitionToState(READY);
+ super.start(listener);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (onButtonListeners != null) {
+ onButtonListeners.clear();
+ }
+ internalInterface.removeOnRPCNotificationListener(FunctionID.ON_BUTTON_PRESS, onButtonPressListener);
+ internalInterface.removeOnRPCNotificationListener(FunctionID.ON_BUTTON_EVENT, onButtonEventListener);
+ }
+
+ /***
+ * Checks to see if Button is already subscribed and adds listener to hashmap.
+ * If button is not already subscribed to, it call method:
+ * subscribeButtonRequest to send RPC request
+ * @param buttonName - Is the button that the developer wants to subscribe to
+ * @param listener - Is the listener that was sent by developer
+ */
+ void addButtonListener(ButtonName buttonName, OnButtonListener listener) {
+ if (listener == null) {
+ Log.e(TAG, "OnButtonListener cannot be null");
+ return;
+ }
+ if (buttonName == null) {
+ listener.onError("ButtonName cannot be null");
+ return;
+ }
+
+ if (onButtonListeners.get(buttonName) == null) {
+ subscribeButtonRequest(buttonName, listener);
+ return;
+ }
+
+ if (onButtonListeners.get(buttonName).contains(listener)) {
+ Log.w(TAG, "Already subscribed to button named: " + buttonName);
+ return;
+ }
+ onButtonListeners.get(buttonName).add(listener);
+ }
+
+ /**
+ * Unsubscribe form button and/or listener sent by developer
+ *
+ * @param buttonName Is the button that the developer wants to unsubscribe from
+ * @param listener - the listener that was sent by developer
+ */
+ void removeButtonListener(final ButtonName buttonName, final OnButtonListener listener) {
+ if (listener == null) {
+ Log.e(TAG, "OnButtonListener cannot be null: ");
+ return;
+ }
+
+ if (buttonName == null) {
+ listener.onError("ButtonName cannot be null");
+ return;
+ }
+
+ if (onButtonListeners.get(buttonName) == null || !onButtonListeners.get(buttonName).contains(listener)) {
+ listener.onError("Attempting to unsubscribe to the " + buttonName + " button failed because it is not currently subscribed");
+ return;
+ }
+
+ if (onButtonListeners.get(buttonName).size() > 1) {
+ onButtonListeners.get(buttonName).remove(listener);
+ return;
+ }
+ unsubscribeButtonRequest(buttonName, listener);
+ }
+
+ /**
+ * Send the UnsubscribeButton RPC
+ *
+ * @param buttonName - ButtonName - name of button
+ * @param listener - OnButtonListener - listener to get notified
+ */
+ private void unsubscribeButtonRequest(final ButtonName buttonName, final OnButtonListener listener) {
+ UnsubscribeButton unsubscribeButtonRequest = new UnsubscribeButton(buttonName);
+ unsubscribeButtonRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
+ @Override
+ public void onResponse(int correlationId, RPCResponse response) {
+ onButtonListeners.remove(buttonName);
+ }
+
+ @Override
+ public void onError(int correlationId, Result resultCode, String info) {
+ listener.onError("Attempt to unsubscribe to button named " + buttonName + " Failed. ResultCode: " + resultCode + " info: " + info);
+ }
+ });
+ internalInterface.sendRPC(unsubscribeButtonRequest);
+ }
+
+ /**
+ * Send the SubscribeButton RPC
+ *
+ * @param buttonName - ButtonName - name of button
+ * @param listener - OnButtonListener - listener to get notified
+ */
+ private void subscribeButtonRequest(final ButtonName buttonName, final OnButtonListener listener) {
+ SubscribeButton subscribeButtonRequest = new SubscribeButton(buttonName);
+ subscribeButtonRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
+ @Override
+ public void onResponse(int correlationId, RPCResponse response) {
+ onButtonListeners.put(buttonName, new CopyOnWriteArrayList<OnButtonListener>());
+ onButtonListeners.get(buttonName).add(listener);
+ }
+
+ @Override
+ public void onError(int correlationId, Result resultCode, String info) {
+ listener.onError("Attempt to subscribe to button named " + buttonName + " Failed . ResultCode: " + resultCode + " info: " + info);
+ }
+ });
+ internalInterface.sendRPC(subscribeButtonRequest);
+ }
+
+ /**
+ * Sets up RpcNotificationListeners for button presses and events, is setup when manager is created
+ */
+ private void setRpcNotificationListeners() {
+ onButtonPressListener = new OnRPCNotificationListener() {
+ @Override
+ public void onNotified(RPCNotification notification) {
+ OnButtonPress onButtonPressNotification = (OnButtonPress) notification;
+ CopyOnWriteArrayList<OnButtonListener> listeners = onButtonListeners.get(onButtonPressNotification.getButtonName());
+ if (listeners != null && listeners.size() > 0) {
+ for (OnButtonListener listener : listeners) {
+ listener.onPress(onButtonPressNotification.getButtonName(), onButtonPressNotification);
+ }
+ }
+ }
+ };
+ internalInterface.addOnRPCNotificationListener(FunctionID.ON_BUTTON_PRESS, onButtonPressListener);
+
+ onButtonEventListener = new OnRPCNotificationListener() {
+ @Override
+ public void onNotified(RPCNotification notification) {
+ OnButtonEvent onButtonEvent = (OnButtonEvent) notification;
+ CopyOnWriteArrayList<OnButtonListener> listeners = onButtonListeners.get(onButtonEvent.getButtonName());
+ if (listeners != null && listeners.size() > 0) {
+ for (OnButtonListener listener : listeners) {
+ listener.onEvent(onButtonEvent.getButtonName(), onButtonEvent);
+ }
+ }
+ }
+ };
+ internalInterface.addOnRPCNotificationListener(FunctionID.ON_BUTTON_EVENT, onButtonEventListener);
+ }
+}
diff --git a/base/src/main/java/com/smartdevicelink/managers/screen/OnButtonListener.java b/base/src/main/java/com/smartdevicelink/managers/screen/OnButtonListener.java
new file mode 100644
index 000000000..ba2910307
--- /dev/null
+++ b/base/src/main/java/com/smartdevicelink/managers/screen/OnButtonListener.java
@@ -0,0 +1,32 @@
+package com.smartdevicelink.managers.screen;
+
+import com.smartdevicelink.proxy.rpc.OnButtonEvent;
+import com.smartdevicelink.proxy.rpc.OnButtonPress;
+import com.smartdevicelink.proxy.rpc.enums.ButtonName;
+
+/**
+ * OnButtonListener is a listener used for notifying when events have happened with SubscribeButtons
+ */
+public interface OnButtonListener {
+
+ /**
+ * Returns when a Subscribed button is pressed
+ * @param buttonName - Name of Button
+ * @param buttonPress - OnButtonPress
+ */
+ void onPress(ButtonName buttonName, OnButtonPress buttonPress);
+
+ /**
+ * Returns when a Subscribed button Event has occurred
+ * @param buttonName - Name of Button
+ * @param buttonEvent - OnButtonEvent
+ */
+ void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent);
+
+ /**
+ * Returns when there is an error with subscribing to button
+ * @param info - Error info
+ */
+ void onError(String info);
+}
+
diff --git a/hello_sdl_java/src/main/java/com/smartdevicelink/java/SdlService.java b/hello_sdl_java/src/main/java/com/smartdevicelink/java/SdlService.java
index 328527e8c..d53b64b9c 100644
--- a/hello_sdl_java/src/main/java/com/smartdevicelink/java/SdlService.java
+++ b/hello_sdl_java/src/main/java/com/smartdevicelink/java/SdlService.java
@@ -34,6 +34,7 @@ package com.smartdevicelink.java;
import android.util.Log;
import com.smartdevicelink.managers.CompletionListener;
+import com.smartdevicelink.managers.screen.OnButtonListener;
import com.smartdevicelink.managers.SdlManager;
import com.smartdevicelink.managers.SdlManagerListener;
import com.smartdevicelink.managers.file.filetypes.SdlArtwork;
@@ -76,15 +77,12 @@ public class SdlService {
private static final String IMAGE_DIR = "assets/images/";
-
-
// variable to create and call functions of the SyncProxy
private SdlManager sdlManager = null;
private List<ChoiceCell> choiceCellList;
private SdlServiceCallback callback;
-
public SdlService(BaseTransportConfig config, SdlServiceCallback callback){
this.callback = callback;
buildSdlManager(config);
@@ -192,6 +190,7 @@ public class SdlService {
performWelcomeSpeak();
performWelcomeShow();
preloadChoices();
+ subscribeToButtons();
}
}
});
@@ -328,6 +327,37 @@ public class SdlService {
}
/**
+ * Attempts to Subscribe to all preset buttons
+ */
+ private void subscribeToButtons() {
+ ButtonName[] buttonNames = {ButtonName.PLAY_PAUSE, ButtonName.SEEKLEFT, ButtonName.SEEKRIGHT, ButtonName.AC_MAX, ButtonName.AC, ButtonName.RECIRCULATE,
+ ButtonName.FAN_UP, ButtonName.FAN_DOWN, ButtonName.TEMP_UP, ButtonName.TEMP_DOWN, ButtonName.FAN_DOWN, ButtonName.DEFROST_MAX, ButtonName.DEFROST_REAR, ButtonName.DEFROST,
+ ButtonName.UPPER_VENT, ButtonName.LOWER_VENT, ButtonName.VOLUME_UP, ButtonName.VOLUME_DOWN, ButtonName.EJECT, ButtonName.SOURCE, ButtonName.SHUFFLE, ButtonName.REPEAT};
+
+ OnButtonListener onButtonListener = new OnButtonListener() {
+ @Override
+ public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
+ sdlManager.getScreenManager().setTextField1(buttonName + " pressed");
+ Log.i(TAG, "onPress: " + buttonName);
+ }
+
+ @Override
+ public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
+ sdlManager.getScreenManager().setTextField2(buttonName + " " + buttonEvent.getButtonEventMode());
+ }
+
+ @Override
+ public void onError(String info) {
+ Log.i(TAG, "onError: " + info);
+ }
+ };
+
+ for (ButtonName buttonName : buttonNames) {
+ sdlManager.getScreenManager().addButtonListener(buttonName, onButtonListener);
+ }
+ }
+
+ /**
* Will show a sample test message on screen as well as speak a sample test message
*/
private void showTest(){
diff --git a/javaSE/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java b/javaSE/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java
new file mode 100644
index 000000000..c34b0775d
--- /dev/null
+++ b/javaSE/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java
@@ -0,0 +1,11 @@
+package com.smartdevicelink.managers.screen;
+
+import android.support.annotation.NonNull;
+import com.smartdevicelink.proxy.interfaces.ISdl;
+
+public class SubscribeButtonManager extends BaseSubscribeButtonManager {
+
+ public SubscribeButtonManager(@NonNull ISdl internalInterface) {
+ super(internalInterface);
+ }
+}