diff options
author | Bilal Alsharifi <599206+bilal-alsharifi@users.noreply.github.com> | 2020-06-30 11:38:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-30 11:38:25 -0400 |
commit | 3a2800d55a150510749e2758ef72c95b7ecc5640 (patch) | |
tree | a204e895205d18f49b09a0e2b9580ea9e3e2976b | |
parent | c367dd8c2ed58b7ba1a134e513886aca2e549060 (diff) | |
parent | a1fbaa6f9f1ab37ed64e4f326ac415e05e94cfee (diff) | |
download | sdl_android-3a2800d55a150510749e2758ef72c95b7ecc5640.tar.gz |
Merge pull request #1391 from smartdevicelink/feature/subscribe_buttons
Feature/subscribe buttons
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); + } +} |