Skip to content

Commit bcfda72

Browse files
authored
Merge pull request #447 from smartdevicelink/bugfix/issue_446
Update lifecycle manager to work around Sync 3 media capabilities bug
2 parents 22f8bcd + b2604a3 commit bcfda72

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

lib/js/src/manager/lifecycle/_LifecycleManager.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ import { SdlMsgVersion } from '../../rpc/structs/SdlMsgVersion.js';
4343
import { FunctionID } from '../../rpc/enums/FunctionID.js';
4444
import { _ServiceType } from '../../protocol/enums/_ServiceType.js';
4545
import { SystemInfo } from '../../util/SystemInfo.js';
46+
import { AppHMIType } from '../../rpc/enums/AppHMIType.js';
47+
import { PredefinedLayout } from '../../rpc/enums/PredefinedLayout.js';
4648

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

9597
this._didCheckSystemInfo = false;
98+
this._lastDisplayLayoutRequestTemplate = null;
99+
this._initialMediaCapabilities = null;
96100
}
97101

98102
/**
@@ -162,6 +166,7 @@ class _LifecycleManager {
162166
return;
163167
}
164168

169+
this.fixIncorrectDisplayCapabilities(rpcMessage);
165170
const functionID = FunctionID.valueForKey(rpcMessage.getFunctionId()); // this is the number value
166171
const listenerArray = this._rpcListeners.get(functionID);
167172
if (Array.isArray(listenerArray)) {
@@ -315,6 +320,10 @@ class _LifecycleManager {
315320
if (rpcMessage.getCorrelationId() === null || rpcMessage.getCorrelationId() === undefined) {
316321
rpcMessage.setCorrelationId(++this._maxCorrelationId);
317322
}
323+
// 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
324+
if (rpcMessage.getFunctionId() === FunctionID.keyForValue(FunctionID.SetDisplayLayout)) {
325+
this._lastDisplayLayoutRequestTemplate = rpcMessage.getDisplayLayout();
326+
}
318327
this.addRpcListener(FunctionID.valueForKey(rpcMessage.getFunctionId()), listener);
319328
// listen for GenericResponse as well, in the case of interacting with older head units
320329
this.addRpcListener(FunctionID.GenericResponse, listener);
@@ -440,6 +449,18 @@ class _LifecycleManager {
440449
return true;
441450
}
442451

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

444465
/* *******************************************************************************************************
445466
********************************** INTERNAL - RPC LISTENERS !! START !! *********************************
@@ -531,6 +552,9 @@ class _LifecycleManager {
531552
this.sendRpcResolve(new UnregisterAppInterface());
532553
this._cleanProxy();
533554
}
555+
if (this._lifecycleConfig.getAppTypes().includes(AppHMIType.MEDIA)) {
556+
this._initialMediaCapabilities = registerAppInterfaceResponse.getDisplayCapabilities();
557+
}
534558
}
535559

536560
// parse RAI for system capabilities

tests/managers/lifecycle/LifecycleManagerTests.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,33 @@ module.exports = function (appClient) {
6969

7070
done();
7171
});
72+
73+
it('testFixingIncorrectCapabilities', function (done) {
74+
let setDisplayLayoutResponse;
75+
76+
const registerAppInterFaceCapabilities = new SDL.rpc.structs.DisplayCapabilities()
77+
.setImageFields([new SDL.rpc.structs.ImageField(SDL.rpc.enums.ImageFieldName.graphic, [SDL.rpc.enums.FileType.GRAPHIC_PNG])]);
78+
79+
const setDisplayLayoutCapabilities = new SDL.rpc.structs.DisplayCapabilities()
80+
.setImageFields([]);
81+
82+
sdlManager._lifecycleManager._initialMediaCapabilities = registerAppInterFaceCapabilities;
83+
84+
85+
// Test switching to MEDIA template - Capabilities in setDisplayLayoutResponse should be replaced with the ones from RAIR
86+
sdlManager._lifecycleManager._lastDisplayLayoutRequestTemplate = SDL.rpc.enums.PredefinedLayout.MEDIA;
87+
setDisplayLayoutResponse = new SDL.rpc.messages.SetDisplayLayoutResponse()
88+
.setDisplayCapabilities(setDisplayLayoutCapabilities);
89+
sdlManager._lifecycleManager.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
90+
Validator.assertEquals(registerAppInterFaceCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
91+
92+
// Test switching to non-MEDIA template - Capabilities in setDisplayLayoutResponse should not be altered
93+
sdlManager._lifecycleManager._lastDisplayLayoutRequestTemplate = SDL.rpc.enums.PredefinedLayout.TEXT_WITH_GRAPHIC;
94+
setDisplayLayoutResponse = new SDL.rpc.messages.SetDisplayLayoutResponse()
95+
.setDisplayCapabilities(setDisplayLayoutCapabilities);
96+
sdlManager._lifecycleManager.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
97+
Validator.assertEquals(setDisplayLayoutCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
98+
done();
99+
});
72100
});
73101
};

0 commit comments

Comments
 (0)