From 807ace753c0e1be615524541b5126f4ee313fd93 Mon Sep 17 00:00:00 2001 From: Arun P Madhavan <54109113+arun-madhavan-013@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:54:00 -0400 Subject: [PATCH 1/3] RDKEAPPRT-866: fix NaN display on volume overlay (#211) * RDKEAPPRT-866: fix(volume) prevent NaN volume values from reaching DisplaySettings add safe fallback in volume overlay read path when getVolumeLevel is invalid/failed guard overlay setVolume to skip invalid numeric values harden Speaker AdjustVolume/SetVolume flow to parse and clamp values before write add final validation and clamping in AppApi setVolumeLevel (0..100) prevents NaN overlay text and avoids crash/restart risk on volume-up after mute/down sequence * Clean-up unwanted file * Fix copilot review * bump version to 6.0.21 * bump version to 6.0.22 * Fix copilot review * Fix the review comments * Fix the copilot review - part 1 * Fix the order issue * Fix the copilot issue - part 2 --------- Co-authored-by: suryag23 --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 74 +++++++++++-------- accelerator-home-ui/src/api/AppApi.js | 20 +++-- .../src/tvOverlay/components/Volume.js | 51 +++++++++---- .../package-configs/com.rdkcentral.refui.json | 4 +- 5 files changed, 97 insertions(+), 54 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 6673af43..6f63d829 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.22" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 5e59394d..314f61c1 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -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/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/bolt/package-configs/com.rdkcentral.refui.json b/bolt/package-configs/com.rdkcentral.refui.json index 1db2f155..6aaf52af 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.22", + "versionName": "6.0.22", "name": "RDK Ref UI Home Screen", "packageType": "application", "entryPoint": "--lightning --dev file:///usr/share/refui/index.html", From d2059ba4ef444f34a3381f405fc9f0b352758592 Mon Sep 17 00:00:00 2001 From: suryag23 <141610966+suryag23@users.noreply.github.com> Date: Fri, 3 Jul 2026 10:02:11 +0530 Subject: [PATCH 2/3] REFPLTV-3161 Language Changed From Spanish To English After Clear Cookies And App Data From Settings And Reboot (#218) --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 14 +++++++------- bolt/package-configs/com.rdkcentral.refui.json | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 6f63d829..b95999dd 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.22" + "version": "6.0.23" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 314f61c1..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()) + } } } diff --git a/bolt/package-configs/com.rdkcentral.refui.json b/bolt/package-configs/com.rdkcentral.refui.json index 6aaf52af..ff735bfc 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.22", - "versionName": "6.0.22", + "version": "6.0.23", + "versionName": "6.0.23", "name": "RDK Ref UI Home Screen", "packageType": "application", "entryPoint": "--lightning --dev file:///usr/share/refui/index.html", From bcdfa503ed9f16f515ca95d157db7bcb513a7395 Mon Sep 17 00:00:00 2001 From: suryag23 <141610966+suryag23@users.noreply.github.com> Date: Tue, 7 Jul 2026 10:37:06 +0530 Subject: [PATCH 3/3] RDKMVE-2367,RDKEAPPRT-722-Focus issue in the appinfo overlay and navigation issue form the recommended apps page (#219) --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/overlays/UninstallConfirmation.js | 6 ++++++ accelerator-home-ui/src/views/AppStore.js | 2 +- bolt/package-configs/com.rdkcentral.refui.json | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index b95999dd..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.23" + "version": "6.0.24" } } 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/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 ff735bfc..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.23", - "versionName": "6.0.23", + "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",