Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions lib/js/src/manager/lifecycle/_LifecycleManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ import { SdlMsgVersion } from '../../rpc/structs/SdlMsgVersion.js';
import { FunctionID } from '../../rpc/enums/FunctionID.js';
import { _ServiceType } from '../../protocol/enums/_ServiceType.js';
import { SystemInfo } from '../../util/SystemInfo.js';
import { AppHMIType } from '../../rpc/enums/AppHMIType.js';
import { PredefinedLayout } from '../../rpc/enums/PredefinedLayout.js';

/**
* This class should also be marked private and behind the SdlManager API
Expand Down Expand Up @@ -93,6 +95,8 @@ class _LifecycleManager {
this._registerAppInterfaceResponse = null;

this._didCheckSystemInfo = false;
this._lastDisplayLayoutRequestTemplate = null;
this._initialMediaCapabilities = null;
}

/**
Expand Down Expand Up @@ -162,6 +166,7 @@ class _LifecycleManager {
return;
}

this.fixIncorrectDisplayCapabilities(rpcMessage);
const functionID = FunctionID.valueForKey(rpcMessage.getFunctionId()); // this is the number value
const listenerArray = this._rpcListeners.get(functionID);
if (Array.isArray(listenerArray)) {
Expand Down Expand Up @@ -315,6 +320,10 @@ class _LifecycleManager {
if (rpcMessage.getCorrelationId() === null || rpcMessage.getCorrelationId() === undefined) {
rpcMessage.setCorrelationId(++this._maxCorrelationId);
}
// Ford Sync bug returning incorrect display capabilities (https://github.com/smartdevicelink/sdl_javascript_suite/issues/446). Save the next desired layout type to the update capabilities when the SetDisplayLayout response is received
if (rpcMessage.getFunctionId() === FunctionID.keyForValue(FunctionID.SetDisplayLayout)) {
this._lastDisplayLayoutRequestTemplate = rpcMessage.getDisplayLayout();
}
this.addRpcListener(FunctionID.valueForKey(rpcMessage.getFunctionId()), listener);
// listen for GenericResponse as well, in the case of interacting with older head units
this.addRpcListener(FunctionID.GenericResponse, listener);
Expand Down Expand Up @@ -440,6 +449,18 @@ class _LifecycleManager {
return true;
}

/**
* When a SetDisplayLayout response is received and the desired layout type is MEDIA, use the initial media capabilities
* See Ford Sync bug returning incorrect display capabilities (https://github.com/smartdevicelink/sdl_javascript_suite/issues/446).
* @param {RpcMessage} rpc - an RPC Message
*/
fixIncorrectDisplayCapabilities (rpc) {
if (MessageType.response === rpc.getMessageType() && rpc.getFunctionId() === FunctionID.keyForValue(FunctionID.SetDisplayLayout) &&
this._initialMediaCapabilities !== null && this._lastDisplayLayoutRequestTemplate === PredefinedLayout.MEDIA) {
rpc.setDisplayCapabilities(this._initialMediaCapabilities);
}
}


/* *******************************************************************************************************
********************************** INTERNAL - RPC LISTENERS !! START !! *********************************
Expand Down Expand Up @@ -531,6 +552,9 @@ class _LifecycleManager {
this.sendRpcResolve(new UnregisterAppInterface());
this._cleanProxy();
}
if (this._lifecycleConfig.getAppTypes().includes(AppHMIType.MEDIA)) {
this._initialMediaCapabilities = registerAppInterfaceResponse.getDisplayCapabilities();
}
}

// parse RAI for system capabilities
Expand Down
28 changes: 28 additions & 0 deletions tests/managers/lifecycle/LifecycleManagerTests.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,33 @@ module.exports = function (appClient) {

done();
});

it('testFixingIncorrectCapabilities', function (done) {
let setDisplayLayoutResponse;

const registerAppInterFaceCapabilities = new SDL.rpc.structs.DisplayCapabilities()
.setImageFields([new SDL.rpc.structs.ImageField(SDL.rpc.enums.ImageFieldName.graphic, [SDL.rpc.enums.FileType.GRAPHIC_PNG])]);

const setDisplayLayoutCapabilities = new SDL.rpc.structs.DisplayCapabilities()
.setImageFields([]);

sdlManager._lifecycleManager._initialMediaCapabilities = registerAppInterFaceCapabilities;


// Test switching to MEDIA template - Capabilities in setDisplayLayoutResponse should be replaced with the ones from RAIR
sdlManager._lifecycleManager._lastDisplayLayoutRequestTemplate = SDL.rpc.enums.PredefinedLayout.MEDIA;
setDisplayLayoutResponse = new SDL.rpc.messages.SetDisplayLayoutResponse()
.setDisplayCapabilities(setDisplayLayoutCapabilities);
sdlManager._lifecycleManager.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
Validator.assertEquals(registerAppInterFaceCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());

// Test switching to non-MEDIA template - Capabilities in setDisplayLayoutResponse should not be altered
sdlManager._lifecycleManager._lastDisplayLayoutRequestTemplate = SDL.rpc.enums.PredefinedLayout.TEXT_WITH_GRAPHIC;
setDisplayLayoutResponse = new SDL.rpc.messages.SetDisplayLayoutResponse()
.setDisplayCapabilities(setDisplayLayoutCapabilities);
sdlManager._lifecycleManager.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
Validator.assertEquals(setDisplayLayoutCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
done();
});
});
};