1595d5899Sopenharmony_ci/*
2595d5899Sopenharmony_ci * Copyright (c) 2023-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_service.h"
17595d5899Sopenharmony_ci
18595d5899Sopenharmony_ci#include <file_ex.h>
19595d5899Sopenharmony_ci#ifdef HAS_HIVIEWDFX_HISYSEVENT_PART
20595d5899Sopenharmony_ci#include <hisysevent.h>
21595d5899Sopenharmony_ci#endif
22595d5899Sopenharmony_ci#include <ipc_skeleton.h>
23595d5899Sopenharmony_ci#include <securec.h>
24595d5899Sopenharmony_ci
25595d5899Sopenharmony_ci#include "brightness_action.h"
26595d5899Sopenharmony_ci#include "brightness_setting_helper.h"
27595d5899Sopenharmony_ci#include "config_parser.h"
28595d5899Sopenharmony_ci#include "delayed_sp_singleton.h"
29595d5899Sopenharmony_ci#include "display_common.h"
30595d5899Sopenharmony_ci#include "display_log.h"
31595d5899Sopenharmony_ci#include "display_manager_lite.h"
32595d5899Sopenharmony_ci#include "dm_common.h"
33595d5899Sopenharmony_ci#include "errors.h"
34595d5899Sopenharmony_ci#include "ffrt_utils.h"
35595d5899Sopenharmony_ci#include "light_lux_manager.h"
36595d5899Sopenharmony_ci#include "new"
37595d5899Sopenharmony_ci#include "permission.h"
38595d5899Sopenharmony_ci#include "refbase.h"
39595d5899Sopenharmony_ci#include "screen_manager_lite.h"
40595d5899Sopenharmony_ci#include "setting_provider.h"
41595d5899Sopenharmony_ci#include "system_ability_definition.h"
42595d5899Sopenharmony_ci
43595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART
44595d5899Sopenharmony_ci#include "sensor_agent.h"
45595d5899Sopenharmony_ci#endif
46595d5899Sopenharmony_ci
47595d5899Sopenharmony_cinamespace OHOS {
48595d5899Sopenharmony_cinamespace DisplayPowerMgr {
49595d5899Sopenharmony_cinamespace {
50595d5899Sopenharmony_ciconstexpr uint32_t MAX_DEFAULT_BRGIHTNESS_LEVEL = 255;
51595d5899Sopenharmony_ciconstexpr uint32_t MIN_DEFAULT_BRGIHTNESS_LEVEL = 1;
52595d5899Sopenharmony_ciconstexpr uint32_t MAX_MAPPING_BRGIHTNESS_LEVEL = 223;
53595d5899Sopenharmony_ciconstexpr uint32_t MIN_MAPPING_BRGIHTNESS_LEVEL = 1;
54595d5899Sopenharmony_ciconstexpr uint32_t MAX_DEFAULT_BRGIHTNESS_NIT = 600;
55595d5899Sopenharmony_ciconstexpr uint32_t MIN_DEFAULT_BRGIHTNESS_NIT = 2;
56595d5899Sopenharmony_ciconstexpr uint32_t MAX_DEFAULT_HIGH_BRGIHTNESS_LEVEL = 10000;
57595d5899Sopenharmony_ciconstexpr uint32_t MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL = 156;
58595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_ANIMATING_DURATION = 500;
59595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_BRIGHTEN_DURATION = 2000;
60595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_DARKEN_DURATION = 5000;
61595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_MAX_BRIGHTNESS_DURATION = 3000;
62595d5899Sopenharmony_ciconstexpr uint32_t BRIGHTNESS_TYPE = 0;
63595d5899Sopenharmony_ciconstexpr uint32_t AMBIENT_LIGHT_TYPE = 1;
64595d5899Sopenharmony_ciconstexpr uint32_t APS_LISTEN_PARAMS_LENGHT = 3;
65595d5899Sopenharmony_ciconstexpr time_t CALL_APS_INTERVAL = 2;
66595d5899Sopenharmony_ci
67595d5899Sopenharmony_ciFFRTHandle g_cancelBoostTaskHandle{};
68595d5899Sopenharmony_ciFFRTHandle g_waitForFirstLuxTaskHandle{};
69595d5899Sopenharmony_ci}
70595d5899Sopenharmony_ci
71595d5899Sopenharmony_ciconst uint32_t BrightnessService::AMBIENT_LUX_LEVELS[BrightnessService::LUX_LEVEL_LENGTH] = { 1, 3, 5, 10, 20, 50, 200,
72595d5899Sopenharmony_ci    500, 1000, 2000, 3000, 5000, 10000, 20000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, INT_MAX };
73595d5899Sopenharmony_ci
74595d5899Sopenharmony_ciusing namespace OHOS::PowerMgr;
75595d5899Sopenharmony_ci
76595d5899Sopenharmony_ciuint32_t BrightnessService::brightnessValueMax = MAX_DEFAULT_BRGIHTNESS_LEVEL;
77595d5899Sopenharmony_ciuint32_t BrightnessService::brightnessValueMin = MIN_DEFAULT_BRGIHTNESS_LEVEL;
78595d5899Sopenharmony_ci
79595d5899Sopenharmony_ciBrightnessService::BrightnessService()
80595d5899Sopenharmony_ci{
81595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService created for displayId=%{public}d", mDisplayId);
82595d5899Sopenharmony_ci    mAction = std::make_shared<BrightnessAction>(mDisplayId);
83595d5899Sopenharmony_ci    if (mAction == nullptr) {
84595d5899Sopenharmony_ci        DISPLAY_HILOGE(FEAT_BRIGHTNESS, "mAction is null");
85595d5899Sopenharmony_ci        return;
86595d5899Sopenharmony_ci    }
87595d5899Sopenharmony_ci    mState = mAction->GetDisplayState();
88595d5899Sopenharmony_ci    mDimmingCallback = std::make_shared<DimmingCallbackImpl>(mAction, [this](uint32_t brightness) {
89595d5899Sopenharmony_ci        SetSettingBrightness(brightness);
90595d5899Sopenharmony_ci    });
91595d5899Sopenharmony_ci    if (mDimmingCallback == nullptr) {
92595d5899Sopenharmony_ci        DISPLAY_HILOGE(FEAT_BRIGHTNESS, "mDimmingCallback is null");
93595d5899Sopenharmony_ci    }
94595d5899Sopenharmony_ci    std::string name = "BrightnessService" + std::to_string(mDisplayId);
95595d5899Sopenharmony_ci    mDimming = std::make_shared<BrightnessDimming>(name, mDimmingCallback);
96595d5899Sopenharmony_ci}
97595d5899Sopenharmony_ci
98595d5899Sopenharmony_ciBrightnessService& BrightnessService::Get()
99595d5899Sopenharmony_ci{
100595d5899Sopenharmony_ci    static BrightnessService brightnessManager;
101595d5899Sopenharmony_ci    return brightnessManager;
102595d5899Sopenharmony_ci}
103595d5899Sopenharmony_ci
104595d5899Sopenharmony_civoid BrightnessService::Init(uint32_t defaultMax, uint32_t defaultMin)
105595d5899Sopenharmony_ci{
106595d5899Sopenharmony_ci    queue_ = std::make_shared<FFRTQueue> ("brightness_manager");
107595d5899Sopenharmony_ci    if (queue_ == nullptr) {
108595d5899Sopenharmony_ci        return;
109595d5899Sopenharmony_ci    }
110595d5899Sopenharmony_ci    if (!mDimming->Init()) {
111595d5899Sopenharmony_ci        return;
112595d5899Sopenharmony_ci    }
113595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART
114595d5899Sopenharmony_ci    InitSensors();
115595d5899Sopenharmony_ci    mIsFoldDevice = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
116595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Init mIsFoldDevice=%{public}d", mIsFoldDevice);
117595d5899Sopenharmony_ci#endif
118595d5899Sopenharmony_ci    ConfigParse::Get().Initialize();
119595d5899Sopenharmony_ci    mLightLuxManager.InitParameters();
120595d5899Sopenharmony_ci    mBrightnessCalculationManager.InitParameters();
121595d5899Sopenharmony_ci
122595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
123595d5899Sopenharmony_ci    brightnessValueMax = defaultMax;
124595d5899Sopenharmony_ci    brightnessValueMin = defaultMin;
125595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::init isFoldable=%{public}d, max=%{public}u, min=%{public}u",
126595d5899Sopenharmony_ci        isFoldable, brightnessValueMax, brightnessValueMin);
127595d5899Sopenharmony_ci    if (isFoldable) {
128595d5899Sopenharmony_ci        RegisterFoldStatusListener();
129595d5899Sopenharmony_ci    }
130595d5899Sopenharmony_ci}
131595d5899Sopenharmony_ci
132595d5899Sopenharmony_civoid BrightnessService::DeInit()
133595d5899Sopenharmony_ci{
134595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
135595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::init isFoldable=%{public}d", isFoldable);
136595d5899Sopenharmony_ci    if (isFoldable) {
137595d5899Sopenharmony_ci        UnRegisterFoldStatusListener();
138595d5899Sopenharmony_ci    }
139595d5899Sopenharmony_ci    if (queue_) {
140595d5899Sopenharmony_ci        queue_.reset();
141595d5899Sopenharmony_ci        g_cancelBoostTaskHandle = nullptr;
142595d5899Sopenharmony_ci        g_waitForFirstLuxTaskHandle = nullptr;
143595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "destruct brightness ffrt queue");
144595d5899Sopenharmony_ci    }
145595d5899Sopenharmony_ci
146595d5899Sopenharmony_ci    mDimming->Reset();
147595d5899Sopenharmony_ci}
148595d5899Sopenharmony_ci
149595d5899Sopenharmony_civoid BrightnessService::FoldStatusLisener::OnFoldStatusChanged(Rosen::FoldStatus foldStatus)
150595d5899Sopenharmony_ci{
151595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged currenFoldStatus=%{public}d", foldStatus);
152595d5899Sopenharmony_ci    if (mLastFoldStatus == foldStatus) {
153595d5899Sopenharmony_ci        DISPLAY_HILOGE(FEAT_BRIGHTNESS, "no need set foldStatus");
154595d5899Sopenharmony_ci        return;
155595d5899Sopenharmony_ci    }
156595d5899Sopenharmony_ci    bool isSensorEnable = BrightnessService::Get().GetIsSupportLightSensor();
157595d5899Sopenharmony_ci    bool isAutoEnable = BrightnessService::Get().GetSettingAutoBrightness();
158595d5899Sopenharmony_ci    bool isScreenOn = BrightnessService::Get().IsScreenOn();
159595d5899Sopenharmony_ci    int displayId = BrightnessService::Get().GetDisplayIdWithFoldstatus(foldStatus);
160595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged isSensorEnable=%{public}d, isAutoEnable=%{public}d"\
161595d5899Sopenharmony_ci        ", isScreenOn=%{public}d, displayid=%{public}d", isSensorEnable, isAutoEnable, isScreenOn, displayId);
162595d5899Sopenharmony_ci    uint32_t currentBrightness = BrightnessService::Get().GetBrightness();
163595d5899Sopenharmony_ci    BrightnessService::Get().SetDisplayId(displayId);
164595d5899Sopenharmony_ci
165595d5899Sopenharmony_ci    if (Rosen::FoldStatus::FOLDED == foldStatus || Rosen::FoldStatus::EXPAND == foldStatus) {
166595d5899Sopenharmony_ci        int sensorId = BrightnessService::Get().GetSensorIdWithFoldstatus(foldStatus);
167595d5899Sopenharmony_ci        BrightnessService::Get().SetCurrentSensorId(static_cast<uint32_t>(sensorId));
168595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged sensorid=%{public}d", sensorId);
169595d5899Sopenharmony_ci        if (isSensorEnable && isAutoEnable && isScreenOn) {
170595d5899Sopenharmony_ci            if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
171595d5899Sopenharmony_ci                BrightnessService::Get().ActivateAmbientSensor();
172595d5899Sopenharmony_ci            } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
173595d5899Sopenharmony_ci                BrightnessService::Get().ActivateAmbientSensor1();
174595d5899Sopenharmony_ci            }
175595d5899Sopenharmony_ci        }
176595d5899Sopenharmony_ci    } else if (Rosen::FoldStatus::HALF_FOLD == foldStatus) {
177595d5899Sopenharmony_ci        uint32_t currentEffectSensorId = BrightnessService::Get().GetCurrentSensorId();
178595d5899Sopenharmony_ci        if (isSensorEnable && isAutoEnable && isScreenOn) {
179595d5899Sopenharmony_ci            if (currentEffectSensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
180595d5899Sopenharmony_ci                BrightnessService::Get().DeactivateAmbientSensor();
181595d5899Sopenharmony_ci            } else if (currentEffectSensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
182595d5899Sopenharmony_ci                BrightnessService::Get().DeactivateAmbientSensor1();
183595d5899Sopenharmony_ci            }
184595d5899Sopenharmony_ci        }
185595d5899Sopenharmony_ci    }
186595d5899Sopenharmony_ci
187595d5899Sopenharmony_ci    if (BrightnessService::Get().CanSetBrightness()) {
188595d5899Sopenharmony_ci        BrightnessService::Get().UpdateBrightness(currentBrightness, 0, true);
189595d5899Sopenharmony_ci    }
190595d5899Sopenharmony_ci    mLastFoldStatus = foldStatus;
191595d5899Sopenharmony_ci}
192595d5899Sopenharmony_ci
193595d5899Sopenharmony_civoid BrightnessService::RegisterFoldStatusListener()
194595d5899Sopenharmony_ci{
195595d5899Sopenharmony_ci    mFoldStatusistener = new FoldStatusLisener();
196595d5899Sopenharmony_ci    if (mFoldStatusistener == nullptr) {
197595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::RegisterDisplayModeListener newListener failed");
198595d5899Sopenharmony_ci        return;
199595d5899Sopenharmony_ci    }
200595d5899Sopenharmony_ci    auto ret = Rosen::DisplayManagerLite::GetInstance().RegisterFoldStatusListener(mFoldStatusistener);
201595d5899Sopenharmony_ci    if (ret != Rosen::DMError::DM_OK) {
202595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Rosen::DisplayManagerLite::RegisterDisplayModeListener failed");
203595d5899Sopenharmony_ci        mFoldStatusistener = nullptr;
204595d5899Sopenharmony_ci    } else {
205595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::RegisterDisplayModeListener success");
206595d5899Sopenharmony_ci    }
207595d5899Sopenharmony_ci}
208595d5899Sopenharmony_ci
209595d5899Sopenharmony_civoid BrightnessService::UnRegisterFoldStatusListener()
210595d5899Sopenharmony_ci{
211595d5899Sopenharmony_ci    if (mFoldStatusistener == nullptr) {
212595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::UnRegistermFoldStatusistener listener is null");
213595d5899Sopenharmony_ci        return;
214595d5899Sopenharmony_ci    }
215595d5899Sopenharmony_ci    auto ret = Rosen::DisplayManagerLite::GetInstance().UnregisterFoldStatusListener(mFoldStatusistener);
216595d5899Sopenharmony_ci    if (ret != Rosen::DMError::DM_OK) {
217595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::UnRegisterDisplayModeListener  failed");
218595d5899Sopenharmony_ci    }
219595d5899Sopenharmony_ci}
220595d5899Sopenharmony_ci
221595d5899Sopenharmony_ciuint32_t BrightnessService::GetDisplayId()
222595d5899Sopenharmony_ci{
223595d5899Sopenharmony_ci    return mDisplayId;
224595d5899Sopenharmony_ci}
225595d5899Sopenharmony_ci
226595d5899Sopenharmony_civoid BrightnessService::NotifyLightChangeToAps(uint32_t type, float value)
227595d5899Sopenharmony_ci{
228595d5899Sopenharmony_ci    // Check whether APS callback interface exists
229595d5899Sopenharmony_ci    if (!mApsListenLightChangeCallback) {
230595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps function is null");
231595d5899Sopenharmony_ci        return;
232595d5899Sopenharmony_ci    }
233595d5899Sopenharmony_ci
234595d5899Sopenharmony_ci    // Check Whether APS is initialized
235595d5899Sopenharmony_ci    if (mLightBrightnessThreshold.size() != APS_LISTEN_PARAMS_LENGHT) {
236595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps not init yet");
237595d5899Sopenharmony_ci        return;
238595d5899Sopenharmony_ci    }
239595d5899Sopenharmony_ci
240595d5899Sopenharmony_ci    // brightness
241595d5899Sopenharmony_ci    if (type == BRIGHTNESS_TYPE) {
242595d5899Sopenharmony_ci        int32_t nitValue = static_cast<int32_t>(GetMappingBrightnessNit(static_cast<uint32_t>(value)));
243595d5899Sopenharmony_ci        int32_t brightness = mLightBrightnessThreshold[0];
244595d5899Sopenharmony_ci        if (!mIsBrightnessValidate && nitValue >= brightness) {
245595d5899Sopenharmony_ci            mIsBrightnessValidate = true;
246595d5899Sopenharmony_ci            mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsBrightnessValidate);
247595d5899Sopenharmony_ci        } else if (mIsBrightnessValidate && nitValue < brightness) {
248595d5899Sopenharmony_ci            mIsBrightnessValidate = false;
249595d5899Sopenharmony_ci            mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsBrightnessValidate);
250595d5899Sopenharmony_ci        }
251595d5899Sopenharmony_ci        return;
252595d5899Sopenharmony_ci    }
253595d5899Sopenharmony_ci
254595d5899Sopenharmony_ci    // amlient light
255595d5899Sopenharmony_ci    if (type == AMBIENT_LIGHT_TYPE) {
256595d5899Sopenharmony_ci        // Check the interval for invoking the APS interface
257595d5899Sopenharmony_ci        time_t currentTime = time(0);
258595d5899Sopenharmony_ci        if (currentTime - mLastCallApsTime < CALL_APS_INTERVAL) {
259595d5899Sopenharmony_ci            DISPLAY_HILOGD(
260595d5899Sopenharmony_ci                FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps interface is invoked frequently");
261595d5899Sopenharmony_ci            return;
262595d5899Sopenharmony_ci        }
263595d5899Sopenharmony_ci        mLastCallApsTime = currentTime;
264595d5899Sopenharmony_ci
265595d5899Sopenharmony_ci        int32_t light = mLightBrightnessThreshold[1];
266595d5899Sopenharmony_ci        int32_t range = mLightBrightnessThreshold[2];
267595d5899Sopenharmony_ci        if (!mIsLightValidate && value >= light) {
268595d5899Sopenharmony_ci            mIsLightValidate = true;
269595d5899Sopenharmony_ci            mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsLightValidate);
270595d5899Sopenharmony_ci        } else if (mIsLightValidate && value < (light - range)) {
271595d5899Sopenharmony_ci            mIsLightValidate = false;
272595d5899Sopenharmony_ci            mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsLightValidate);
273595d5899Sopenharmony_ci        }
274595d5899Sopenharmony_ci    }
275595d5899Sopenharmony_ci}
276595d5899Sopenharmony_ci
277595d5899Sopenharmony_ciuint32_t BrightnessService::GetCurrentDisplayId(uint32_t defaultId)
278595d5899Sopenharmony_ci{
279595d5899Sopenharmony_ci    uint32_t currentId = defaultId;
280595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
281595d5899Sopenharmony_ci    if (!isFoldable) {
282595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_STATE, "GetCurrentDisplayId not fold phone return default id=%{public}d", defaultId);
283595d5899Sopenharmony_ci        return currentId;
284595d5899Sopenharmony_ci    }
285595d5899Sopenharmony_ci    std::string identity = IPCSkeleton::ResetCallingIdentity();
286595d5899Sopenharmony_ci    auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
287595d5899Sopenharmony_ci    currentId = static_cast<uint32_t>(GetDisplayIdWithDisplayMode(foldMode));
288595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_STATE, "GetCurrentDisplayId foldMode=%{public}u", foldMode);
289595d5899Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(identity);
290595d5899Sopenharmony_ci    return static_cast<uint32_t>(currentId);
291595d5899Sopenharmony_ci}
292595d5899Sopenharmony_ci
293595d5899Sopenharmony_civoid BrightnessService::SetDisplayId(uint32_t displayId)
294595d5899Sopenharmony_ci{
295595d5899Sopenharmony_ci    mDisplayId = displayId;
296595d5899Sopenharmony_ci    if (mAction == nullptr) {
297595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::SetDisplayId mAction == nullptr");
298595d5899Sopenharmony_ci        return;
299595d5899Sopenharmony_ci    }
300595d5899Sopenharmony_ci    mAction->SetDisplayId(displayId);
301595d5899Sopenharmony_ci}
302595d5899Sopenharmony_ci
303595d5899Sopenharmony_ciuint32_t BrightnessService::GetCurrentSensorId()
304595d5899Sopenharmony_ci{
305595d5899Sopenharmony_ci    return mCurrentSensorId;
306595d5899Sopenharmony_ci}
307595d5899Sopenharmony_ci
308595d5899Sopenharmony_civoid BrightnessService::SetCurrentSensorId(uint32_t sensorId)
309595d5899Sopenharmony_ci{
310595d5899Sopenharmony_ci    mCurrentSensorId = sensorId;
311595d5899Sopenharmony_ci}
312595d5899Sopenharmony_ci
313595d5899Sopenharmony_ciBrightnessService::DimmingCallbackImpl::DimmingCallbackImpl(
314595d5899Sopenharmony_ci    const std::shared_ptr<BrightnessAction>& action, std::function<void(uint32_t)> callback)
315595d5899Sopenharmony_ci    : mAction(action), mCallback(callback)
316595d5899Sopenharmony_ci{
317595d5899Sopenharmony_ci}
318595d5899Sopenharmony_ci
319595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::OnStart()
320595d5899Sopenharmony_ci{
321595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessDimmingCallback onStart");
322595d5899Sopenharmony_ci}
323595d5899Sopenharmony_ci
324595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::OnChanged(uint32_t currentValue)
325595d5899Sopenharmony_ci{
326595d5899Sopenharmony_ci    if (!BrightnessService::Get().IsDimming()) {
327595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged currentValue=%{public}d already stopDimming, return", currentValue);
328595d5899Sopenharmony_ci        return;
329595d5899Sopenharmony_ci    }
330595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged brightness,mapBrightness=%{public}d", currentValue);
331595d5899Sopenharmony_ci    bool isSuccess = mAction->SetBrightness(currentValue);
332595d5899Sopenharmony_ci    if (isSuccess) {
333595d5899Sopenharmony_ci        BrightnessService::Get().ReportBrightnessBigData(currentValue);
334595d5899Sopenharmony_ci    }
335595d5899Sopenharmony_ci    if (isSuccess && !BrightnessService::Get().IsSleepStatus()) {
336595d5899Sopenharmony_ci        if (!BrightnessService::Get().IsDimming()) {
337595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged already stopDimming , not update setting brightness");
338595d5899Sopenharmony_ci            return;
339595d5899Sopenharmony_ci        }
340595d5899Sopenharmony_ci        FFRTTask task = [this, currentValue] {
341595d5899Sopenharmony_ci            auto tmpVal = BrightnessService::Get().GetOrigBrightnessLevel(currentValue);
342595d5899Sopenharmony_ci            this->mCallback(tmpVal);
343595d5899Sopenharmony_ci        };
344595d5899Sopenharmony_ci        FFRTUtils::SubmitTask(task);
345595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Update OnChanged,Setting brightness=%{public}d", currentValue);
346595d5899Sopenharmony_ci    } else {
347595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Update OnChanged failed, brightness=%{public}d", currentValue);
348595d5899Sopenharmony_ci    }
349595d5899Sopenharmony_ci}
350595d5899Sopenharmony_ci
351595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::OnEnd()
352595d5899Sopenharmony_ci{
353595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "ScreenAnimatorCallback OnEnd");
354595d5899Sopenharmony_ci}
355595d5899Sopenharmony_ci
356595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::DiscountBrightness(double discount)
357595d5899Sopenharmony_ci{
358595d5899Sopenharmony_ci    mDiscount = discount;
359595d5899Sopenharmony_ci}
360595d5899Sopenharmony_ci
361595d5899Sopenharmony_civoid BrightnessService::SetDisplayState(uint32_t id, DisplayState state)
362595d5899Sopenharmony_ci{
363595d5899Sopenharmony_ci    mState = state;
364595d5899Sopenharmony_ci    bool isAutoMode = false;
365595d5899Sopenharmony_ci    bool isScreenOn = IsScreenOnState(state); // depend on state on
366595d5899Sopenharmony_ci    bool isSettingOn = false;
367595d5899Sopenharmony_ci    if (isScreenOn) {
368595d5899Sopenharmony_ci        isSettingOn = IsAutoAdjustBrightness();
369595d5899Sopenharmony_ci    }
370595d5899Sopenharmony_ci    isAutoMode = isScreenOn && isSettingOn;
371595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetDisplayState id=%{public}d, isAutoMode=%{public}d, isScreenOn=%{public}d, "\
372595d5899Sopenharmony_ci        "isSettingOn=%{public}d, state=%{public}d", id, isAutoMode, isScreenOn, isSettingOn, state);
373595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART
374595d5899Sopenharmony_ci    bool isModeChange = StateChangedSetAutoBrightness(isAutoMode);
375595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetDisplayState id=%{public}d, isAutoMode=%{public}d, isModeChange=%{public}d",
376595d5899Sopenharmony_ci        id, isAutoMode, isModeChange);
377595d5899Sopenharmony_ci#endif
378595d5899Sopenharmony_ci    if (state == DisplayState::DISPLAY_OFF) {
379595d5899Sopenharmony_ci        if (mIsSleepStatus) {
380595d5899Sopenharmony_ci            mIsBrightnessOverridden = false;
381595d5899Sopenharmony_ci            mIsSleepStatus = false;
382595d5899Sopenharmony_ci        }
383595d5899Sopenharmony_ci        mBrightnessTarget.store(0);
384595d5899Sopenharmony_ci        if (mDimming->IsDimming()) {
385595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DISPLAY_OFF StopDimming");
386595d5899Sopenharmony_ci            mDimming->StopDimming();
387595d5899Sopenharmony_ci        }
388595d5899Sopenharmony_ci    } else if (state == DisplayState::DISPLAY_DIM) {
389595d5899Sopenharmony_ci        SetSleepBrightness();
390595d5899Sopenharmony_ci    } else if (state == DisplayState::DISPLAY_ON) {
391595d5899Sopenharmony_ci        mIsDisplayOnWhenFirstLuxReport.store(true);
392595d5899Sopenharmony_ci        if (mIsSleepStatus) {
393595d5899Sopenharmony_ci            RestoreBrightness(0);
394595d5899Sopenharmony_ci            mIsSleepStatus = false;
395595d5899Sopenharmony_ci        }
396595d5899Sopenharmony_ci    }
397595d5899Sopenharmony_ci}
398595d5899Sopenharmony_ci
399595d5899Sopenharmony_ciDisplayState BrightnessService::GetDisplayState()
400595d5899Sopenharmony_ci{
401595d5899Sopenharmony_ci    return mState;
402595d5899Sopenharmony_ci}
403595d5899Sopenharmony_ci
404595d5899Sopenharmony_cibool BrightnessService::IsScreenOnState(DisplayState state)
405595d5899Sopenharmony_ci{
406595d5899Sopenharmony_ci    return state == DisplayState::DISPLAY_ON || state == DisplayState::DISPLAY_DIM;
407595d5899Sopenharmony_ci}
408595d5899Sopenharmony_ci
409595d5899Sopenharmony_cibool BrightnessService::GetSettingAutoBrightness(const std::string& key)
410595d5899Sopenharmony_ci{
411595d5899Sopenharmony_ci    return BrightnessSettingHelper::GetSettingAutoBrightness(key);
412595d5899Sopenharmony_ci}
413595d5899Sopenharmony_ci
414595d5899Sopenharmony_civoid BrightnessService::SetSettingAutoBrightness(bool enable)
415595d5899Sopenharmony_ci{
416595d5899Sopenharmony_ci    BrightnessSettingHelper::SetSettingAutoBrightness(enable);
417595d5899Sopenharmony_ci}
418595d5899Sopenharmony_ci
419595d5899Sopenharmony_ciuint32_t BrightnessService::SetLightBrightnessThreshold(
420595d5899Sopenharmony_ci    std::vector<int32_t> threshold, sptr<IDisplayBrightnessCallback> callback)
421595d5899Sopenharmony_ci{
422595d5899Sopenharmony_ci    uint32_t result = 0;
423595d5899Sopenharmony_ci    if (threshold.size() != APS_LISTEN_PARAMS_LENGHT || !callback) {
424595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS, "BrightnessService::SetLightBrightnessThreshold params verify faild.");
425595d5899Sopenharmony_ci        return result;
426595d5899Sopenharmony_ci    }
427595d5899Sopenharmony_ci    result = 1;
428595d5899Sopenharmony_ci    mLightBrightnessThreshold = threshold;
429595d5899Sopenharmony_ci    mApsListenLightChangeCallback = callback;
430595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::SetLightBrightnessThreshold set listener success");
431595d5899Sopenharmony_ci    return result;
432595d5899Sopenharmony_ci}
433595d5899Sopenharmony_ci
434595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART
435595d5899Sopenharmony_cibool BrightnessService::AutoAdjustBrightness(bool enable)
436595d5899Sopenharmony_ci{
437595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable start, enable=%{public}d, isEnabled=%{public}d, "\
438595d5899Sopenharmony_ci        "isSupport=%{public}d", enable, mIsAutoBrightnessEnabled, mIsSupportLightSensor);
439595d5899Sopenharmony_ci    if (!mIsSupportLightSensor) {
440595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable not support");
441595d5899Sopenharmony_ci        SetSettingAutoBrightness(false);
442595d5899Sopenharmony_ci        return false;
443595d5899Sopenharmony_ci    }
444595d5899Sopenharmony_ci    if (enable) {
445595d5899Sopenharmony_ci        if (mIsAutoBrightnessEnabled) {
446595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable is already enabled");
447595d5899Sopenharmony_ci            return true;
448595d5899Sopenharmony_ci        }
449595d5899Sopenharmony_ci        mIsAutoBrightnessEnabled = true;
450595d5899Sopenharmony_ci        ActivateValidAmbientSensor();
451595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable enable");
452595d5899Sopenharmony_ci    } else {
453595d5899Sopenharmony_ci        if (!mIsAutoBrightnessEnabled) {
454595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable is already disabled");
455595d5899Sopenharmony_ci            return true;
456595d5899Sopenharmony_ci        }
457595d5899Sopenharmony_ci        DeactivateAllAmbientSensor();
458595d5899Sopenharmony_ci        mIsAutoBrightnessEnabled = false;
459595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable disable");
460595d5899Sopenharmony_ci    }
461595d5899Sopenharmony_ci    return true;
462595d5899Sopenharmony_ci}
463595d5899Sopenharmony_ci
464595d5899Sopenharmony_cibool BrightnessService::StateChangedSetAutoBrightness(bool enable)
465595d5899Sopenharmony_ci{
466595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness start, enable=%{public}d, "\
467595d5899Sopenharmony_ci        "isSensorEnabled=%{public}d, isSupport=%{public}d", enable, mIsLightSensorEnabled, mIsSupportLightSensor);
468595d5899Sopenharmony_ci    if (!mIsSupportLightSensor) {
469595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness not support");
470595d5899Sopenharmony_ci        SetSettingAutoBrightness(false);
471595d5899Sopenharmony_ci        return false;
472595d5899Sopenharmony_ci    }
473595d5899Sopenharmony_ci    if (enable) {
474595d5899Sopenharmony_ci        if (IsCurrentSensorEnable()) {
475595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness is already enabled");
476595d5899Sopenharmony_ci            return true;
477595d5899Sopenharmony_ci        }
478595d5899Sopenharmony_ci        ActivateValidAmbientSensor();
479595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness enable");
480595d5899Sopenharmony_ci    } else {
481595d5899Sopenharmony_ci        if (!IsCurrentSensorEnable()) {
482595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness is already disabled");
483595d5899Sopenharmony_ci            return true;
484595d5899Sopenharmony_ci        }
485595d5899Sopenharmony_ci        DeactivateAllAmbientSensor();
486595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness disable");
487595d5899Sopenharmony_ci    }
488595d5899Sopenharmony_ci    return true;
489595d5899Sopenharmony_ci}
490595d5899Sopenharmony_ci
491595d5899Sopenharmony_civoid BrightnessService::InitSensors()
492595d5899Sopenharmony_ci{
493595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "InitSensors start");
494595d5899Sopenharmony_ci    SensorInfo* sensorInfo = nullptr;
495595d5899Sopenharmony_ci    int32_t count;
496595d5899Sopenharmony_ci    int ret = GetAllSensors(&sensorInfo, &count);
497595d5899Sopenharmony_ci    if (ret != 0 || sensorInfo == nullptr || count < 0) {
498595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Can't get sensors");
499595d5899Sopenharmony_ci        return;
500595d5899Sopenharmony_ci    }
501595d5899Sopenharmony_ci    mIsSupportLightSensor = false;
502595d5899Sopenharmony_ci    for (int i = 0; i < count; i++) {
503595d5899Sopenharmony_ci        if (sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT ||
504595d5899Sopenharmony_ci            sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
505595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT Support");
506595d5899Sopenharmony_ci            mIsSupportLightSensor = true;
507595d5899Sopenharmony_ci            break;
508595d5899Sopenharmony_ci        }
509595d5899Sopenharmony_ci    }
510595d5899Sopenharmony_ci    if (!mIsSupportLightSensor) {
511595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT not support");
512595d5899Sopenharmony_ci    }
513595d5899Sopenharmony_ci}
514595d5899Sopenharmony_ci
515595d5899Sopenharmony_civoid BrightnessService::AmbientLightCallback(SensorEvent* event)
516595d5899Sopenharmony_ci{
517595d5899Sopenharmony_ci    if (event == nullptr) {
518595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor event is nullptr");
519595d5899Sopenharmony_ci        return;
520595d5899Sopenharmony_ci    }
521595d5899Sopenharmony_ci    if (event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT && event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
522595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor Callback is not AMBIENT_LIGHT id=%{public}d", event->sensorTypeId);
523595d5899Sopenharmony_ci        return;
524595d5899Sopenharmony_ci    }
525595d5899Sopenharmony_ci    AmbientLightData* data = reinterpret_cast<AmbientLightData*>(event->data);
526595d5899Sopenharmony_ci    if (data == nullptr) {
527595d5899Sopenharmony_ci        DISPLAY_HILOGE(FEAT_BRIGHTNESS, "AmbientLightData is null");
528595d5899Sopenharmony_ci        return;
529595d5899Sopenharmony_ci    }
530595d5899Sopenharmony_ci    BrightnessService::Get().ProcessLightLux(data->intensity);
531595d5899Sopenharmony_ci}
532595d5899Sopenharmony_ci
533595d5899Sopenharmony_civoid BrightnessService::ActivateAmbientSensor()
534595d5899Sopenharmony_ci{
535595d5899Sopenharmony_ci    if (!mIsAutoBrightnessEnabled) {
536595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness is not enabled");
537595d5899Sopenharmony_ci        return;
538595d5899Sopenharmony_ci    }
539595d5899Sopenharmony_ci    if (mIsLightSensorEnabled) {
540595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor is already on");
541595d5899Sopenharmony_ci        return;
542595d5899Sopenharmony_ci    }
543595d5899Sopenharmony_ci    (void)strcpy_s(mSensorUser.name, sizeof(mSensorUser.name), "BrightnessService");
544595d5899Sopenharmony_ci    mSensorUser.userData = nullptr;
545595d5899Sopenharmony_ci    mSensorUser.callback = &AmbientLightCallback;
546595d5899Sopenharmony_ci    SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
547595d5899Sopenharmony_ci    SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser, SAMPLING_RATE, SAMPLING_RATE);
548595d5899Sopenharmony_ci    ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
549595d5899Sopenharmony_ci    SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser, SENSOR_ON_CHANGE);
550595d5899Sopenharmony_ci    mIsLightSensorEnabled = true;
551595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateAmbientSensor");
552595d5899Sopenharmony_ci}
553595d5899Sopenharmony_ci
554595d5899Sopenharmony_civoid BrightnessService::DeactivateAmbientSensor()
555595d5899Sopenharmony_ci{
556595d5899Sopenharmony_ci    if (!mIsAutoBrightnessEnabled) {
557595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness is not enabled");
558595d5899Sopenharmony_ci        return;
559595d5899Sopenharmony_ci    }
560595d5899Sopenharmony_ci    if (!mIsLightSensorEnabled) {
561595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor is already off");
562595d5899Sopenharmony_ci        return;
563595d5899Sopenharmony_ci    }
564595d5899Sopenharmony_ci    DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
565595d5899Sopenharmony_ci    UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
566595d5899Sopenharmony_ci    mIsLightSensorEnabled = false;
567595d5899Sopenharmony_ci    mLightLuxManager.ClearLuxData();
568595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAmbientSensor");
569595d5899Sopenharmony_ci}
570595d5899Sopenharmony_ci
571595d5899Sopenharmony_civoid BrightnessService::ActivateAmbientSensor1()
572595d5899Sopenharmony_ci{
573595d5899Sopenharmony_ci    if (!mIsAutoBrightnessEnabled) {
574595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness1 is not enabled");
575595d5899Sopenharmony_ci        return;
576595d5899Sopenharmony_ci    }
577595d5899Sopenharmony_ci    if (mIsLightSensor1Enabled) {
578595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor1 is already on");
579595d5899Sopenharmony_ci        return;
580595d5899Sopenharmony_ci    }
581595d5899Sopenharmony_ci    (void)strcpy_s(mSensorUser1.name, sizeof(mSensorUser1.name), "BrightnessService");
582595d5899Sopenharmony_ci    mSensorUser1.userData = nullptr;
583595d5899Sopenharmony_ci    mSensorUser1.callback = &AmbientLightCallback;
584595d5899Sopenharmony_ci    SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
585595d5899Sopenharmony_ci    SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1, SAMPLING_RATE, SAMPLING_RATE);
586595d5899Sopenharmony_ci    ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
587595d5899Sopenharmony_ci    SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1, SENSOR_ON_CHANGE);
588595d5899Sopenharmony_ci    mIsLightSensor1Enabled = true;
589595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateAmbientSensor1");
590595d5899Sopenharmony_ci}
591595d5899Sopenharmony_ci
592595d5899Sopenharmony_civoid BrightnessService::DeactivateAmbientSensor1()
593595d5899Sopenharmony_ci{
594595d5899Sopenharmony_ci    if (!mIsAutoBrightnessEnabled) {
595595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness1 is not enabled");
596595d5899Sopenharmony_ci        return;
597595d5899Sopenharmony_ci    }
598595d5899Sopenharmony_ci    if (!mIsLightSensor1Enabled) {
599595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor1 is already off");
600595d5899Sopenharmony_ci        return;
601595d5899Sopenharmony_ci    }
602595d5899Sopenharmony_ci    DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
603595d5899Sopenharmony_ci    UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
604595d5899Sopenharmony_ci    mIsLightSensor1Enabled = false;
605595d5899Sopenharmony_ci    mLightLuxManager.ClearLuxData();
606595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAmbientSensor1");
607595d5899Sopenharmony_ci}
608595d5899Sopenharmony_ci
609595d5899Sopenharmony_civoid BrightnessService::ActivateValidAmbientSensor()
610595d5899Sopenharmony_ci{
611595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateValidAmbientSensor");
612595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
613595d5899Sopenharmony_ci    if (!isFoldable) {
614595d5899Sopenharmony_ci        ActivateAmbientSensor();
615595d5899Sopenharmony_ci        return;
616595d5899Sopenharmony_ci    }
617595d5899Sopenharmony_ci    std::string identity = IPCSkeleton::ResetCallingIdentity();
618595d5899Sopenharmony_ci    auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
619595d5899Sopenharmony_ci    int sensorId = GetSensorIdWithDisplayMode(foldMode);
620595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateValidAmbientSensor sensorId=%{public}d, mode=%{public}d",
621595d5899Sopenharmony_ci        sensorId, foldMode);
622595d5899Sopenharmony_ci    if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
623595d5899Sopenharmony_ci        ActivateAmbientSensor();
624595d5899Sopenharmony_ci    } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
625595d5899Sopenharmony_ci        ActivateAmbientSensor1();
626595d5899Sopenharmony_ci    }
627595d5899Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(identity);
628595d5899Sopenharmony_ci}
629595d5899Sopenharmony_ci
630595d5899Sopenharmony_civoid BrightnessService::DeactivateValidAmbientSensor()
631595d5899Sopenharmony_ci{
632595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateValidAmbientSensor");
633595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
634595d5899Sopenharmony_ci    if (!isFoldable) {
635595d5899Sopenharmony_ci        DeactivateAmbientSensor();
636595d5899Sopenharmony_ci        return;
637595d5899Sopenharmony_ci    }
638595d5899Sopenharmony_ci    std::string identity = IPCSkeleton::ResetCallingIdentity();
639595d5899Sopenharmony_ci    auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
640595d5899Sopenharmony_ci    int sensorId = GetSensorIdWithDisplayMode(foldMode);
641595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateValidAmbientSensor sensorId=%{public}d, mode=%{public}d",
642595d5899Sopenharmony_ci        sensorId, foldMode);
643595d5899Sopenharmony_ci    if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
644595d5899Sopenharmony_ci        DeactivateAmbientSensor();
645595d5899Sopenharmony_ci    } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
646595d5899Sopenharmony_ci        DeactivateAmbientSensor1();
647595d5899Sopenharmony_ci    }
648595d5899Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(identity);
649595d5899Sopenharmony_ci}
650595d5899Sopenharmony_ci
651595d5899Sopenharmony_civoid BrightnessService::DeactivateAllAmbientSensor()
652595d5899Sopenharmony_ci{
653595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAllAmbientSensor");
654595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
655595d5899Sopenharmony_ci    if (!isFoldable) {
656595d5899Sopenharmony_ci        DeactivateAmbientSensor();
657595d5899Sopenharmony_ci        return;
658595d5899Sopenharmony_ci    }
659595d5899Sopenharmony_ci    DeactivateAmbientSensor();
660595d5899Sopenharmony_ci    DeactivateAmbientSensor1();
661595d5899Sopenharmony_ci}
662595d5899Sopenharmony_ci#endif
663595d5899Sopenharmony_ci
664595d5899Sopenharmony_cibool BrightnessService::IsAutoAdjustBrightness()
665595d5899Sopenharmony_ci{
666595d5899Sopenharmony_ci    return mIsAutoBrightnessEnabled;
667595d5899Sopenharmony_ci}
668595d5899Sopenharmony_ci
669595d5899Sopenharmony_civoid BrightnessService::ProcessLightLux(float lux)
670595d5899Sopenharmony_ci{
671595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "ProcessLightLux, lux=%{public}f, mLightLux=%{public}f",
672595d5899Sopenharmony_ci        lux, mLightLuxManager.GetSmoothedLux());
673595d5899Sopenharmony_ci    if (!CanSetBrightness()) {
674595d5899Sopenharmony_ci        if (mIsLuxActiveWithLog) {
675595d5899Sopenharmony_ci            mIsLuxActiveWithLog = false;
676595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ProcessLightLux:mIsLuxActiveWithLog=false");
677595d5899Sopenharmony_ci        }
678595d5899Sopenharmony_ci        return;
679595d5899Sopenharmony_ci    }
680595d5899Sopenharmony_ci    if (!mIsLuxActiveWithLog) {
681595d5899Sopenharmony_ci        mIsLuxActiveWithLog = true;
682595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ProcessLightLux:mIsLuxActiveWithLog=true");
683595d5899Sopenharmony_ci    }
684595d5899Sopenharmony_ci    NotifyLightChangeToAps(AMBIENT_LIGHT_TYPE, lux);
685595d5899Sopenharmony_ci    if (mLightLuxManager.IsNeedUpdateBrightness(lux)) {
686595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateLightLux, lux=%{public}f, mLightLux=%{public}f, isFirst=%{public}d",
687595d5899Sopenharmony_ci            lux, mLightLuxManager.GetSmoothedLux(), mLightLuxManager.GetIsFirstLux());
688595d5899Sopenharmony_ci        UpdateCurrentBrightnessLevel(lux, mLightLuxManager.GetIsFirstLux());
689595d5899Sopenharmony_ci    }
690595d5899Sopenharmony_ci
691595d5899Sopenharmony_ci    for (int index = 0; index < LUX_LEVEL_LENGTH; index++) {
692595d5899Sopenharmony_ci        if (static_cast<uint32_t>(lux) < AMBIENT_LUX_LEVELS[index]) {
693595d5899Sopenharmony_ci            if (index != mLuxLevel || mLightLuxManager.GetIsFirstLux()) {
694595d5899Sopenharmony_ci                mLuxLevel = index;
695595d5899Sopenharmony_ci                // Notify ambient lux change event to battery statistics
696595d5899Sopenharmony_ci                // type:0 auto brightness, 1 manual brightness, 2 window brightness, 3 others
697595d5899Sopenharmony_ci#ifdef HAS_HIVIEWDFX_HISYSEVENT_PART
698595d5899Sopenharmony_ci                HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "AMBIENT_LIGHT",
699595d5899Sopenharmony_ci                    HiviewDFX::HiSysEvent::EventType::STATISTIC, "LEVEL", mLuxLevel, "TYPE", 0);
700595d5899Sopenharmony_ci#endif
701595d5899Sopenharmony_ci            }
702595d5899Sopenharmony_ci            break;
703595d5899Sopenharmony_ci        }
704595d5899Sopenharmony_ci    }
705595d5899Sopenharmony_ci}
706595d5899Sopenharmony_ci
707595d5899Sopenharmony_civoid BrightnessService::UpdateCurrentBrightnessLevel(float lux, bool isFastDuration)
708595d5899Sopenharmony_ci{
709595d5899Sopenharmony_ci    uint32_t brightnessLevel = GetBrightnessLevel(lux);
710595d5899Sopenharmony_ci    if (mBrightnessLevel != brightnessLevel || isFastDuration) {
711595d5899Sopenharmony_ci        uint32_t duration = DEFAULT_BRIGHTEN_DURATION;
712595d5899Sopenharmony_ci        if (brightnessLevel < mBrightnessLevel) {
713595d5899Sopenharmony_ci            duration = DEFAULT_DARKEN_DURATION;
714595d5899Sopenharmony_ci        }
715595d5899Sopenharmony_ci        if (isFastDuration) {
716595d5899Sopenharmony_ci            duration = DEFAULT_ANIMATING_DURATION;
717595d5899Sopenharmony_ci        }
718595d5899Sopenharmony_ci        if (isFastDuration && mIsDisplayOnWhenFirstLuxReport) {
719595d5899Sopenharmony_ci            duration = 0;
720595d5899Sopenharmony_ci            mIsDisplayOnWhenFirstLuxReport.store(false);
721595d5899Sopenharmony_ci        }
722595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateCurrentBrightnessLevel lux=%{public}f, mBrightnessLevel=%{public}d, "\
723595d5899Sopenharmony_ci            "brightnessLevel=%{public}d, duration=%{public}d", lux, mBrightnessLevel, brightnessLevel, duration);
724595d5899Sopenharmony_ci        mBrightnessLevel = brightnessLevel;
725595d5899Sopenharmony_ci        mCurrentBrightness.store(brightnessLevel);
726595d5899Sopenharmony_ci        if (mWaitForFirstLux) {
727595d5899Sopenharmony_ci            FFRTUtils::CancelTask(g_waitForFirstLuxTaskHandle, queue_);
728595d5899Sopenharmony_ci            mWaitForFirstLux = false;
729595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateCurrentBrightnessLevel CancelScreenOn waitforFisrtLux Task");
730595d5899Sopenharmony_ci        }
731595d5899Sopenharmony_ci        mBrightnessTarget.store(brightnessLevel);
732595d5899Sopenharmony_ci        SetBrightnessLevel(brightnessLevel, duration);
733595d5899Sopenharmony_ci    }
734595d5899Sopenharmony_ci}
735595d5899Sopenharmony_ci
736595d5899Sopenharmony_civoid BrightnessService::SetBrightnessLevel(uint32_t value, uint32_t duration)
737595d5899Sopenharmony_ci{
738595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBrightnessLevel value=%{public}d, duration=%{public}d",
739595d5899Sopenharmony_ci        value, duration);
740595d5899Sopenharmony_ci    UpdateBrightness(value, duration, true);
741595d5899Sopenharmony_ci}
742595d5899Sopenharmony_ci
743595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightnessLevel(float lux)
744595d5899Sopenharmony_ci{
745595d5899Sopenharmony_ci    uint32_t brightnessLevel = static_cast<uint32_t>(mBrightnessCalculationManager.GetInterpolatedValue(lux) *
746595d5899Sopenharmony_ci        MAX_DEFAULT_BRGIHTNESS_LEVEL);
747595d5899Sopenharmony_ci
748595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetBrightnessLevel lux=%{public}f, brightnessLevel=%{public}d",
749595d5899Sopenharmony_ci        lux, brightnessLevel);
750595d5899Sopenharmony_ci    return brightnessLevel;
751595d5899Sopenharmony_ci}
752595d5899Sopenharmony_ci
753595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightnessHighLevel(uint32_t level)
754595d5899Sopenharmony_ci{
755595d5899Sopenharmony_ci    return level;
756595d5899Sopenharmony_ci}
757595d5899Sopenharmony_ci
758595d5899Sopenharmony_cibool BrightnessService::SetBrightness(uint32_t value, uint32_t gradualDuration, bool continuous)
759595d5899Sopenharmony_ci{
760595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "SetBrightness val=%{public}d, duration=%{public}d", value, gradualDuration);
761595d5899Sopenharmony_ci    if (!CanSetBrightness()) {
762595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot set brightness, ignore the change");
763595d5899Sopenharmony_ci        mCachedSettingBrightness = value;
764595d5899Sopenharmony_ci        return false;
765595d5899Sopenharmony_ci    }
766595d5899Sopenharmony_ci    if (gradualDuration == 0) {
767595d5899Sopenharmony_ci        bool isSettingOn = IsAutoAdjustBrightness();
768595d5899Sopenharmony_ci        if (isSettingOn && IsCurrentSensorEnable()) {
769595d5899Sopenharmony_ci            mIsUserMode = true;
770595d5899Sopenharmony_ci            mBrightnessCalculationManager.UpdateBrightnessOffset(value, mLightLuxManager.GetSmoothedLux());
771595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightnessOffset level=%{public}d, mLightLux=%{public}f",
772595d5899Sopenharmony_ci                value, mLightLuxManager.GetSmoothedLux());
773595d5899Sopenharmony_ci        }
774595d5899Sopenharmony_ci    }
775595d5899Sopenharmony_ci    mBrightnessTarget.store(value);
776595d5899Sopenharmony_ci    mCurrentBrightness.store(value);
777595d5899Sopenharmony_ci    NotifyLightChangeToAps(BRIGHTNESS_TYPE, static_cast<float>(value));
778595d5899Sopenharmony_ci    bool isSuccess = UpdateBrightness(value, gradualDuration, !continuous);
779595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "SetBrightness val=%{public}d, isSuccess=%{public}d", value, isSuccess);
780595d5899Sopenharmony_ci    mIsUserMode = false;
781595d5899Sopenharmony_ci    return isSuccess;
782595d5899Sopenharmony_ci}
783595d5899Sopenharmony_ci
784595d5899Sopenharmony_civoid BrightnessService::SetScreenOnBrightness()
785595d5899Sopenharmony_ci{
786595d5899Sopenharmony_ci    uint32_t screenOnBrightness = GetScreenOnBrightness(true);
787595d5899Sopenharmony_ci    if (mWaitForFirstLux) {
788595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness waitForFirstLux");
789595d5899Sopenharmony_ci        FFRTUtils::CancelTask(g_waitForFirstLuxTaskHandle, queue_);
790595d5899Sopenharmony_ci        screenOnBrightness = mCachedSettingBrightness;
791595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness waitForFirstLux,GetSettingBrightness=%{public}d",
792595d5899Sopenharmony_ci            screenOnBrightness);
793595d5899Sopenharmony_ci        FFRTTask setBrightnessTask = [this, screenOnBrightness] {
794595d5899Sopenharmony_ci            this->UpdateBrightness(screenOnBrightness, 0, true);
795595d5899Sopenharmony_ci        };
796595d5899Sopenharmony_ci        g_waitForFirstLuxTaskHandle = FFRTUtils::SubmitDelayTask(setBrightnessTask, WAIT_FOR_FIRST_LUX_MAX_TIME,
797595d5899Sopenharmony_ci            queue_);
798595d5899Sopenharmony_ci        return;
799595d5899Sopenharmony_ci    }
800595d5899Sopenharmony_ci    bool needUpdateBrightness = true;
801595d5899Sopenharmony_ci    if (IsBrightnessBoosted() || IsBrightnessOverridden()) {
802595d5899Sopenharmony_ci        needUpdateBrightness = false;
803595d5899Sopenharmony_ci    }
804595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness screenOnBrightness=%{public}d, needUpdate=%{public}d",
805595d5899Sopenharmony_ci        screenOnBrightness, needUpdateBrightness);
806595d5899Sopenharmony_ci    UpdateBrightness(screenOnBrightness, 0, needUpdateBrightness);
807595d5899Sopenharmony_ci}
808595d5899Sopenharmony_ci
809595d5899Sopenharmony_civoid BrightnessService::ClearOffset()
810595d5899Sopenharmony_ci{
811595d5899Sopenharmony_ci    if (mDimming->IsDimming()) {
812595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "mode off StopDimming");
813595d5899Sopenharmony_ci        mDimming->StopDimming();
814595d5899Sopenharmony_ci    }
815595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ClearOffset mLightLux=%{public}f", mLightLuxManager.GetSmoothedLux());
816595d5899Sopenharmony_ci    mBrightnessTarget.store(0);
817595d5899Sopenharmony_ci    mBrightnessCalculationManager.UpdateBrightnessOffset(0, mLightLuxManager.GetSmoothedLux());
818595d5899Sopenharmony_ci}
819595d5899Sopenharmony_ci
820595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightness()
821595d5899Sopenharmony_ci{
822595d5899Sopenharmony_ci    return GetSettingBrightness();
823595d5899Sopenharmony_ci}
824595d5899Sopenharmony_ci
825595d5899Sopenharmony_ciuint32_t BrightnessService::GetDeviceBrightness()
826595d5899Sopenharmony_ci{
827595d5899Sopenharmony_ci    uint32_t brightness = DEFAULT_BRIGHTNESS;
828595d5899Sopenharmony_ci    if (mAction != nullptr) {
829595d5899Sopenharmony_ci        brightness = mAction->GetBrightness();
830595d5899Sopenharmony_ci    }
831595d5899Sopenharmony_ci    return GetOrigBrightnessLevel(brightness);
832595d5899Sopenharmony_ci}
833595d5899Sopenharmony_ci
834595d5899Sopenharmony_ciuint32_t BrightnessService::GetCachedSettingBrightness()
835595d5899Sopenharmony_ci{
836595d5899Sopenharmony_ci    return mCachedSettingBrightness;
837595d5899Sopenharmony_ci}
838595d5899Sopenharmony_ci
839595d5899Sopenharmony_cibool BrightnessService::DiscountBrightness(double discount, uint32_t gradualDuration)
840595d5899Sopenharmony_ci{
841595d5899Sopenharmony_ci    if (!CanDiscountBrightness()) {
842595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot discount brightness, ignore the change");
843595d5899Sopenharmony_ci        return false;
844595d5899Sopenharmony_ci    }
845595d5899Sopenharmony_ci    auto safeDiscount = discount;
846595d5899Sopenharmony_ci    if (safeDiscount > DISCOUNT_MAX) {
847595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "discount value is greater than max, discount=%{public}lf", discount);
848595d5899Sopenharmony_ci        safeDiscount = DISCOUNT_MAX;
849595d5899Sopenharmony_ci    }
850595d5899Sopenharmony_ci    if (safeDiscount < DISCOUNT_MIN) {
851595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "discount value is less than min, discount=%{public}lf", discount);
852595d5899Sopenharmony_ci        safeDiscount = DISCOUNT_MIN;
853595d5899Sopenharmony_ci    }
854595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Discount brightness, safeDiscount=%{public}lf", safeDiscount);
855595d5899Sopenharmony_ci    mDiscount = safeDiscount;
856595d5899Sopenharmony_ci    if (mDimmingCallback) {
857595d5899Sopenharmony_ci        mDimmingCallback->DiscountBrightness(safeDiscount);
858595d5899Sopenharmony_ci    }
859595d5899Sopenharmony_ci    uint32_t screenOnBrightness = GetScreenOnBrightness(false);
860595d5899Sopenharmony_ci    return UpdateBrightness(screenOnBrightness, gradualDuration);
861595d5899Sopenharmony_ci}
862595d5899Sopenharmony_ci
863595d5899Sopenharmony_civoid BrightnessService::SetSleepBrightness()
864595d5899Sopenharmony_ci{
865595d5899Sopenharmony_ci    uint32_t value = GetSettingBrightness();
866595d5899Sopenharmony_ci    if (value <= MIN_DEFAULT_BRGIHTNESS_LEVEL) {
867595d5899Sopenharmony_ci        return;
868595d5899Sopenharmony_ci    }
869595d5899Sopenharmony_ci    uint32_t sleepBrightness = BrightnessParamHelper::GetSleepBrightness();
870595d5899Sopenharmony_ci    uint32_t sleepMinumumReductionBrightness = BrightnessParamHelper::GetSleepMinumumReductionBrightness();
871595d5899Sopenharmony_ci    if (value < sleepMinumumReductionBrightness) {
872595d5899Sopenharmony_ci        value = sleepMinumumReductionBrightness;
873595d5899Sopenharmony_ci    }
874595d5899Sopenharmony_ci    uint32_t enterSleepBrightness = std::max(std::min(value - sleepMinumumReductionBrightness, sleepBrightness),
875595d5899Sopenharmony_ci        MIN_DEFAULT_BRGIHTNESS_LEVEL);
876595d5899Sopenharmony_ci    uint32_t sleepDarkenTime = BrightnessParamHelper::GetSleepDarkenTime();
877595d5899Sopenharmony_ci    mIsSleepStatus = true;
878595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetSleepBrightness enterSleepBrightness=%{public}d, sleepDarkenTime=%{public}d",
879595d5899Sopenharmony_ci        enterSleepBrightness, sleepDarkenTime);
880595d5899Sopenharmony_ci    OverrideBrightness(enterSleepBrightness, sleepDarkenTime);
881595d5899Sopenharmony_ci}
882595d5899Sopenharmony_ci
883595d5899Sopenharmony_cibool BrightnessService::OverrideBrightness(uint32_t value, uint32_t gradualDuration)
884595d5899Sopenharmony_ci{
885595d5899Sopenharmony_ci    if (!CanOverrideBrightness()) {
886595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot override brightness, ignore the change");
887595d5899Sopenharmony_ci        return false;
888595d5899Sopenharmony_ci    }
889595d5899Sopenharmony_ci    if (!mIsBrightnessOverridden) {
890595d5899Sopenharmony_ci        mIsBrightnessOverridden = true;
891595d5899Sopenharmony_ci    }
892595d5899Sopenharmony_ci    mOverriddenBrightness = value;
893595d5899Sopenharmony_ci    mBeforeOverriddenBrightness = GetSettingBrightness();
894595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Override brightness, value=%{public}u, mBeforeOverriddenBrightness=%{public}d",
895595d5899Sopenharmony_ci        value, mBeforeOverriddenBrightness);
896595d5899Sopenharmony_ci    return UpdateBrightness(value, gradualDuration);
897595d5899Sopenharmony_ci}
898595d5899Sopenharmony_ci
899595d5899Sopenharmony_cibool BrightnessService::RestoreBrightness(uint32_t gradualDuration)
900595d5899Sopenharmony_ci{
901595d5899Sopenharmony_ci    if (!IsBrightnessOverridden()) {
902595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is not override, no need to restore");
903595d5899Sopenharmony_ci        return false;
904595d5899Sopenharmony_ci    }
905595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "restore brightness=%{public}d", mBeforeOverriddenBrightness);
906595d5899Sopenharmony_ci    mIsBrightnessOverridden = false;
907595d5899Sopenharmony_ci    return UpdateBrightness(mBeforeOverriddenBrightness, gradualDuration, true);
908595d5899Sopenharmony_ci}
909595d5899Sopenharmony_ci
910595d5899Sopenharmony_cibool BrightnessService::IsBrightnessOverridden()
911595d5899Sopenharmony_ci{
912595d5899Sopenharmony_ci    return mIsBrightnessOverridden;
913595d5899Sopenharmony_ci}
914595d5899Sopenharmony_ci
915595d5899Sopenharmony_cibool BrightnessService::BoostBrightness(uint32_t timeoutMs, uint32_t gradualDuration)
916595d5899Sopenharmony_ci{
917595d5899Sopenharmony_ci    if (!CanBoostBrightness()) {
918595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot boost brightness, ignore the change");
919595d5899Sopenharmony_ci        return false;
920595d5899Sopenharmony_ci    }
921595d5899Sopenharmony_ci    bool isSuccess = true;
922595d5899Sopenharmony_ci    if (!mIsBrightnessBoosted) {
923595d5899Sopenharmony_ci        uint32_t maxBrightness = BrightnessParamHelper::GetMaxBrightness();
924595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Boost brightness, maxBrightness: %{public}d", maxBrightness);
925595d5899Sopenharmony_ci        mIsBrightnessBoosted = true;
926595d5899Sopenharmony_ci        isSuccess = UpdateBrightness(maxBrightness, gradualDuration);
927595d5899Sopenharmony_ci    }
928595d5899Sopenharmony_ci
929595d5899Sopenharmony_ci    // If boost multi-times, we will resend the cancel boost event.
930595d5899Sopenharmony_ci    FFRTUtils::CancelTask(g_cancelBoostTaskHandle, queue_);
931595d5899Sopenharmony_ci    FFRTTask task = [this, gradualDuration] { this->CancelBoostBrightness(gradualDuration); };
932595d5899Sopenharmony_ci    g_cancelBoostTaskHandle = FFRTUtils::SubmitDelayTask(task, timeoutMs, queue_);
933595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BoostBrightness update timeout=%{public}u, isSuccess=%{public}d", timeoutMs,
934595d5899Sopenharmony_ci        isSuccess);
935595d5899Sopenharmony_ci    return isSuccess;
936595d5899Sopenharmony_ci}
937595d5899Sopenharmony_ci
938595d5899Sopenharmony_cibool BrightnessService::CancelBoostBrightness(uint32_t gradualDuration)
939595d5899Sopenharmony_ci{
940595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Cancel boost brightness");
941595d5899Sopenharmony_ci    if (!IsBrightnessBoosted()) {
942595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is not boost, no need to restore");
943595d5899Sopenharmony_ci        return false;
944595d5899Sopenharmony_ci    }
945595d5899Sopenharmony_ci    FFRTUtils::CancelTask(g_cancelBoostTaskHandle, queue_);
946595d5899Sopenharmony_ci    mIsBrightnessBoosted = false;
947595d5899Sopenharmony_ci    return UpdateBrightness(mCachedSettingBrightness, gradualDuration, true);
948595d5899Sopenharmony_ci}
949595d5899Sopenharmony_ci
950595d5899Sopenharmony_cibool BrightnessService::IsBrightnessBoosted()
951595d5899Sopenharmony_ci{
952595d5899Sopenharmony_ci    return mIsBrightnessBoosted;
953595d5899Sopenharmony_ci}
954595d5899Sopenharmony_ci
955595d5899Sopenharmony_cibool BrightnessService::IsScreenOn()
956595d5899Sopenharmony_ci{
957595d5899Sopenharmony_ci    return (mState == DisplayState::DISPLAY_ON || mState == DisplayState::DISPLAY_DIM);
958595d5899Sopenharmony_ci}
959595d5899Sopenharmony_ci
960595d5899Sopenharmony_cibool BrightnessService::CanSetBrightness()
961595d5899Sopenharmony_ci{
962595d5899Sopenharmony_ci    bool isScreenOn = IsScreenOn();
963595d5899Sopenharmony_ci    bool isOverridden = IsBrightnessOverridden();
964595d5899Sopenharmony_ci    bool isBoosted = IsBrightnessBoosted();
965595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "isScreenOn: %{public}d, isOverridden: %{public}d, isBoosted: %{public}d",
966595d5899Sopenharmony_ci        isScreenOn, isOverridden, isBoosted);
967595d5899Sopenharmony_ci    return isScreenOn && !isOverridden && !isBoosted;
968595d5899Sopenharmony_ci}
969595d5899Sopenharmony_ci
970595d5899Sopenharmony_cibool BrightnessService::CanDiscountBrightness()
971595d5899Sopenharmony_ci{
972595d5899Sopenharmony_ci    return IsScreenOn();
973595d5899Sopenharmony_ci}
974595d5899Sopenharmony_ci
975595d5899Sopenharmony_cibool BrightnessService::CanOverrideBrightness()
976595d5899Sopenharmony_ci{
977595d5899Sopenharmony_ci    return IsScreenOn() && !IsBrightnessBoosted();
978595d5899Sopenharmony_ci}
979595d5899Sopenharmony_ci
980595d5899Sopenharmony_cibool BrightnessService::CanBoostBrightness()
981595d5899Sopenharmony_ci{
982595d5899Sopenharmony_ci    return IsScreenOn() && !IsBrightnessOverridden();
983595d5899Sopenharmony_ci}
984595d5899Sopenharmony_ci
985595d5899Sopenharmony_cibool BrightnessService::UpdateBrightness(uint32_t value, uint32_t gradualDuration, bool updateSetting)
986595d5899Sopenharmony_ci{
987595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "UpdateBrightness, value=%{public}u, discount=%{public}f,"\
988595d5899Sopenharmony_ci        "duration=%{public}u, updateSetting=%{public}d", value, mDiscount, gradualDuration, updateSetting);
989595d5899Sopenharmony_ci    mWaitForFirstLux = false;
990595d5899Sopenharmony_ci    auto safeBrightness = GetSafeBrightness(value);
991595d5899Sopenharmony_ci    if (mDimming->IsDimming()) {
992595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightness StopDimming");
993595d5899Sopenharmony_ci        mDimming->StopDimming();
994595d5899Sopenharmony_ci    }
995595d5899Sopenharmony_ci    auto brightness = static_cast<uint32_t>(safeBrightness * mDiscount);
996595d5899Sopenharmony_ci    brightness = GetMappingBrightnessLevel(brightness);
997595d5899Sopenharmony_ci    if (gradualDuration > 0) {
998595d5899Sopenharmony_ci        mDimming->StartDimming(GetSettingBrightness(), brightness, gradualDuration);
999595d5899Sopenharmony_ci        return true;
1000595d5899Sopenharmony_ci    }
1001595d5899Sopenharmony_ci    bool isSuccess = mAction->SetBrightness(brightness);
1002595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "UpdateBrightness is %{public}s, brightness: %{public}u",
1003595d5899Sopenharmony_ci        isSuccess ? "succ" : "failed", brightness);
1004595d5899Sopenharmony_ci    if (isSuccess && updateSetting) {
1005595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightness, settings, value=%{public}u", safeBrightness);
1006595d5899Sopenharmony_ci        FFRTUtils::SubmitTask([this, safeBrightness] { this->SetSettingBrightness(safeBrightness); });
1007595d5899Sopenharmony_ci    }
1008595d5899Sopenharmony_ci    if (isSuccess) {
1009595d5899Sopenharmony_ci        ReportBrightnessBigData(brightness);
1010595d5899Sopenharmony_ci    }
1011595d5899Sopenharmony_ci    return isSuccess;
1012595d5899Sopenharmony_ci}
1013595d5899Sopenharmony_ci
1014595d5899Sopenharmony_ciuint32_t BrightnessService::GetSettingBrightness(const std::string& key)
1015595d5899Sopenharmony_ci{
1016595d5899Sopenharmony_ci    uint32_t settingBrightness = DEFAULT_BRIGHTNESS;
1017595d5899Sopenharmony_ci    auto isSuccess = BrightnessSettingHelper::GetSettingBrightness(settingBrightness, key);
1018595d5899Sopenharmony_ci    if (isSuccess != ERR_OK) {
1019595d5899Sopenharmony_ci        DISPLAY_HILOGW(FEAT_BRIGHTNESS,
1020595d5899Sopenharmony_ci            "get setting brightness failed, return default=%{public}d, key=%{public}s, ret=%{public}d",
1021595d5899Sopenharmony_ci            settingBrightness, key.c_str(), isSuccess);
1022595d5899Sopenharmony_ci    }
1023595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetSettingBrightness=%{public}d", settingBrightness);
1024595d5899Sopenharmony_ci    return settingBrightness;
1025595d5899Sopenharmony_ci}
1026595d5899Sopenharmony_ci
1027595d5899Sopenharmony_civoid BrightnessService::SetSettingBrightness(uint32_t value)
1028595d5899Sopenharmony_ci{
1029595d5899Sopenharmony_ci    BrightnessSettingHelper::SetSettingBrightness(value);
1030595d5899Sopenharmony_ci    mBrightnessLevel = value;
1031595d5899Sopenharmony_ci    mCachedSettingBrightness = value;
1032595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetSettingBrightness brightness=%{public}u", value);
1033595d5899Sopenharmony_ci}
1034595d5899Sopenharmony_ci
1035595d5899Sopenharmony_ciuint32_t BrightnessService::GetScreenOnBrightness(bool isUpdateTarget)
1036595d5899Sopenharmony_ci{
1037595d5899Sopenharmony_ci    uint32_t screenOnbrightness;
1038595d5899Sopenharmony_ci    if (IsBrightnessBoosted()) {
1039595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is boosted, return max brightness");
1040595d5899Sopenharmony_ci        screenOnbrightness = BrightnessParamHelper::GetMaxBrightness();
1041595d5899Sopenharmony_ci    } else if (IsBrightnessOverridden()) {
1042595d5899Sopenharmony_ci        DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is overridden, return overridden brightness=%{public}u",
1043595d5899Sopenharmony_ci            mOverriddenBrightness);
1044595d5899Sopenharmony_ci        screenOnbrightness = mOverriddenBrightness;
1045595d5899Sopenharmony_ci    } else if (isUpdateTarget && mIsAutoBrightnessEnabled) {
1046595d5899Sopenharmony_ci        if (mBrightnessTarget.load() > 0) {
1047595d5899Sopenharmony_ci            DISPLAY_HILOGI(FEAT_BRIGHTNESS, "update, return mBrightnessTarget=%{public}d", mBrightnessTarget.load());
1048595d5899Sopenharmony_ci            screenOnbrightness = mBrightnessTarget.load();
1049595d5899Sopenharmony_ci        } else {
1050595d5899Sopenharmony_ci            screenOnbrightness = 0;
1051595d5899Sopenharmony_ci            mWaitForFirstLux = true;
1052595d5899Sopenharmony_ci        }
1053595d5899Sopenharmony_ci    } else {
1054595d5899Sopenharmony_ci        screenOnbrightness = GetSettingBrightness();
1055595d5899Sopenharmony_ci    }
1056595d5899Sopenharmony_ci    return screenOnbrightness;
1057595d5899Sopenharmony_ci}
1058595d5899Sopenharmony_ci
1059595d5899Sopenharmony_civoid BrightnessService::RegisterSettingBrightnessObserver()
1060595d5899Sopenharmony_ci{
1061595d5899Sopenharmony_ci}
1062595d5899Sopenharmony_ci
1063595d5899Sopenharmony_civoid BrightnessService::UpdateBrightnessSettingFunc(const std::string& key)
1064595d5899Sopenharmony_ci{
1065595d5899Sopenharmony_ci}
1066595d5899Sopenharmony_ci
1067595d5899Sopenharmony_civoid BrightnessService::UnregisterSettingBrightnessObserver()
1068595d5899Sopenharmony_ci{
1069595d5899Sopenharmony_ci    BrightnessSettingHelper::UnregisterSettingBrightnessObserver();
1070595d5899Sopenharmony_ci}
1071595d5899Sopenharmony_ci
1072595d5899Sopenharmony_cidouble BrightnessService::GetDiscount() const
1073595d5899Sopenharmony_ci{
1074595d5899Sopenharmony_ci    return mDiscount;
1075595d5899Sopenharmony_ci}
1076595d5899Sopenharmony_ci
1077595d5899Sopenharmony_ciuint32_t BrightnessService::GetDimmingUpdateTime() const
1078595d5899Sopenharmony_ci{
1079595d5899Sopenharmony_ci    return mDimming->GetDimmingUpdateTime();
1080595d5899Sopenharmony_ci}
1081595d5899Sopenharmony_ci
1082595d5899Sopenharmony_ciuint32_t BrightnessService::GetMappingBrightnessLevel(uint32_t level)
1083595d5899Sopenharmony_ci{
1084595d5899Sopenharmony_ci    if (level < MIN_DEFAULT_BRGIHTNESS_LEVEL) {
1085595d5899Sopenharmony_ci        level = MIN_DEFAULT_BRGIHTNESS_LEVEL;
1086595d5899Sopenharmony_ci    }
1087595d5899Sopenharmony_ci    if (level > MAX_DEFAULT_BRGIHTNESS_LEVEL) {
1088595d5899Sopenharmony_ci        level = MAX_DEFAULT_BRGIHTNESS_LEVEL;
1089595d5899Sopenharmony_ci    }
1090595d5899Sopenharmony_ci    float levelOut = static_cast<float>(1.0f * (level - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1091595d5899Sopenharmony_ci         * (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL)
1092595d5899Sopenharmony_ci         / (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)) + MIN_MAPPING_BRGIHTNESS_LEVEL + 0.5f;
1093595d5899Sopenharmony_ci    if (static_cast<uint32_t>(levelOut) < BrightnessParamHelper::GetMinBrightness()) {
1094595d5899Sopenharmony_ci        return BrightnessParamHelper::GetMinBrightness();
1095595d5899Sopenharmony_ci    }
1096595d5899Sopenharmony_ci    return static_cast<uint32_t>(levelOut);
1097595d5899Sopenharmony_ci}
1098595d5899Sopenharmony_ci
1099595d5899Sopenharmony_ciuint32_t BrightnessService::GetOrigBrightnessLevel(uint32_t level)
1100595d5899Sopenharmony_ci{
1101595d5899Sopenharmony_ci    if (level < MIN_MAPPING_BRGIHTNESS_LEVEL) {
1102595d5899Sopenharmony_ci        level = MIN_MAPPING_BRGIHTNESS_LEVEL;
1103595d5899Sopenharmony_ci    }
1104595d5899Sopenharmony_ci    if (level > MAX_MAPPING_BRGIHTNESS_LEVEL) {
1105595d5899Sopenharmony_ci        level = MAX_MAPPING_BRGIHTNESS_LEVEL;
1106595d5899Sopenharmony_ci    }
1107595d5899Sopenharmony_ci    float levelOut = static_cast<float>(1.0f * (level - MIN_MAPPING_BRGIHTNESS_LEVEL)
1108595d5899Sopenharmony_ci        * (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1109595d5899Sopenharmony_ci         / (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) + MIN_MAPPING_BRGIHTNESS_LEVEL + 0.5f);
1110595d5899Sopenharmony_ci    return static_cast<int>(levelOut);
1111595d5899Sopenharmony_ci}
1112595d5899Sopenharmony_ci
1113595d5899Sopenharmony_ciuint32_t BrightnessService::GetMappingBrightnessNit(uint32_t level)
1114595d5899Sopenharmony_ci{
1115595d5899Sopenharmony_ci    uint32_t levelIn = level;
1116595d5899Sopenharmony_ci    if (levelIn < MIN_MAPPING_BRGIHTNESS_LEVEL) {
1117595d5899Sopenharmony_ci        levelIn = MIN_MAPPING_BRGIHTNESS_LEVEL;
1118595d5899Sopenharmony_ci    }
1119595d5899Sopenharmony_ci    if (levelIn > MAX_MAPPING_BRGIHTNESS_LEVEL) {
1120595d5899Sopenharmony_ci        levelIn = MAX_MAPPING_BRGIHTNESS_LEVEL;
1121595d5899Sopenharmony_ci    }
1122595d5899Sopenharmony_ci    double nitOut = (double)(levelIn - MIN_MAPPING_BRGIHTNESS_LEVEL)
1123595d5899Sopenharmony_ci        * (MAX_DEFAULT_BRGIHTNESS_NIT - MIN_DEFAULT_BRGIHTNESS_NIT)
1124595d5899Sopenharmony_ci         / (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) + MIN_DEFAULT_BRGIHTNESS_NIT;
1125595d5899Sopenharmony_ci    return round(nitOut);
1126595d5899Sopenharmony_ci}
1127595d5899Sopenharmony_ci
1128595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightnessLevelFromNit(uint32_t nit)
1129595d5899Sopenharmony_ci{
1130595d5899Sopenharmony_ci    uint32_t nitIn = nit;
1131595d5899Sopenharmony_ci    if (nitIn < MIN_DEFAULT_BRGIHTNESS_NIT) {
1132595d5899Sopenharmony_ci        nitIn = MIN_DEFAULT_BRGIHTNESS_NIT;
1133595d5899Sopenharmony_ci    }
1134595d5899Sopenharmony_ci    if (nitIn > MAX_DEFAULT_BRGIHTNESS_NIT) {
1135595d5899Sopenharmony_ci        nitIn = MAX_DEFAULT_BRGIHTNESS_NIT;
1136595d5899Sopenharmony_ci    }
1137595d5899Sopenharmony_ci    double levelOut = (double)(nitIn - MIN_DEFAULT_BRGIHTNESS_NIT)
1138595d5899Sopenharmony_ci        * (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1139595d5899Sopenharmony_ci         / (MAX_DEFAULT_BRGIHTNESS_NIT - MIN_DEFAULT_BRGIHTNESS_NIT) + MIN_DEFAULT_BRGIHTNESS_LEVEL;
1140595d5899Sopenharmony_ci    return round(levelOut);
1141595d5899Sopenharmony_ci}
1142595d5899Sopenharmony_ci
1143595d5899Sopenharmony_ciuint32_t BrightnessService::GetMappingHighBrightnessLevel(uint32_t level)
1144595d5899Sopenharmony_ci{
1145595d5899Sopenharmony_ci    uint32_t levelIn = level;
1146595d5899Sopenharmony_ci    if (levelIn < MIN_DEFAULT_BRGIHTNESS_LEVEL) {
1147595d5899Sopenharmony_ci        levelIn = MIN_DEFAULT_BRGIHTNESS_LEVEL;
1148595d5899Sopenharmony_ci    }
1149595d5899Sopenharmony_ci    if (levelIn > MAX_DEFAULT_BRGIHTNESS_LEVEL) {
1150595d5899Sopenharmony_ci        levelIn = MAX_DEFAULT_BRGIHTNESS_LEVEL;
1151595d5899Sopenharmony_ci    }
1152595d5899Sopenharmony_ci    uint32_t levelOut = (levelIn - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1153595d5899Sopenharmony_ci         * (MAX_DEFAULT_HIGH_BRGIHTNESS_LEVEL - MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL)
1154595d5899Sopenharmony_ci         / (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL) + MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL;
1155595d5899Sopenharmony_ci    return levelOut;
1156595d5899Sopenharmony_ci}
1157595d5899Sopenharmony_ci
1158595d5899Sopenharmony_civoid BrightnessService::UpdateBrightnessSceneMode(BrightnessSceneMode mode)
1159595d5899Sopenharmony_ci{
1160595d5899Sopenharmony_ci}
1161595d5899Sopenharmony_ci
1162595d5899Sopenharmony_cibool BrightnessService::IsDimming()
1163595d5899Sopenharmony_ci{
1164595d5899Sopenharmony_ci    if (mDimming == nullptr) {
1165595d5899Sopenharmony_ci        return false;
1166595d5899Sopenharmony_ci    }
1167595d5899Sopenharmony_ci    return mDimming->IsDimming();
1168595d5899Sopenharmony_ci}
1169595d5899Sopenharmony_ci
1170595d5899Sopenharmony_cistd::string BrightnessService::GetReason()
1171595d5899Sopenharmony_ci{
1172595d5899Sopenharmony_ci    if (mIsBrightnessOverridden) {
1173595d5899Sopenharmony_ci        return "APP";
1174595d5899Sopenharmony_ci    }
1175595d5899Sopenharmony_ci    if (mIsUserMode) {
1176595d5899Sopenharmony_ci        return "USER";
1177595d5899Sopenharmony_ci    }
1178595d5899Sopenharmony_ci    if (mIsAutoBrightnessEnabled) {
1179595d5899Sopenharmony_ci        return "AUTO";
1180595d5899Sopenharmony_ci    }
1181595d5899Sopenharmony_ci    return "MANUAL";
1182595d5899Sopenharmony_ci}
1183595d5899Sopenharmony_ci
1184595d5899Sopenharmony_civoid BrightnessService::ReportBrightnessBigData(uint32_t brightness)
1185595d5899Sopenharmony_ci{
1186595d5899Sopenharmony_ci    std::string reason = GetReason();
1187595d5899Sopenharmony_ci    uint32_t nit = GetMappingBrightnessNit(brightness);
1188595d5899Sopenharmony_ci    // Notify screen brightness change event to battery statistics
1189595d5899Sopenharmony_ci#ifdef HAS_HIVIEWDFX_HISYSEVENT_PART
1190595d5899Sopenharmony_ci    HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "BRIGHTNESS_NIT",
1191595d5899Sopenharmony_ci        HiviewDFX::HiSysEvent::EventType::STATISTIC, "BRIGHTNESS", brightness, "REASON", reason, "NIT", nit);
1192595d5899Sopenharmony_ci#endif
1193595d5899Sopenharmony_ci    DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BigData brightness=%{public}d,reason=%{public}s,nit=%{public}d",
1194595d5899Sopenharmony_ci        brightness, reason.c_str(), nit);
1195595d5899Sopenharmony_ci}
1196595d5899Sopenharmony_ci
1197595d5899Sopenharmony_cibool BrightnessService::IsSleepStatus()
1198595d5899Sopenharmony_ci{
1199595d5899Sopenharmony_ci    return mIsSleepStatus;
1200595d5899Sopenharmony_ci}
1201595d5899Sopenharmony_ci
1202595d5899Sopenharmony_cibool BrightnessService::GetIsSupportLightSensor()
1203595d5899Sopenharmony_ci{
1204595d5899Sopenharmony_ci    return mIsSupportLightSensor;
1205595d5899Sopenharmony_ci}
1206595d5899Sopenharmony_ci
1207595d5899Sopenharmony_cibool BrightnessService::IsCurrentSensorEnable()
1208595d5899Sopenharmony_ci{
1209595d5899Sopenharmony_ci    bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
1210595d5899Sopenharmony_ci    if (!isFoldable) {
1211595d5899Sopenharmony_ci        return mIsLightSensorEnabled;
1212595d5899Sopenharmony_ci    }
1213595d5899Sopenharmony_ci    bool result = false;
1214595d5899Sopenharmony_ci    std::string identity = IPCSkeleton::ResetCallingIdentity();
1215595d5899Sopenharmony_ci    auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
1216595d5899Sopenharmony_ci    int sensorId = GetSensorIdWithDisplayMode(foldMode);
1217595d5899Sopenharmony_ci    if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
1218595d5899Sopenharmony_ci        result = mIsLightSensorEnabled;
1219595d5899Sopenharmony_ci    } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
1220595d5899Sopenharmony_ci        result = mIsLightSensor1Enabled;
1221595d5899Sopenharmony_ci    }
1222595d5899Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(identity);
1223595d5899Sopenharmony_ci    return result;
1224595d5899Sopenharmony_ci}
1225595d5899Sopenharmony_ci
1226595d5899Sopenharmony_ciint BrightnessService::GetDisplayIdWithFoldstatus(Rosen::FoldStatus foldStatus)
1227595d5899Sopenharmony_ci{
1228595d5899Sopenharmony_ci    return mBrightnessCalculationManager.GetDisplayIdWithFoldstatus(static_cast<int>(foldStatus));
1229595d5899Sopenharmony_ci}
1230595d5899Sopenharmony_ci
1231595d5899Sopenharmony_ciint BrightnessService::GetSensorIdWithFoldstatus(Rosen::FoldStatus foldStatus)
1232595d5899Sopenharmony_ci{
1233595d5899Sopenharmony_ci    return mBrightnessCalculationManager.GetSensorIdWithFoldstatus(static_cast<int>(foldStatus));
1234595d5899Sopenharmony_ci}
1235595d5899Sopenharmony_ci
1236595d5899Sopenharmony_ciint BrightnessService::GetDisplayIdWithDisplayMode(Rosen::FoldDisplayMode mode)
1237595d5899Sopenharmony_ci{
1238595d5899Sopenharmony_ci    return mBrightnessCalculationManager.GetDisplayIdWithDisplayMode(static_cast<int>(mode));
1239595d5899Sopenharmony_ci}
1240595d5899Sopenharmony_ci
1241595d5899Sopenharmony_ciint BrightnessService::GetSensorIdWithDisplayMode(Rosen::FoldDisplayMode mode)
1242595d5899Sopenharmony_ci{
1243595d5899Sopenharmony_ci    return mBrightnessCalculationManager.GetSensorIdWithDisplayMode(static_cast<int>(mode));
1244595d5899Sopenharmony_ci}
1245595d5899Sopenharmony_ci
1246595d5899Sopenharmony_cibool BrightnessService::SetMaxBrightness(double value)
1247595d5899Sopenharmony_ci{
1248595d5899Sopenharmony_ci    int32_t intMaxValue = round(value * MAX_DEFAULT_BRGIHTNESS_LEVEL);
1249595d5899Sopenharmony_ci    if (intMaxValue <= 0) {
1250595d5899Sopenharmony_ci        intMaxValue = brightnessValueMin;
1251595d5899Sopenharmony_ci    }
1252595d5899Sopenharmony_ci    if (intMaxValue == brightnessValueMax) {
1253595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=oldMax");
1254595d5899Sopenharmony_ci        return true;
1255595d5899Sopenharmony_ci    }
1256595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=%{public}u, oldMax=%{public}u",
1257595d5899Sopenharmony_ci        intMaxValue, brightnessValueMax);
1258595d5899Sopenharmony_ci    brightnessValueMax =
1259595d5899Sopenharmony_ci        (intMaxValue > MAX_DEFAULT_BRGIHTNESS_LEVEL ? MAX_DEFAULT_BRGIHTNESS_LEVEL : intMaxValue);
1260595d5899Sopenharmony_ci    uint32_t currentBrightness = GetSettingBrightness();
1261595d5899Sopenharmony_ci    if (brightnessValueMax < currentBrightness) {
1262595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness currentBrightness=%{public}u", currentBrightness);
1263595d5899Sopenharmony_ci        return UpdateBrightness(brightnessValueMax, DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1264595d5899Sopenharmony_ci    }
1265595d5899Sopenharmony_ci    if (mCurrentBrightness.load() == 0) {
1266595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "No need to update brightne during init");
1267595d5899Sopenharmony_ci        return true;
1268595d5899Sopenharmony_ci    }
1269595d5899Sopenharmony_ci    return UpdateBrightness(mCurrentBrightness.load(), DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1270595d5899Sopenharmony_ci}
1271595d5899Sopenharmony_ci
1272595d5899Sopenharmony_cibool BrightnessService::SetMaxBrightnessNit(uint32_t maxNit)
1273595d5899Sopenharmony_ci{
1274595d5899Sopenharmony_ci    uint32_t max_value = GetBrightnessLevelFromNit(maxNit);
1275595d5899Sopenharmony_ci    DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightnessNit nitIn=%{public}u, levelOut=%{public}u",
1276595d5899Sopenharmony_ci        maxNit, max_value);
1277595d5899Sopenharmony_ci    if (max_value == brightnessValueMax) {
1278595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=oldMax");
1279595d5899Sopenharmony_ci        return true;
1280595d5899Sopenharmony_ci    }
1281595d5899Sopenharmony_ci    brightnessValueMax =
1282595d5899Sopenharmony_ci        (max_value > MAX_DEFAULT_BRGIHTNESS_LEVEL ? MAX_DEFAULT_BRGIHTNESS_LEVEL : max_value);
1283595d5899Sopenharmony_ci    uint32_t currentBrightness = GetSettingBrightness();
1284595d5899Sopenharmony_ci    if (brightnessValueMax < currentBrightness) {
1285595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightnessNit currentBrightness=%{public}u", currentBrightness);
1286595d5899Sopenharmony_ci        return UpdateBrightness(brightnessValueMax, DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1287595d5899Sopenharmony_ci    }
1288595d5899Sopenharmony_ci    if (mCurrentBrightness.load() == 0) {
1289595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "No need to update brightne during init");
1290595d5899Sopenharmony_ci        return true;
1291595d5899Sopenharmony_ci    }
1292595d5899Sopenharmony_ci    return UpdateBrightness(mCurrentBrightness.load(), DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1293595d5899Sopenharmony_ci}
1294595d5899Sopenharmony_ci
1295595d5899Sopenharmony_ciuint32_t BrightnessService::GetSafeBrightness(uint32_t value)
1296595d5899Sopenharmony_ci{
1297595d5899Sopenharmony_ci    auto brightnessValue = value;
1298595d5899Sopenharmony_ci    if (brightnessValue > brightnessValueMax) {
1299595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "value is bigger than max=%{public}u, value=%{public}u",
1300595d5899Sopenharmony_ci            brightnessValueMax, value);
1301595d5899Sopenharmony_ci        brightnessValue = brightnessValueMax;
1302595d5899Sopenharmony_ci    }
1303595d5899Sopenharmony_ci    if (brightnessValue < brightnessValueMin) {
1304595d5899Sopenharmony_ci        DISPLAY_HILOGI(FEAT_BRIGHTNESS, "brightness value is less than min, value=%{public}u", value);
1305595d5899Sopenharmony_ci        brightnessValue = brightnessValueMin;
1306595d5899Sopenharmony_ci    }
1307595d5899Sopenharmony_ci    return brightnessValue;
1308595d5899Sopenharmony_ci}
1309595d5899Sopenharmony_ci} // namespace DisplayPowerMgr
1310595d5899Sopenharmony_ci} // namespace OHOS
1311