15ccb8f90Sopenharmony_ci/* 25ccb8f90Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 35ccb8f90Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 45ccb8f90Sopenharmony_ci * you may not use this file except in compliance with the License. 55ccb8f90Sopenharmony_ci * You may obtain a copy of the License at 65ccb8f90Sopenharmony_ci * 75ccb8f90Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 85ccb8f90Sopenharmony_ci * 95ccb8f90Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 105ccb8f90Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 115ccb8f90Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125ccb8f90Sopenharmony_ci * See the License for the specific language governing permissions and 135ccb8f90Sopenharmony_ci * limitations under the License. 145ccb8f90Sopenharmony_ci */ 155ccb8f90Sopenharmony_ci 165ccb8f90Sopenharmony_ci#include "power_mode_policy.h" 175ccb8f90Sopenharmony_ci#include "power_mgr_service.h" 185ccb8f90Sopenharmony_ci#include "power_log.h" 195ccb8f90Sopenharmony_ci#include "power_save_mode.h" 205ccb8f90Sopenharmony_ci#include "singleton.h" 215ccb8f90Sopenharmony_ci#include "setting_helper.h" 225ccb8f90Sopenharmony_ci#include "json/json.h" 235ccb8f90Sopenharmony_ciusing namespace std; 245ccb8f90Sopenharmony_ci 255ccb8f90Sopenharmony_cinamespace OHOS { 265ccb8f90Sopenharmony_cinamespace PowerMgr { 275ccb8f90Sopenharmony_ciint32_t PowerModePolicy::GetPowerModeValuePolicy(uint32_t type) 285ccb8f90Sopenharmony_ci{ 295ccb8f90Sopenharmony_ci int32_t ret = INIT_VALUE_FALSE; 305ccb8f90Sopenharmony_ci if (IsValidType(type)) { 315ccb8f90Sopenharmony_ci ret = GetPolicyFromMap(type); 325ccb8f90Sopenharmony_ci } 335ccb8f90Sopenharmony_ci 345ccb8f90Sopenharmony_ci return ret; 355ccb8f90Sopenharmony_ci} 365ccb8f90Sopenharmony_ci 375ccb8f90Sopenharmony_ciint32_t PowerModePolicy::GetPolicyFromMap(uint32_t type) 385ccb8f90Sopenharmony_ci{ 395ccb8f90Sopenharmony_ci int32_t ret = INIT_VALUE_FALSE; 405ccb8f90Sopenharmony_ci std::lock_guard<std::mutex> lock(policyMutex_); 415ccb8f90Sopenharmony_ci auto iter = switchMap_.find(type); 425ccb8f90Sopenharmony_ci if (iter != switchMap_.end()) { 435ccb8f90Sopenharmony_ci ret = iter->second; 445ccb8f90Sopenharmony_ci } 455ccb8f90Sopenharmony_ci return ret; 465ccb8f90Sopenharmony_ci} 475ccb8f90Sopenharmony_ci 485ccb8f90Sopenharmony_civoid PowerModePolicy::UpdatePowerModePolicy(uint32_t mode) 495ccb8f90Sopenharmony_ci{ 505ccb8f90Sopenharmony_ci POWER_HILOGD(FEATURE_POWER_MODE, "update mode policy, mode=%{public}d", mode); 515ccb8f90Sopenharmony_ci ReadPowerModePolicy(mode); 525ccb8f90Sopenharmony_ci ComparePowerModePolicy(); 535ccb8f90Sopenharmony_ci} 545ccb8f90Sopenharmony_ci 555ccb8f90Sopenharmony_civoid PowerModePolicy::ComparePowerModePolicy() 565ccb8f90Sopenharmony_ci{ 575ccb8f90Sopenharmony_ci std::lock_guard<std::mutex> lock(policyMutex_); 585ccb8f90Sopenharmony_ci for (auto [id, value] : recoverMap_) { 595ccb8f90Sopenharmony_ci if (switchMap_.find(id) != switchMap_.end()) { 605ccb8f90Sopenharmony_ci backupMap_[id] = value; 615ccb8f90Sopenharmony_ci } 625ccb8f90Sopenharmony_ci switchMap_.emplace(id, value); 635ccb8f90Sopenharmony_ci } 645ccb8f90Sopenharmony_ci recoverMap_ = backupMap_; 655ccb8f90Sopenharmony_ci SavePowerModeRecoverMap(); 665ccb8f90Sopenharmony_ci} 675ccb8f90Sopenharmony_ci 685ccb8f90Sopenharmony_cibool PowerModePolicy::InitRecoverMap() 695ccb8f90Sopenharmony_ci{ 705ccb8f90Sopenharmony_ci std::string jsonStr = SettingHelper::ReadPowerModeRecoverMap(); 715ccb8f90Sopenharmony_ci Json::Value recoverJson; 725ccb8f90Sopenharmony_ci Json::Reader reader; 735ccb8f90Sopenharmony_ci if (!reader.parse(jsonStr.data(), jsonStr.data() + jsonStr.size(), recoverJson)) { 745ccb8f90Sopenharmony_ci POWER_HILOGW(FEATURE_POWER_MODE, "parse recover json str error"); 755ccb8f90Sopenharmony_ci return false; 765ccb8f90Sopenharmony_ci } 775ccb8f90Sopenharmony_ci for (const auto &member : recoverJson.getMemberNames()) { 785ccb8f90Sopenharmony_ci int32_t key = std::stoi(member); 795ccb8f90Sopenharmony_ci if (!recoverJson[member].isInt()) { 805ccb8f90Sopenharmony_ci continue; 815ccb8f90Sopenharmony_ci } 825ccb8f90Sopenharmony_ci int32_t value = recoverJson[member].asInt(); 835ccb8f90Sopenharmony_ci recoverMap_[key] = value; 845ccb8f90Sopenharmony_ci } 855ccb8f90Sopenharmony_ci POWER_HILOGI(FEATURE_POWER_MODE, "init recover map succeed"); 865ccb8f90Sopenharmony_ci return true; 875ccb8f90Sopenharmony_ci} 885ccb8f90Sopenharmony_ci 895ccb8f90Sopenharmony_civoid PowerModePolicy::ReadPowerModePolicy(uint32_t mode) 905ccb8f90Sopenharmony_ci{ 915ccb8f90Sopenharmony_ci auto policyCache = DelayedSpSingleton<PowerSaveMode>::GetInstance()->GetPolicyCache(); 925ccb8f90Sopenharmony_ci if (policyCache.empty()) { 935ccb8f90Sopenharmony_ci POWER_HILOGD(FEATURE_POWER_MODE, "config policy cache is empty"); 945ccb8f90Sopenharmony_ci return; 955ccb8f90Sopenharmony_ci } 965ccb8f90Sopenharmony_ci 975ccb8f90Sopenharmony_ci switchMap_.clear(); 985ccb8f90Sopenharmony_ci backupMap_.clear(); 995ccb8f90Sopenharmony_ci for (auto [id, value, flag] : policyCache[mode]) { 1005ccb8f90Sopenharmony_ci switchMap_[id] = value; 1015ccb8f90Sopenharmony_ci POWER_HILOGD(FEATURE_POWER_MODE, "read switch id: %{public}d, value: %{public}d", id, value); 1025ccb8f90Sopenharmony_ci if (flag == ValueProp::recover) { 1035ccb8f90Sopenharmony_ci GetSettingSwitchState(id, backupMap_[id]); 1045ccb8f90Sopenharmony_ci } 1055ccb8f90Sopenharmony_ci } 1065ccb8f90Sopenharmony_ci} 1075ccb8f90Sopenharmony_ci 1085ccb8f90Sopenharmony_ciint64_t PowerModePolicy::GetSettingDisplayOffTime(int64_t defaultVal) 1095ccb8f90Sopenharmony_ci{ 1105ccb8f90Sopenharmony_ci auto pms = DelayedSpSingleton<PowerMgrService>::GetInstance(); 1115ccb8f90Sopenharmony_ci if (pms == nullptr) { 1125ccb8f90Sopenharmony_ci POWER_HILOGE(FEATURE_POWER_MODE, "get PowerMgrService fail"); 1135ccb8f90Sopenharmony_ci return defaultVal; 1145ccb8f90Sopenharmony_ci } 1155ccb8f90Sopenharmony_ci return pms->GetSettingDisplayOffTime(defaultVal); 1165ccb8f90Sopenharmony_ci} 1175ccb8f90Sopenharmony_ci 1185ccb8f90Sopenharmony_civoid PowerModePolicy::GetSettingSwitchState(uint32_t& switchId, int32_t& value) 1195ccb8f90Sopenharmony_ci{ 1205ccb8f90Sopenharmony_ci int32_t defaultVal = INIT_VALUE_FALSE; 1215ccb8f90Sopenharmony_ci switch (switchId) { 1225ccb8f90Sopenharmony_ci case PowerModePolicy::ServiceType::AUTO_ADJUST_BRIGHTNESS: 1235ccb8f90Sopenharmony_ci defaultVal = SettingHelper::GetSettingAutoAdjustBrightness(defaultVal); 1245ccb8f90Sopenharmony_ci break; 1255ccb8f90Sopenharmony_ci case PowerModePolicy::ServiceType::AUTO_WINDOWN_RORATION: 1265ccb8f90Sopenharmony_ci defaultVal = SettingHelper::GetSettingWindowRotation(defaultVal); 1275ccb8f90Sopenharmony_ci break; 1285ccb8f90Sopenharmony_ci case PowerModePolicy::ServiceType::VIBRATORS_STATE: 1295ccb8f90Sopenharmony_ci defaultVal = SettingHelper::GetSettingVibration(defaultVal); 1305ccb8f90Sopenharmony_ci break; 1315ccb8f90Sopenharmony_ci case PowerModePolicy::ServiceType::INTELL_VOICE: 1325ccb8f90Sopenharmony_ci defaultVal = SettingHelper::GetSettingIntellVoice(defaultVal); 1335ccb8f90Sopenharmony_ci break; 1345ccb8f90Sopenharmony_ci case PowerModePolicy::ServiceType::DISPLAY_OFFTIME: { 1355ccb8f90Sopenharmony_ci int64_t displayOfftime = GetSettingDisplayOffTime(static_cast<int64_t>(defaultVal)); 1365ccb8f90Sopenharmony_ci defaultVal = static_cast<int32_t>(displayOfftime); 1375ccb8f90Sopenharmony_ci break; 1385ccb8f90Sopenharmony_ci } 1395ccb8f90Sopenharmony_ci default: 1405ccb8f90Sopenharmony_ci break; 1415ccb8f90Sopenharmony_ci } 1425ccb8f90Sopenharmony_ci 1435ccb8f90Sopenharmony_ci if (defaultVal == INIT_VALUE_FALSE) { 1445ccb8f90Sopenharmony_ci POWER_HILOGW(FEATURE_POWER_MODE, "get setting state invalid, switch id: %{public}d", switchId); 1455ccb8f90Sopenharmony_ci return; 1465ccb8f90Sopenharmony_ci } 1475ccb8f90Sopenharmony_ci value = defaultVal; 1485ccb8f90Sopenharmony_ci POWER_HILOGD(FEATURE_POWER_MODE, "read switch id: %{public}d, switch value: %{public}d", switchId, value); 1495ccb8f90Sopenharmony_ci} 1505ccb8f90Sopenharmony_ci 1515ccb8f90Sopenharmony_civoid PowerModePolicy::AddAction(uint32_t type, ModeAction& action) 1525ccb8f90Sopenharmony_ci{ 1535ccb8f90Sopenharmony_ci POWER_HILOGD(FEATURE_POWER_MODE, "add action, type=%{public}d", type); 1545ccb8f90Sopenharmony_ci std::lock_guard<std::mutex> lock(actionMapMutex_); 1555ccb8f90Sopenharmony_ci actionMap_.emplace(type, action); 1565ccb8f90Sopenharmony_ci} 1575ccb8f90Sopenharmony_ci 1585ccb8f90Sopenharmony_civoid PowerModePolicy::TriggerAllActions(bool isBoot) 1595ccb8f90Sopenharmony_ci{ 1605ccb8f90Sopenharmony_ci std::vector<ModeAction> allActions; 1615ccb8f90Sopenharmony_ci { 1625ccb8f90Sopenharmony_ci std::lock_guard<std::mutex> lock(actionMapMutex_); 1635ccb8f90Sopenharmony_ci for (auto iterator = actionMap_.begin(); iterator != actionMap_.end(); iterator++) { 1645ccb8f90Sopenharmony_ci POWER_HILOGD(FEATURE_POWER_MODE, "trigger action, type=%{public}d", iterator->first); 1655ccb8f90Sopenharmony_ci allActions.emplace_back(iterator->second); 1665ccb8f90Sopenharmony_ci } 1675ccb8f90Sopenharmony_ci } 1685ccb8f90Sopenharmony_ci for (const auto &actions : allActions) { 1695ccb8f90Sopenharmony_ci actions(isBoot); 1705ccb8f90Sopenharmony_ci } 1715ccb8f90Sopenharmony_ci} 1725ccb8f90Sopenharmony_ci 1735ccb8f90Sopenharmony_cibool PowerModePolicy::IsValidType(uint32_t type) 1745ccb8f90Sopenharmony_ci{ 1755ccb8f90Sopenharmony_ci std::lock_guard<std::mutex> lock(actionMapMutex_); 1765ccb8f90Sopenharmony_ci auto iterator = actionMap_.find(type); 1775ccb8f90Sopenharmony_ci if (iterator == actionMap_.end()) { 1785ccb8f90Sopenharmony_ci POWER_HILOGW(FEATURE_POWER_MODE, "Invalid type: %{public}d", type); 1795ccb8f90Sopenharmony_ci return false; 1805ccb8f90Sopenharmony_ci } 1815ccb8f90Sopenharmony_ci return true; 1825ccb8f90Sopenharmony_ci} 1835ccb8f90Sopenharmony_ci 1845ccb8f90Sopenharmony_civoid PowerModePolicy::RemoveBackupMapSettingSwitch(uint32_t switchId) 1855ccb8f90Sopenharmony_ci{ 1865ccb8f90Sopenharmony_ci auto iter = recoverMap_.find(switchId); 1875ccb8f90Sopenharmony_ci if (iter != recoverMap_.end()) { 1885ccb8f90Sopenharmony_ci recoverMap_.erase(iter); 1895ccb8f90Sopenharmony_ci SavePowerModeRecoverMap(); 1905ccb8f90Sopenharmony_ci POWER_HILOGW(FEATURE_POWER_MODE, "remove backup switch: %{public}d", switchId); 1915ccb8f90Sopenharmony_ci } 1925ccb8f90Sopenharmony_ci} 1935ccb8f90Sopenharmony_ci 1945ccb8f90Sopenharmony_civoid PowerModePolicy::SavePowerModeRecoverMap() 1955ccb8f90Sopenharmony_ci{ 1965ccb8f90Sopenharmony_ci Json::Value recoverJson; 1975ccb8f90Sopenharmony_ci for (const auto& pair : recoverMap_) { 1985ccb8f90Sopenharmony_ci recoverJson[to_string(pair.first)] = pair.second; 1995ccb8f90Sopenharmony_ci } 2005ccb8f90Sopenharmony_ci SettingHelper::SavePowerModeRecoverMap(recoverJson.toStyledString()); 2015ccb8f90Sopenharmony_ci} 2025ccb8f90Sopenharmony_ci} // namespace PowerMgr 2035ccb8f90Sopenharmony_ci} // namespace OHOS 204