From 8a214e5d5e7605fdd75bc5760cb10225f006da9c Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Tue, 21 Oct 2025 12:28:01 +0530 Subject: [PATCH 01/12] Fixed the sleep timer issue --- accelerator-home-ui/src/App.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index f69cd3b..9e2cee2 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -80,7 +80,6 @@ import MiracastNotification from './screens/MiracastNotification.js'; import NetworkManager from './api/NetworkManagerAPI.js'; -var powerState = 'ON'; var AlexaAudioplayerActive = false; var thunder = ThunderJS(CONFIG.thunderConfig); var appApi = new AppApi(); @@ -2089,12 +2088,12 @@ export default class App extends Router.App { if (value == 'Back') { // TODO: Identify what to do here. } else { - if (powerState == 'ON') { + if (GLOBALS.powerState == 'ON') { this.LOG("Power state was on trying to set it to standby"); appApi.setPowerState(value).then(res => { if (res.success) { this.LOG("successfully set to standby"); - powerState = 'STANDBY' + GLOBALS.powerState = 'STANDBY' if (GLOBALS.topmostApp !== GLOBALS.selfClientName) { appApi.exitApp(GLOBALS.topmostApp); } else { @@ -2114,7 +2113,7 @@ export default class App extends Router.App { this.LOG("registered inactivity listener"); appApi.setPowerState('ON').then(res => { if (res.success) { - powerState = 'ON' + GLOBALS.powerState = 'ON' } }) @@ -2125,7 +2124,7 @@ export default class App extends Router.App { this.LOG("activated the rdk shell plugin trying to set the inactivity listener; res = " + JSON.stringify(res)); thunder.on("org.rdk.RDKShell.1", "onUserInactivity", notification => { this.LOG('onUserInactivity: ' + JSON.stringify(notification)); - if (powerState === "ON" && (GLOBALS.topmostApp === GLOBALS.selfClientName)) { + if (GLOBALS.powerState === "ON" && (GLOBALS.topmostApp === GLOBALS.selfClientName)) { this.standby("STANDBY"); } }, err => { @@ -2144,7 +2143,7 @@ export default class App extends Router.App { this.LOG("reset sleep timer call " + JSON.stringify(t)); var arr = t.split(" "); - function setTimer() { + const setTimer = () => { this.LOG('Timer ' + JSON.stringify(arr)) var temp = arr[1].substring(0, 1); if (temp === 'H') { From 8b55a27ada6f2f55e70be22b9af52e4b2964bf9d Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Tue, 21 Oct 2025 12:57:54 +0530 Subject: [PATCH 02/12] Updated the version number --- accelerator-home-ui/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 38709b8..362e32e 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.12" + "version": "5.0.13" } } From c07106edb648a0a7959bb8c4096f6b72041581ac Mon Sep 17 00:00:00 2001 From: suryag23 Date: Tue, 21 Oct 2025 16:05:27 +0530 Subject: [PATCH 03/12] RDKEAPPRT-241 Remove Features Dependent on Deprecated System Plugin APIs --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 30 +++--- accelerator-home-ui/src/api/AppApi.js | 65 ------------- .../src/api/PowerManagerApi.js | 75 +++++++++++++++ .../OtherSettings/OtherSettingsOverlay.js | 95 ++----------------- .../src/routes/otherSettingsRoutes.js | 6 -- .../FactoryResetConfirmationScreen.js | 2 - .../OtherSettingsScreen.js | 70 +------------- 8 files changed, 103 insertions(+), 242 deletions(-) create mode 100644 accelerator-home-ui/src/api/PowerManagerApi.js diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 362e32e..d939b1c 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.13" + "version": "5.0.14" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 9e2cee2..83732de 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -78,6 +78,7 @@ import RDKShellApis from './api/RDKShellApis.js'; import Miracast from './api/Miracast.js'; import MiracastNotification from './screens/MiracastNotification.js'; import NetworkManager from './api/NetworkManagerAPI.js'; +import PowerManagerApi from './api/PowerManagerApi.js'; var AlexaAudioplayerActive = false; @@ -88,6 +89,7 @@ var cecApi = new CECApi(); var xcastApi = new XcastApi(); var voiceApi = new VoiceApi(); var miracast = new Miracast(); +var powermanagerapi = new PowerManagerApi(); export default class App extends Router.App { @@ -497,21 +499,10 @@ export default class App extends Router.App { callsign: 'org.rdk.System' }).then(result => { this.LOG("App System plugin activation result: " + JSON.stringify(result)) - appApi.setNetworkStandbyMode().then(result => { - if (!result.success) { - this.WARN("App RFC setNetworkStandbyMode returned false; trying updated API.") - let param = { - wakeupSources: [{ - "WAKEUPSRC_WIFI": true, - "WAKEUPSRC_IR": true, - "WAKEUPSRC_POWER_KEY": true, - "WAKEUPSRC_CEC": true, - "WAKEUPSRC_LAN": true - }] - } - appApi.setWakeupSrcConfiguration(param); - } - }) + let param = { + "wakeupSources": 262143 + } + powermanagerapi.setWakeupSrcConfig(param); appApi.setPowerState(GLOBALS.powerState).then(res => {}); }).catch(err => { this.ERR("App System plugin activation error: " + JSON.stringify(err)); @@ -682,6 +673,15 @@ export default class App extends Router.App { } }) } + appApi.getPluginStatus('org.rdk.PowerManager').then(result => { + if (result[0].state === "activated") { + console.log("org.rdk.PowerManager is already activated"); + } else { + powermanagerapi.activate().then((res) => { + this.LOG("activating the powermanager from app.js " + JSON.stringify(res)) + }).catch((err) => this.ERR(JSON.stringify(err))) + } + }) appApi.getPluginStatus('org.rdk.NetworkManager').then(result => { if (result[0].state === "activated") { this.SubscribeToNetworkManager() diff --git a/accelerator-home-ui/src/api/AppApi.js b/accelerator-home-ui/src/api/AppApi.js index 78d6c39..2cd4fed 100644 --- a/accelerator-home-ui/src/api/AppApi.js +++ b/accelerator-home-ui/src/api/AppApi.js @@ -71,27 +71,6 @@ export default class AppApi { * Function to launch Html app. * @param {String} url url of app. */ - getIP() { - return new Promise((resolve) => { - thunder.Controller.activate({ callsign: 'org.rdk.System' }) - .then(() => { - thunder - .call('org.rdk.System', 'getDeviceInfo', { params: 'estb_ip' }) - .then(result => { - resolve(result.success) - }) - .catch(err => { - this.ERR("AppAPI System getDeviceInfo estb_ip failed." + JSON.stringify(err)); - Metrics.error(Metrics.ErrorType.NETWORK, "Network Error", "Error in Thunder system getDeviceInfo" + JSON.stringify(err), false, null) - resolve(false) - }) - }) - .catch(err => { - this.ERR("AppAPI activate System failed." + JSON.stringify(err)); - Metrics.error(Metrics.ErrorType.NETWORK, "Network Error", "Error in Thunder system activation " + JSON.stringify(err), false, null) - }) - }) - } /** * Function to get timeZone */ @@ -1569,23 +1548,6 @@ export default class AppApi { }) } - setPreferredStandbyMode(standbyMode) { - this.LOG("setPreferredStandbyMode called : " + standbyMode) - return new Promise((resolve) => { - thunder - .call('org.rdk.System', 'setPreferredStandbyMode', { - "standbyMode": standbyMode - }).then(result => { - resolve(result) - }) - .catch(err => { - this.ERR("AppAPI setPreferredStandbyMode error:", JSON.stringify(err, 3, null)) - Metrics.error(Metrics.ErrorType.NETWORK, "PluginError", "Error in Thunder system setPreferredStandbyMode " + JSON.stringify(err), false, null) - resolve(false) - }) - }) - } - getNetworkStandbyMode() { return new Promise((resolve, reject) => { thunder.call('org.rdk.System', 'getNetworkStandbyMode').then(result => { @@ -1611,17 +1573,6 @@ export default class AppApi { }) } - setNetworkStandbyMode(nwStandby = true) { - return new Promise((resolve, reject) => { - thunder.call('org.rdk.System', 'setNetworkStandbyMode', { nwStandby: nwStandby }).then(result => { - resolve(result.success) - }).catch(err => { - this.ERR("AppAPI setNetworkStandbyMode error:", JSON.stringify(err, 3, null)) - Metrics.error(Metrics.ErrorType.NETWORK, "NetworkError", "Error in Thunder system setNetworkStandbyMode " + JSON.stringify(err), false, null) - reject(err) - }) - }) - } setWakeupSrcConfiguration(params) { this.LOG("AppAPI: setWakeupSrcConfiguration params:", JSON.stringify(params)); @@ -1859,22 +1810,6 @@ export default class AppApi { }) } - //clearLastDeepSleepReason - clearLastDeepSleepReason() { - return new Promise((resolve) => { - thunder - .call('org.rdk.System', 'clearLastDeepSleepReason') - .then(result => { - resolve(result) - }) - .catch(err => { - this.ERR("AppAPI clearLastDeepSleepReason error:", err) - Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder clearLastDeepSleepReason of system " + JSON.stringify(err), false, null) - resolve(false) - }) - }) - } - monitorStatus(callsign) { return new Promise((resolve) => { thunder diff --git a/accelerator-home-ui/src/api/PowerManagerApi.js b/accelerator-home-ui/src/api/PowerManagerApi.js new file mode 100644 index 0000000..0cb63b4 --- /dev/null +++ b/accelerator-home-ui/src/api/PowerManagerApi.js @@ -0,0 +1,75 @@ +/** + * If not stated otherwise in this file or this component's LICENSE + * file the following copyright and licenses apply: + * + * Copyright 2020 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +import ThunderJS from 'ThunderJS'; +import { CONFIG } from '../Config/Config' + + +/** + * Class for Xcast thunder plugin apis. + */ +export default class PowerManagerApi { + constructor() { + this.thunder = ThunderJS(CONFIG.thunderConfig); + this.INFO = console.info; + this.LOG = console.log; + this.ERR = console.error; + this.WARN = console.warn; + this.callsign = "org.rdk.PowerManager"; + } + activate() { + return new Promise((resolve, reject) => { + this.thunder.Controller.activate({ callsign: this.callsign }) + .then(() => { + resolve(true) + }) + .catch(err => { + this.ERR("Error Activation " + JSON.stringify(err)) + Metrics.error(Metrics.ErrorType.OTHER, errorName, `Error while Thunder Controller ${callsign} activate ${JSON.stringify(err)}`, false, null) + reject(err) + }) + }) + } + deactivate() { + return new Promise((resolve, reject) => { + this.thunder.Controller.deactivate({ callsign: this.callsign }) + .then(() => { + resolve(true) + }) + .catch(err => { + this.ERR("Error Deactivation " + JSON.stringify(err)) + Metrics.error(Metrics.ErrorType.OTHER, errorName, `Error while Thunder Controller ${callsign} deactivate ${JSON.stringify(err)}`, false, null) + reject(err) + }) + }) + } + setWakeupSrcConfig(params) { + this.LOG("setWakeupSrcConfiguration params:", JSON.stringify(params)); + return new Promise((resolve, reject) => { + this.thunder.call(this.callsign, 'setWakeupSrcConfig', params).then(result => { + this.LOG(" setWakeupSrcConfiguration result:", JSON.stringify(result)) + resolve(result.success) + }).catch(err => { + this.ERR(" setWakeupSrcConfiguration error:", JSON.stringify(err, 3, null)) + Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder system setWakeupSrcConfiguration " + JSON.stringify(err), false, null) + reject(err) + }) + }) + } +} \ No newline at end of file diff --git a/accelerator-home-ui/src/overlays/OtherSettings/OtherSettingsOverlay.js b/accelerator-home-ui/src/overlays/OtherSettings/OtherSettingsOverlay.js index 7beda20..e51243e 100644 --- a/accelerator-home-ui/src/overlays/OtherSettings/OtherSettingsOverlay.js +++ b/accelerator-home-ui/src/overlays/OtherSettings/OtherSettingsOverlay.js @@ -22,7 +22,6 @@ import { CONFIG } from '../../Config/Config' import AppApi from '../../api/AppApi' import SleepTimerScreen from './SleepTimerOverlay' - import EnergySavingsScreen from './EnergySaverOverlay' import LanguageScreen from './LanguageScreenOverlay' import PrivacyScreen from './PrivacyScreenOverlay' import AdvanceSettingsScreen from './AdvancedSettingsScreenOverlay' @@ -110,33 +109,9 @@ src: Utils.asset('images/settings/Arrow.png'), }, }, - EnergySaver: { - y: 270, - type: SettingsMainItem, - Title: { - x: 10, - y: 45, - mountY: 0.5, - text: { - text: Language.translate('Energy Saver: '), - textColor: COLORS.titleColor, - fontFace: CONFIG.language.font, - fontSize: 25, - } - }, - Button: { - h: 45, - w: 45, - x: 1600, - mountX: 1, - y: 45, - mountY: 0.5, - src: Utils.asset('images/settings/Arrow.png'), - }, - }, Language: { alpha: 0.3, // disabled - y: 450 - 90, + y: 270, type: SettingsMainItem, Title: { x: 10, @@ -161,7 +136,7 @@ }, Privacy: { //alpha: 0.3, // disabled - y: 540 - 90, + y: 360, type: SettingsMainItem, Title: { x: 10, @@ -185,7 +160,7 @@ }, }, AdvancedSettings: { - y: 630 - 90, + y: 450, type: SettingsMainItem, Title: { x: 10, @@ -213,10 +188,6 @@ type: SleepTimerScreen, visible: false }, - EnergySavingsScreen:{ - type: EnergySavingsScreen, - visible: false - }, LanguageScreen: { type: LanguageScreen, visible: false @@ -236,10 +207,6 @@ this._appApi = new AppApi(); this._setState('SleepTimer') } - $updateStandbyMode(standbyMode) { - this.tag("EnergySaver.Title").text.text = Language.translate("Energy Saver: ") + standbyMode - } - $sleepTimerText(text) { this.tag('SleepTimer.Title').text.text = Language.translate('Sleep Timer: ') + text } @@ -253,17 +220,6 @@ else { this.tag('SleepTimer.Title').text.text = Language.translate('Sleep Timer: ') + 'Off' } - - this._appApi.getPreferredStandbyMode().then(result => { - let currentStandbyMode = "" - if (result.preferredStandbyMode == "LIGHT_SLEEP") { - currentStandbyMode = "Light Sleep" - } else if (result.preferredStandbyMode == "DEEP_SLEEP") { - currentStandbyMode = "Deep Sleep" - } - this.tag("EnergySaver.Title").text.text = Language.translate("Energy Saver: ") + currentStandbyMode - }) - if (Storage.get('ScreenSaverTimeoutInterval')) { this.tag('ScreenSaver.Title').text.text = Language.translate('Screen-Saver: ') + Storage.get('ScreenSaverTimeoutInterval') + ' min' } else { @@ -294,7 +250,7 @@ } _handleDown() { // this._setState('RemoteControl') - this._setState('EnergySaver') + this._setState('Privacy') } _handleEnter() { this._setState("SleepTimerScreen") @@ -328,28 +284,11 @@ _handleUp() { this._setState('RemoteControl') } - _handleDown() { - this._setState('EnergySaver') - } - _handleEnter() { - // - } - }, - class EnergySaver extends this { - $enter() { - this.tag('EnergySaver')._focus() - } - $exit() { - this.tag('EnergySaver')._unfocus() - } - _handleUp() { - this._setState('SleepTimer') - } _handleDown() { this._setState('Privacy') } _handleEnter() { - this._setState("EnergySavingsScreen") + // } }, @@ -361,7 +300,7 @@ this.tag('Language')._unfocus() } _handleUp() { - this._setState('EnergySaver') + this._setState('SleepTimer') } _handleDown() { this._setState('Privacy') @@ -378,7 +317,7 @@ this.tag('Privacy')._unfocus() } _handleUp() { - this._setState('EnergySaver') + this._setState('SleepTimer') } _handleDown() { this._setState('AdvancedSettings') @@ -424,26 +363,6 @@ this._setState('SleepTimer') } }, - class EnergySavingsScreen extends this { - $enter() { - ////console.log("bpscreen") - this.hide() - this.tag('EnergySavingsScreen').visible = true - this.fireAncestors("$updatePageTitle",'Settings Other Settings Energy Saver') - } - _getFocused() { - //console.log("getfocusedbp") - return this.tag('EnergySavingsScreen') - } - $exit() { - this.show() - this.tag('EnergySavingsScreen').visible = false - this.fireAncestors("$updatePageTitle",'Settings Other Settings') - } - _handleBack() { - this._setState('EnergySaver') - } - }, //LanguageScreen class LanguageScreen extends this { $enter() { diff --git a/accelerator-home-ui/src/routes/otherSettingsRoutes.js b/accelerator-home-ui/src/routes/otherSettingsRoutes.js index eec5bd3..94477df 100644 --- a/accelerator-home-ui/src/routes/otherSettingsRoutes.js +++ b/accelerator-home-ui/src/routes/otherSettingsRoutes.js @@ -18,7 +18,6 @@ **/ import OtherSettingsScreen from '../screens/OtherSettingsScreens/OtherSettingsScreen' import SleepTimerScreen from '../screens/SleepTimerScreen' -import EnergySaverScreen from '../screens/OtherSettingsScreens/EnergySavingsScreen' import LanguageScreen from '../screens/OtherSettingsScreens/LanguageScreen' import PrivacyScreen from '../screens/OtherSettingsScreens/PrivacyScreen' import PrivacyPolicyScreen from '../screens/OtherSettingsScreens/PrivacyPolicyScreen' @@ -50,11 +49,6 @@ export default { component: SleepTimerScreen, widgets: ['Menu', 'Volume', "AppCarousel"], }, - { - path: 'settings/other/energy', - component: EnergySaverScreen, - widgets: ['Menu', 'Volume', "AppCarousel"], - }, { path: 'settings/other/language', component: LanguageScreen, diff --git a/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js b/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js index 36d50e0..0bebc3b 100644 --- a/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js +++ b/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js @@ -196,8 +196,6 @@ export default class RebootConfirmationScreen extends Lightning.Component { let rsactivitytime = await appApi.resetInactivityTime().catch(err => { this.ERR("resetInactivityTime" + JSON.stringify(err)) }); if (rsactivitytime.success != true) { this.LOG("rsactivitytime" + JSON.stringify(rsactivitytime)) } - let clearLastDeepSleepReason = await appApi.clearLastDeepSleepReason().catch(err => { this.ERR("clearLastDeepSleepReason" + JSON.stringify(err)) }); - if (clearLastDeepSleepReason.success != true) { this.LOG("clearLastDeepSleepReason" + JSON.stringify(clearLastDeepSleepReason)) } let GetKnownSSIDs = await NetworkManager.GetKnownSSIDs().then((ssids)=>{ssids}).catch(err => { console.error("GetKnownssids",err) }); let clearSSID =false for(let i=0;i { - let currentStandbyMode = "" - if (result.preferredStandbyMode == "LIGHT_SLEEP") { - currentStandbyMode = "Light Sleep" - } else if (result.preferredStandbyMode == "DEEP_SLEEP") { - currentStandbyMode = "Deep Sleep" - } - this.tag("EnergySaver.Title").text.text = Language.translate("Energy Saver: ") + Language.translate(currentStandbyMode) - }) - if (Storage.get('ScreenSaverTimeoutInterval')) { this.tag('ScreenSaver.Title').text.text = Language.translate('Screen-Saver: ') + Storage.get('ScreenSaverTimeoutInterval') + ' min' } else { @@ -320,35 +281,14 @@ export default class OtherSettingsScreen extends Lightning.Component { this._setState('SleepTimer') } _handleDown() { - this._setState('EnergySaver') - } - _handleEnter() { - if(!Router.isNavigating()){ - Router.navigate('settings/other/ScreenSaver') - } - } - }, - class EnergySaver extends this { - $enter() { - this.tag('EnergySaver')._focus() - } - $exit() { - this.tag('EnergySaver')._unfocus() - } - _handleUp() { - this._setState('ScreenSaver') - } - _handleDown() { - // this._setState('Theme') this._setState('Language') } _handleEnter() { if(!Router.isNavigating()){ - Router.navigate('settings/other/energy') + Router.navigate('settings/other/ScreenSaver') } } }, - class Language extends this { $enter() { this.tag('Language')._focus() @@ -357,7 +297,7 @@ export default class OtherSettingsScreen extends Lightning.Component { this.tag('Language')._unfocus() } _handleUp() { - this._setState('EnergySaver') + this._setState('ScreenSaver') } _handleDown() { this._setState('Privacy') From 27819d567b4692be6ac2bc978fad7c68874d05c9 Mon Sep 17 00:00:00 2001 From: suryag23 Date: Wed, 22 Oct 2025 14:08:12 +0530 Subject: [PATCH 04/12] addressed the review comments --- accelerator-home-ui/src/App.js | 7 ++- .../src/api/PowerManagerApi.js | 50 +++++++++---------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 83732de..052d3c2 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -500,7 +500,10 @@ export default class App extends Router.App { }).then(result => { this.LOG("App System plugin activation result: " + JSON.stringify(result)) let param = { - "wakeupSources": 262143 + //https://github.com/rdkcentral/entservices-apis/blob/1.15.11/docs/apis/PowerManagerPlugin.md#setWakeupSrcConfig + //By the above documentation we passed the Enum value sum to enable all wakeup sources expect WAKEUP_REASON_UNKNOWN + //Enum indicating bit position (bit counting starts at 1) + "wakeupSources": 262143 } powermanagerapi.setWakeupSrcConfig(param); appApi.setPowerState(GLOBALS.powerState).then(res => {}); @@ -674,7 +677,7 @@ export default class App extends Router.App { }) } appApi.getPluginStatus('org.rdk.PowerManager').then(result => { - if (result[0].state === "activated") { + if (res && res.length > 0 && result[0].state === "activated") { console.log("org.rdk.PowerManager is already activated"); } else { powermanagerapi.activate().then((res) => { diff --git a/accelerator-home-ui/src/api/PowerManagerApi.js b/accelerator-home-ui/src/api/PowerManagerApi.js index 0cb63b4..e06213d 100644 --- a/accelerator-home-ui/src/api/PowerManagerApi.js +++ b/accelerator-home-ui/src/api/PowerManagerApi.js @@ -34,18 +34,18 @@ export default class PowerManagerApi { this.callsign = "org.rdk.PowerManager"; } activate() { - return new Promise((resolve, reject) => { - this.thunder.Controller.activate({ callsign: this.callsign }) - .then(() => { - resolve(true) - }) - .catch(err => { - this.ERR("Error Activation " + JSON.stringify(err)) - Metrics.error(Metrics.ErrorType.OTHER, errorName, `Error while Thunder Controller ${callsign} activate ${JSON.stringify(err)}`, false, null) - reject(err) - }) - }) - } + return new Promise((resolve, reject) => { + this.thunder.Controller.activate({ callsign: this.callsign }) + .then(() => { + resolve(true) + }) + .catch(err => { + this.ERR("Error Activation " + JSON.stringify(err)) + Metrics.error(Metrics.ErrorType.OTHER, errorName, `Error while Thunder Controller ${callsign} activate ${JSON.stringify(err)}`, false, null) + reject(err) + }) + }) + } deactivate() { return new Promise((resolve, reject) => { this.thunder.Controller.deactivate({ callsign: this.callsign }) @@ -59,17 +59,17 @@ export default class PowerManagerApi { }) }) } - setWakeupSrcConfig(params) { - this.LOG("setWakeupSrcConfiguration params:", JSON.stringify(params)); - return new Promise((resolve, reject) => { - this.thunder.call(this.callsign, 'setWakeupSrcConfig', params).then(result => { - this.LOG(" setWakeupSrcConfiguration result:", JSON.stringify(result)) - resolve(result.success) - }).catch(err => { - this.ERR(" setWakeupSrcConfiguration error:", JSON.stringify(err, 3, null)) - Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder system setWakeupSrcConfiguration " + JSON.stringify(err), false, null) - reject(err) - }) + setWakeupSrcConfig(params) { + this.LOG("setWakeupSrcConfiguration params:", JSON.stringify(params)); + return new Promise((resolve, reject) => { + this.thunder.call(this.callsign, 'setWakeupSrcConfig', params).then(result => { + this.LOG(" setWakeupSrcConfiguration result:", JSON.stringify(result)) + resolve(result.success) + }).catch(err => { + this.ERR(" setWakeupSrcConfiguration error:", JSON.stringify(err)) + Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder system setWakeupSrcConfiguration " + JSON.stringify(err), false, null) + reject(err) }) - } -} \ No newline at end of file + }) + } +} From bede538e86130b3e32143399dd44c3e739c74c07 Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Thu, 23 Oct 2025 18:31:45 +0530 Subject: [PATCH 05/12] Ethernet connection showing Configuring as default with continous loader issue is fixed --- .../NetworkInterfaceScreen.js | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js b/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js index ef714c3..1a4ca18 100644 --- a/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js +++ b/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js @@ -116,14 +116,20 @@ export default class NetworkInterfaceScreen extends Lightning.Component { } else if (notification.currentActiveInterface === "wlan0") { this.loadingAnimation.stop() this.tag('Ethernet.Loader').visible = false - this.tag('Ethernet.Title').text.text = 'Ethernet' + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Not Connected') } Metrics.action("user", "The user changed the network interface", null) }); this.onConnectionStatusChangedCB = NetworkManager.thunder.on(NetworkManager.callsign, 'onInterfaceStateChange', (notification) => { this.LOG('onInterfaceStateChange notification from networkInterfaceScreen: ' + JSON.stringify(notification)) if (notification.interface === "eth0") { - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate(notification.state.toLowerCase()) + if (notification.status == 'INTERFACE_LINK_DOWN') { + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Not Connected') + } else if (notification.status == 'INTERFACE_ACQUIRING_IP'){ + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Connected') + } else { + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate(notification.status.toLowerCase()) + } } Metrics.action("App", "network connection of app changed", null) }); @@ -194,22 +200,18 @@ export default class NetworkInterfaceScreen extends Lightning.Component { this.tag('Ethernet')._unfocus() } async _handleEnter() { - this.tag('Ethernet.Title').text.text = 'Ethernet :' + Language.translate('Configuring as default') + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Configuring as default') this.tag('Ethernet.Loader').visible = true this.loadingAnimation.start() await NetworkManager.GetInterfaceState("eth0").then(enabled => { if (!enabled) { - NetworkManager.SetInterfaceState("eth0").then(() => { - if (result) { - this.loadingAnimation.stop() - this.tag('Ethernet.Title').text.text = 'Ethernet' - this.tag('Ethernet.Loader').visible = false - } - }); + this.loadingAnimation.stop() + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Not Connected') + this.tag('Ethernet.Loader').visible = false } else { setTimeout(() => { this.loadingAnimation.stop() - this.tag('Ethernet.Title').text.text = 'Ethernet' + this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate("Connected") this.tag('Ethernet.Loader').visible = false }, 1000) } From 1554bca315e6ef5f77d860838c9922f59e4e1668 Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Fri, 24 Oct 2025 12:24:39 +0530 Subject: [PATCH 06/12] Updated version number --- accelerator-home-ui/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index d939b1c..af1c59e 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.14" + "version": "5.0.15" } } From d0c5c6055dd988c50bab309eee8b9906a1091617 Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Fri, 24 Oct 2025 18:30:36 +0530 Subject: [PATCH 07/12] Addressed the review comments --- .../src/api/NetworkManagerAPI.js | 5 +++ .../NetworkInterfaceScreen.js | 32 +++++++++---------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/accelerator-home-ui/src/api/NetworkManagerAPI.js b/accelerator-home-ui/src/api/NetworkManagerAPI.js index 5f0dc1d..4aebb26 100644 --- a/accelerator-home-ui/src/api/NetworkManagerAPI.js +++ b/accelerator-home-ui/src/api/NetworkManagerAPI.js @@ -37,6 +37,11 @@ export const WiFiState = { WIFI_STATE_ERROR:13 } +export const ETHERNET_STATUS = { + DISCONNECTED: 'INTERFACE_LINK_DOWN', + CONNECTED: 'INTERFACE_ACQUIRING_IP' +} + class NetworkManager { constructor() { this.thunder = ThunderJS(CONFIG.thunderConfig); diff --git a/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js b/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js index 1a4ca18..eec5929 100644 --- a/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js +++ b/accelerator-home-ui/src/screens/OtherSettingsScreens/NetworkInterfaceScreen.js @@ -22,7 +22,7 @@ import { COLORS } from '../../colors/Colors' import { CONFIG } from '../../Config/Config' import { Language } from '@lightningjs/sdk'; import { Metrics } from '@firebolt-js/sdk' -import NetworkManager from '../../api/NetworkManagerAPI' +import NetworkManager, { ETHERNET_STATUS } from '../../api/NetworkManagerAPI' export default class NetworkInterfaceScreen extends Lightning.Component { constructor(...args) { @@ -108,25 +108,25 @@ export default class NetworkInterfaceScreen extends Lightning.Component { if (notification.currentActiveInterface === "eth0") { this.loadingAnimation.stop() this.tag('Ethernet.Loader').visible = false - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate("Connected") + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate("Connected") } else if (notification.currentActiveInterface === "" && notification.prevActiveInterface === "wlan0") { this.loadingAnimation.stop() this.tag('Ethernet.Loader').visible = false - this.tag('Ethernet.Title').text.text = 'Ethernet: '+Language.translate('Error')+', '+Language.translate('Retry')+'!' + this.tag('Ethernet.Title').text.text = 'Ethernet : '+Language.translate('Error')+', '+Language.translate('Retry')+'!' } else if (notification.currentActiveInterface === "wlan0") { this.loadingAnimation.stop() this.tag('Ethernet.Loader').visible = false - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Not Connected') + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate('Not Connected') } Metrics.action("user", "The user changed the network interface", null) }); this.onConnectionStatusChangedCB = NetworkManager.thunder.on(NetworkManager.callsign, 'onInterfaceStateChange', (notification) => { this.LOG('onInterfaceStateChange notification from networkInterfaceScreen: ' + JSON.stringify(notification)) if (notification.interface === "eth0") { - if (notification.status == 'INTERFACE_LINK_DOWN') { - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Not Connected') - } else if (notification.status == 'INTERFACE_ACQUIRING_IP'){ - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Connected') + if (notification.status == ETHERNET_STATUS.DISCONNECTED) { + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate('Not Connected') + } else if (notification.status == ETHERNET_STATUS.CONNECTED){ + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate('Connected') } else { this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate(notification.status.toLowerCase()) } @@ -200,20 +200,20 @@ export default class NetworkInterfaceScreen extends Lightning.Component { this.tag('Ethernet')._unfocus() } async _handleEnter() { - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Configuring as default') + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate('Configuring as default') this.tag('Ethernet.Loader').visible = true this.loadingAnimation.start() await NetworkManager.GetInterfaceState("eth0").then(enabled => { - if (!enabled) { - this.loadingAnimation.stop() - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate('Not Connected') - this.tag('Ethernet.Loader').visible = false - } else { - setTimeout(() => { + if (enabled) { + setTimeout(() => { this.loadingAnimation.stop() - this.tag('Ethernet.Title').text.text = 'Ethernet: ' + Language.translate("Connected") + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate("Connected") this.tag('Ethernet.Loader').visible = false }, 1000) + } else { + this.loadingAnimation.stop() + this.tag('Ethernet.Title').text.text = 'Ethernet : ' + Language.translate('Not Connected') + this.tag('Ethernet.Loader').visible = false } }); } From dc7dc338fa03a44f0eef6f3471f206ab8098990c Mon Sep 17 00:00:00 2001 From: MadhumitaBiswas-Comcast Date: Wed, 29 Oct 2025 16:38:27 +0530 Subject: [PATCH 08/12] [RDKEAPPRT-328] - Use UserSettings instead of UserPreferences for storing currently set UI language (#139) * UserSettings instead of UserPreferences * use UserSettingsApi for presentationLanguage * resolve review comment * resolve review comment2 * resolve review comment * resolved review and keep old name * resolve review2 * remove comment * resolve review * version tag update in settings --------- Co-authored-by: suryag23 <141610966+suryag23@users.noreply.github.com> --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 11 ++----- accelerator-home-ui/src/api/AppApi.js | 24 +++----------- .../src/api/UserSettingsApi.js | 33 +++++++++++++++++++ 4 files changed, 41 insertions(+), 29 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index af1c59e..99cd05a 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.15" + "version": "5.0.16" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 052d3c2..c8ded3f 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -79,7 +79,7 @@ import Miracast from './api/Miracast.js'; import MiracastNotification from './screens/MiracastNotification.js'; import NetworkManager from './api/NetworkManagerAPI.js'; import PowerManagerApi from './api/PowerManagerApi.js'; - +import UserSettingsApi from './api/UserSettingsApi'; var AlexaAudioplayerActive = false; var thunder = ThunderJS(CONFIG.thunderConfig); @@ -487,14 +487,7 @@ export default class App extends Router.App { GLOBALS.deviceType = ((result.devicetype != null) ? result.devicetype : "IpTv"); Storage.set("deviceType", ((result.devicetype != null) ? result.devicetype : "IpTv")); }); - thunder.Controller.activate({ - callsign: 'org.rdk.UserPreferences' - }).then(result => { - this.LOG("App UserPreferences plugin activation result: " + JSON.stringify(result)) - }).catch(err => { - this.ERR("App UserPreferences plugin activation error: " + JSON.stringify(err)); - Metrics.error(Metrics.ErrorType.OTHER, 'PluginError', "Thunder Controller Activate error " + JSON.stringify(err), false, null) - }) + UserSettingsApi.get().activate(); thunder.Controller.activate({ callsign: 'org.rdk.System' }).then(result => { diff --git a/accelerator-home-ui/src/api/AppApi.js b/accelerator-home-ui/src/api/AppApi.js index 2cd4fed..084cab4 100644 --- a/accelerator-home-ui/src/api/AppApi.js +++ b/accelerator-home-ui/src/api/AppApi.js @@ -26,6 +26,7 @@ import AlexaApi from './AlexaApi.js'; import RDKShellApis from './RDKShellApis.js'; import { Metrics } from '@firebolt-js/sdk'; import Network from './NetworkApi.js'; +import UserSettingsApi from './UserSettingsApi.js'; const thunder = ThunderJS(CONFIG.thunderConfig) @@ -1899,28 +1900,13 @@ export default class AppApi { }); }) } - + setUILanguage(updatedLanguage) { - return new Promise((resolve) => { - thunder.call('org.rdk.UserPreferences', 'setUILanguage', { "ui_language": updatedLanguage }).then(result => { - resolve(result) - }).catch(err => { - this.ERR('AppAPI setUILanguage failed:' + JSON.stringify(err)) - Metrics.error(Metrics.ErrorType.OTHER, "PluginError", 'Error in Thunder setUILanguage of UserPreferences' + JSON.stringify(err), false, null) - resolve(false) - }) - }) + return UserSettingsApi.get().setPresentationLanguage(updatedLanguage) } + getUILanguage() { - return new Promise((resolve) => { - thunder.call('org.rdk.UserPreferences', 'getUILanguage').then(result => { - resolve(result.ui_language) - }).catch(err => { - this.ERR('AppAPI getUILanguage failed:' + JSON.stringify(err)) - Metrics.error(Metrics.ErrorType.OTHER, "PluginError", 'Error in Thunder getUILanguage of UserPreferences' +JSON.stringify(err), false, null) - resolve(false) - }) - }) + return UserSettingsApi.get().getPresentationLanguage(updatedLanguage) } deeplinkToApp(app = undefined, payload = undefined, launchLocation = "voice", namespace = undefined) { diff --git a/accelerator-home-ui/src/api/UserSettingsApi.js b/accelerator-home-ui/src/api/UserSettingsApi.js index 4e8038e..dd1bffb 100644 --- a/accelerator-home-ui/src/api/UserSettingsApi.js +++ b/accelerator-home-ui/src/api/UserSettingsApi.js @@ -24,6 +24,8 @@ const thunder = ThunderJS(CONFIG.thunderConfig) const callsign = 'org.rdk.UserSettings' const errorName = 'UserSettingsError' +let instance = null + export default class UserSettingsApi { constructor() { this.INFO = console.info; @@ -32,6 +34,13 @@ export default class UserSettingsApi { this.WARN = console.warn; } + static get() { + if (instance === null) { + instance = new UserSettingsApi() + } + return instance; + } + activate() { return new Promise((resolve, reject) => { thunder.Controller.activate({ callsign: callsign }) @@ -90,4 +99,28 @@ export default class UserSettingsApi { }) }) } + + setPresentationLanguage(updatedLanguage) { + return new Promise((resolve) => { + thunder.call(callsign, 'setPresentationLanguage', { "presentationLanguage": updatedLanguage }).then(result => { + resolve(result) + }).catch(err => { + this.ERR('UserSettingsApi setPresentationLanguage failed:' + JSON.stringify(err)) + Metrics.error(Metrics.ErrorType.OTHER, "PluginError", 'Error in Thunder setPresentationLanguage of UserSettings' + JSON.stringify(err), false, null) + resolve(false) + }) + }) + } + + getPresentationLanguage() { + return new Promise((resolve) => { + thunder.call(callsign, 'getPresentationLanguage').then(result => { + resolve(result) + }).catch(err => { + this.ERR('UserSettingsApi getPresentationLanguage failed:' + JSON.stringify(err)) + Metrics.error(Metrics.ErrorType.OTHER, "PluginError", 'Error in Thunder getPresentationLanguage of UserSettings' +JSON.stringify(err), false, null) + resolve(false) + }) + }) + } } From 4c2f755d054e04530a8af815760a5f7936c72f2d Mon Sep 17 00:00:00 2001 From: suryag23 <141610966+suryag23@users.noreply.github.com> Date: Thu, 30 Oct 2025 14:49:08 +0530 Subject: [PATCH 09/12] RDKEAPPRT-356 Incorrect behaviors seen after giving wrong credentials for WiFi SSID Or changing the password for a connected SSID (#140) * RDKEAPPRT-356 Incorrect behaviors seen after giving wrong credentials for WiFi SSID Or changing the password for a connected SSID * Updated the logic to remove known ssid in networklist screen * Addressed review comment and added fix for getknownssids in factoryreset page --- accelerator-home-ui/settings.json | 2 +- .../src/overlays/NetworkScreens/NetworkWifiOverlay.js | 6 +++--- .../FactoryResetConfirmationScreen.js | 8 +++++--- .../src/screens/SplashScreens/NetworkList.js | 9 ++++++++- accelerator-home-ui/src/screens/WiFiPairingScreen.js | 2 +- accelerator-home-ui/src/screens/WifiScreen.js | 4 ++-- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 99cd05a..e781802 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.16" + "version": "5.0.17" } } diff --git a/accelerator-home-ui/src/overlays/NetworkScreens/NetworkWifiOverlay.js b/accelerator-home-ui/src/overlays/NetworkScreens/NetworkWifiOverlay.js index c8837ab..ff774c0 100644 --- a/accelerator-home-ui/src/overlays/NetworkScreens/NetworkWifiOverlay.js +++ b/accelerator-home-ui/src/overlays/NetworkScreens/NetworkWifiOverlay.js @@ -191,7 +191,7 @@ export default class WiFiScreen extends Lightning.Component { notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED || notification.state === WiFiState.WIFI_STATE_ERROR ) { - if ((notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS) || (notification.state === WiFiState.WIFI_STATE_SSID_CHANGED)) { + if ((notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS) || (notification.state === WiFiState.WIFI_STATE_SSID_CHANGED)|| (notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED)) { NetworkManager.RemoveKnownSSID(selectedssid.ssid).then(() => { this.LOG("INVALID_CREDENTIALS; deleting WiFi Persistence data.") PersistentStoreApi.get().deleteNamespace('wifi') @@ -381,9 +381,9 @@ export default class WiFiScreen extends Lightning.Component { this.LOG("WiFiScreen getPairedSSID matched with current selection; try auto connect."); NetworkManager.WiFiConnect(true).then(() => { NetworkManager.thunder.on('onWiFiStateChange', notification => { - if (notification.code === WiFiState.WIFI_STATE_SSID_CHANGED || notification.code === WiFiState.WIFI_STATE_INVALID_CREDENTIALS) { + if (notification.code === WiFiState.WIFI_STATE_SSID_CHANGED || notification.code === WiFiState.WIFI_STATE_INVALID_CREDENTIALS|| notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED) { - NetworkManager.RemoveKnownSSID(selectedssid).then(() => { + NetworkManager.RemoveKnownSSID(selectedssid.ssid).then(() => { this._setState("WifiPairingScreen") }) } diff --git a/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js b/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js index 0bebc3b..558712a 100644 --- a/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js +++ b/accelerator-home-ui/src/screens/OtherSettingsScreens/FactoryResetConfirmationScreen.js @@ -198,10 +198,12 @@ export default class RebootConfirmationScreen extends Lightning.Component { if (rsactivitytime.success != true) { this.LOG("rsactivitytime" + JSON.stringify(rsactivitytime)) } let GetKnownSSIDs = await NetworkManager.GetKnownSSIDs().then((ssids)=>{ssids}).catch(err => { console.error("GetKnownssids",err) }); let clearSSID =false - for(let i=0;i0) { - if(GetKnownSSIDs.length>0) - {clearSSID= await NetworkManager.RemoveKnownSSID(ssids[i]).catch(err => { this.ERR("clearSSID" + JSON.stringify(err)) });} + for(let i=0;i { this.ERR("clearSSID" + JSON.stringify(err)) });} + } } if (clearSSID != true) { this.LOG("clearSSID" + JSON.stringify(clearSSID)) } let wifidisconnect = await NetworkManager.WiFiDisconnect().catch(err =>{ this.ERR("wifidisconnect" + JSON.stringify(err)) }); diff --git a/accelerator-home-ui/src/screens/SplashScreens/NetworkList.js b/accelerator-home-ui/src/screens/SplashScreens/NetworkList.js index ab6ca9f..fd82db6 100644 --- a/accelerator-home-ui/src/screens/SplashScreens/NetworkList.js +++ b/accelerator-home-ui/src/screens/SplashScreens/NetworkList.js @@ -24,6 +24,7 @@ import SettingsMainItem from '../../items/SettingsMainItem' import WiFiItem from '../../items/WiFiItem' import NetworkManager,{WiFiState}from '../../api/NetworkManagerAPI' + export default class NetworkList extends Lightning.Component { constructor(...args) { super(...args); @@ -31,6 +32,7 @@ export default class NetworkList extends Lightning.Component { this.LOG = console.log; this.ERR = console.error; this.WARN = console.warn; + this.selectedssid = null; } static _template() { @@ -298,6 +300,7 @@ export default class NetworkList extends Lightning.Component { this._navigate('AvailableDevices', 'up') } _handleEnter() { + this.selectedssid = this.tag('Networks.AvailableNetworks').tag('List').element._item console.log(this.tag('Networks.AvailableNetworks').tag('List').element._item) GLOBALS.NetworkListStatus = true Router.navigate('settings/network/interface/wifi/connect', { wifiItem: this.tag('Networks.AvailableNetworks').tag('List').element._item }) @@ -390,7 +393,7 @@ export default class NetworkList extends Lightning.Component { */ _activateWiFi() { this.switch() - NetworkManager.thunder.on(NetworkManager.callsign, 'onWiFiStateChange', notification => { + NetworkManager.thunder.on(NetworkManager.callsign, 'onWiFiStateChange', async notification => { this.LOG(JSON.stringify(notification)) if (notification.state === WiFiState.WIFI_STATE_CONNECTED && ! GLOBALS.Setup) { this.tag('Info').text.text = Language.translate("Connection successful"); @@ -407,6 +410,10 @@ export default class NetworkList extends Lightning.Component { notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED || notification.state === WiFiState.WIFI_STATE_ERROR ) { + if (notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS|| notification.state === WiFiState.WIFI_STATE_SSID_CHANGED || notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED) + { + await NetworkManager.RemoveKnownSSID(this.selectedssid.ssid) + } NetworkManager.StartWiFiScan() NetworkManager.GetPrimaryInterface().then(defIface => { if (defIface != "eth0") { diff --git a/accelerator-home-ui/src/screens/WiFiPairingScreen.js b/accelerator-home-ui/src/screens/WiFiPairingScreen.js index 31eb9ad..67865cf 100644 --- a/accelerator-home-ui/src/screens/WiFiPairingScreen.js +++ b/accelerator-home-ui/src/screens/WiFiPairingScreen.js @@ -233,7 +233,7 @@ export default class WifiPairingScreen extends Lightning.Component { } let flag = 0 this.onWIFIStateChangedCB = NetworkManager.thunder.on(NetworkManager.callsign, 'onWiFiStateChange', notification => { - if (notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS|| notification.state === WiFiState.WIFI_STATE_SSID_CHANGED) { + if (notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS|| notification.state === WiFiState.WIFI_STATE_SSID_CHANGED || notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED) { this.LOG("INVALID_CREDENTIALS; deleting WiFi Persistence data.") NetworkManager.RemoveKnownSSID(Ssid).then(() => { PersistentStoreApi.get().deleteNamespace('wifi') diff --git a/accelerator-home-ui/src/screens/WifiScreen.js b/accelerator-home-ui/src/screens/WifiScreen.js index 8e0abc5..4ed25ba 100644 --- a/accelerator-home-ui/src/screens/WifiScreen.js +++ b/accelerator-home-ui/src/screens/WifiScreen.js @@ -340,7 +340,7 @@ export default class WiFiScreen extends Lightning.Component { this.LOG("WiFiScreen getPairedSSID matched with current selection; try auto connect.") NetworkManager.WiFiConnect(true).then(() => { NetworkManager.thunder.on('onWiFiStateChange', notification => { - if (notification.state === WiFiState.WIFI_STATE_SSID_CHANGED || notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS) { + if (notification.state === WiFiState.WIFI_STATE_SSID_CHANGED || notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS || notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED) { NetworkManager.RemoveKnownSSID(selectedssid.ssid).then(() => { Router.navigate('settings/network/interface/wifi/connect', { wifiItem: this.tag('Networks.AvailableNetworks').tag('List').element._item }) }) @@ -500,7 +500,7 @@ export default class WiFiScreen extends Lightning.Component { notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED || notification.state === WiFiState.WIFI_STATE_ERROR || notification.state === WiFiState.WIFI_STATE_DISCONNECTED) { - if ((notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS) || (notification.state === WiFiState.WIFI_STATE_SSID_CHANGED)) { + if ((notification.state === WiFiState.WIFI_STATE_INVALID_CREDENTIALS) || (notification.state === WiFiState.WIFI_STATE_SSID_CHANGED) || notification.state === WiFiState.WIFI_STATE_AUTHENTICATION_FAILED) { await NetworkManager.RemoveKnownSSID(selectedssid.ssid) } if (this.renderSSIDS.length) { From f0257e0ff5aa351f3d748c8437f5ed03f7fc7fe9 Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Fri, 31 Oct 2025 16:01:41 +0530 Subject: [PATCH 10/12] RDKEAPPRT-358: Once disabled, not able to toggle Local Device Discovery radio to ON state (#141) * Local Device discovery toggle button issue fixed * Added a catch block * Addressed review comment added global variable * Updated version --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 2 + accelerator-home-ui/src/Config/Config.js | 9 +++++ .../OtherSettingsScreens/PrivacyScreen.js | 40 ++++++++++--------- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index e781802..8943a61 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.17" + "version": "5.0.18" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index c8ded3f..6c9ab1a 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -790,8 +790,10 @@ export default class App extends Router.App { this.LOG("Xcast friendly name to be set: " + JSON.stringify(modelName)); await this.xcastApi.setFriendlyName(modelName); await this.xcastApi.setEnabled(true).then(res => { + GLOBALS.LocalDeviceDiscoveryStatus = true; console.warn("Xcast setEnabled success" + JSON.stringify(res)); }).catch(err => { + GLOBALS.LocalDeviceDiscoveryStatus = false; this.ERR("Xcast setEnabled error:" + JSON.stringify(err)) }); await this.xcastApi.setStandbyBehavior("active").then(async res => { diff --git a/accelerator-home-ui/src/Config/Config.js b/accelerator-home-ui/src/Config/Config.js index 0362f34..7338471 100644 --- a/accelerator-home-ui/src/Config/Config.js +++ b/accelerator-home-ui/src/Config/Config.js @@ -81,6 +81,7 @@ export const GLOBALS = { _previousapp_onActiveSourceStatusUpdated:null, _previousapp_onDisplayConnectionChanged:null, _constantselfClientName: window.__firebolt && window.__firebolt.endpoint !== undefined ? "FireboltMainApp-refui" : "ResidentApp", + _LocalDeviceDiscoveryStatus:false, get selfClientName() { return this._constantselfClientName; }, @@ -185,5 +186,13 @@ export const GLOBALS = { get MiracastNotificationstatus() { return this._MiracastNotificationstatus + }, + set LocalDeviceDiscoveryStatus(status) + { + this._LocalDeviceDiscoveryStatus = status + }, + get LocalDeviceDiscoveryStatus() + { + return this._LocalDeviceDiscoveryStatus } } diff --git a/accelerator-home-ui/src/screens/OtherSettingsScreens/PrivacyScreen.js b/accelerator-home-ui/src/screens/OtherSettingsScreens/PrivacyScreen.js index 19e5954..c37ace2 100644 --- a/accelerator-home-ui/src/screens/OtherSettingsScreens/PrivacyScreen.js +++ b/accelerator-home-ui/src/screens/OtherSettingsScreens/PrivacyScreen.js @@ -229,25 +229,29 @@ export default class PrivacyScreen extends Lightning.Component { } toggleLocalDeviceDiscovery() { - xcastApi.getEnabled().then(res => { - if (!res.enabled) { - xcastApi.activate().then(res => { - if (res) { - this.tag('LocalDeviceDiscovery.Button').src = Utils.asset('images/settings/ToggleOnOrange.png') - } - }) - } - else { - xcastApi.deactivate().then(res => { - if (res) { + if (GLOBALS.LocalDeviceDiscoveryStatus) { + xcastApi.getEnabled().then(res => { + if (res.enabled) { + xcastApi.deactivate().then(res => { this.tag('LocalDeviceDiscovery.Button').src = Utils.asset('images/settings/ToggleOffWhite.png') - } - }) - } - }).catch(err => { - this.LOG('Service not active') - this.tag('LocalDeviceDiscovery.Button').src = Utils.asset('images/settings/ToggleOffWhite.png') - }) + GLOBALS.LocalDeviceDiscoveryStatus = false; + }) + } + }).catch(err => { + this.LOG('Error while fetching Xcast Enable status') + this.tag('LocalDeviceDiscovery.Button').src = Utils.asset('images/settings/ToggleOffWhite.png') + }) + } else { + xcastApi.activate().then(res => { + if (res) { + GLOBALS.LocalDeviceDiscoveryStatus = true; + this.tag('LocalDeviceDiscovery.Button').src = Utils.asset('images/settings/ToggleOnOrange.png') + } + }).catch(err => { + this.LOG('Service not active') + this.tag('LocalDeviceDiscovery.Button').src = Utils.asset('images/settings/ToggleOffWhite.png') + }) + } } static _states() { From f7a458063bc57f1103bb7977593423c5ba1a84b6 Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Thu, 13 Nov 2025 11:01:50 +0530 Subject: [PATCH 11/12] RDKEAPPRT-344- Migrate the New powermanger plugin APIs in UI (#142) * Add loader app assets and channel configuration * Delete accelerator-home-ui/dist directory * Changes to use powermanager api's for reboot and factory reset * Updated version * Addressed the review comments * Addressed the review comments * Added const for power states --------- Co-authored-by: suryag23 Co-authored-by: suryag23 <141610966+suryag23@users.noreply.github.com> --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 118 ++++++++---------- accelerator-home-ui/src/api/AppApi.js | 73 +++-------- .../src/api/PowerManagerApi.js | 95 +++++++++++++- 4 files changed, 162 insertions(+), 126 deletions(-) diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 8943a61..0dfda18 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.18" + "version": "5.0.19" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index 6c9ab1a..c097bac 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -78,7 +78,7 @@ import RDKShellApis from './api/RDKShellApis.js'; import Miracast from './api/Miracast.js'; import MiracastNotification from './screens/MiracastNotification.js'; import NetworkManager from './api/NetworkManagerAPI.js'; -import PowerManagerApi from './api/PowerManagerApi.js'; +import PowerManagerApi, {PowerState} from './api/PowerManagerApi.js'; import UserSettingsApi from './api/UserSettingsApi'; var AlexaAudioplayerActive = false; @@ -89,7 +89,6 @@ var cecApi = new CECApi(); var xcastApi = new XcastApi(); var voiceApi = new VoiceApi(); var miracast = new Miracast(); -var powermanagerapi = new PowerManagerApi(); export default class App extends Router.App { @@ -209,7 +208,7 @@ export default class App extends Router.App { this.LOG("powerState ===>" + JSON.stringify(GLOBALS.powerState)) if (GLOBALS.powerState !== "ON") { appApi.setPowerState("ON").then(res => { - res.success ? this.LOG("successfully set the power state to ON from " + JSON.stringify(GLOBALS.powerState)) : this.LOG("Failure while turning ON the device") + res ? this.LOG("successfully set the power state to ON from " + JSON.stringify(GLOBALS.powerState)) : this.LOG("Failure while turning ON the device") }) return true } @@ -459,15 +458,7 @@ export default class App extends Router.App { "Amazon": "n:2", "Prime": "n:2" } - appApi.getPowerStateIsManagedByDevice().then(res => { - if (!res.powerStateManagedByDevice) { - this._getPowerStatebeforeReboot(); - } else { - appApi.getPowerState().then(res => { - GLOBALS.powerState = res.success ? res.powerState : "ON"; - }); - } - }).catch(err => this._getPowerStatebeforeReboot()); + this._getPowerStatebeforeReboot(); keyIntercept(GLOBALS.selfClientName).catch(err => { this.ERR("App _init keyIntercept err:" + JSON.stringify(err)); @@ -498,7 +489,7 @@ export default class App extends Router.App { //Enum indicating bit position (bit counting starts at 1) "wakeupSources": 262143 } - powermanagerapi.setWakeupSrcConfig(param); + appApi.setWakeupSrcConfiguration(param); appApi.setPowerState(GLOBALS.powerState).then(res => {}); }).catch(err => { this.ERR("App System plugin activation error: " + JSON.stringify(err)); @@ -654,26 +645,26 @@ export default class App extends Router.App { //video info change events begin here--------------------- /******************** RDKUI-341 CHANGES - DEEP SLEEP/LIGHT SLEEP **************************/ this._subscribeToControlNotifications() - let cachedPowerState = Storage.get('SLEEPING'); + let cachedPowerState = Storage.get(PowerState.POWER_STATE_SLEEP); this.LOG("cached power state" + JSON.stringify(cachedPowerState)) this.LOG(typeof cachedPowerState) if (cachedPowerState) { appApi.getWakeupReason().then(result => { if (result.result.wakeupReason !== 'WAKEUP_REASON_UNKNOWN') { - cachedPowerState = 'ON' + cachedPowerState = PowerState.POWER_STATE_ON; } }) appApi.setPowerState(cachedPowerState).then(result => { - if (result.success) { + if (result) { this.LOG("successfully set powerstate to: " + JSON.stringify(cachedPowerState)) } }) } appApi.getPluginStatus('org.rdk.PowerManager').then(result => { - if (res && res.length > 0 && result[0].state === "activated") { + if (result && result.length > 0 && result[0].state === "activated") { console.log("org.rdk.PowerManager is already activated"); } else { - powermanagerapi.activate().then((res) => { + PowerManagerApi.get().activate().then((res) => { this.LOG("activating the powermanager from app.js " + JSON.stringify(res)) }).catch((err) => this.ERR(JSON.stringify(err))) } @@ -1526,12 +1517,12 @@ export default class App extends Router.App { _getPowerStateWhileReboot() { appApi.getPowerState().then(res => { - this.LOG("_getPowerStateWhileReboot: Current power state while reboot " + JSON.stringify(res.powerState)); - this._powerStateWhileReboot = res.powerState; + this.LOG("_getPowerStateWhileReboot: Current power state while reboot " + JSON.stringify(res)); + this._powerStateWhileReboot = res.currentState; this._PowerStateHandlingWhileReboot(); }).catch(err => { this.LOG("_getPowerStateWhileReboot: Error in getting current power state while reboot " + JSON.stringify(err)); - this._powerStateWhileReboot = 'STANDBY'; + this._powerStateWhileReboot = PowerState.POWER_STATE_STANDBY; this._PowerStateHandlingWhileReboot(); }); } @@ -1542,9 +1533,9 @@ export default class App extends Router.App { this.LOG("_PowerStateHandlingWhileReboot: old power state is not equal to powerstate while reboot " + JSON.stringify(this._oldPowerStateWhileReboot) + " " + JSON.stringify(this._powerStateWhileReboot)); appApi.setPowerState(this._oldPowerStateWhileReboot).then(res => { this.LOG("_PowerStateHandlingWhileReboot: successfully set powerstate to old powerstate " + JSON.stringify(this._oldPowerStateWhileReboot)); - if (res.success) { + if (res) { appApi.getPowerState().then(res => { - GLOBALS.powerState = res.powerState; + GLOBALS.powerState = res.currentState; }); this.LOG("_PowerStateHandlingWhileReboot: powerstate after setting to new powerstate " + JSON.stringify(GLOBALS.powerState) + " and "); } @@ -1560,12 +1551,12 @@ export default class App extends Router.App { _getPowerStatebeforeReboot() { appApi.getPowerStateBeforeReboot().then(res => { - this.LOG("_getPowerStatebeforeReboot: getpowerstate before reboot " + JSON.stringify(res.state)); - this._oldPowerStateWhileReboot = res.state; + this.LOG("_getPowerStatebeforeReboot: getpowerstate before reboot " + JSON.stringify(res)); + this._oldPowerStateWhileReboot = res; this._getPowerStateWhileReboot(); }).catch(err => { this.LOG("_getPowerStatebeforeReboot: getPowerStateBeforeReboot error " + JSON.stringify(err) + " setting powerstate to ON"); - this._oldPowerStateWhileReboot = 'ON'; + this._oldPowerStateWhileReboot = PowerState.POWER_STATE_ON; this._getPowerStateWhileReboot(); }); } @@ -1597,24 +1588,24 @@ export default class App extends Router.App { } _firstEnable() { - thunder.on("org.rdk.System", "onSystemPowerStateChanged", notification => { - this.LOG(new Date().toISOString() + " onSystemPowerStateChanged Notification: " + JSON.stringify(notification)); + appApi.registerPowerEvent('onPowerModeChanged', notification => { + this.LOG(new Date().toISOString() + " onPowerModeChanged Notification: " + JSON.stringify(notification)); appApi.getPowerState().then(res => { - GLOBALS.powerState = res.success ? res.powerState : notification.powerState - }).catch(e => GLOBALS.powerState = notification.powerState) - if (notification.powerState !== "ON" && notification.currentPowerState === "ON") { - this.LOG("onSystemPowerStateChanged Notification: power state was changed from ON to " + JSON.stringify(notification.powerState)) + GLOBALS.powerState = res ? res.currentState : notification.newState + }).catch(e => GLOBALS.powerState = notification.newState) + if (notification.newState !== "ON" && notification.currentState === "ON") { + this.LOG("onPowerModeChanged Notification: power state was changed from ON to " + JSON.stringify(notification.newState)) //TURNING OFF THE DEVICE - Storage.set('SLEEPING', notification.powerState) + Storage.set(PowerState.POWER_STATE_SLEEP, notification.newState) let currentApp = GLOBALS.topmostApp if (currentApp !== "") { appApi.exitApp(currentApp); //will suspend/destroy the app depending on the setting. } Router.navigate('menu'); - } else if (notification.powerState === "ON" && notification.currentPowerState !== "ON") { + } else if (notification.newState === "ON" && notification.currentState !== "ON") { //TURNING ON THE DEVICE - Storage.remove('SLEEPING') + Storage.remove(PowerState.POWER_STATE_SLEEP) } }) @@ -1847,27 +1838,22 @@ export default class App extends Router.App { _powerKeyPressed() { appApi.getPowerState().then(res => { this.LOG("getPowerState: " + JSON.stringify(res)); - if (res.success) { - if (res.powerState === "ON") { - this.LOG("current powerState is ON so setting power state to LIGHT_SLEEP/DEEP_SLEEP depending of preferred option"); - appApi.getPreferredStandbyMode().then(res => { - this.LOG("getPreferredStandbyMode: " + JSON.stringify(res.preferredStandbyMode)); - appApi.setPowerState(res.preferredStandbyMode).then(result => { - if (result.success) { - this.LOG("successfully set powerstate to: " + JSON.stringify(res.preferredStandbyMode)) - return result.success - } - }) - }) - } else { - this.LOG("current powerState is " + JSON.stringify(res.powerState) + " so setting power state to ON"); - appApi.setPowerState("ON").then(res => { - if (res.success) { - this.LOG("successfully set powerstate to: ON") - return res.success - } - }) - } + if (res.currentState === "ON") { + this.LOG("current powerState is ON so setting power state to LIGHT_SLEEP/DEEP_SLEEP depending of preferred option"); + appApi.setPowerState(res.previousState).then(result => { + if (result) { + this.LOG("successfully set powerstate to: " + JSON.stringify(res.previousState)) + return result + } + }) + } else { + this.LOG("current powerState is " + JSON.stringify(res.currentState) + " so setting power state to ON"); + appApi.setPowerState("ON").then(result => { + if (result) { + this.LOG("successfully set powerstate to: ON") + return result + } + }) } }) } @@ -1919,8 +1905,8 @@ export default class App extends Router.App { this.xcastApi.registerEvent('onApplicationLaunchRequest', notification => { this.LOG('App onApplicationLaunchRequest: ' + JSON.stringify(notification)); appApi.getPowerState().then(res => { - if (res.powerState != 'ON') { - appApi.setPowerState('ON') + if (res.currentState != PowerState.POWER_STATE_ON) { + appApi.setPowerState(PowerState.POWER_STATE_ON) } }) if (this.xcastApps(notification.applicationName)) { @@ -1978,8 +1964,8 @@ export default class App extends Router.App { this.xcastApi.registerEvent('onApplicationResumeRequest', notification => { this.LOG('App onApplicationResumeRequest: ' + JSON.stringify(notification)); appApi.getPowerState().then(res => { - if (res.powerState != 'ON') { - appApi.setPowerState('ON') + if (res.currentState != PowerState.POWER_STATE_ON) { + appApi.setPowerState(PowerState.POWER_STATE_ON) } }) if (this.xcastApps(notification.applicationName)) { @@ -2086,12 +2072,12 @@ export default class App extends Router.App { if (value == 'Back') { // TODO: Identify what to do here. } else { - if (GLOBALS.powerState == 'ON') { + if (GLOBALS.powerState == PowerState.POWER_STATE_ON) { this.LOG("Power state was on trying to set it to standby"); appApi.setPowerState(value).then(res => { - if (res.success) { + if (res) { this.LOG("successfully set to standby"); - GLOBALS.powerState = 'STANDBY' + GLOBALS.powerState = PowerState.POWER_STATE_STANDBY if (GLOBALS.topmostApp !== GLOBALS.selfClientName) { appApi.exitApp(GLOBALS.topmostApp); } else { @@ -2109,9 +2095,9 @@ export default class App extends Router.App { $registerInactivityMonitoringEvents() { return new Promise((resolve, reject) => { this.LOG("registered inactivity listener"); - appApi.setPowerState('ON').then(res => { - if (res.success) { - GLOBALS.powerState = 'ON' + appApi.setPowerState(PowerState.POWER_STATE_ON).then(res => { + if (res) { + GLOBALS.powerState = PowerState.POWER_STATE_ON } }) diff --git a/accelerator-home-ui/src/api/AppApi.js b/accelerator-home-ui/src/api/AppApi.js index 084cab4..7ed87fb 100644 --- a/accelerator-home-ui/src/api/AppApi.js +++ b/accelerator-home-ui/src/api/AppApi.js @@ -27,6 +27,7 @@ import RDKShellApis from './RDKShellApis.js'; import { Metrics } from '@firebolt-js/sdk'; import Network from './NetworkApi.js'; import UserSettingsApi from './UserSettingsApi.js'; +import PowerManagerApi from './PowerManagerApi.js'; const thunder = ThunderJS(CONFIG.thunderConfig) @@ -1023,6 +1024,10 @@ export default class AppApi { }) } + registerPowerEvent(callback) { + return PowerManagerApi.get().registerEvent("onPowerModeChanged", callback); + } + /** * Function to deactivate html app. */ @@ -1098,30 +1103,11 @@ export default class AppApi { } setPowerState(value) { - return new Promise((resolve) => { - thunder - .call('org.rdk.System', 'setPowerState', { "powerState": value, "standbyReason": "ResidentApp User Requested" }) - .then(result => { - resolve(result) - }) - .catch(err => { - this.ERR("AppAPI System setPowerState failed: ", JSON.stringify(err)); - Metrics.error(Metrics.ErrorType.OTHER, "PowerStateFailure", "Error in Thunder System setPowerState " + JSON.stringify(err), false, null) - resolve(false) - }) - }) + return PowerManagerApi.get().setPowerState(value) } getPowerStateBeforeReboot() { - return new Promise((resolve, reject) => { - thunder.call('org.rdk.System', 'getPowerStateBeforeReboot').then(result => { - resolve(result); - }).catch(err => { - this.ERR("AppAPI System getPowerStateBeforeReboot failed: ", JSON.stringify(err)); - Metrics.error(Metrics.ErrorType.OTHER, "PowerStateFailure", "Error in Thunder System getPowerStateBeforeReboot " + JSON.stringify(err), false, null); - reject(err); - }); - }); + return PowerManagerApi.get().getPowerStateBeforeReboot(); } getPowerStateIsManagedByDevice() { @@ -1137,17 +1123,12 @@ export default class AppApi { } getPowerState() { - return new Promise((resolve, reject) => { - thunder - .call('org.rdk.System', 'getPowerState') - .then(result => { - resolve(result) - }) - .catch(err => { - this.ERR("AppAPI System getPowerState failed: ", JSON.stringify(err)); - Metrics.error(Metrics.ErrorType.OTHER, "PowerStateFailure", "Error in Thunder System getPowerState " + JSON.stringify(err), false, null) - reject(err) - }) + return PowerManagerApi.get().getPowerState().then(result => { + this.LOG("AppApi getPowerState result:", JSON.stringify(result)) + return { + currentState: result?.currentState ?? null, + previousState: result?.previousState ?? null + }; }) } @@ -1509,20 +1490,7 @@ export default class AppApi { // 6. Reboot and add default reason as FIRMWARE_FAILURE reboot(reason = "FIRMWARE_FAILURE") { - return new Promise((resolve) => { - thunder - .call('org.rdk.System', 'reboot', { - "rebootReason": reason - }) - .then(result => { - resolve(result) - }) - .catch(err => { - this.ERR("AppAPI reboot error:", JSON.stringify(err, 3, null)) - Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder system reboot " + JSON.stringify(err), false, null) - resolve(false) - }) - }) + return PowerManagerApi.get().reboot(reason) } getNetflixESN() { @@ -1574,21 +1542,10 @@ export default class AppApi { }) } - setWakeupSrcConfiguration(params) { - this.LOG("AppAPI: setWakeupSrcConfiguration params:", JSON.stringify(params)); - return new Promise((resolve, reject) => { - thunder.call('org.rdk.System', 'setWakeupSrcConfiguration', params).then(result => { - resolve(result.success) - }).catch(err => { - this.ERR("AppAPI setWakeupSrcConfiguration error:", JSON.stringify(err, 3, null)) - Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder system setWakeupSrcConfiguration " + JSON.stringify(err), false, null) - reject(err) - }) - }) + return PowerManagerApi.get().setWakeupSrcConfig(params) } - async sendAppState(value) { const state = await thunder .call('org.rdk.RDKShell', 'getState', {}) diff --git a/accelerator-home-ui/src/api/PowerManagerApi.js b/accelerator-home-ui/src/api/PowerManagerApi.js index e06213d..361e9e7 100644 --- a/accelerator-home-ui/src/api/PowerManagerApi.js +++ b/accelerator-home-ui/src/api/PowerManagerApi.js @@ -19,8 +19,15 @@ import ThunderJS from 'ThunderJS'; import { CONFIG } from '../Config/Config' +import { Metrics } from '@firebolt-js/sdk'; +export const PowerState = { + POWER_STATE_ON:'ON', + POWER_STATE_STANDBY:'STANDBY', + POWER_STATE_SLEEP:'SLEEPING' +} +let instance = null /** * Class for Xcast thunder plugin apis. */ @@ -32,11 +39,27 @@ export default class PowerManagerApi { this.ERR = console.error; this.WARN = console.warn; this.callsign = "org.rdk.PowerManager"; + this._events = new Map(); + } + + + static get() { + if (instance === null) { + instance = new PowerManagerApi() + } + return instance; } + activate() { return new Promise((resolve, reject) => { this.thunder.Controller.activate({ callsign: this.callsign }) .then(() => { + this.thunder.on(this.callsign, 'onPowerModeChanged', notification => { + this.LOG("onPowerModeChanged " + JSON.stringify(notification)); + if (this._events.has('onPowerModeChanged')) { + this._events.get('onPowerModeChanged')(notification); + } + }); resolve(true) }) .catch(err => { @@ -46,6 +69,7 @@ export default class PowerManagerApi { }) }) } + deactivate() { return new Promise((resolve, reject) => { this.thunder.Controller.deactivate({ callsign: this.callsign }) @@ -59,12 +83,13 @@ export default class PowerManagerApi { }) }) } + setWakeupSrcConfig(params) { this.LOG("setWakeupSrcConfiguration params:", JSON.stringify(params)); return new Promise((resolve, reject) => { this.thunder.call(this.callsign, 'setWakeupSrcConfig', params).then(result => { this.LOG(" setWakeupSrcConfiguration result:", JSON.stringify(result)) - resolve(result.success) + resolve(result) }).catch(err => { this.ERR(" setWakeupSrcConfiguration error:", JSON.stringify(err)) Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder system setWakeupSrcConfiguration " + JSON.stringify(err), false, null) @@ -72,4 +97,72 @@ export default class PowerManagerApi { }) }) } + + setPowerState(value) { + return new Promise((resolve) => { + this.thunder.call(this.callsign, 'setPowerState', { "powerState": value, "standbyReason": "ResidentApp User Requested" }) + .then(result => { + this.LOG("PowerManager setPowerState result:", JSON.stringify(result)) + if(result === null){ + resolve(true) + } else { + resolve(false) + } + }) + .catch(err => { + this.ERR("PowerManager setPowerState failed: ", JSON.stringify(err)); + Metrics.error(Metrics.ErrorType.OTHER, "PowerStateFailure", "Error in Thunder PowerManager setPowerState " + JSON.stringify(err), false, null) + resolve(false) + }) + }) + } + + getPowerStateBeforeReboot() { + return new Promise((resolve, reject) => { + this.thunder.call(this.callsign, 'getPowerStateBeforeReboot').then(result => { + this.LOG("PowerManager getPowerStateBeforeReboot result:", JSON.stringify(result)) + resolve(result); + }).catch(err => { + this.ERR("PowerManager getPowerStateBeforeReboot failed: ", JSON.stringify(err)); + Metrics.error(Metrics.ErrorType.OTHER, "PowerStateFailure", "Error in Thunder PowerManager getPowerStateBeforeReboot " + JSON.stringify(err), false, null); + reject(err); + }); + }); + } + + getPowerState() { + return new Promise((resolve, reject) => { + this.thunder.call(this.callsign, 'getPowerState') + .then(result => { + this.LOG("PowerManager getPowerState result:", JSON.stringify(result)) + resolve(result) + }) + .catch(err => { + this.ERR("PowerManager getPowerState failed: ", JSON.stringify(err)); + Metrics.error(Metrics.ErrorType.OTHER, "PowerStateFailure", "Error in Thunder PowerManager getPowerState " + JSON.stringify(err), false, null) + reject(err) + }) + }) + } + + reboot(reason) { + return new Promise((resolve) => { + this.thunder.call(this.callsign, 'reboot', { + "rebootReasonCustom": reason + }) + .then(result => { + this.LOG("PowerManager reboot result:", JSON.stringify(result)) + resolve(result) + }) + .catch(err => { + this.ERR("PowerManager reboot error:", JSON.stringify(err, 3, null)) + Metrics.error(Metrics.ErrorType.OTHER, "PluginError", "Error in Thunder PowerManager reboot " + JSON.stringify(err), false, null) + resolve(false) + }) + }) + } + + registerEvent(eventId, callback) { + this._events.set(eventId, callback); + } } From a971bab1fb6ebeac1776e9bff3bb63b04db33410 Mon Sep 17 00:00:00 2001 From: rakshithaks12 Date: Tue, 16 Dec 2025 19:46:37 +0530 Subject: [PATCH 12/12] RDKEAPPRT-420: Unable to change Sleep timer and energy saver (#143) --- accelerator-home-ui/settings.json | 2 +- accelerator-home-ui/src/App.js | 348 +++++++++--------- accelerator-home-ui/src/Config/Config.js | 9 + .../src/api/PowerManagerApi.js | 3 +- .../src/helpers/InactivityHelper.js | 166 +++++++++ .../OtherSettings/SleepTimerOverlay.js | 29 +- .../OtherSettingsScreen.js | 79 +++- .../src/screens/ScreenSaverTimer.js | 28 +- .../src/screens/SleepTimerScreen.js | 21 +- 9 files changed, 471 insertions(+), 214 deletions(-) create mode 100644 accelerator-home-ui/src/helpers/InactivityHelper.js diff --git a/accelerator-home-ui/settings.json b/accelerator-home-ui/settings.json index 0dfda18..0b6223a 100644 --- a/accelerator-home-ui/settings.json +++ b/accelerator-home-ui/settings.json @@ -13,6 +13,6 @@ "log": true, "enableAppSuspended": true, "showVersion": false, - "version": "5.0.19" + "version": "5.0.20" } } diff --git a/accelerator-home-ui/src/App.js b/accelerator-home-ui/src/App.js index c097bac..31f8ac6 100644 --- a/accelerator-home-ui/src/App.js +++ b/accelerator-home-ui/src/App.js @@ -69,7 +69,6 @@ import { Keyboard, PinChallenge } from '@firebolt-js/manage-sdk' -import PersistentStoreApi from './api/PersistentStore.js'; import { Localization, Metrics @@ -80,6 +79,7 @@ import MiracastNotification from './screens/MiracastNotification.js'; import NetworkManager from './api/NetworkManagerAPI.js'; import PowerManagerApi, {PowerState} from './api/PowerManagerApi.js'; import UserSettingsApi from './api/UserSettingsApi'; +import InactivityHelper from './helpers/InactivityHelper.js'; var AlexaAudioplayerActive = false; var thunder = ThunderJS(CONFIG.thunderConfig); @@ -89,6 +89,8 @@ var cecApi = new CECApi(); var xcastApi = new XcastApi(); var voiceApi = new VoiceApi(); var miracast = new Miracast(); +var inactivityHelper = new InactivityHelper(); +const SLEEP_STATE = 'SLEEPING'; export default class App extends Router.App { @@ -209,12 +211,19 @@ export default class App extends Router.App { if (GLOBALS.powerState !== "ON") { appApi.setPowerState("ON").then(res => { res ? this.LOG("successfully set the power state to ON from " + JSON.stringify(GLOBALS.powerState)) : this.LOG("Failure while turning ON the device") - }) + GLOBALS.powerState = PowerState.POWER_STATE_ON; + this.LOG("powerState after ===>" + JSON.stringify(GLOBALS.powerState)) + this.initializeInactivityEngine(); + }) + .catch(err => { + this.ERR("Error waking device: " + JSON.stringify(err)); + }) return true } this.$hideImage(0); return this._performKeyPressOPerations(key) } + _performKeyPressOPerations(key) { let self = this; if(GLOBALS.MiracastNotificationstatus && key.keyCode !== Keymap.Power && key.keyCode !== Keymap.Home ){ @@ -399,43 +408,6 @@ export default class App extends Router.App { }) } - userInactivity() { - PersistentStoreApi.get().activate().then(() => { - PersistentStoreApi.get().getValue('ScreenSaverTime', 'timerValue').then(result => { - // check if result has value property and if it is not undefined^M - if (result && result.value && result.value !== undefined && result.value !== "Off") { - this.LOG("App PersistentStoreApi screensaver timer value is: " + JSON.stringify(result.value)); - RDKShellApis.enableInactivityReporting(true).then(() => { - RDKShellApis.setInactivityInterval(result.value).then(() => { - this.userInactivity = thunder.on('org.rdk.RDKShell', 'onUserInactivity', notification => { - this.LOG("UserInactivityStatusNotification: " + JSON.stringify(notification)) - appApi.getAvCodeStatus().then(result => { - this.LOG("Avdecoder" + JSON.stringify(result.avDecoderStatus)); - if ((result.avDecoderStatus === "IDLE" || result.avDecoderStatus === "PAUSE") && GLOBALS.topmostApp === "") { - this.$hideImage(1); - } - }) - }) - }) - }); - } else { - this.WARN("App PersistentStoreApi screensaver timer value is not set or is Off.") - RDKShellApis.enableInactivityReporting(false).then(() => { - this.userInactivity.dispose(); - }) - } - }).catch(err => { - this.ERR("App PersistentStoreApi getValue error: " + JSON.stringify(err)); - RDKShellApis.enableInactivityReporting(false).then(() => { - this.userInactivity.dispose(); - }) - }); - }).catch(err => { - this.ERR("App PersistentStoreApi activation error: " + JSON.stringify(err)); - reject(err); - }); - } - $hideImage(alpha) { if (alpha === 1) { this.tag("Widgets").visible = false; @@ -448,8 +420,11 @@ export default class App extends Router.App { // this.tag("ScreenSaver").alpha = alpha; } _init() { - let self = this; + this.inactivityEngineInitialized = false; + this.thunderListenerRegistered = false; + this.currentStage = null; + this.currentInterval = null; self.appIdentifiers = { "YouTubeTV": "n:4", "YouTube": "n:3", @@ -463,7 +438,6 @@ export default class App extends Router.App { keyIntercept(GLOBALS.selfClientName).catch(err => { this.ERR("App _init keyIntercept err:" + JSON.stringify(err)); }); - this.userInactivity(); this._registerFireboltListeners() Keyboard.provide('xrn:firebolt:capability:input:keyboard', new KeyboardUIProvider(this)) @@ -589,6 +563,11 @@ export default class App extends Router.App { this.SubscribeToNetworkManager() } } + if (noti.callsign === "org.rdk.PowerManager") { + if (noti.data.state === "activated") { + this.subscribeToPowerChangeNotifications() + } + } }) this._subscribeToRDKShellNotifications() appApi.getPluginStatus("Cobalt").then(() => { @@ -645,12 +624,12 @@ export default class App extends Router.App { //video info change events begin here--------------------- /******************** RDKUI-341 CHANGES - DEEP SLEEP/LIGHT SLEEP **************************/ this._subscribeToControlNotifications() - let cachedPowerState = Storage.get(PowerState.POWER_STATE_SLEEP); + let cachedPowerState = Storage.get(SLEEP_STATE); this.LOG("cached power state" + JSON.stringify(cachedPowerState)) this.LOG(typeof cachedPowerState) if (cachedPowerState) { appApi.getWakeupReason().then(result => { - if (result.result.wakeupReason !== 'WAKEUP_REASON_UNKNOWN') { + if (result.wakeupReason !== 'WAKEUP_REASON_UNKNOWN') { cachedPowerState = PowerState.POWER_STATE_ON; } }) @@ -685,6 +664,15 @@ export default class App extends Router.App { }).catch((err) => this.ERR(JSON.stringify(err))) } }) + appApi.getPluginStatus('org.rdk.PowerManager').then(result => { + if (result[0].state === "activated") { + this.subscribeToPowerChangeNotifications() + } else { + PowerManagerApi.get().activate().then((res) => { + this.LOG("activating the power manager from app.js " + JSON.stringify(res)) + }).catch((err) => this.ERR(JSON.stringify(err))) + } + }) appApi.getPluginStatus('org.rdk.MiracastService').then(result => { if (result[0].state === "activated") { miracast.getEnable().then((res) => { @@ -1588,34 +1576,132 @@ export default class App extends Router.App { } _firstEnable() { - appApi.registerPowerEvent('onPowerModeChanged', notification => { - this.LOG(new Date().toISOString() + " onPowerModeChanged Notification: " + JSON.stringify(notification)); - appApi.getPowerState().then(res => { - GLOBALS.powerState = res ? res.currentState : notification.newState - }).catch(e => GLOBALS.powerState = notification.newState) - if (notification.newState !== "ON" && notification.currentState === "ON") { - this.LOG("onPowerModeChanged Notification: power state was changed from ON to " + JSON.stringify(notification.newState)) - - //TURNING OFF THE DEVICE - Storage.set(PowerState.POWER_STATE_SLEEP, notification.newState) - let currentApp = GLOBALS.topmostApp - if (currentApp !== "") { - appApi.exitApp(currentApp); //will suspend/destroy the app depending on the setting. - } - Router.navigate('menu'); - } else if (notification.newState === "ON" && notification.currentState !== "ON") { - //TURNING ON THE DEVICE - Storage.remove(PowerState.POWER_STATE_SLEEP) - } - }) - this.LOG("App Calling listenToVoiceControl method to activate VoiceControl Plugin") this.listenToVoiceControl(); this._updateLanguageToDefault() /* Subscribe to Volume status events to report to Alexa. */ this._subscribeToAlexaNotifications() + this.initializeInactivityEngine(); + } + + initializeInactivityEngine() { + if (this.inactivityEngineInitialized) { + this.LOG("Inactivity engine already initialized. Skipping..."); + return; + } + this.inactivityEngineInitialized = true; + this.initializeInactivity(); } + initializeInactivity() { + this.LOG('Into initialize'); + + const { energySaver, screenSaver, sleepTimer } = inactivityHelper.getInactivityConfig(); + this.LOG(`Loaded config: energySaver=${energySaver}, screenSaver=${screenSaver}, sleep=${sleepTimer}`) + + const hasValidTimer = inactivityHelper.isValidTimeout(screenSaver) || inactivityHelper.isValidTimeout(energySaver) || inactivityHelper.isValidTimeout(sleepTimer); + + if (!hasValidTimer) { + this.LOG('No valid inactivity timers found. Disabling inactivity reporting.'); + RDKShellApis.enableInactivityReporting(false) + .catch(err => this.ERR('Error disabling inactivity: ' + JSON.stringify(err))); + return; + } + + // Set initial interval based on valid timers + if (inactivityHelper.isValidTimeout(screenSaver)) { + this.$setInactivityIntervalStage('ScreenSaver', screenSaver); + } else if (inactivityHelper.isValidTimeout(sleepTimer)) { + this.$setInactivityIntervalStage('SleepTimer', sleepTimer); + } else if(inactivityHelper.isValidTimeout(energySaver)) { + this.$setInactivityIntervalStage('EnergySaver', energySaver); + } else { + this.LOG('No valid inactivity timers found. Engine will not start.'); + } + } + + registerOnUserInactivityListener() { + thunder.Controller.activate({ callsign: 'org.rdk.RDKShell.1' }).then(res => { + this.LOG("RDKShell activated, trying to set the inactivity listener; res = " + JSON.stringify(res)); + thunder.on("org.rdk.RDKShell.1", "onUserInactivity", async notification => { + const { energySaver, screenSaver, sleepTimer } = inactivityHelper.getInactivityConfig(); + const minutes = Math.floor(Number(notification.minutes)); + + this.LOG(`onUserInactivity fired: ${notification.minutes} mins`); + // Screensaver stage + if (screenSaver && minutes === screenSaver) { + this.LOG("Screensaver event reached"); + this.currentStage = 'ScreenSaver'; + await this.triggerScreensaver(); + } + // Sleep Timer Stage + if (inactivityHelper.isValidTimeout(sleepTimer) && minutes === sleepTimer) { + this.LOG('Sleep Timer triggered'); + this.currentStage = 'SleepTimer'; + if (GLOBALS.powerState === "ON" && GLOBALS.topmostApp === GLOBALS.selfClientName) { + inactivityHelper.standby('STANDBY'); + } + } + // Energy Saver Stage + if (inactivityHelper.isValidTimeout(energySaver) && minutes === energySaver) { + this.LOG('Energy saver triggered'); + this.currentStage = 'EnergySaver'; + if (GLOBALS.powerState === "ON" && GLOBALS.topmostApp === GLOBALS.selfClientName) { + this.LOG("Going to sleep due to inactivity"); + inactivityHelper._enterSleepMode(); + } + } + }, err => this.ERR("Listener error: " + JSON.stringify(err))); + }) + } + + async triggerScreensaver() { + const result = await appApi.getAvCodeStatus(); + if (["IDLE", "PAUSE"].includes(result.avDecoderStatus) && + GLOBALS.topmostApp === GLOBALS.selfClientName) { + this.$hideImage(1); + } + return result; + } + + $setInactivityIntervalStage(stage, minutes) { + this.LOG(`Request for set interval from stage=${stage} minutes=${minutes}`); + if (!inactivityHelper.isValidTimeout(minutes)) { + this.$resetInactivityStage(stage); + return; + } + this.currentStage = stage; + this.currentInterval = minutes; + + const { energySaver, screenSaver, sleepTimer } = inactivityHelper.getInactivityConfig(); + if (inactivityHelper.isValidTimeout(screenSaver)) { + this.currentStage = 'ScreenSaver'; + this.currentInterval = screenSaver; + } + + RDKShellApis.enableInactivityReporting(true) + .then(() => RDKShellApis.setInactivityInterval(this.currentInterval)) + .then(() => { + this.LOG(`Inactivity interval set to ${this.currentInterval} for stage=${this.currentStage}`) + + if (!this.thunderListenerRegistered) { + this.LOG("Registering listener for inactivity events..."); + this.registerOnUserInactivityListener(); + this.thunderListenerRegistered = true; + } + }) + .catch(err => this.ERR("setInactivityIntervalStage error: " + JSON.stringify(err))); + } + + $resetInactivityStage(stage) { + this.LOG(`Reset request for stage=${stage}`); + if (this.currentStage === stage) { + this.currentStage = null; + this.currentInterval = null; + } + inactivityHelper.$resetInactivity(stage); + } + async listenToVoiceControl() { this.LOG("App listenToVoiceControl method got called, configuring VoiceControl Plugin") await voiceApi.activate().then(() => { @@ -1876,6 +1962,29 @@ export default class App extends Router.App { } } + subscribeToPowerChangeNotifications() { + thunder.on("org.rdk.PowerManager", "onPowerModeChanged", notification => { + this.LOG(new Date().toISOString() + " onPowerModeChanged Notification: " + JSON.stringify(notification)); + appApi.getPowerState().then(res => { + GLOBALS.powerState = res ? res.currentState : notification.newState + }).catch(e => GLOBALS.powerState = notification.newState) + if (notification.newState !== "ON" && notification.currentState === "ON") { + this.LOG("onPowerModeChanged Notification: power state was changed from ON to " + JSON.stringify(notification.newState)) + + //TURNING OFF THE DEVICE + Storage.set(SLEEP_STATE, notification.newState) + let currentApp = GLOBALS.topmostApp + if (currentApp !== "") { + appApi.exitApp(currentApp); //will suspend/destroy the app depending on the setting. + } + Router.navigate('menu'); + } else if (notification.newState === "ON" && notification.currentState !== "ON") { + //TURNING ON THE DEVICE + Storage.remove(SLEEP_STATE) + } + }) + } + _moveApptoFront(appName, visibility) { RDKShellApis.moveToFront(appName).then(() => { RDKShellApis.setVisibility(appName, visibility); @@ -2067,109 +2176,14 @@ export default class App extends Router.App { this.LOG("successfully deregistered usb listener"); } - standby(value) { - this.LOG("standby call"); - if (value == 'Back') { - // TODO: Identify what to do here. - } else { - if (GLOBALS.powerState == PowerState.POWER_STATE_ON) { - this.LOG("Power state was on trying to set it to standby"); - appApi.setPowerState(value).then(res => { - if (res) { - this.LOG("successfully set to standby"); - GLOBALS.powerState = PowerState.POWER_STATE_STANDBY - if (GLOBALS.topmostApp !== GLOBALS.selfClientName) { - appApi.exitApp(GLOBALS.topmostApp); - } else { - if (!Router.isNavigating()) { - Router.navigate('menu') - } - } - } - }) - return true - } - } - } - - $registerInactivityMonitoringEvents() { - return new Promise((resolve, reject) => { - this.LOG("registered inactivity listener"); - appApi.setPowerState(PowerState.POWER_STATE_ON).then(res => { - if (res) { - GLOBALS.powerState = PowerState.POWER_STATE_ON - } - }) - - thunder.Controller.activate({ - callsign: 'org.rdk.RDKShell.1' - }) - .then(res => { - this.LOG("activated the rdk shell plugin trying to set the inactivity listener; res = " + JSON.stringify(res)); - thunder.on("org.rdk.RDKShell.1", "onUserInactivity", notification => { - this.LOG('onUserInactivity: ' + JSON.stringify(notification)); - if (GLOBALS.powerState === "ON" && (GLOBALS.topmostApp === GLOBALS.selfClientName)) { - this.standby("STANDBY"); - } - }, err => { - this.ERR("error while inactivity monitoring , " + JSON.stringify(err)) - }) - resolve(res) - }).catch((err) => { - Metrics.error(Metrics.ErrorType.OTHER, 'AppError', "Controller.activate error with " + JSON.stringify(err), false, null) - reject(err) - this.ERR("error while activating the displaysettings plugin; err = " + JSON.stringify(err)) - }) - }) - } - - $resetSleepTimer(t) { - this.LOG("reset sleep timer call " + JSON.stringify(t)); - var arr = t.split(" "); - - const setTimer = () => { - this.LOG('Timer ' + JSON.stringify(arr)) - var temp = arr[1].substring(0, 1); - if (temp === 'H') { - let temp1 = parseFloat(arr[0]) * 60; - RDKShellApis.setInactivityInterval(temp1).then(() => { - Storage.set('TimeoutInterval', t) - this.LOG("successfully set the timer to " + JSON.stringify(t) + " hours") - }).catch(err => { - this.ERR("error while setting the timer " + JSON.stringify(err)) - }); - } else if (temp === 'M') { - this.LOG("minutes"); - let temp1 = parseFloat(arr[0]); - RDKShellApis.setInactivityInterval(temp1).then(() => { - Storage.set('TimeoutInterval', t) - this.LOG("successfully set the timer to " + JSON.stringify(t) + " minutes"); - }).catch(err => { - this.ERR("error while setting the timer " + JSON.stringify(err)) - }); - } - } - - if (arr.length < 2) { - RDKShellApis.enableInactivityReporting(false).then((res) => { - if (res === true) { - Storage.set('TimeoutInterval', false) - this.LOG("Disabled inactivity reporting"); - // this.timerIsOff = true; - } - }).catch(err => { - this.ERR("error : unable to set the reset; error = " + JSON.stringify(err)) - }); - } else { - RDKShellApis.enableInactivityReporting(true).then(res => { - if (res === true) { - this.LOG("Enabled inactivity reporting; trying to set the timer to " + JSON.stringify(t)); - // this.timerIsOff = false; - setTimer(); - } - }).catch(err => { - this.ERR("error while enabling inactivity reporting " + JSON.stringify(err)) - }); + $setEnergySaverMode(time) { + var timeoutInMinutes = inactivityHelper.$setEnergySaver(time); + this.LOG("Final timeout (minutes): " + timeoutInMinutes); + try { + Storage.set('EnergySaverInterval', timeoutInMinutes); + this.$setInactivityIntervalStage("EnergySaver", parseInt(timeoutInMinutes)); + } catch (err) { + this.ERR("Error setting energy saver mode: " + JSON.stringify(err)); } } diff --git a/accelerator-home-ui/src/Config/Config.js b/accelerator-home-ui/src/Config/Config.js index 7338471..bb51300 100644 --- a/accelerator-home-ui/src/Config/Config.js +++ b/accelerator-home-ui/src/Config/Config.js @@ -82,6 +82,7 @@ export const GLOBALS = { _previousapp_onDisplayConnectionChanged:null, _constantselfClientName: window.__firebolt && window.__firebolt.endpoint !== undefined ? "FireboltMainApp-refui" : "ResidentApp", _LocalDeviceDiscoveryStatus:false, + _EnergySaverMode:false, get selfClientName() { return this._constantselfClientName; }, @@ -194,5 +195,13 @@ export const GLOBALS = { get LocalDeviceDiscoveryStatus() { return this._LocalDeviceDiscoveryStatus + }, + set EnergySaverMode(status) + { + this._EnergySaverMode = status + }, + get EnergySaverMode() + { + return this._EnergySaverMode } } diff --git a/accelerator-home-ui/src/api/PowerManagerApi.js b/accelerator-home-ui/src/api/PowerManagerApi.js index 361e9e7..7994d1a 100644 --- a/accelerator-home-ui/src/api/PowerManagerApi.js +++ b/accelerator-home-ui/src/api/PowerManagerApi.js @@ -24,7 +24,8 @@ import { Metrics } from '@firebolt-js/sdk'; export const PowerState = { POWER_STATE_ON:'ON', POWER_STATE_STANDBY:'STANDBY', - POWER_STATE_SLEEP:'SLEEPING' + POWER_STATE_LIGHT_SLEEP:'LIGHT_SLEEP', + POWER_STATE_DEEP_SLEEP:'DEEP_SLEEP' } let instance = null diff --git a/accelerator-home-ui/src/helpers/InactivityHelper.js b/accelerator-home-ui/src/helpers/InactivityHelper.js new file mode 100644 index 0000000..53d6094 --- /dev/null +++ b/accelerator-home-ui/src/helpers/InactivityHelper.js @@ -0,0 +1,166 @@ +/** + * If not stated otherwise in this file or this component's LICENSE + * file the following copyright and licenses apply: + * + * Copyright 2020 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +import { Router, Storage } from '@lightningjs/sdk'; +import AppApi from '../api/AppApi.js'; +import RDKShellApis from '../api/RDKShellApis.js'; +import { GLOBALS } from '../Config/Config.js'; +import { PowerState } from '../api/PowerManagerApi.js'; + +var appApi = new AppApi(); + +export default class InactivityHelper { + constructor(...args) { + this.INFO = console.info; + this.LOG = console.log; + this.ERR = console.error; + this.WARN = console.warn; + } + + getInactivityConfig() { + return { + energySaver: parseInt(Storage.get("EnergySaverInterval"), 10), + screenSaver: parseInt(Storage.get("ScreenSaverTimeoutInterval"), 10), + sleepTimer: parseInt(Storage.get("TimeoutInterval"), 10) + }; + } + + isValidTimeout(value) { + return value !== null && value !== undefined && !isNaN(value) && value > 0 && value !== false; + } + + $resetInactivity(stage) { + switch (stage) { + case 'EnergySaver': + Storage.set("EnergySaverInterval", false); + break; + + case 'ScreenSaver': + Storage.set("ScreenSaverTimeoutInterval", false); + break; + + case 'SleepTimer': + Storage.set("TimeoutInterval", false); + break; + + default: + this.LOG(`Unknown stage: ${stage}. No storage update performed.`); + + } + const { energySaver, screenSaver, sleepTimer } = this.getInactivityConfig(); + const activeStages = []; + if (this.isValidTimeout(energySaver) && stage !== 'EnergySaver') activeStages.push('EnergySaver'); + if (this.isValidTimeout(screenSaver) && stage !== 'ScreenSaver') activeStages.push('ScreenSaver'); + if (this.isValidTimeout(sleepTimer) && stage !== 'SleepTimer') activeStages.push('SleepTimer'); + + if (activeStages.length === 0) { + this.LOG('No active timers left. Disabling inactivity reporting.'); + RDKShellApis.enableInactivityReporting(false) + .catch(err => this.ERR('Error disabling inactivity: ' + JSON.stringify(err))); + } else { + this.LOG(`Stage ${stage} cleared, but ${activeStages.join(', ')} still active.`); + } + } + + $setEnergySaver(time) { + this.LOG("Energy Saver input = " + JSON.stringify(time)); + if (!time || time.toLowerCase() === "off") { + Storage.set("EnergySaverInterval", false); + this.LOG("Energy Saver disabled"); + return; + } + let arr = time.split(" "); + let value = parseFloat(arr[0]); + let unit = arr[1].substring(0, 1); // "M" or "H" + + let storedTimeout = Storage.get("TimeoutInterval"); + if (storedTimeout && storedTimeout !== "Off") { + this.LOG("Using stored timeout instead: " + storedTimeout); + value = parseFloat(storedTimeout); + unit = "M"; // already in minutes + } + // Convert to minutes + let timeoutInMinutes = (unit === "H") ? value * 60 : value; + return timeoutInMinutes; + } + + standby(value) { + this.LOG("standby call"); + if (value == 'Back') { + // TODO: Identify what to do here. + } else { + if (GLOBALS.powerState == PowerState.POWER_STATE_ON) { + this.LOG("Power state was on trying to set it to standby"); + appApi.setPowerState(value).then(res => { + if (res) { + this.LOG("successfully set to standby"); + GLOBALS.powerState = PowerState.POWER_STATE_STANDBY + if (GLOBALS.topmostApp !== GLOBALS.selfClientName) { + appApi.exitApp(GLOBALS.topmostApp); + } else { + if (!Router.isNavigating()) { + Router.navigate('menu') + } + } + } + }) + return true + } + } + } + + _enterSleepMode() { + this.LOG("Attempting Deep Sleep"); + appApi.setPowerState(PowerState.POWER_STATE_DEEP_SLEEP).then(res => { + if (res) { + this.LOG("Sleep request success"); + } else { + this.LOG("DEEP_SLEEP failed, falling back to LIGHT_SLEEP"); + this._enterLightSleep(); + } + }) + .catch(err => { + this.ERR("Error entering DEEP_SLEEP: " + JSON.stringify(err)); + this._enterLightSleep(); + }); + } + + _enterLightSleep() { + appApi.setPowerState(PowerState.POWER_STATE_LIGHT_SLEEP).then(res => { + if (res) { + this.LOG("Successfully entered LIGHT_SLEEP"); + } else { + this.ERR("Failed to enter LIGHT_SLEEP"); + } + }) + .catch(err => { + this.ERR("Error entering LIGHT_SLEEP: " + JSON.stringify(err)); + }); + } + + _convertToMinutes(value) { + if (typeof value !== "string") { + return value; + } + if (value === "Off") return null; + if (value.includes("Minutes")) return parseInt(value); + if (value.includes("Hour")) return parseFloat(value) * 60; + return null; + } + +} diff --git a/accelerator-home-ui/src/overlays/OtherSettings/SleepTimerOverlay.js b/accelerator-home-ui/src/overlays/OtherSettings/SleepTimerOverlay.js index 6d2b62f..3821894 100644 --- a/accelerator-home-ui/src/overlays/OtherSettings/SleepTimerOverlay.js +++ b/accelerator-home-ui/src/overlays/OtherSettings/SleepTimerOverlay.js @@ -16,8 +16,11 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ -import { Lightning, Storage } from '@lightningjs/sdk' +import { Language, Lightning, Router, Storage } from '@lightningjs/sdk' import SettingsItem from '../../items/SettingsItem' +import InactivityHelper from '../../helpers/InactivityHelper'; + +var inactivityHelper = new InactivityHelper(); export default class SleepTimerScreen extends Lightning.Component { constructor(...args) { @@ -27,8 +30,13 @@ export default class SleepTimerScreen extends Lightning.Component { this.ERR = console.error; this.WARN = console.warn; } + static _template() { return { + rect: true, + color: 0xCC000000, + w: 1920, + h: 1080, SleepTimer: { y: 275, x: 200, @@ -73,12 +81,13 @@ export default class SleepTimerScreen extends Lightning.Component { } }) this.tag('List').getElement(index).tag('Tick').visible = true - this.fireAncestors('$registerInactivityMonitoringEvents').then(() => { - this.fireAncestors('$resetSleepTimer', timeoutInterval); - }).catch(err => { - this.ERR("error while registering the inactivity monitoring event" + JSON.stringify(err)); - }) - + // Convert value → minutes + const timeOutInMinutes = inactivityHelper._convertToMinutes(timeoutInterval); + if (timeOutInMinutes) { + this.fireAncestors("$setInactivityIntervalStage", "SleepTimer", timeOutInMinutes); + } else { + this.fireAncestors("$resetInactivityStage", "SleepTimer"); + } this._setState('Options') } @@ -103,8 +112,10 @@ export default class SleepTimerScreen extends Lightning.Component { }); this.tag('List').element.tag('Tick').visible = true //this.options[this.tag('List').index].tick = true - this.fireAncestors('$sleepTimerText', this.options[this.tag('List').index].value) - this.fireAncestors('$resetSleepTimer', this.options[this.tag('List').index].value); + let timeout = this.options[this.tag('List').index].value; + Storage.set("TimeoutInterval", timeout); + this.fireAncestors('$sleepTimerText', timeout) + this.fireAncestors("$setInactivityIntervalStage", "SleepTimer", inactivityHelper._convertToMinutes(timeout)); } } ] diff --git a/accelerator-home-ui/src/screens/OtherSettingsScreens/OtherSettingsScreen.js b/accelerator-home-ui/src/screens/OtherSettingsScreens/OtherSettingsScreen.js index 071ce22..0b5507b 100644 --- a/accelerator-home-ui/src/screens/OtherSettingsScreens/OtherSettingsScreen.js +++ b/accelerator-home-ui/src/screens/OtherSettingsScreens/OtherSettingsScreen.js @@ -19,9 +19,10 @@ import { Lightning, Utils, Language, Router, Storage } from '@lightningjs/sdk' import SettingsMainItem from '../../items/SettingsMainItem' import { COLORS } from '../../colors/Colors' -import { CONFIG } from '../../Config/Config' +import { CONFIG, GLOBALS } from '../../Config/Config' import AppApi from '../../api/AppApi' +const energySaverTimeout = '15 Minutes'; /** * Class for Other Settings Screen. */ @@ -119,9 +120,33 @@ export default class OtherSettingsScreen extends Lightning.Component { src: Utils.asset('images/settings/Arrow.png'), }, }, + EnergySaver: { + y: 270, + type: SettingsMainItem, + Title: { + x: 10, + y: 45, + mountY: 0.5, + text: { + text: Language.translate('Energy Saver: '), + textColor: COLORS.titleColor, + fontFace: CONFIG.language.font, + fontSize: 25, + } + }, + Button: { + h: 45, + w: 67, + x: 1600, + mountX: 1, + y: 45, + mountY: 0.5, + src: Utils.asset('images/settings/ToggleOffWhite.png'), + }, + }, Language: { //alpha: 0.3, // disabled - y: 270, + y: 360, type: SettingsMainItem, Title: { x: 10, @@ -146,7 +171,7 @@ export default class OtherSettingsScreen extends Lightning.Component { }, Privacy: { //alpha: 0.3, // disabled - y: 360, + y: 450, type: SettingsMainItem, Title: { x: 10, @@ -170,7 +195,7 @@ export default class OtherSettingsScreen extends Lightning.Component { }, }, AdvancedSettings: { - y: 450, + y: 540, type: SettingsMainItem, Title: { x: 10, @@ -200,6 +225,10 @@ export default class OtherSettingsScreen extends Lightning.Component { this._appApi = new AppApi(); this._setState('SleepTimer') } + + $updateStandbyMode(standbyMode) { + this.tag("EnergySaver.Title").text.text = Language.translate("Energy Saver: ") + Language.translate(standbyMode) + } $sleepTimerText(text) { this.tag('SleepTimer.Title').text.text = Language.translate('Sleep Timer: ') + text } @@ -209,7 +238,6 @@ export default class OtherSettingsScreen extends Lightning.Component { _focus() { this._setState(this.state) - if (Storage.get('TimeoutInterval')) { this.tag('SleepTimer.Title').text.text = Language.translate('Sleep Timer: ') + Storage.get('TimeoutInterval') } @@ -221,6 +249,13 @@ export default class OtherSettingsScreen extends Lightning.Component { } else { this.tag('ScreenSaver.Title').text.text = Language.translate('Screen-Saver: ') + 'Off' } + if (Storage.get('EnergySaverInterval')) { + GLOBALS.EnergySaverMode = true; + this.tag('EnergySaver.Button').src = Utils.asset('images/settings/ToggleOnOrange.png') + } else { + GLOBALS.EnergySaverMode = false; + this.tag('EnergySaver.Button').src = Utils.asset('images/settings/ToggleOffWhite.png') + } } _handleBack() { @@ -270,6 +305,32 @@ export default class OtherSettingsScreen extends Lightning.Component { } }, + class EnergySaver extends this { + $enter() { + this.tag('EnergySaver')._focus() + } + $exit() { + this.tag('EnergySaver')._unfocus() + } + _handleUp() { + this._setState('ScreenSaver') + } + _handleDown() { + this._setState('Language') + } + _handleEnter() { + // Toggle Energy Saver mode + GLOBALS.EnergySaverMode = !GLOBALS.EnergySaverMode; + if (GLOBALS.EnergySaverMode) { + this.fireAncestors('$setEnergySaverMode', energySaverTimeout) + this.tag('EnergySaver.Button').src = Utils.asset('images/settings/ToggleOnOrange.png') + } else { + this.tag('EnergySaver.Button').src = Utils.asset('images/settings/ToggleOffWhite.png') + this.fireAncestors("$resetInactivityStage", "EnergySaver"); + } + } + }, + class ScreenSaver extends this { $enter() { this.tag('ScreenSaver')._focus() @@ -281,7 +342,7 @@ export default class OtherSettingsScreen extends Lightning.Component { this._setState('SleepTimer') } _handleDown() { - this._setState('Language') + this._setState('EnergySaver') } _handleEnter() { if(!Router.isNavigating()){ @@ -297,14 +358,14 @@ export default class OtherSettingsScreen extends Lightning.Component { this.tag('Language')._unfocus() } _handleUp() { - this._setState('ScreenSaver') + this._setState('EnergySaver') } _handleDown() { this._setState('Privacy') } _handleEnter() { if(!Router.isNavigating()){ - Router.navigate('settings/other/language') + Router.navigate('settings/other/language') } } }, @@ -323,7 +384,7 @@ export default class OtherSettingsScreen extends Lightning.Component { } _handleEnter() { if(!Router.isNavigating()){ - Router.navigate('settings/other/privacy') + Router.navigate('settings/other/privacy') } } }, diff --git a/accelerator-home-ui/src/screens/ScreenSaverTimer.js b/accelerator-home-ui/src/screens/ScreenSaverTimer.js index ff159ca..02431c6 100644 --- a/accelerator-home-ui/src/screens/ScreenSaverTimer.js +++ b/accelerator-home-ui/src/screens/ScreenSaverTimer.js @@ -148,27 +148,17 @@ export default class SreenSaverScreen extends Lightning.Component { if (time === "Off" || time === undefined || time === null) { RDKShellApis.enableInactivityReporting(false).then(resp => this.LOG("setTimerValue response: " + JSON.stringify(resp))) Storage.remove('ScreenSaverTimeoutInterval') + this.fireAncestors("$resetInactivityStage", "ScreenSaver"); + return; } else { - // 10 - RDKShellApis.enableInactivityReporting(true).then(() => { - RDKShellApis.setInactivityInterval(parseInt(time)).then(res => { - this.LOG("setinactivityres" + JSON.stringify(res)) - Storage.set('ScreenSaverTimeoutInterval', time) - this.LOG("successfully set the timer to " + JSON.stringify(time) + " minutes") - thunder.on('org.rdk.RDKShell', 'onUserInactivity', notification => { - this.LOG("UserInactivityStatusNotification: " + JSON.stringify(notification)) - appApi.getAvCodeStatus().then(result => { - this.LOG("Avdecoder" + JSON.stringify(result.avDecoderStatus)); - if ((result.avDecoderStatus === "IDLE" || result.avDecoderStatus === "PAUSE") && GLOBALS.topmostApp === GLOBALS.selfClientName) { - this.fireAncestors("$hideImage", 1); - } - }) - }) - }).catch(err => { - this.ERR("error while setting the timer" + JSON.stringify(err)) - }); - }) + const timeout = parseInt(time, 10); + if (isNaN(timeout) || timeout <= 0) { + this.ERR("Invalid screensaver timeout value: " + time); + return; + } + Storage.set('ScreenSaverTimeoutInterval', timeout) + this.fireAncestors('$setInactivityIntervalStage', 'ScreenSaver', timeout); } } diff --git a/accelerator-home-ui/src/screens/SleepTimerScreen.js b/accelerator-home-ui/src/screens/SleepTimerScreen.js index 2779bef..1757499 100644 --- a/accelerator-home-ui/src/screens/SleepTimerScreen.js +++ b/accelerator-home-ui/src/screens/SleepTimerScreen.js @@ -18,7 +18,9 @@ **/ import { Language, Lightning, Router, Storage } from '@lightningjs/sdk' import SettingsItem from '../items/SettingsItem' +import InactivityHelper from '../helpers/InactivityHelper'; +var inactivityHelper = new InactivityHelper(); export default class SleepTimerScreen extends Lightning.Component { constructor(...args) { @@ -87,12 +89,13 @@ export default class SleepTimerScreen extends Lightning.Component { } }) this.tag('List').getElement(index).tag('Tick').visible = true - this.fireAncestors('$registerInactivityMonitoringEvents').then(() => { - this.fireAncestors('$resetSleepTimer', timeoutInterval); - }).catch(err => { - this.ERR('error while registering the inactivity monitoring event' + JSON.stringify(err)) - }) - + // Convert value → minutes + const timeOutInMinutes = inactivityHelper._convertToMinutes(timeoutInterval); + if (timeOutInMinutes) { + this.fireAncestors("$setInactivityIntervalStage", "SleepTimer", timeOutInMinutes); + } else { + this.fireAncestors("$resetInactivityStage", "SleepTimer"); + } this._setState('Options') } @@ -123,8 +126,10 @@ export default class SleepTimerScreen extends Lightning.Component { }); this.tag('List').element.tag('Tick').visible = true //this.options[this.tag('List').index].tick = true - this.fireAncestors('$sleepTimerText', this.options[this.tag('List').index].value) - this.fireAncestors('$resetSleepTimer', this.options[this.tag('List').index].value); + let timeout = this.options[this.tag('List').index].value; + Storage.set("TimeoutInterval", timeout); + this.fireAncestors('$sleepTimerText', timeout) + this.fireAncestors("$setInactivityIntervalStage", "SleepTimer", inactivityHelper._convertToMinutes(timeout)); } } ]