1ea497e4dSopenharmony_ci/*
2ea497e4dSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3ea497e4dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ea497e4dSopenharmony_ci * you may not use this file except in compliance with the License.
5ea497e4dSopenharmony_ci * You may obtain a copy of the License at
6ea497e4dSopenharmony_ci *
7ea497e4dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ea497e4dSopenharmony_ci *
9ea497e4dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ea497e4dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ea497e4dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ea497e4dSopenharmony_ci * See the License for the specific language governing permissions and
13ea497e4dSopenharmony_ci * limitations under the License.
14ea497e4dSopenharmony_ci */
15ea497e4dSopenharmony_ci
16ea497e4dSopenharmony_ci#include "screen_brightness_manager.h"
17ea497e4dSopenharmony_ci
18ea497e4dSopenharmony_ci#include "iam_check.h"
19ea497e4dSopenharmony_ci#include "iam_logger.h"
20ea497e4dSopenharmony_ci#include "iam_ptr.h"
21ea497e4dSopenharmony_ci
22ea497e4dSopenharmony_ci#include "sa_command_manager.h"
23ea497e4dSopenharmony_ci#include "service_ex_manager.h"
24ea497e4dSopenharmony_ci
25ea497e4dSopenharmony_ci#define LOG_TAG "FACE_AUTH_SA"
26ea497e4dSopenharmony_ci
27ea497e4dSopenharmony_cinamespace OHOS {
28ea497e4dSopenharmony_cinamespace UserIam {
29ea497e4dSopenharmony_cinamespace FaceAuth {
30ea497e4dSopenharmony_cinamespace {
31ea497e4dSopenharmony_cistd::shared_ptr<ScreenBrightnessManager> CreateScreenBrightnessManager()
32ea497e4dSopenharmony_ci{
33ea497e4dSopenharmony_ci    auto manager = Common::MakeShared<ScreenBrightnessManager>();
34ea497e4dSopenharmony_ci    IF_FALSE_LOGE_AND_RETURN_VAL(manager != nullptr, nullptr);
35ea497e4dSopenharmony_ci
36ea497e4dSopenharmony_ci    std::vector<SaCommandId> commandIds = { SaCommandId::BEGIN_SCREEN_BRIGHTNESS_INCREASE,
37ea497e4dSopenharmony_ci        SaCommandId::END_SCREEN_BRIGHTNESS_INCREASE };
38ea497e4dSopenharmony_ci    SaCommandManager::GetInstance().RegisterSaCommandProcessor(commandIds, manager);
39ea497e4dSopenharmony_ci    return manager;
40ea497e4dSopenharmony_ci}
41ea497e4dSopenharmony_ci} // namespace
42ea497e4dSopenharmony_ci
43ea497e4dSopenharmony_cistd::shared_ptr<ScreenBrightnessManager> ScreenBrightnessManager::GetInstance()
44ea497e4dSopenharmony_ci{
45ea497e4dSopenharmony_ci    static auto manager = CreateScreenBrightnessManager();
46ea497e4dSopenharmony_ci    if (manager == nullptr) {
47ea497e4dSopenharmony_ci        IAM_LOGE("ScreenBrightnessManager is null");
48ea497e4dSopenharmony_ci    }
49ea497e4dSopenharmony_ci    return manager;
50ea497e4dSopenharmony_ci}
51ea497e4dSopenharmony_ci
52ea497e4dSopenharmony_cistd::shared_ptr<IScreenBrightnessTask> ScreenBrightnessManager::GetCurrentTask()
53ea497e4dSopenharmony_ci{
54ea497e4dSopenharmony_ci    return taskInProc_;
55ea497e4dSopenharmony_ci}
56ea497e4dSopenharmony_ci
57ea497e4dSopenharmony_ciUserAuth::ResultCode ScreenBrightnessManager::ProcessSaCommand(std::shared_ptr<FaceAuthAllInOneExecutorHdi> executor,
58ea497e4dSopenharmony_ci    const SaCommand &command)
59ea497e4dSopenharmony_ci{
60ea497e4dSopenharmony_ci    IF_FALSE_LOGE_AND_RETURN_VAL(executor != nullptr, UserAuth::GENERAL_ERROR);
61ea497e4dSopenharmony_ci
62ea497e4dSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
63ea497e4dSopenharmony_ci
64ea497e4dSopenharmony_ci    UserAuth::ResultCode result = UserAuth::GENERAL_ERROR;
65ea497e4dSopenharmony_ci    switch (command.id) {
66ea497e4dSopenharmony_ci        case SaCommandId::BEGIN_SCREEN_BRIGHTNESS_INCREASE:
67ea497e4dSopenharmony_ci            result = ProcessScreenBrightnessIncreaseBegin(executor, command.param);
68ea497e4dSopenharmony_ci            break;
69ea497e4dSopenharmony_ci        case SaCommandId::END_SCREEN_BRIGHTNESS_INCREASE:
70ea497e4dSopenharmony_ci            result = ProcessScreenBrightnessIncreaseEnd(executor, command.param);
71ea497e4dSopenharmony_ci            break;
72ea497e4dSopenharmony_ci        default:
73ea497e4dSopenharmony_ci            IAM_LOGE("command id %{public}d not match", command.id);
74ea497e4dSopenharmony_ci    }
75ea497e4dSopenharmony_ci    return result;
76ea497e4dSopenharmony_ci}
77ea497e4dSopenharmony_ci
78ea497e4dSopenharmony_civoid ScreenBrightnessManager::OnHdiDisconnect(std::shared_ptr<FaceAuthAllInOneExecutorHdi> executor)
79ea497e4dSopenharmony_ci{
80ea497e4dSopenharmony_ci    IF_FALSE_LOGE_AND_RETURN(executor != nullptr);
81ea497e4dSopenharmony_ci
82ea497e4dSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
83ea497e4dSopenharmony_ci
84ea497e4dSopenharmony_ci    if (executorInProc_ != executor) {
85ea497e4dSopenharmony_ci        return;
86ea497e4dSopenharmony_ci    }
87ea497e4dSopenharmony_ci
88ea497e4dSopenharmony_ci    IAM_LOGI("start");
89ea497e4dSopenharmony_ci    executorInProc_ = nullptr;
90ea497e4dSopenharmony_ci
91ea497e4dSopenharmony_ci    if (taskInProc_ != nullptr) {
92ea497e4dSopenharmony_ci        taskInProc_->Stop();
93ea497e4dSopenharmony_ci        taskInProc_ = nullptr;
94ea497e4dSopenharmony_ci    }
95ea497e4dSopenharmony_ci    IAM_LOGI("success");
96ea497e4dSopenharmony_ci}
97ea497e4dSopenharmony_ci
98ea497e4dSopenharmony_ciUserAuth::ResultCode ScreenBrightnessManager::ProcessScreenBrightnessIncreaseBegin(
99ea497e4dSopenharmony_ci    std::shared_ptr<FaceAuthAllInOneExecutorHdi> executor, const SaCommandParam param)
100ea497e4dSopenharmony_ci{
101ea497e4dSopenharmony_ci    if (executorInProc_ != nullptr) {
102ea497e4dSopenharmony_ci        IAM_LOGE("another executor is using this module");
103ea497e4dSopenharmony_ci        return UserAuth::GENERAL_ERROR;
104ea497e4dSopenharmony_ci    }
105ea497e4dSopenharmony_ci
106ea497e4dSopenharmony_ci    if (taskInProc_ != nullptr) {
107ea497e4dSopenharmony_ci        IAM_LOGE("another task is running");
108ea497e4dSopenharmony_ci        return UserAuth::GENERAL_ERROR;
109ea497e4dSopenharmony_ci    }
110ea497e4dSopenharmony_ci
111ea497e4dSopenharmony_ci    IAM_LOGI("start");
112ea497e4dSopenharmony_ci    auto acquireRet = ServiceExManager::GetInstance().Acquire();
113ea497e4dSopenharmony_ci    IF_FALSE_LOGE_AND_RETURN_VAL(acquireRet == UserAuth::SUCCESS, UserAuth::GENERAL_ERROR);
114ea497e4dSopenharmony_ci
115ea497e4dSopenharmony_ci    auto taskInProc = ServiceExManager::GetInstance().GetScreenBrightnessTask();
116ea497e4dSopenharmony_ci    if (taskInProc == nullptr) {
117ea497e4dSopenharmony_ci        ServiceExManager::GetInstance().Release();
118ea497e4dSopenharmony_ci        IAM_LOGE("failed to get task");
119ea497e4dSopenharmony_ci        return UserAuth::GENERAL_ERROR;
120ea497e4dSopenharmony_ci    }
121ea497e4dSopenharmony_ci    taskInProc->RegisterDestructCallback([]() {
122ea497e4dSopenharmony_ci        IAM_LOGI("task destruct");
123ea497e4dSopenharmony_ci        ServiceExManager::GetInstance().Release();
124ea497e4dSopenharmony_ci    });
125ea497e4dSopenharmony_ci    taskInProc->Start();
126ea497e4dSopenharmony_ci
127ea497e4dSopenharmony_ci    executorInProc_ = executor;
128ea497e4dSopenharmony_ci    taskInProc_ = taskInProc;
129ea497e4dSopenharmony_ci    IAM_LOGI("success");
130ea497e4dSopenharmony_ci    return UserAuth::SUCCESS;
131ea497e4dSopenharmony_ci}
132ea497e4dSopenharmony_ci
133ea497e4dSopenharmony_ciUserAuth::ResultCode ScreenBrightnessManager::ProcessScreenBrightnessIncreaseEnd(
134ea497e4dSopenharmony_ci    std::shared_ptr<FaceAuthAllInOneExecutorHdi> executor, const SaCommandParam param)
135ea497e4dSopenharmony_ci{
136ea497e4dSopenharmony_ci    if (executorInProc_ != executor) {
137ea497e4dSopenharmony_ci        IAM_LOGE("another executor is using this module");
138ea497e4dSopenharmony_ci        return UserAuth::GENERAL_ERROR;
139ea497e4dSopenharmony_ci    }
140ea497e4dSopenharmony_ci
141ea497e4dSopenharmony_ci    IAM_LOGI("start");
142ea497e4dSopenharmony_ci    executorInProc_ = nullptr;
143ea497e4dSopenharmony_ci
144ea497e4dSopenharmony_ci    if (taskInProc_ != nullptr) {
145ea497e4dSopenharmony_ci        taskInProc_->Stop();
146ea497e4dSopenharmony_ci        taskInProc_ = nullptr;
147ea497e4dSopenharmony_ci    }
148ea497e4dSopenharmony_ci
149ea497e4dSopenharmony_ci    IAM_LOGI("success");
150ea497e4dSopenharmony_ci    return UserAuth::SUCCESS;
151ea497e4dSopenharmony_ci}
152ea497e4dSopenharmony_ci
153ea497e4dSopenharmony_ci} // namespace FaceAuth
154ea497e4dSopenharmony_ci} // namespace UserIam
155ea497e4dSopenharmony_ci} // namespace OHOS