Skip to content

Commit 3a2800d

Browse files
Merge pull request #1391 from smartdevicelink/feature/subscribe_buttons
Feature/subscribe buttons
2 parents c367dd8 + a1fbaa6 commit 3a2800d

8 files changed

Lines changed: 498 additions & 7 deletions

File tree

android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import android.util.Log;
1313

1414
import com.smartdevicelink.managers.CompletionListener;
15+
import com.smartdevicelink.managers.screen.OnButtonListener;
1516
import com.smartdevicelink.managers.SdlManager;
1617
import com.smartdevicelink.managers.SdlManagerListener;
1718
import com.smartdevicelink.managers.file.filetypes.SdlArtwork;
@@ -27,9 +28,12 @@
2728
import com.smartdevicelink.proxy.RPCNotification;
2829
import com.smartdevicelink.proxy.TTSChunkFactory;
2930
import com.smartdevicelink.proxy.rpc.Alert;
31+
import com.smartdevicelink.proxy.rpc.OnButtonEvent;
32+
import com.smartdevicelink.proxy.rpc.OnButtonPress;
3033
import com.smartdevicelink.proxy.rpc.OnHMIStatus;
3134
import com.smartdevicelink.proxy.rpc.Speak;
3235
import com.smartdevicelink.proxy.rpc.enums.AppHMIType;
36+
import com.smartdevicelink.proxy.rpc.enums.ButtonName;
3337
import com.smartdevicelink.proxy.rpc.enums.FileType;
3438
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
3539
import com.smartdevicelink.proxy.rpc.enums.InteractionMode;
@@ -183,6 +187,7 @@ public void onNotified(RPCNotification notification) {
183187
performWelcomeSpeak();
184188
performWelcomeShow();
185189
preloadChoices();
190+
subscribeToButtons();
186191
}
187192
}
188193
});
@@ -370,6 +375,36 @@ public void onComplete(boolean success) {
370375
});
371376
}
372377

378+
/**
379+
* Attempts to Subscribe to all preset buttons
380+
*/
381+
private void subscribeToButtons() {
382+
ButtonName[] buttonNames = {ButtonName.PLAY_PAUSE, ButtonName.SEEKLEFT, ButtonName.SEEKRIGHT, ButtonName.AC_MAX, ButtonName.AC, ButtonName.RECIRCULATE,
383+
ButtonName.FAN_UP, ButtonName.FAN_DOWN, ButtonName.TEMP_UP, ButtonName.TEMP_DOWN, ButtonName.FAN_DOWN, ButtonName.DEFROST_MAX, ButtonName.DEFROST_REAR, ButtonName.DEFROST,
384+
ButtonName.UPPER_VENT, ButtonName.LOWER_VENT, ButtonName.VOLUME_UP, ButtonName.VOLUME_DOWN, ButtonName.EJECT, ButtonName.SOURCE, ButtonName.SHUFFLE, ButtonName.REPEAT};
385+
386+
OnButtonListener onButtonListener = new OnButtonListener() {
387+
@Override
388+
public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
389+
sdlManager.getScreenManager().setTextField1(buttonName + " pressed");
390+
}
391+
392+
@Override
393+
public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
394+
sdlManager.getScreenManager().setTextField2(buttonName + " " + buttonEvent.getButtonEventMode());
395+
}
396+
397+
@Override
398+
public void onError(String info) {
399+
Log.i(TAG, "onError: " + info);
400+
}
401+
};
402+
403+
for (ButtonName buttonName : buttonNames) {
404+
sdlManager.getScreenManager().addButtonListener(buttonName, onButtonListener);
405+
}
406+
}
407+
373408
/**
374409
* Will show a sample test message on screen as well as speak a sample test message
375410
*/
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package com.smartdevicelink.managers.screen;
2+
3+
import com.smartdevicelink.AndroidTestCase2;
4+
import com.smartdevicelink.managers.BaseSubManager;
5+
import com.smartdevicelink.proxy.RPCMessage;
6+
import com.smartdevicelink.proxy.RPCRequest;
7+
import com.smartdevicelink.proxy.interfaces.ISdl;
8+
import com.smartdevicelink.proxy.rpc.OnButtonEvent;
9+
import com.smartdevicelink.proxy.rpc.OnButtonPress;
10+
import com.smartdevicelink.proxy.rpc.SubscribeButton;
11+
import com.smartdevicelink.proxy.rpc.SubscribeButtonResponse;
12+
import com.smartdevicelink.proxy.rpc.UnsubscribeButton;
13+
import com.smartdevicelink.proxy.rpc.UnsubscribeButtonResponse;
14+
import com.smartdevicelink.proxy.rpc.enums.ButtonName;
15+
import com.smartdevicelink.proxy.rpc.enums.Result;
16+
17+
import org.mockito.invocation.InvocationOnMock;
18+
import org.mockito.stubbing.Answer;
19+
20+
import static org.mockito.ArgumentMatchers.any;
21+
import static org.mockito.Mockito.doAnswer;
22+
import static org.mockito.Mockito.mock;
23+
24+
public class SubscribeButtonManagerTest extends AndroidTestCase2 {
25+
private SubscribeButtonManager subscribeButtonManager;
26+
private ISdl internalInterface;
27+
28+
private Answer<Void> onSubscribe_UnsubscribeSuccess = new Answer<Void>() {
29+
@Override
30+
public Void answer(InvocationOnMock invocation) {
31+
Object[] args = invocation.getArguments();
32+
RPCRequest message = (RPCRequest) args[0];
33+
if(message instanceof SubscribeButton){
34+
SubscribeButtonResponse subscribeButtonResponse = new SubscribeButtonResponse();
35+
subscribeButtonResponse.setSuccess(true);
36+
message.getOnRPCResponseListener().onResponse(message.getCorrelationID(),subscribeButtonResponse);
37+
}
38+
if(message instanceof UnsubscribeButton) {
39+
UnsubscribeButtonResponse unsubscribeButtonResponse = new UnsubscribeButtonResponse();
40+
unsubscribeButtonResponse.setSuccess(true);
41+
message.getOnRPCResponseListener().onResponse(message.getCorrelationID(), unsubscribeButtonResponse);
42+
}
43+
return null;
44+
}
45+
};
46+
47+
48+
private Answer<Void> onSubscribeFail = new Answer<Void>() {
49+
@Override
50+
public Void answer(InvocationOnMock invocation) {
51+
Object[] args = invocation.getArguments();
52+
RPCRequest message = (RPCRequest) args[0];
53+
if(message instanceof SubscribeButton){
54+
SubscribeButtonResponse subscribeButtonResponse = new SubscribeButtonResponse();
55+
subscribeButtonResponse.setSuccess(false);
56+
message.getOnRPCResponseListener().onError(message.getCorrelationID(), Result.GENERIC_ERROR, "Fail");
57+
}
58+
return null;
59+
}
60+
};
61+
private OnButtonListener listener = new OnButtonListener() {
62+
@Override
63+
public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
64+
65+
}
66+
67+
@Override
68+
public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
69+
70+
}
71+
72+
@Override
73+
public void onError(String info) {
74+
75+
}
76+
};
77+
78+
private OnButtonListener listener2 = new OnButtonListener() {
79+
@Override
80+
public void onPress(ButtonName buttonName, OnButtonPress buttonPress) {
81+
82+
}
83+
84+
@Override
85+
public void onEvent(ButtonName buttonName, OnButtonEvent buttonEvent) {
86+
87+
}
88+
89+
@Override
90+
public void onError(String info) {
91+
92+
}
93+
};
94+
95+
@Override
96+
public void setUp() throws Exception {
97+
super.setUp();
98+
internalInterface = mock(ISdl.class);
99+
subscribeButtonManager = new SubscribeButtonManager(internalInterface);
100+
}
101+
102+
public void testInstantiation(){
103+
assertNotNull(subscribeButtonManager.onButtonListeners);
104+
assertEquals(subscribeButtonManager.getState(), BaseSubManager.SETTING_UP);
105+
}
106+
107+
public void testDispose() {
108+
subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
109+
subscribeButtonManager.dispose();
110+
assertTrue(subscribeButtonManager.onButtonListeners.size() == 0);
111+
}
112+
113+
public void testAddButtonListener() {
114+
doAnswer(onSubscribe_UnsubscribeSuccess).when(internalInterface).sendRPC(any(RPCMessage.class));
115+
116+
subscribeButtonManager.addButtonListener(null, null);
117+
assertTrue(subscribeButtonManager.onButtonListeners.size() == 0);
118+
119+
subscribeButtonManager.addButtonListener(null, listener);
120+
assertTrue(subscribeButtonManager.onButtonListeners.size() == 0);
121+
122+
subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
123+
assertTrue(subscribeButtonManager.onButtonListeners.containsKey(ButtonName.VOLUME_UP));
124+
125+
}
126+
127+
public void testAddButtonListenerError(){
128+
doAnswer(onSubscribeFail).when(internalInterface).sendRPC(any(RPCMessage.class));
129+
subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
130+
assertFalse(subscribeButtonManager.onButtonListeners.containsKey(ButtonName.VOLUME_UP));
131+
}
132+
133+
public void testRemoveButtonListener() {
134+
doAnswer(onSubscribe_UnsubscribeSuccess).when(internalInterface).sendRPC(any(RPCMessage.class));
135+
136+
subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_DOWN, listener);
137+
assertFalse(subscribeButtonManager.onButtonListeners.containsKey(ButtonName.VOLUME_DOWN));
138+
139+
subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
140+
assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
141+
142+
subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_UP, listener2);
143+
assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
144+
145+
subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener);
146+
assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
147+
148+
subscribeButtonManager.addButtonListener(ButtonName.VOLUME_UP, listener2);
149+
assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 2);
150+
151+
152+
subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_UP, listener);
153+
assertTrue(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP).size() == 1);
154+
155+
subscribeButtonManager.removeButtonListener(ButtonName.VOLUME_UP, listener2);
156+
assertNull(subscribeButtonManager.onButtonListeners.get(ButtonName.VOLUME_UP));
157+
}
158+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.smartdevicelink.managers.screen;
2+
3+
import android.support.annotation.NonNull;
4+
import com.smartdevicelink.proxy.interfaces.ISdl;
5+
6+
/**
7+
* <strong>SubscribeButtonManager</strong> <br>
8+
*
9+
* Note: This class must be accessed through the SdlManager. Do not instantiate it by itself. <br>
10+
*
11+
*/
12+
class SubscribeButtonManager extends BaseSubscribeButtonManager {
13+
14+
SubscribeButtonManager(@NonNull ISdl internalInterface) {
15+
super(internalInterface);
16+
}
17+
}

base/src/main/java/com/smartdevicelink/managers/screen/BaseScreenManager.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.smartdevicelink.managers.screen.menu.VoiceCommandManager;
5252
import com.smartdevicelink.proxy.interfaces.ISdl;
5353
import com.smartdevicelink.proxy.rpc.KeyboardProperties;
54+
import com.smartdevicelink.proxy.rpc.enums.ButtonName;
5455
import com.smartdevicelink.proxy.rpc.enums.InteractionMode;
5556
import com.smartdevicelink.proxy.rpc.enums.MetadataType;
5657
import com.smartdevicelink.proxy.rpc.enums.TextAlignment;
@@ -74,19 +75,23 @@ abstract class BaseScreenManager extends BaseSubManager {
7475
private VoiceCommandManager voiceCommandManager;
7576
private MenuManager menuManager;
7677
private ChoiceSetManager choiceSetManager;
78+
private SubscribeButtonManager subscribeButtonManager;
7779

7880
// Sub manager listener
7981
private final CompletionListener subManagerListener = new CompletionListener() {
8082
@Override
8183
public synchronized void onComplete(boolean success) {
82-
if (softButtonManager != null && textAndGraphicManager != null && voiceCommandManager != null && menuManager != null && choiceSetManager != null) {
83-
if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY && voiceCommandManager.getState() == BaseSubManager.READY && menuManager.getState() == BaseSubManager.READY) {
84+
if (softButtonManager != null && textAndGraphicManager != null && voiceCommandManager != null && menuManager != null && choiceSetManager != null && subscribeButtonManager != null) {
85+
if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY && voiceCommandManager.getState() == BaseSubManager.READY && menuManager.getState() == BaseSubManager.READY
86+
&& subscribeButtonManager.getState() == BaseSubManager.READY) {
8487
DebugTool.logInfo("Starting screen manager, all sub managers are in ready state");
8588
transitionToState(READY);
86-
} else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR && voiceCommandManager.getState() == BaseSubManager.ERROR && menuManager.getState() == BaseSubManager.ERROR && choiceSetManager.getState() == BaseSubManager.ERROR) {
89+
} else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR && voiceCommandManager.getState() == BaseSubManager.ERROR && menuManager.getState() == BaseSubManager.ERROR
90+
&& choiceSetManager.getState() == BaseSubManager.ERROR && subscribeButtonManager.getState() == BaseSubManager.ERROR) {
8791
Log.e(TAG, "ERROR starting screen manager, all sub managers are in error state");
8892
transitionToState(ERROR);
89-
} 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) {
93+
} else if (textAndGraphicManager.getState() == BaseSubManager.SETTING_UP || softButtonManager.getState() == BaseSubManager.SETTING_UP || voiceCommandManager.getState() == BaseSubManager.SETTING_UP || menuManager.getState() == BaseSubManager.SETTING_UP
94+
|| choiceSetManager.getState() == BaseSubManager.SETTING_UP || subscribeButtonManager.getState() == BaseSubManager.SETTING_UP) {
9095
DebugTool.logInfo("SETTING UP screen manager, at least one sub manager is still setting up");
9196
transitionToState(SETTING_UP);
9297
} else {
@@ -115,6 +120,7 @@ public void start(CompletionListener listener) {
115120
this.voiceCommandManager.start(subManagerListener);
116121
this.menuManager.start(subManagerListener);
117122
this.choiceSetManager.start(subManagerListener);
123+
this.subscribeButtonManager.start(subManagerListener);
118124
}
119125

120126
private void initialize(){
@@ -124,6 +130,7 @@ private void initialize(){
124130
this.menuManager = new MenuManager(internalInterface, fileManager.get());
125131
this.choiceSetManager = new ChoiceSetManager(internalInterface, fileManager.get());
126132
}
133+
this.subscribeButtonManager = new SubscribeButtonManager(internalInterface);
127134
this.voiceCommandManager = new VoiceCommandManager(internalInterface);
128135
}
129136

@@ -137,6 +144,7 @@ public void dispose() {
137144
voiceCommandManager.dispose();
138145
menuManager.dispose();
139146
choiceSetManager.dispose();
147+
subscribeButtonManager.dispose();
140148
super.dispose();
141149
}
142150

@@ -578,4 +586,11 @@ public void onComplete(boolean success) {
578586
}
579587
});
580588
}
589+
590+
public void addButtonListener(@NonNull ButtonName buttonName, @NonNull OnButtonListener listener){
591+
subscribeButtonManager.addButtonListener(buttonName,listener);
592+
}
593+
public void removeButtonListener(@NonNull ButtonName buttonName, @NonNull OnButtonListener listener){
594+
subscribeButtonManager.removeButtonListener(buttonName, listener);
595+
}
581596
}

0 commit comments

Comments
 (0)