summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBilal Alsharifi <599206+bilal-alsharifi@users.noreply.github.com>2021-05-25 15:37:27 -0400
committerGitHub <noreply@github.com>2021-05-25 15:37:27 -0400
commit0c3b2afd6c88699dc87944efda26f8ba4c96dbc7 (patch)
tree2f270af7655aa1723d463140ac124d54cfd8e655
parentbe4e58b755567b939fcfb06b00e7772a90868909 (diff)
downloadsdl_android-0c3b2afd6c88699dc87944efda26f8ba4c96dbc7.tar.gz
Update LCM to workaround Sync 3 bug with media capabilities (#1694)
* Add workaround to solve issue 1690 * Add unit tests for the workaround
-rw-r--r--android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java33
-rw-r--r--base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java28
2 files changed, 61 insertions, 0 deletions
diff --git a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java
index 28f09f8bb..21837014e 100644
--- a/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java
+++ b/android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java
@@ -22,6 +22,7 @@ import com.smartdevicelink.proxy.rpc.DisplayCapability;
import com.smartdevicelink.proxy.rpc.GetSystemCapability;
import com.smartdevicelink.proxy.rpc.GetSystemCapabilityResponse;
import com.smartdevicelink.proxy.rpc.HMICapabilities;
+import com.smartdevicelink.proxy.rpc.ImageField;
import com.smartdevicelink.proxy.rpc.OnHMIStatus;
import com.smartdevicelink.proxy.rpc.OnSystemCapabilityUpdated;
import com.smartdevicelink.proxy.rpc.PhoneCapability;
@@ -37,10 +38,13 @@ import com.smartdevicelink.proxy.rpc.WindowTypeCapabilities;
import com.smartdevicelink.proxy.rpc.enums.AppServiceType;
import com.smartdevicelink.proxy.rpc.enums.AudioStreamingState;
import com.smartdevicelink.proxy.rpc.enums.DisplayType;
+import com.smartdevicelink.proxy.rpc.enums.FileType;
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
import com.smartdevicelink.proxy.rpc.enums.HmiZoneCapabilities;
+import com.smartdevicelink.proxy.rpc.enums.ImageFieldName;
import com.smartdevicelink.proxy.rpc.enums.ImageType;
import com.smartdevicelink.proxy.rpc.enums.MediaClockFormat;
+import com.smartdevicelink.proxy.rpc.enums.PredefinedLayout;
import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
import com.smartdevicelink.proxy.rpc.enums.PrerecordedSpeech;
import com.smartdevicelink.proxy.rpc.enums.Result;
@@ -1075,4 +1079,33 @@ public class SystemCapabilityManagerTests {
return null;
}
}
+
+ @Test
+ public void testFixingIncorrectCapabilities() {
+ SetDisplayLayoutResponse setDisplayLayoutResponse;
+
+ DisplayCapabilities RegisterAppInterFaceCapabilities = new DisplayCapabilities()
+ .setImageFields(Collections.singletonList(new ImageField(ImageFieldName.graphic, Collections.singletonList(FileType.GRAPHIC_PNG))));
+
+ DisplayCapabilities setDisplayLayoutCapabilities = new DisplayCapabilities()
+ .setImageFields(new ArrayList<ImageField>());
+
+ LifecycleManager lcm = new LifecycleManager(new BaseLifecycleManager.AppConfig(), null, null);
+ lcm.initialMediaCapabilities = RegisterAppInterFaceCapabilities;
+
+
+ // Test switching to MEDIA template - Capabilities in setDisplayLayoutResponse should be replaced with the ones from RAIR
+ lcm.lastDisplayLayoutRequestTemplate = PredefinedLayout.MEDIA.toString();
+ setDisplayLayoutResponse = new SetDisplayLayoutResponse()
+ .setDisplayCapabilities(setDisplayLayoutCapabilities);
+ lcm.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
+ assertEquals(RegisterAppInterFaceCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
+
+ // Test switching to non-MEDIA template - Capabilities in setDisplayLayoutResponse should not be altered
+ lcm.lastDisplayLayoutRequestTemplate = PredefinedLayout.TEXT_WITH_GRAPHIC.toString();
+ setDisplayLayoutResponse = new SetDisplayLayoutResponse()
+ .setDisplayCapabilities(setDisplayLayoutCapabilities);
+ lcm.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
+ assertEquals(setDisplayLayoutCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
+ }
}
diff --git a/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java b/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java
index 71cd38096..63cc091af 100644
--- a/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java
+++ b/base/src/main/java/com/smartdevicelink/managers/lifecycle/BaseLifecycleManager.java
@@ -52,6 +52,7 @@ import com.smartdevicelink.proxy.RPCMessage;
import com.smartdevicelink.proxy.RPCNotification;
import com.smartdevicelink.proxy.RPCRequest;
import com.smartdevicelink.proxy.RPCResponse;
+import com.smartdevicelink.proxy.rpc.DisplayCapabilities;
import com.smartdevicelink.proxy.rpc.GenericResponse;
import com.smartdevicelink.proxy.rpc.OnAppInterfaceUnregistered;
import com.smartdevicelink.proxy.rpc.OnButtonEvent;
@@ -61,6 +62,8 @@ import com.smartdevicelink.proxy.rpc.OnSystemRequest;
import com.smartdevicelink.proxy.rpc.RegisterAppInterface;
import com.smartdevicelink.proxy.rpc.RegisterAppInterfaceResponse;
import com.smartdevicelink.proxy.rpc.SdlMsgVersion;
+import com.smartdevicelink.proxy.rpc.SetDisplayLayout;
+import com.smartdevicelink.proxy.rpc.SetDisplayLayoutResponse;
import com.smartdevicelink.proxy.rpc.SubscribeButton;
import com.smartdevicelink.proxy.rpc.SystemRequest;
import com.smartdevicelink.proxy.rpc.TTSChunk;
@@ -73,6 +76,7 @@ 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.Language;
+import com.smartdevicelink.proxy.rpc.enums.PredefinedLayout;
import com.smartdevicelink.proxy.rpc.enums.RequestType;
import com.smartdevicelink.proxy.rpc.enums.Result;
import com.smartdevicelink.proxy.rpc.enums.SdlDisconnectedReason;
@@ -132,6 +136,8 @@ abstract class BaseLifecycleManager {
BaseTransportConfig _transportConfig;
private Taskmaster taskmaster;
private boolean didCheckSystemInfo = false;
+ String lastDisplayLayoutRequestTemplate;
+ DisplayCapabilities initialMediaCapabilities;
BaseLifecycleManager(AppConfig appConfig, BaseTransportConfig config, LifecycleListener listener) {
this.appConfig = appConfig;
@@ -405,6 +411,10 @@ abstract class BaseLifecycleManager {
//If the vehicle is acceptable and this is the first check, init security lib
setSecurityLibraryIfAvailable(vehicleType);
}
+ // 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.
+ if (appConfig.appType.contains(AppHMIType.MEDIA)) {
+ initialMediaCapabilities = raiResponse.getDisplayCapabilities();
+ }
systemCapabilityManager.parseRAIResponse(raiResponse);
break;
case ON_HMI_STATUS:
@@ -825,6 +835,10 @@ abstract class BaseLifecycleManager {
addOnRPCResponseListener(listener, corrId);
}
}
+ // 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
+ if (FunctionID.SET_DISPLAY_LAYOUT.toString().equals(message.getFunctionName())) {
+ lastDisplayLayoutRequestTemplate = ((SetDisplayLayout)message).getDisplayLayout();
+ }
} else if (RPCMessage.KEY_RESPONSE.equals(message.getMessageType())) { // Response Specifics
RPCResponse response = (RPCResponse) message;
pm.setRPCType((byte) 0x01);
@@ -855,6 +869,16 @@ abstract class BaseLifecycleManager {
}
}
+ // 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.
+ void fixIncorrectDisplayCapabilities(RPCMessage rpc) {
+ if (RPCMessage.KEY_RESPONSE.equals(rpc.getMessageType()) && rpc.getFunctionName().equals(FunctionID.SET_DISPLAY_LAYOUT.toString()) &&
+ initialMediaCapabilities != null && lastDisplayLayoutRequestTemplate.equals(PredefinedLayout.MEDIA.toString())) {
+
+ SetDisplayLayoutResponse setDisplayLayoutResponse = (SetDisplayLayoutResponse) rpc;
+ setDisplayLayoutResponse.setDisplayCapabilities(initialMediaCapabilities);
+ }
+ }
+
/* *******************************************************************************************************
**************************************** ISdlSessionListener START **************************************
*********************************************************************************************************/
@@ -875,6 +899,8 @@ abstract class BaseLifecycleManager {
rpc.format(rpcSpecVersion, true);
+ fixIncorrectDisplayCapabilities(rpc);
+
BaseLifecycleManager.this.onRPCReceived(rpc);
if (RPCMessage.KEY_RESPONSE.equals(messageType)) {
@@ -1197,6 +1223,8 @@ abstract class BaseLifecycleManager {
void clean() {
firstTimeFull = true;
currentHMIStatus = null;
+ lastDisplayLayoutRequestTemplate = null;
+ initialMediaCapabilities = null;
if (rpcListeners != null) {
rpcListeners.clear();
}