1595d5899Sopenharmony_ci/*
2595d5899Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3595d5899Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4595d5899Sopenharmony_ci * you may not use this file except in compliance with the License.
5595d5899Sopenharmony_ci * You may obtain a copy of the License at
6595d5899Sopenharmony_ci *
7595d5899Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8595d5899Sopenharmony_ci *
9595d5899Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10595d5899Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11595d5899Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12595d5899Sopenharmony_ci * See the License for the specific language governing permissions and
13595d5899Sopenharmony_ci * limitations under the License.
14595d5899Sopenharmony_ci */
15595d5899Sopenharmony_ci
16595d5899Sopenharmony_ci#include "brightness.h"
17595d5899Sopenharmony_ci#include "napi/native_common.h"
18595d5899Sopenharmony_ci#include "display_common.h"
19595d5899Sopenharmony_ci#include "display_log.h"
20595d5899Sopenharmony_ci#include "display_power_mgr_client.h"
21595d5899Sopenharmony_ci
22595d5899Sopenharmony_ciusing namespace OHOS::PowerMgr;
23595d5899Sopenharmony_ci
24595d5899Sopenharmony_cinamespace OHOS {
25595d5899Sopenharmony_cinamespace DisplayPowerMgr {
26595d5899Sopenharmony_cinamespace {
27595d5899Sopenharmony_ciconst uint32_t MAX_ARGC = 2;
28595d5899Sopenharmony_ciconst uint32_t CALLBACK_ARGC = 1;
29595d5899Sopenharmony_ciconst uint32_t ARGV_BRIGHTNESS_INDEX = 0;
30595d5899Sopenharmony_ciconst uint32_t ARGV_CONTINUOUS_INDEX = 1;
31595d5899Sopenharmony_ciconst uint32_t ERR_DATA_INDEX = 0;
32595d5899Sopenharmony_ciconst uint32_t ERR_CODE_INDEX = 1;
33595d5899Sopenharmony_ciconst uint32_t MAX_FAIL_ARGC = 2;
34595d5899Sopenharmony_ciconst uint32_t MAX_BRIGHTNESS = DisplayPowerMgrClient::GetInstance().GetMaxBrightness();
35595d5899Sopenharmony_ciconst uint32_t MIN_BRIGHTNESS = DisplayPowerMgrClient::GetInstance().GetMinBrightness();
36595d5899Sopenharmony_ciconst uint32_t DEFAULT_BRIGHTNESS = DisplayPowerMgrClient::GetInstance().GetDefaultBrightness();
37595d5899Sopenharmony_ciconst uint32_t MAIN_DISPLAY_ID = DisplayPowerMgrClient::GetInstance().GetMainDisplayId();
38595d5899Sopenharmony_ci
39595d5899Sopenharmony_ciconst std::string FUNC_SUCEESS_NAME = "success";
40595d5899Sopenharmony_ciconst std::string FUNC_FAIL_NAME = "fail";
41595d5899Sopenharmony_ciconst std::string FUNC_COMPLETE_NAME = "complete";
42595d5899Sopenharmony_ci
43595d5899Sopenharmony_ciconst int32_t COMMON_ERROR_COED = 200;
44595d5899Sopenharmony_ciconst int32_t INPUT_ERROR_CODE = 202;
45595d5899Sopenharmony_ci
46595d5899Sopenharmony_ciconst std::string SET_VALUE_ERROR_MGR = "value is not an available number";
47595d5899Sopenharmony_ciconst std::string GET_VALUE_ERROR_MGR = "get system screen brightness fail";
48595d5899Sopenharmony_ciconst std::string SET_MODE_ERROR_MGR = "value is not an available number";
49595d5899Sopenharmony_ciconst std::string SET_MODE_NOT_SUPPORTED_ERROR_MGR = "Auto adjusting brightness is not supported";
50595d5899Sopenharmony_ciconst std::string SET_KEEP_SCREENON_ERROR_MGR = "value is not an available boolean";
51595d5899Sopenharmony_ci} // namespace
52595d5899Sopenharmony_ci
53595d5899Sopenharmony_cistd::map<DisplayErrors, std::string> Brightness::Result::errorTable_ = {
54595d5899Sopenharmony_ci    {DisplayErrors::ERR_CONNECTION_FAIL,   "Failed to connect to the service."},
55595d5899Sopenharmony_ci    {DisplayErrors::ERR_PERMISSION_DENIED, "Permission is denied"             },
56595d5899Sopenharmony_ci    {DisplayErrors::ERR_SYSTEM_API_DENIED, "System permission is denied"      },
57595d5899Sopenharmony_ci    {DisplayErrors::ERR_PARAM_INVALID,     "Invalid input parameter."         }
58595d5899Sopenharmony_ci};
59595d5899Sopenharmony_ci
60595d5899Sopenharmony_ciBrightness::Brightness(napi_env env, std::shared_ptr<RunningLock> runningLock) : env_(env), runningLock_(runningLock) {}
61595d5899Sopenharmony_ci
62595d5899Sopenharmony_ciBrightness::~Brightness()
63595d5899Sopenharmony_ci{
64595d5899Sopenharmony_ci    ReleaseReference(successRef_);
65595d5899Sopenharmony_ci    ReleaseReference(failRef_);
66595d5899Sopenharmony_ci    ReleaseReference(completeRef_);
67595d5899Sopenharmony_ci    ReleaseReference(napiValRef_);
68595d5899Sopenharmony_ci}
69595d5899Sopenharmony_ci
70595d5899Sopenharmony_civoid Brightness::GetValue()
71595d5899Sopenharmony_ci{
72595d5899Sopenharmony_ci    uint32_t brightness = brightnessInfo_.GetBrightness();
73595d5899Sopenharmony_ci    if (brightness < MIN_BRIGHTNESS || brightness > MAX_BRIGHTNESS) {
74595d5899Sopenharmony_ci        result_.Error(COMMON_ERROR_COED, GET_VALUE_ERROR_MGR);
75595d5899Sopenharmony_ci    } else {
76595d5899Sopenharmony_ci        result_.SetResult(BRIGHTNESS_VALUE, brightness);
77595d5899Sopenharmony_ci    }
78595d5899Sopenharmony_ci    ExecuteCallback();
79595d5899Sopenharmony_ci}
80595d5899Sopenharmony_ci
81595d5899Sopenharmony_civoid Brightness::SetValue(napi_callback_info& info)
82595d5899Sopenharmony_ci{
83595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness interface");
84595d5899Sopenharmony_ci    napi_value napiBrightness = GetCallbackInfo(info, ARGV_BRIGHTNESS_INDEX, napi_number);
85595d5899Sopenharmony_ci    napi_value napiUndefined = GetCallbackInfo(info, ARGV_BRIGHTNESS_INDEX, napi_undefined);
86595d5899Sopenharmony_ci    if (napiBrightness == nullptr && napiUndefined == nullptr) {
87595d5899Sopenharmony_ci        result_.ThrowError(env_, DisplayErrors::ERR_PARAM_INVALID);
88595d5899Sopenharmony_ci        return;
89595d5899Sopenharmony_ci    }
90595d5899Sopenharmony_ci
91595d5899Sopenharmony_ci    int32_t value = MIN_BRIGHTNESS;
92595d5899Sopenharmony_ci    bool continuous = false;
93595d5899Sopenharmony_ci    if (napi_get_value_int32(env_, napiBrightness, &value) != napi_ok) {
94595d5899Sopenharmony_ci        if (napiUndefined != nullptr) {
95595d5899Sopenharmony_ci            return;
96595d5899Sopenharmony_ci        } else {
97595d5899Sopenharmony_ci            DISPLAY_HILOGW(COMP_FWK, "Failed to get the input number");
98595d5899Sopenharmony_ci            result_.ThrowError(env_, DisplayErrors::ERR_PARAM_INVALID);
99595d5899Sopenharmony_ci            return;
100595d5899Sopenharmony_ci        }
101595d5899Sopenharmony_ci    }
102595d5899Sopenharmony_ci    napi_value napiContinuous = GetCallbackInfo(info, ARGV_CONTINUOUS_INDEX, napi_boolean);
103595d5899Sopenharmony_ci    if (napiContinuous != nullptr) {
104595d5899Sopenharmony_ci        napi_get_value_bool(env_, napiContinuous, &continuous);
105595d5899Sopenharmony_ci    }
106595d5899Sopenharmony_ci
107595d5899Sopenharmony_ci    if (!brightnessInfo_.SetBrightness(value, continuous)) {
108595d5899Sopenharmony_ci        DisplayErrors error = brightnessInfo_.GetServiceError();
109595d5899Sopenharmony_ci        if (error != DisplayErrors::ERR_OK) {
110595d5899Sopenharmony_ci            result_.ThrowError(env_, error);
111595d5899Sopenharmony_ci        }
112595d5899Sopenharmony_ci    }
113595d5899Sopenharmony_ci}
114595d5899Sopenharmony_ci
115595d5899Sopenharmony_civoid Brightness::SystemSetValue()
116595d5899Sopenharmony_ci{
117595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "System brightness interface");
118595d5899Sopenharmony_ci    if (napiValRef_ == nullptr) {
119595d5899Sopenharmony_ci        result_.Error(INPUT_ERROR_CODE, SET_VALUE_ERROR_MGR);
120595d5899Sopenharmony_ci    } else {
121595d5899Sopenharmony_ci        int32_t brightness = MIN_BRIGHTNESS;
122595d5899Sopenharmony_ci        napi_value napiVal = nullptr;
123595d5899Sopenharmony_ci        napi_get_reference_value(env_, napiValRef_, &napiVal);
124595d5899Sopenharmony_ci        napi_get_value_int32(env_, napiVal, &brightness);
125595d5899Sopenharmony_ci        brightnessInfo_.SetBrightness(brightness, false);
126595d5899Sopenharmony_ci        ReleaseReference(napiValRef_);
127595d5899Sopenharmony_ci    }
128595d5899Sopenharmony_ci    ExecuteCallback();
129595d5899Sopenharmony_ci}
130595d5899Sopenharmony_ci
131595d5899Sopenharmony_civoid Brightness::GetMode()
132595d5899Sopenharmony_ci{
133595d5899Sopenharmony_ci    int32_t isAuto = brightnessInfo_.GetAutoMode();
134595d5899Sopenharmony_ci    result_.SetResult(BRIGHTNESS_MODE, isAuto);
135595d5899Sopenharmony_ci    ExecuteCallback();
136595d5899Sopenharmony_ci}
137595d5899Sopenharmony_ci
138595d5899Sopenharmony_civoid Brightness::SetMode()
139595d5899Sopenharmony_ci{
140595d5899Sopenharmony_ci    DISPLAY_HILOGD(COMP_FWK, "Set auto brightness");
141595d5899Sopenharmony_ci    if (napiValRef_ == nullptr) {
142595d5899Sopenharmony_ci        result_.Error(INPUT_ERROR_CODE, SET_MODE_ERROR_MGR);
143595d5899Sopenharmony_ci    } else {
144595d5899Sopenharmony_ci        int32_t mode = 0;
145595d5899Sopenharmony_ci        napi_value napiMode = nullptr;
146595d5899Sopenharmony_ci        napi_get_reference_value(env_, napiValRef_, &napiMode);
147595d5899Sopenharmony_ci        napi_get_value_int32(env_, napiMode, &mode);
148595d5899Sopenharmony_ci        if (!brightnessInfo_.SetAutoMode(static_cast<bool>(mode))) {
149595d5899Sopenharmony_ci            result_.Error(COMMON_ERROR_COED, SET_MODE_NOT_SUPPORTED_ERROR_MGR);
150595d5899Sopenharmony_ci        }
151595d5899Sopenharmony_ci        ReleaseReference(napiValRef_);
152595d5899Sopenharmony_ci    }
153595d5899Sopenharmony_ci    ExecuteCallback();
154595d5899Sopenharmony_ci}
155595d5899Sopenharmony_ci
156595d5899Sopenharmony_civoid Brightness::SetKeepScreenOn()
157595d5899Sopenharmony_ci{
158595d5899Sopenharmony_ci    DISPLAY_HILOGD(COMP_FWK, "Set keep screen on");
159595d5899Sopenharmony_ci    if (napiValRef_ == nullptr) {
160595d5899Sopenharmony_ci        result_.Error(INPUT_ERROR_CODE, SET_KEEP_SCREENON_ERROR_MGR);
161595d5899Sopenharmony_ci    } else {
162595d5899Sopenharmony_ci        napi_value napiKeep = nullptr;
163595d5899Sopenharmony_ci        napi_get_reference_value(env_, napiValRef_, &napiKeep);
164595d5899Sopenharmony_ci        bool screenOn = false;
165595d5899Sopenharmony_ci        napi_get_value_bool(env_, napiKeep, &screenOn);
166595d5899Sopenharmony_ci        brightnessInfo_.ScreenOn(screenOn, runningLock_);
167595d5899Sopenharmony_ci        ReleaseReference(napiValRef_);
168595d5899Sopenharmony_ci    }
169595d5899Sopenharmony_ci    ExecuteCallback();
170595d5899Sopenharmony_ci}
171595d5899Sopenharmony_ci
172595d5899Sopenharmony_cinapi_value Brightness::GetCallbackInfo(napi_callback_info& info, uint32_t index, napi_valuetype checkType)
173595d5899Sopenharmony_ci{
174595d5899Sopenharmony_ci    size_t argc = MAX_ARGC;
175595d5899Sopenharmony_ci    napi_value argv[argc];
176595d5899Sopenharmony_ci    napi_value thisVar = nullptr;
177595d5899Sopenharmony_ci    void* data = nullptr;
178595d5899Sopenharmony_ci    if (napi_ok != napi_get_cb_info(env_, info, &argc, argv, &thisVar, &data)) {
179595d5899Sopenharmony_ci        DISPLAY_HILOGW(COMP_FWK, "Failed to get the input parameter");
180595d5899Sopenharmony_ci        return nullptr;
181595d5899Sopenharmony_ci    }
182595d5899Sopenharmony_ci
183595d5899Sopenharmony_ci    if (argc > MAX_ARGC || index >= argc) {
184595d5899Sopenharmony_ci        DISPLAY_HILOGW(COMP_FWK, "parameter %{public}u is invalid", index);
185595d5899Sopenharmony_ci        return nullptr;
186595d5899Sopenharmony_ci    }
187595d5899Sopenharmony_ci
188595d5899Sopenharmony_ci    napi_value options = argv[index];
189595d5899Sopenharmony_ci    RETURN_IF_WITH_RET(!CheckValueType(options, checkType), nullptr);
190595d5899Sopenharmony_ci    return options;
191595d5899Sopenharmony_ci}
192595d5899Sopenharmony_ci
193595d5899Sopenharmony_cibool Brightness::CreateCallbackRef(napi_value& options)
194595d5899Sopenharmony_ci{
195595d5899Sopenharmony_ci    RETURN_IF_WITH_RET(!CheckValueType(options, napi_object), false);
196595d5899Sopenharmony_ci
197595d5899Sopenharmony_ci    napi_value succCallBack = GetOptions(options, FUNC_SUCEESS_NAME, napi_function);
198595d5899Sopenharmony_ci    if (succCallBack != nullptr) {
199595d5899Sopenharmony_ci        napi_create_reference(env_, succCallBack, 1, &successRef_);
200595d5899Sopenharmony_ci    }
201595d5899Sopenharmony_ci
202595d5899Sopenharmony_ci    napi_value failCallBack = GetOptions(options, FUNC_FAIL_NAME, napi_function);
203595d5899Sopenharmony_ci    if (failCallBack != nullptr) {
204595d5899Sopenharmony_ci        napi_create_reference(env_, failCallBack, 1, &failRef_);
205595d5899Sopenharmony_ci    }
206595d5899Sopenharmony_ci
207595d5899Sopenharmony_ci    napi_value completeCallBack = GetOptions(options, FUNC_COMPLETE_NAME, napi_function);
208595d5899Sopenharmony_ci    if (completeCallBack != nullptr) {
209595d5899Sopenharmony_ci        napi_create_reference(env_, completeCallBack, 1, &completeRef_);
210595d5899Sopenharmony_ci    }
211595d5899Sopenharmony_ci    return true;
212595d5899Sopenharmony_ci}
213595d5899Sopenharmony_ci
214595d5899Sopenharmony_civoid Brightness::CreateValueRef(napi_value& options, const std::string& valName, napi_valuetype checkType)
215595d5899Sopenharmony_ci{
216595d5899Sopenharmony_ci    napi_value value = GetOptions(options, valName, checkType);
217595d5899Sopenharmony_ci    if (value != nullptr) {
218595d5899Sopenharmony_ci        napi_create_reference(env_, value, 1, &napiValRef_);
219595d5899Sopenharmony_ci    }
220595d5899Sopenharmony_ci}
221595d5899Sopenharmony_ci
222595d5899Sopenharmony_civoid Brightness::Result::Error(int32_t code, const std::string& msg)
223595d5899Sopenharmony_ci{
224595d5899Sopenharmony_ci    code_ = code;
225595d5899Sopenharmony_ci    msg_ = msg;
226595d5899Sopenharmony_ci    DISPLAY_HILOGW(COMP_FWK, "Error message, code: %{public}d, msg: %{public}s", code_, msg_.c_str());
227595d5899Sopenharmony_ci}
228595d5899Sopenharmony_ci
229595d5899Sopenharmony_civoid Brightness::Result::GetError(napi_env env, napi_value* error, size_t& size) const
230595d5899Sopenharmony_ci{
231595d5899Sopenharmony_ci    if (!error) {
232595d5899Sopenharmony_ci        DISPLAY_HILOGW(COMP_FWK, "error is null");
233595d5899Sopenharmony_ci        return;
234595d5899Sopenharmony_ci    }
235595d5899Sopenharmony_ci    napi_value data = nullptr;
236595d5899Sopenharmony_ci    napi_value code = nullptr;
237595d5899Sopenharmony_ci    napi_create_string_utf8(env, msg_.c_str(), msg_.size(), &data);
238595d5899Sopenharmony_ci    napi_create_int32(env, code_, &code);
239595d5899Sopenharmony_ci    size = MAX_FAIL_ARGC;
240595d5899Sopenharmony_ci    error[ERR_DATA_INDEX] = data;
241595d5899Sopenharmony_ci    error[ERR_CODE_INDEX] = code;
242595d5899Sopenharmony_ci}
243595d5899Sopenharmony_ci
244595d5899Sopenharmony_cinapi_value Brightness::Result::GetError(napi_env& env)
245595d5899Sopenharmony_ci{
246595d5899Sopenharmony_ci    napi_value napiError = nullptr;
247595d5899Sopenharmony_ci    if (!IsError()) {
248595d5899Sopenharmony_ci        napi_get_undefined(env, &napiError);
249595d5899Sopenharmony_ci        return napiError;
250595d5899Sopenharmony_ci    }
251595d5899Sopenharmony_ci
252595d5899Sopenharmony_ci    std::string msg;
253595d5899Sopenharmony_ci    auto item = errorTable_.find(static_cast<DisplayErrors>(code_));
254595d5899Sopenharmony_ci    if (item != errorTable_.end()) {
255595d5899Sopenharmony_ci        msg = item->second;
256595d5899Sopenharmony_ci    }
257595d5899Sopenharmony_ci    napi_value napiMsg;
258595d5899Sopenharmony_ci    NAPI_CALL(env, napi_create_string_utf8(env, msg.c_str(), msg.size(), &napiMsg));
259595d5899Sopenharmony_ci    NAPI_CALL(env, napi_create_error(env, nullptr, napiMsg, &napiError));
260595d5899Sopenharmony_ci
261595d5899Sopenharmony_ci    napi_value napiCode;
262595d5899Sopenharmony_ci    NAPI_CALL(env, napi_create_int32(env, code_, &napiCode));
263595d5899Sopenharmony_ci
264595d5899Sopenharmony_ci    napi_set_named_property(env, napiError, "code", napiCode);
265595d5899Sopenharmony_ci    napi_set_named_property(env, napiError, "message", napiMsg);
266595d5899Sopenharmony_ci
267595d5899Sopenharmony_ci    DISPLAY_HILOGW(COMP_FWK, "throw error code: %{public}d, msg: %{public}s,", code_, msg.c_str());
268595d5899Sopenharmony_ci    return napiError;
269595d5899Sopenharmony_ci}
270595d5899Sopenharmony_ci
271595d5899Sopenharmony_cinapi_value Brightness::Result::ThrowError(napi_env& env, DisplayErrors code)
272595d5899Sopenharmony_ci{
273595d5899Sopenharmony_ci    Error(static_cast<int32_t>(code));
274595d5899Sopenharmony_ci    napi_value error = GetError(env);
275595d5899Sopenharmony_ci    RETURN_IF_WITH_RET(error == nullptr, nullptr);
276595d5899Sopenharmony_ci    napi_throw(env, error);
277595d5899Sopenharmony_ci    return nullptr;
278595d5899Sopenharmony_ci}
279595d5899Sopenharmony_ci
280595d5899Sopenharmony_cinapi_value Brightness::Result::GetResult(napi_env env)
281595d5899Sopenharmony_ci{
282595d5899Sopenharmony_ci    napi_value result = nullptr;
283595d5899Sopenharmony_ci    NAPI_CALL(env, napi_create_object(env, &result));
284595d5899Sopenharmony_ci    for (const auto& it : mapResult_) {
285595d5899Sopenharmony_ci        napi_value napiValue = 0;
286595d5899Sopenharmony_ci        NAPI_CALL(env, napi_create_int32(env, it.second, &napiValue));
287595d5899Sopenharmony_ci        NAPI_CALL(env, napi_set_named_property(env, result, it.first.c_str(), napiValue));
288595d5899Sopenharmony_ci    }
289595d5899Sopenharmony_ci    return result;
290595d5899Sopenharmony_ci}
291595d5899Sopenharmony_ci
292595d5899Sopenharmony_ciuint32_t Brightness::BrightnessInfo::GetBrightness() const
293595d5899Sopenharmony_ci{
294595d5899Sopenharmony_ci    uint32_t brightness = DisplayPowerMgrClient::GetInstance().GetBrightness(MAIN_DISPLAY_ID);
295595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Get brightness: %{public}d", brightness);
296595d5899Sopenharmony_ci    return brightness;
297595d5899Sopenharmony_ci}
298595d5899Sopenharmony_ci
299595d5899Sopenharmony_cibool Brightness::BrightnessInfo::SetBrightness(int32_t value, bool continuous)
300595d5899Sopenharmony_ci{
301595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Set brightness: %{public}d, %{public}d", value, continuous);
302595d5899Sopenharmony_ci    value = value > static_cast<int32_t>(MAX_BRIGHTNESS) ? static_cast<int32_t>(MAX_BRIGHTNESS) : value;
303595d5899Sopenharmony_ci    value = value < static_cast<int32_t>(MIN_BRIGHTNESS) ? static_cast<int32_t>(MIN_BRIGHTNESS) : value;
304595d5899Sopenharmony_ci    bool isSucc = DisplayPowerMgrClient::GetInstance().SetBrightness(value, 0, continuous);
305595d5899Sopenharmony_ci    if (!isSucc) {
306595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Failed to set brightness: %{public}d", value);
307595d5899Sopenharmony_ci    }
308595d5899Sopenharmony_ci    return isSucc;
309595d5899Sopenharmony_ci}
310595d5899Sopenharmony_ci
311595d5899Sopenharmony_ciint32_t Brightness::BrightnessInfo::GetAutoMode() const
312595d5899Sopenharmony_ci{
313595d5899Sopenharmony_ci    bool isAuto = DisplayPowerMgrClient::GetInstance().IsAutoAdjustBrightness();
314595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Automatic brightness adjustment: %{public}d", isAuto);
315595d5899Sopenharmony_ci    return static_cast<int32_t>(isAuto);
316595d5899Sopenharmony_ci}
317595d5899Sopenharmony_ci
318595d5899Sopenharmony_cibool Brightness::BrightnessInfo::SetAutoMode(bool mode)
319595d5899Sopenharmony_ci{
320595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness begin");
321595d5899Sopenharmony_ci    bool isSucc = DisplayPowerMgrClient::GetInstance().AutoAdjustBrightness(mode);
322595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "set auto brightness mode: %{public}d, succ: %{public}d", mode, isSucc);
323595d5899Sopenharmony_ci    return isSucc;
324595d5899Sopenharmony_ci}
325595d5899Sopenharmony_ci
326595d5899Sopenharmony_civoid Brightness::BrightnessInfo::ScreenOn(bool keep, std::shared_ptr<RunningLock>& runningLock)
327595d5899Sopenharmony_ci{
328595d5899Sopenharmony_ci    if (runningLock != nullptr) {
329595d5899Sopenharmony_ci        DISPLAY_HILOGD(COMP_FWK, "Keep screen on, keep: %{public}d, isUsed: %{public}d", keep, runningLock->IsUsed());
330595d5899Sopenharmony_ci        keep ? runningLock->Lock() : runningLock->UnLock();
331595d5899Sopenharmony_ci    }
332595d5899Sopenharmony_ci}
333595d5899Sopenharmony_ci
334595d5899Sopenharmony_ciDisplayErrors Brightness::BrightnessInfo::GetServiceError() const
335595d5899Sopenharmony_ci{
336595d5899Sopenharmony_ci    return DisplayPowerMgrClient::GetInstance().GetError();
337595d5899Sopenharmony_ci}
338595d5899Sopenharmony_ci
339595d5899Sopenharmony_civoid Brightness::ExecuteCallback()
340595d5899Sopenharmony_ci{
341595d5899Sopenharmony_ci    bool error = result_.IsError();
342595d5899Sopenharmony_ci    if (!error) {
343595d5899Sopenharmony_ci        DISPLAY_HILOGD(COMP_FWK, "Call the js success method");
344595d5899Sopenharmony_ci        napi_value result = result_.GetResult(env_);
345595d5899Sopenharmony_ci        size_t argc = result ? CALLBACK_ARGC : 0;
346595d5899Sopenharmony_ci        CallFunction(successRef_, argc, result ? &result : nullptr);
347595d5899Sopenharmony_ci    }
348595d5899Sopenharmony_ci
349595d5899Sopenharmony_ci    if (error) {
350595d5899Sopenharmony_ci        DISPLAY_HILOGD(COMP_FWK, "Call the js fail method");
351595d5899Sopenharmony_ci        size_t argc = MAX_FAIL_ARGC;
352595d5899Sopenharmony_ci        napi_value argv[argc];
353595d5899Sopenharmony_ci        result_.GetError(env_, argv, argc);
354595d5899Sopenharmony_ci        CallFunction(failRef_, argc, argv);
355595d5899Sopenharmony_ci    }
356595d5899Sopenharmony_ci    DISPLAY_HILOGD(COMP_FWK, "Call the js complete method");
357595d5899Sopenharmony_ci    CallFunction(completeRef_, 0, nullptr);
358595d5899Sopenharmony_ci}
359595d5899Sopenharmony_ci
360595d5899Sopenharmony_cibool Brightness::CheckValueType(napi_value& value, napi_valuetype checkType)
361595d5899Sopenharmony_ci{
362595d5899Sopenharmony_ci    napi_valuetype valueType = napi_undefined;
363595d5899Sopenharmony_ci    napi_typeof(env_, value, &valueType);
364595d5899Sopenharmony_ci    if (valueType != checkType) {
365595d5899Sopenharmony_ci        DISPLAY_HILOGD(COMP_FWK, "Check input parameter error");
366595d5899Sopenharmony_ci        return false;
367595d5899Sopenharmony_ci    }
368595d5899Sopenharmony_ci    return true;
369595d5899Sopenharmony_ci}
370595d5899Sopenharmony_ci
371595d5899Sopenharmony_cinapi_value Brightness::GetOptions(napi_value& options, const std::string& name, napi_valuetype checkType)
372595d5899Sopenharmony_ci{
373595d5899Sopenharmony_ci    napi_value property = nullptr;
374595d5899Sopenharmony_ci    napi_status status = napi_get_named_property(env_, options, name.c_str(), &property);
375595d5899Sopenharmony_ci    if (status != napi_ok) {
376595d5899Sopenharmony_ci        DISPLAY_HILOGW(COMP_FWK, "Failed to get the %{public}s Options property", name.c_str());
377595d5899Sopenharmony_ci        return nullptr;
378595d5899Sopenharmony_ci    }
379595d5899Sopenharmony_ci    if (!CheckValueType(property, checkType)) {
380595d5899Sopenharmony_ci        DISPLAY_HILOGW(COMP_FWK, "Get %{public}s Options property type mismatch", name.c_str());
381595d5899Sopenharmony_ci        return nullptr;
382595d5899Sopenharmony_ci    }
383595d5899Sopenharmony_ci    return property;
384595d5899Sopenharmony_ci}
385595d5899Sopenharmony_ci
386595d5899Sopenharmony_civoid Brightness::CallFunction(napi_ref& callbackRef, size_t argc, napi_value* response)
387595d5899Sopenharmony_ci{
388595d5899Sopenharmony_ci    RETURN_IF(callbackRef == nullptr);
389595d5899Sopenharmony_ci
390595d5899Sopenharmony_ci    napi_value callResult = 0;
391595d5899Sopenharmony_ci    napi_value callback = nullptr;
392595d5899Sopenharmony_ci    napi_get_reference_value(env_, callbackRef, &callback);
393595d5899Sopenharmony_ci    napi_status status = napi_call_function(env_, nullptr, callback, argc, response, &callResult);
394595d5899Sopenharmony_ci    if (status != napi_ok) {
395595d5899Sopenharmony_ci        DISPLAY_HILOGW(COMP_FWK, "Failed to call the callback function");
396595d5899Sopenharmony_ci    }
397595d5899Sopenharmony_ci    ReleaseReference(callbackRef);
398595d5899Sopenharmony_ci}
399595d5899Sopenharmony_ci
400595d5899Sopenharmony_civoid Brightness::ReleaseReference(napi_ref& ref)
401595d5899Sopenharmony_ci{
402595d5899Sopenharmony_ci    if (ref != nullptr) {
403595d5899Sopenharmony_ci        napi_delete_reference(env_, ref);
404595d5899Sopenharmony_ci        ref = nullptr;
405595d5899Sopenharmony_ci    }
406595d5899Sopenharmony_ci}
407595d5899Sopenharmony_ci} // namespace DisplayPowerMgr
408595d5899Sopenharmony_ci} // namespace OHOS
409