diff options
author | Bilal Alsharifi <599206+bilal-alsharifi@users.noreply.github.com> | 2021-05-25 15:37:27 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-25 15:37:27 -0400 |
commit | 0c3b2afd6c88699dc87944efda26f8ba4c96dbc7 (patch) | |
tree | 2f270af7655aa1723d463140ac124d54cfd8e655 | |
parent | be4e58b755567b939fcfb06b00e7772a90868909 (diff) | |
download | sdl_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
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(); } |