diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 6673af43..f98c429f 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "6.0.21" + "version": "6.0.24" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 5e59394d..3f3026d9 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -244,7 +244,7 @@ export default class App extends Router.App { static language() { return { file: Utils.asset('language/language-file.json'), - language: ("ResidentApp" === GLOBALS.selfClientName ? CONFIG.language : Localization.language()) || 'en' + language: ("com.rdkcentral.refui" === GLOBALS.selfclientAppName ? CONFIG.language : Localization.language()) || 'en' } } @@ -2124,12 +2124,7 @@ export default class App extends Router.App { } _updateLanguageToDefault() { - if ("ResidentApp" === GLOBALS.selfClientName) { - if (availableLanguageCodes[Language.get()].length) { - appApi.setUILanguage(availableLanguageCodes[Language.get()]) - localStorage.setItem('Language', Language.get()) - } - } else { + if ("FireboltMainApp-refui" === GLOBALS.selfclientAppName) { FireBoltApi.get().localization.language().then(lang => { if (lang) { FireBoltApi.get().localization.language(lang).then(() => { @@ -2138,6 +2133,11 @@ export default class App extends Router.App { localStorage.setItem('Language', lang) } }) + } else { + if (availableLanguageCodes[Language.get()].length) { + appApi.setUILanguage(availableLanguageCodes[Language.get()]) + localStorage.setItem('Language', Language.get()) + } } } @@ -2727,18 +2727,23 @@ export default class App extends Router.App { for (let i = 0; i < audioport.connectedAudioPorts.length && !audioport.connectedAudioPorts[i].startsWith("SPDIF"); i++) { if ((GLOBALS.deviceType == "IpTv" && audioport.connectedAudioPorts[i].startsWith("SPEAKER")) || (GLOBALS.deviceType != "IpTv" && audioport.connectedAudioPorts[i].startsWith("HDMI"))) { appApi.getVolumeLevel(audioport.connectedAudioPorts[i]).then(volres => { - this.LOG("getVolumeLevel[" + JSON.stringify(audioport.connectedAudioPorts[i]) + "] is:" + JSON.stringify(parseInt(volres.volumeLevel))) - if ((parseInt(volres.volumeLevel) >= 0) || (parseInt(volres.volumeLevel) <= 100)) { - VolumePayload.msgPayload.event.payload.volume = parseInt(volres.volumeLevel) + payload.volume - this.LOG("volumepayload" + JSON.stringify(VolumePayload.msgPayload.event.payload.volume)) - if (VolumePayload.msgPayload.event.payload.volume < 0) { - VolumePayload.msgPayload.event.payload.volume = 0 - } else if (VolumePayload.msgPayload.event.payload.volume > 100) { - VolumePayload.msgPayload.event.payload.volume = 100 - } + const currentVolume = Number.parseInt(volres.volumeLevel, 10) + const volumeDelta = Number.parseInt(payload.volume, 10) + this.LOG("getVolumeLevel[" + JSON.stringify(audioport.connectedAudioPorts[i]) + "] is:" + JSON.stringify(currentVolume)) + if (Number.isNaN(currentVolume) || Number.isNaN(volumeDelta)) { + this.ERR("AdjustVolume invalid volume value current=" + JSON.stringify(volres.volumeLevel) + " delta=" + JSON.stringify(payload.volume)) + return; + } + let targetVolume = currentVolume + volumeDelta + if (targetVolume < 0) { + targetVolume = 0 + } else if (targetVolume > 100) { + targetVolume = 100 } - appApi.setVolumeLevel(audioport.connectedAudioPorts[i], VolumePayload.msgPayload.event.payload.volume).then(() => { - let volumeIncremented = parseInt(volres.volumeLevel) < VolumePayload.msgPayload.event.payload.volume ? true : false + VolumePayload.msgPayload.event.payload.volume = targetVolume + this.LOG("volumepayload" + JSON.stringify(targetVolume)) + appApi.setVolumeLevel(audioport.connectedAudioPorts[i], targetVolume).then(() => { + let volumeIncremented = currentVolume < targetVolume ? true : false if (volumeIncremented && VolumePayload.msgPayload.event.payload.muted) { VolumePayload.msgPayload.event.payload.muted = false } @@ -2746,17 +2751,17 @@ export default class App extends Router.App { this.tag("Volume").onVolumeChanged(volumeIncremented); } else { if (Router.getActiveHash() === "applauncher") { - RDKShellApis.moveToFront(GLOBALS.selfClientName) - RDKShellApis.setVisibility(GLOBALS.selfClientName, true) this.tag("Volume").onVolumeChanged(volumeIncremented); } else { - RDKShellApis.moveToFront(GLOBALS.selfClientName) - RDKShellApis.setVisibility(GLOBALS.selfClientName, true) Router.navigate("applauncher"); this.tag("Volume").onVolumeChanged(volumeIncremented); } } + }).catch(err => { + this.ERR('AdjustVolume setVolumeLevel error:' + JSON.stringify(err)) }); + }).catch(err => { + this.ERR('AdjustVolume getVolumeLevel error:' + JSON.stringify(err)) }); } } @@ -2764,7 +2769,12 @@ export default class App extends Router.App { } if (header.name === "SetVolume") { VolumePayload.msgPayload.event.header.messageId = header.messageId - VolumePayload.msgPayload.event.payload.volume = payload.volume + const requestedVolume = Number.parseInt(payload.volume, 10) + if (Number.isNaN(requestedVolume)) { + this.ERR("SetVolume invalid payload.volume: " + JSON.stringify(payload.volume)) + return; + } + VolumePayload.msgPayload.event.payload.volume = requestedVolume this.LOG("adjust volume" + JSON.stringify(VolumePayload)) this.LOG("checkvolume" + JSON.stringify(VolumePayload.msgPayload.event.payload.volume)) if (VolumePayload.msgPayload.event.payload.volume > 100) { @@ -2776,28 +2786,30 @@ export default class App extends Router.App { for (let i = 0; i < audioport.connectedAudioPorts.length && !audioport.connectedAudioPorts[i].startsWith("SPDIF"); i++) { if ((GLOBALS.deviceType == "IpTv" && audioport.connectedAudioPorts[i].startsWith("SPEAKER")) || (GLOBALS.deviceType != "IpTv" && audioport.connectedAudioPorts[i].startsWith("HDMI"))) { - let volumeIncremented appApi.getVolumeLevel(audioport.connectedAudioPorts[i]).then(volres => { - volumeIncremented = parseInt(volres.volumeLevel) < VolumePayload.msgPayload.event.payload.volume ? true : false + const currentVolume = Number.parseInt(volres.volumeLevel, 10) + const volumeIncremented = Number.isNaN(currentVolume) ? false : (currentVolume < VolumePayload.msgPayload.event.payload.volume ? true : false) if (volumeIncremented && VolumePayload.msgPayload.event.payload.muted) { VolumePayload.msgPayload.event.payload.muted = false } - }) - appApi.setVolumeLevel(audioport.connectedAudioPorts[i], VolumePayload.msgPayload.event.payload.volume).then(() => { - if (GLOBALS.topmostApp === GLOBALS.selfClientName) { - this.tag("Volume").onVolumeChanged(volumeIncremented); - } else { - if (Router.getActiveHash() === "applauncher") { - RDKShellApis.moveToFront(GLOBALS.selfClientName) - RDKShellApis.setVisibility(GLOBALS.selfClientName, true) + return appApi.setVolumeLevel(audioport.connectedAudioPorts[i], VolumePayload.msgPayload.event.payload.volume).then(() => { + if (GLOBALS.topmostApp === GLOBALS.selfClientName) { this.tag("Volume").onVolumeChanged(volumeIncremented); } else { - RDKShellApis.moveToFront(GLOBALS.selfClientName) - RDKShellApis.setVisibility(GLOBALS.selfClientName, true) - Router.navigate("applauncher"); - this.tag("Volume").onVolumeChanged(volumeIncremented); + if (Router.getActiveHash() === "applauncher") { + RDKShellApis.moveToFront(GLOBALS.selfClientName) + RDKShellApis.setVisibility(GLOBALS.selfClientName, true) + this.tag("Volume").onVolumeChanged(volumeIncremented); + } else { + RDKShellApis.moveToFront(GLOBALS.selfClientName) + RDKShellApis.setVisibility(GLOBALS.selfClientName, true) + Router.navigate("applauncher"); + this.tag("Volume").onVolumeChanged(volumeIncremented); + } } - } + }) + }).catch(err => { + this.ERR('SetVolume error:' + JSON.stringify(err)) }); } } diff --git a/accelerator-home-ui/src/api/AppApi.js b/accelerator-home-ui/src/api/AppApi.js index eb0005b9..2ab0c1f7 100644 --- a/accelerator-home-ui/src/api/AppApi.js +++ b/accelerator-home-ui/src/api/AppApi.js @@ -1088,7 +1088,7 @@ export default class AppApi { if (appInstanceId) { this.LOG('Using appInstanceId: ' + appInstanceId + ' for targetAppId: ' + targetAppId); - + // Only setFocus when making the app visible if (visible) { await RDKWindowManager.get().setFocus(appInstanceId).then(() => { @@ -1604,7 +1604,7 @@ export default class AppApi { }) }) } - + getRFCConfig(rfcParamsList) { return new Promise((resolve, reject) => { thunder.call('org.rdk.System', 'getRFCConfig',{"rfcList":[rfcParamsList]}).then(result => { @@ -1696,10 +1696,18 @@ export default class AppApi { setVolumeLevel(port, volume) { return new Promise((resolve) => { + const parsedVolume = Number.parseInt(volume, 10) + if (Number.isNaN(parsedVolume)) { + this.ERR('AppAPI setVolumeLevel invalid volume:', JSON.stringify(volume)) + resolve(false) + return + } + const clampedVolume = Math.min(100, Math.max(0, parsedVolume)) + thunder .call('org.rdk.DisplaySettings', 'setVolumeLevel', { audioPort: port, - volumeLevel: volume, + volumeLevel: clampedVolume, }) .then(result => { this.LOG("AppAPI setVolumeLevel :", JSON.stringify(result)) @@ -1927,13 +1935,13 @@ export default class AppApi { }); }) } - + setUILanguage(updatedLanguage) { return UserSettingsApi.get().setPresentationLanguage(updatedLanguage) } - + getUILanguage() { - return UserSettingsApi.get().getPresentationLanguage(updatedLanguage) + return UserSettingsApi.get().getPresentationLanguage() } deeplinkToApp(app = undefined, payload = undefined, launchLocation = "voice", namespace = undefined) { diff --git a/accelerator-home-ui/src/overlays/UninstallConfirmation.js b/accelerator-home-ui/src/overlays/UninstallConfirmation.js index cc146d61..76d703ed 100644 --- a/accelerator-home-ui/src/overlays/UninstallConfirmation.js +++ b/accelerator-home-ui/src/overlays/UninstallConfirmation.js @@ -222,6 +222,9 @@ export default class UninstallConfirmation extends Lightning.Component { _handleRight() { this._setState("Cancel"); } + _handleLeft() { /* do nothing - already at leftmost button */ } + _handleUp() { /* do nothing - prevent focus escape */ } + _handleDown() { /* do nothing - prevent focus escape */ } _handleBack() { this.fireAncestors("$cancelUninstall"); } @@ -255,6 +258,9 @@ export default class UninstallConfirmation extends Lightning.Component { _handleLeft() { this._setState("Confirm"); } + _handleRight() { /* do nothing - already at rightmost button */ } + _handleUp() { /* do nothing - prevent focus escape */ } + _handleDown() { /* do nothing - prevent focus escape */ } _handleBack() { this.fireAncestors("$cancelUninstall"); } diff --git a/accelerator-home-ui/src/tvOverlay/components/Volume.js b/accelerator-home-ui/src/tvOverlay/components/Volume.js index e86b5e27..d1917667 100644 --- a/accelerator-home-ui/src/tvOverlay/components/Volume.js +++ b/accelerator-home-ui/src/tvOverlay/components/Volume.js @@ -159,14 +159,25 @@ export default class Volume extends Lightning.Component { this._updateText(this.volume) } - setVolume = async (val) => { - let audioport = await this.getAudioPorts() - for (let i = 0; i < audioport.length; i++) { - if ((GLOBALS.deviceType == "IpTv" && audioport[i].startsWith("SPEAKER")) || - (GLOBALS.deviceType != "IpTv" && audioport[i].startsWith("HDMI"))) { - await this.appApi.setVolumeLevel(audioport[i], val) - } + setVolume = (val) => { + const safeVolume = Number.parseInt(val, 10); + if (Number.isNaN(safeVolume)) { + this.WARN('Volume setVolume called with invalid value:' + JSON.stringify(val)); + return false; } + + this.getAudioPorts() + .then(audioport => { + for (let i = 0; i < audioport.length; i++) { + if ((GLOBALS.deviceType == "IpTv" && audioport[i].startsWith("SPEAKER")) || + (GLOBALS.deviceType != "IpTv" && audioport[i].startsWith("HDMI"))) { + this.appApi.setVolumeLevel(audioport[i], safeVolume) + } + } + }) + .catch(err => { + this.ERR('Volume setVolume getConnectedAudioPorts error:' + JSON.stringify(err, null, 3)) + }) return true; } @@ -230,7 +241,7 @@ export default class Volume extends Lightning.Component { this.appApi.getConnectedAudioPorts().then(res => { resolve(res.connectedAudioPorts) }).catch(err => { - this.ERR('Volume getConnectedAudioPorts error:' + JSON.stringify(err, 3, null)) + this.ERR('Volume getConnectedAudioPorts error:' + JSON.stringify(err, null, 3)) reject(false) }) }) @@ -243,7 +254,7 @@ export default class Volume extends Lightning.Component { this._updateIcon(this.mute); resolve(true) }).catch(err => { - this.ERR('Volume updateIcon error:' + JSON.stringify(err, 3, null)) + this.ERR('Volume updateIcon error:' + JSON.stringify(err, null, 3)) reject(false) }); }) @@ -251,22 +262,34 @@ export default class Volume extends Lightning.Component { getVolume() { return new Promise(async (resolve, reject) => { - let audioport = await this.getAudioPorts() + let audioport = [] + try { + audioport = await this.getAudioPorts() + } catch (err) { + this.ERR('Volume getAudioPorts error:' + JSON.stringify(err, null, 3)) + resolve(0) + return + } /* Returns an array. */ for (let i = 0; i < audioport.length; i++) { if ((GLOBALS.deviceType == "IpTv" && audioport[i].startsWith("SPEAKER")) || (GLOBALS.deviceType != "IpTv" && audioport[i].startsWith("HDMI"))) { this.appApi.getVolumeLevel(audioport[i]).then(async res1 => { await this.updateIcon(audioport[i]) - if (res1) { - resolve(parseInt(res1.volumeLevel)); + if (res1 && res1.success) { + const level = Number.parseInt(res1.volumeLevel, 10); + resolve(Number.isNaN(level) ? 0 : level); + } else { + resolve(0); } }).catch(err => { - this.ERR('Volume getVolumeLevel error:' + JSON.stringify(err, 3, null)) - reject(false) + this.ERR('Volume getVolumeLevel error:' + JSON.stringify(err, null, 3)) + resolve(0) }) + return; } } + resolve(0); }) } } diff --git a/accelerator-home-ui/src/views/AppStore.js b/accelerator-home-ui/src/views/AppStore.js index 47608ec0..fd5293d6 100644 --- a/accelerator-home-ui/src/views/AppStore.js +++ b/accelerator-home-ui/src/views/AppStore.js @@ -84,7 +84,7 @@ export default class AppStore extends Lightning.Component { Router.focusWidget('Menu') } _handleBack() { - Router.focusWidget('Menu'); + Router.back(); } pageTransition() { diff --git a/bolt/package-configs/com.rdkcentral.refui.json b/bolt/package-configs/com.rdkcentral.refui.json index 1db2f155..1b5ac489 100644 --- a/bolt/package-configs/com.rdkcentral.refui.json +++ b/bolt/package-configs/com.rdkcentral.refui.json @@ -1,7 +1,7 @@ { "id": "com.rdkcentral.refui", - "version": "6.0.21", - "versionName": "6.0.21", + "version": "6.0.24", + "versionName": "6.0.24", "name": "RDK Ref UI Home Screen", "packageType": "application", "entryPoint": "--lightning --dev file:///usr/share/refui/index.html",