Skip to content

Commit 0c3b2af

Browse files
Update LCM to workaround Sync 3 bug with media capabilities (#1694)
* Add workaround to solve issue 1690 * Add unit tests for the workaround
1 parent be4e58b commit 0c3b2af

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.smartdevicelink.proxy.rpc.GetSystemCapability;
2323
import com.smartdevicelink.proxy.rpc.GetSystemCapabilityResponse;
2424
import com.smartdevicelink.proxy.rpc.HMICapabilities;
25+
import com.smartdevicelink.proxy.rpc.ImageField;
2526
import com.smartdevicelink.proxy.rpc.OnHMIStatus;
2627
import com.smartdevicelink.proxy.rpc.OnSystemCapabilityUpdated;
2728
import com.smartdevicelink.proxy.rpc.PhoneCapability;
@@ -37,10 +38,13 @@
3738
import com.smartdevicelink.proxy.rpc.enums.AppServiceType;
3839
import com.smartdevicelink.proxy.rpc.enums.AudioStreamingState;
3940
import com.smartdevicelink.proxy.rpc.enums.DisplayType;
41+
import com.smartdevicelink.proxy.rpc.enums.FileType;
4042
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
4143
import com.smartdevicelink.proxy.rpc.enums.HmiZoneCapabilities;
44+
import com.smartdevicelink.proxy.rpc.enums.ImageFieldName;
4245
import com.smartdevicelink.proxy.rpc.enums.ImageType;
4346
import com.smartdevicelink.proxy.rpc.enums.MediaClockFormat;
47+
import com.smartdevicelink.proxy.rpc.enums.PredefinedLayout;
4448
import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
4549
import com.smartdevicelink.proxy.rpc.enums.PrerecordedSpeech;
4650
import com.smartdevicelink.proxy.rpc.enums.Result;
@@ -1075,4 +1079,33 @@ public PermissionManager getPermissionManager() {
10751079
return null;
10761080
}
10771081
}
1082+
1083+
@Test
1084+
public void testFixingIncorrectCapabilities() {
1085+
SetDisplayLayoutResponse setDisplayLayoutResponse;
1086+
1087+
DisplayCapabilities RegisterAppInterFaceCapabilities = new DisplayCapabilities()
1088+
.setImageFields(Collections.singletonList(new ImageField(ImageFieldName.graphic, Collections.singletonList(FileType.GRAPHIC_PNG))));
1089+
1090+
DisplayCapabilities setDisplayLayoutCapabilities = new DisplayCapabilities()
1091+
.setImageFields(new ArrayList<ImageField>());
1092+
1093+
LifecycleManager lcm = new LifecycleManager(new BaseLifecycleManager.AppConfig(), null, null);
1094+
lcm.initialMediaCapabilities = RegisterAppInterFaceCapabilities;
1095+
1096+
1097+
// Test switching to MEDIA template - Capabilities in setDisplayLayoutResponse should be replaced with the ones from RAIR
1098+
lcm.lastDisplayLayoutRequestTemplate = PredefinedLayout.MEDIA.toString();
1099+
setDisplayLayoutResponse = new SetDisplayLayoutResponse()
1100+
.setDisplayCapabilities(setDisplayLayoutCapabilities);
1101+
lcm.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
1102+
assertEquals(RegisterAppInterFaceCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
1103+
1104+
// Test switching to non-MEDIA template - Capabilities in setDisplayLayoutResponse should not be altered
1105+
lcm.lastDisplayLayoutRequestTemplate = PredefinedLayout.TEXT_WITH_GRAPHIC.toString();
1106+
setDisplayLayoutResponse = new SetDisplayLayoutResponse()
1107+
.setDisplayCapabilities(setDisplayLayoutCapabilities);
1108+
lcm.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
1109+
assertEquals(setDisplayLayoutCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
1110+
}
10781111
}

base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.smartdevicelink.proxy.RPCNotification;
5353
import com.smartdevicelink.proxy.RPCRequest;
5454
import com.smartdevicelink.proxy.RPCResponse;
55+
import com.smartdevicelink.proxy.rpc.DisplayCapabilities;
5556
import com.smartdevicelink.proxy.rpc.GenericResponse;
5657
import com.smartdevicelink.proxy.rpc.OnAppInterfaceUnregistered;
5758
import com.smartdevicelink.proxy.rpc.OnButtonEvent;
@@ -61,6 +62,8 @@
6162
import com.smartdevicelink.proxy.rpc.RegisterAppInterface;
6263
import com.smartdevicelink.proxy.rpc.RegisterAppInterfaceResponse;
6364
import com.smartdevicelink.proxy.rpc.SdlMsgVersion;
65+
import com.smartdevicelink.proxy.rpc.SetDisplayLayout;
66+
import com.smartdevicelink.proxy.rpc.SetDisplayLayoutResponse;
6467
import com.smartdevicelink.proxy.rpc.SubscribeButton;
6568
import com.smartdevicelink.proxy.rpc.SystemRequest;
6669
import com.smartdevicelink.proxy.rpc.TTSChunk;
@@ -73,6 +76,7 @@
7376
import com.smartdevicelink.proxy.rpc.enums.FileType;
7477
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
7578
import com.smartdevicelink.proxy.rpc.enums.Language;
79+
import com.smartdevicelink.proxy.rpc.enums.PredefinedLayout;
7680
import com.smartdevicelink.proxy.rpc.enums.RequestType;
7781
import com.smartdevicelink.proxy.rpc.enums.Result;
7882
import com.smartdevicelink.proxy.rpc.enums.SdlDisconnectedReason;
@@ -132,6 +136,8 @@ abstract class BaseLifecycleManager {
132136
BaseTransportConfig _transportConfig;
133137
private Taskmaster taskmaster;
134138
private boolean didCheckSystemInfo = false;
139+
String lastDisplayLayoutRequestTemplate;
140+
DisplayCapabilities initialMediaCapabilities;
135141

136142
BaseLifecycleManager(AppConfig appConfig, BaseTransportConfig config, LifecycleListener listener) {
137143
this.appConfig = appConfig;
@@ -405,6 +411,10 @@ public void onReceived(RPCMessage message) {
405411
//If the vehicle is acceptable and this is the first check, init security lib
406412
setSecurityLibraryIfAvailable(vehicleType);
407413
}
414+
// HAX: Issue #1690, Ford Sync bug returning incorrect display capabilities (https://github.com/smartdevicelink/sdl_java_suite/issues/1690). Store the initial capabilities if we are a media app so that we can use them in the future.
415+
if (appConfig.appType.contains(AppHMIType.MEDIA)) {
416+
initialMediaCapabilities = raiResponse.getDisplayCapabilities();
417+
}
408418
systemCapabilityManager.parseRAIResponse(raiResponse);
409419
break;
410420
case ON_HMI_STATUS:
@@ -825,6 +835,10 @@ private void sendRPCMessagePrivate(RPCMessage message, boolean isInternalMessage
825835
addOnRPCResponseListener(listener, corrId);
826836
}
827837
}
838+
// HAX: Issue #1690, Ford Sync bug returning incorrect display capabilities (https://github.com/smartdevicelink/sdl_java_suite/issues/1690). Save the next desired layout type to the update capabilities when the SetDisplayLayout response is received
839+
if (FunctionID.SET_DISPLAY_LAYOUT.toString().equals(message.getFunctionName())) {
840+
lastDisplayLayoutRequestTemplate = ((SetDisplayLayout)message).getDisplayLayout();
841+
}
828842
} else if (RPCMessage.KEY_RESPONSE.equals(message.getMessageType())) { // Response Specifics
829843
RPCResponse response = (RPCResponse) message;
830844
pm.setRPCType((byte) 0x01);
@@ -855,6 +869,16 @@ private void sendRPCMessagePrivate(RPCMessage message, boolean isInternalMessage
855869
}
856870
}
857871

872+
// HAX: Issue #1690, Ford Sync bug returning incorrect display capabilities (https://github.com/smartdevicelink/sdl_java_suite/issues/1690). Use the initial capabilities from RAIR instead of the incorrect ones that are included in SetDisplayLayoutResponse.
873+
void fixIncorrectDisplayCapabilities(RPCMessage rpc) {
874+
if (RPCMessage.KEY_RESPONSE.equals(rpc.getMessageType()) && rpc.getFunctionName().equals(FunctionID.SET_DISPLAY_LAYOUT.toString()) &&
875+
initialMediaCapabilities != null && lastDisplayLayoutRequestTemplate.equals(PredefinedLayout.MEDIA.toString())) {
876+
877+
SetDisplayLayoutResponse setDisplayLayoutResponse = (SetDisplayLayoutResponse) rpc;
878+
setDisplayLayoutResponse.setDisplayCapabilities(initialMediaCapabilities);
879+
}
880+
}
881+
858882
/* *******************************************************************************************************
859883
**************************************** ISdlSessionListener START **************************************
860884
*********************************************************************************************************/
@@ -875,6 +899,8 @@ public void onRPCMessageReceived(RPCMessage rpc) {
875899

876900
rpc.format(rpcSpecVersion, true);
877901

902+
fixIncorrectDisplayCapabilities(rpc);
903+
878904
BaseLifecycleManager.this.onRPCReceived(rpc);
879905

880906
if (RPCMessage.KEY_RESPONSE.equals(messageType)) {
@@ -1197,6 +1223,8 @@ private RPCNotification handleButtonNotificationFormatting(RPCMessage notificati
11971223
void clean() {
11981224
firstTimeFull = true;
11991225
currentHMIStatus = null;
1226+
lastDisplayLayoutRequestTemplate = null;
1227+
initialMediaCapabilities = null;
12001228
if (rpcListeners != null) {
12011229
rpcListeners.clear();
12021230
}

0 commit comments

Comments
 (0)