1d590543dSopenharmony_ci/* 2d590543dSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3d590543dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d590543dSopenharmony_ci * you may not use this file except in compliance with the License. 5d590543dSopenharmony_ci * You may obtain a copy of the License at 6d590543dSopenharmony_ci * 7d590543dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d590543dSopenharmony_ci * 9d590543dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d590543dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d590543dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d590543dSopenharmony_ci * See the License for the specific language governing permissions and 13d590543dSopenharmony_ci * limitations under the License. 14d590543dSopenharmony_ci */ 15d590543dSopenharmony_ci 16d590543dSopenharmony_ci#include "battery_stats.h" 17d590543dSopenharmony_ci 18d590543dSopenharmony_ci#include <memory> 19d590543dSopenharmony_ci 20d590543dSopenharmony_ci#include "async_callback_info.h" 21d590543dSopenharmony_ci#include "battery_stats_client.h" 22d590543dSopenharmony_ci#include "battery_stats_info.h" 23d590543dSopenharmony_ci#include "napi_utils.h" 24d590543dSopenharmony_ci#include "stats_common.h" 25d590543dSopenharmony_ci#include "stats_log.h" 26d590543dSopenharmony_ci 27d590543dSopenharmony_cinamespace OHOS { 28d590543dSopenharmony_cinamespace PowerMgr { 29d590543dSopenharmony_ciBatteryStats::BatteryStats(napi_env& env) : env_(env) {} 30d590543dSopenharmony_ci 31d590543dSopenharmony_civoid BatteryStats::StatsAsyncCallBack(napi_value& value) 32d590543dSopenharmony_ci{ 33d590543dSopenharmony_ci std::unique_ptr<AsyncCallbackInfo> asyncInfo = std::make_unique<AsyncCallbackInfo>(); 34d590543dSopenharmony_ci asyncInfo->CreateCallback(env_, value); 35d590543dSopenharmony_ci napi_value resource = nullptr; 36d590543dSopenharmony_ci NAPI_CALL_RETURN_VOID(env_, napi_create_string_utf8(env_, "StatsAsyncCallBack", NAPI_AUTO_LENGTH, &resource)); 37d590543dSopenharmony_ci napi_create_async_work( 38d590543dSopenharmony_ci env_, nullptr, resource, 39d590543dSopenharmony_ci [](napi_env env, void* data) { 40d590543dSopenharmony_ci AsyncCallbackInfo* asCallbackInfo = reinterpret_cast<AsyncCallbackInfo*>(data); 41d590543dSopenharmony_ci STATS_RETURN_IF(asCallbackInfo == nullptr); 42d590543dSopenharmony_ci asCallbackInfo->GetError().Error(asCallbackInfo->GetData().GetBatteryStatsInfo()); 43d590543dSopenharmony_ci }, 44d590543dSopenharmony_ci [](napi_env env, napi_status status, void* data) { 45d590543dSopenharmony_ci AsyncCallbackInfo* asCallbackInfo = reinterpret_cast<AsyncCallbackInfo*>(data); 46d590543dSopenharmony_ci STATS_RETURN_IF(asCallbackInfo == nullptr); 47d590543dSopenharmony_ci napi_value arrRes = nullptr; 48d590543dSopenharmony_ci asCallbackInfo->GetData().CreateArrayValue(env, arrRes); 49d590543dSopenharmony_ci asCallbackInfo->CallFunction(env, arrRes); 50d590543dSopenharmony_ci asCallbackInfo->Release(env); 51d590543dSopenharmony_ci delete asCallbackInfo; 52d590543dSopenharmony_ci }, 53d590543dSopenharmony_ci reinterpret_cast<void*>(asyncInfo.get()), &asyncInfo->GetAsyncWork()); 54d590543dSopenharmony_ci NAPI_CALL_RETURN_VOID( 55d590543dSopenharmony_ci env_, napi_queue_async_work_with_qos(env_, asyncInfo->GetAsyncWork(), napi_qos_utility)); 56d590543dSopenharmony_ci asyncInfo.release(); 57d590543dSopenharmony_ci} 58d590543dSopenharmony_ci 59d590543dSopenharmony_cinapi_value BatteryStats::StatsPromise() 60d590543dSopenharmony_ci{ 61d590543dSopenharmony_ci std::unique_ptr<AsyncCallbackInfo> asyncInfo = std::make_unique<AsyncCallbackInfo>(); 62d590543dSopenharmony_ci napi_value promise; 63d590543dSopenharmony_ci asyncInfo->CreatePromise(env_, promise); 64d590543dSopenharmony_ci STATS_RETURN_IF_WITH_RET(promise == nullptr, nullptr); 65d590543dSopenharmony_ci 66d590543dSopenharmony_ci napi_value resourceName = nullptr; 67d590543dSopenharmony_ci NAPI_CALL_BASE(env_, napi_create_string_utf8(env_, "StatsPromise", NAPI_AUTO_LENGTH, &resourceName), promise); 68d590543dSopenharmony_ci napi_create_async_work( 69d590543dSopenharmony_ci env_, nullptr, resourceName, 70d590543dSopenharmony_ci [](napi_env env, void* data) { 71d590543dSopenharmony_ci AsyncCallbackInfo* asCallbackInfo = reinterpret_cast<AsyncCallbackInfo*>(data); 72d590543dSopenharmony_ci STATS_RETURN_IF(asCallbackInfo == nullptr); 73d590543dSopenharmony_ci asCallbackInfo->GetError().Error(asCallbackInfo->GetData().GetBatteryStatsInfo()); 74d590543dSopenharmony_ci }, 75d590543dSopenharmony_ci [](napi_env env, napi_status status, void* data) { 76d590543dSopenharmony_ci AsyncCallbackInfo* asCallbackInfo = reinterpret_cast<AsyncCallbackInfo*>(data); 77d590543dSopenharmony_ci STATS_RETURN_IF(asCallbackInfo == nullptr); 78d590543dSopenharmony_ci if (asCallbackInfo->GetError().IsError()) { 79d590543dSopenharmony_ci napi_reject_deferred(env, asCallbackInfo->GetDeferred(), asCallbackInfo->GetError().GetNapiError(env)); 80d590543dSopenharmony_ci } else { 81d590543dSopenharmony_ci napi_value arrRes = nullptr; 82d590543dSopenharmony_ci asCallbackInfo->GetData().CreateArrayValue(env, arrRes); 83d590543dSopenharmony_ci napi_resolve_deferred(env, asCallbackInfo->GetDeferred(), arrRes); 84d590543dSopenharmony_ci } 85d590543dSopenharmony_ci asCallbackInfo->Release(env); 86d590543dSopenharmony_ci delete asCallbackInfo; 87d590543dSopenharmony_ci }, 88d590543dSopenharmony_ci reinterpret_cast<void*>(asyncInfo.get()), &asyncInfo->GetAsyncWork()); 89d590543dSopenharmony_ci NAPI_CALL_BASE(env_, napi_queue_async_work_with_qos(env_, asyncInfo->GetAsyncWork(), napi_qos_utility), promise); 90d590543dSopenharmony_ci asyncInfo.release(); 91d590543dSopenharmony_ci return promise; 92d590543dSopenharmony_ci} 93d590543dSopenharmony_ci 94d590543dSopenharmony_cinapi_value BatteryStats::GetAppStatsMah(napi_callback_info& info, uint32_t maxArgc, uint32_t index) 95d590543dSopenharmony_ci{ 96d590543dSopenharmony_ci return GetAppOrPartStats(info, maxArgc, index, [&](int32_t uid, NapiError& error) { 97d590543dSopenharmony_ci double appStatsMah = BatteryStatsClient::GetInstance().GetAppStatsMah(uid); 98d590543dSopenharmony_ci error.Error(BatteryStatsClient::GetInstance().GetLastError()); 99d590543dSopenharmony_ci STATS_HILOGD(COMP_FWK, "get app stats mah: %{public}lf for uid: %{public}d", appStatsMah, uid); 100d590543dSopenharmony_ci return appStatsMah; 101d590543dSopenharmony_ci }); 102d590543dSopenharmony_ci} 103d590543dSopenharmony_ci 104d590543dSopenharmony_cinapi_value BatteryStats::GetAppStatsPercent(napi_callback_info& info, uint32_t maxArgc, uint32_t index) 105d590543dSopenharmony_ci{ 106d590543dSopenharmony_ci return GetAppOrPartStats(info, maxArgc, index, [&](int32_t uid, NapiError& error) { 107d590543dSopenharmony_ci double appStatsPercent = BatteryStatsClient::GetInstance().GetAppStatsPercent(uid); 108d590543dSopenharmony_ci error.Error(BatteryStatsClient::GetInstance().GetLastError()); 109d590543dSopenharmony_ci STATS_HILOGD(COMP_FWK, "get app stats percent: %{public}lf for uid: %{public}d", appStatsPercent, uid); 110d590543dSopenharmony_ci return appStatsPercent; 111d590543dSopenharmony_ci }); 112d590543dSopenharmony_ci} 113d590543dSopenharmony_ci 114d590543dSopenharmony_cinapi_value BatteryStats::GetPartStatsMah(napi_callback_info& info, uint32_t maxArgc, uint32_t index) 115d590543dSopenharmony_ci{ 116d590543dSopenharmony_ci return GetAppOrPartStats(info, maxArgc, index, [&](int32_t type, NapiError& error) { 117d590543dSopenharmony_ci BatteryStatsInfo::ConsumptionType naviveType = BatteryStatsInfo::ConsumptionType(type); 118d590543dSopenharmony_ci double partStatsMah = BatteryStatsClient::GetInstance().GetPartStatsMah(naviveType); 119d590543dSopenharmony_ci error.Error(BatteryStatsClient::GetInstance().GetLastError()); 120d590543dSopenharmony_ci STATS_HILOGD(COMP_FWK, "get part stats mah: %{public}lf for type: %{public}d", partStatsMah, type); 121d590543dSopenharmony_ci return partStatsMah; 122d590543dSopenharmony_ci }); 123d590543dSopenharmony_ci} 124d590543dSopenharmony_ci 125d590543dSopenharmony_cinapi_value BatteryStats::GetPartStatsPercent(napi_callback_info& info, uint32_t maxArgc, uint32_t index) 126d590543dSopenharmony_ci{ 127d590543dSopenharmony_ci return GetAppOrPartStats(info, maxArgc, index, [&](int32_t type, NapiError& error) { 128d590543dSopenharmony_ci BatteryStatsInfo::ConsumptionType naviveType = BatteryStatsInfo::ConsumptionType(type); 129d590543dSopenharmony_ci double partStatsPercent = BatteryStatsClient::GetInstance().GetPartStatsPercent(naviveType); 130d590543dSopenharmony_ci error.Error(BatteryStatsClient::GetInstance().GetLastError()); 131d590543dSopenharmony_ci STATS_HILOGD(COMP_FWK, "get part stats percent: %{public}lf for type: %{public}d", partStatsPercent, type); 132d590543dSopenharmony_ci return partStatsPercent; 133d590543dSopenharmony_ci }); 134d590543dSopenharmony_ci} 135d590543dSopenharmony_ci 136d590543dSopenharmony_cinapi_value BatteryStats::GetAppOrPartStats( 137d590543dSopenharmony_ci napi_callback_info& info, uint32_t maxArgc, uint32_t index, std::function<double(int32_t, NapiError&)> getAppOrPart) 138d590543dSopenharmony_ci{ 139d590543dSopenharmony_ci size_t argc = maxArgc; 140d590543dSopenharmony_ci napi_value argv[argc]; 141d590543dSopenharmony_ci NapiUtils::GetCallbackInfo(env_, info, argc, argv); 142d590543dSopenharmony_ci NapiError error; 143d590543dSopenharmony_ci 144d590543dSopenharmony_ci if (argc != maxArgc || !NapiUtils::CheckValueType(env_, argv[index], napi_number)) { 145d590543dSopenharmony_ci return error.ThrowError(env_, StatsError::ERR_PARAM_INVALID); 146d590543dSopenharmony_ci } 147d590543dSopenharmony_ci 148d590543dSopenharmony_ci int32_t jsValue; 149d590543dSopenharmony_ci napi_get_value_int32(env_, argv[index], &jsValue); 150d590543dSopenharmony_ci double statsData = getAppOrPart(jsValue, error); 151d590543dSopenharmony_ci if (error.IsError()) { 152d590543dSopenharmony_ci return error.ThrowError(env_); 153d590543dSopenharmony_ci } 154d590543dSopenharmony_ci 155d590543dSopenharmony_ci napi_value result = nullptr; 156d590543dSopenharmony_ci napi_create_double(env_, statsData, &result); 157d590543dSopenharmony_ci return result; 158d590543dSopenharmony_ci} 159d590543dSopenharmony_ci} // namespace PowerMgr 160d590543dSopenharmony_ci} // namespace OHOS 161