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