• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "screen_action.h"
17 
18 #include <hisysevent.h>
19 #include <ipc_skeleton.h>
20 
21 #include "display_log.h"
22 #include "power_state_machine_info.h"
23 #include "screen_manager.h"
24 
25 namespace OHOS {
26 namespace DisplayPowerMgr {
ScreenAction(uint32_t displayId)27 ScreenAction::ScreenAction(uint32_t displayId) : displayId_(displayId)
28 {}
29 
GetDefaultDisplayId()30 uint32_t ScreenAction::GetDefaultDisplayId()
31 {
32     std::string identity = IPCSkeleton::ResetCallingIdentity();
33     uint64_t defaultId = Rosen::DisplayManager::GetInstance().GetDefaultDisplayId();
34     IPCSkeleton::SetCallingIdentity(identity);
35     return static_cast<uint32_t>(defaultId);
36 }
37 
GetAllDisplayId()38 std::vector<uint32_t> ScreenAction::GetAllDisplayId()
39 {
40     std::string identity = IPCSkeleton::ResetCallingIdentity();
41     std::vector<uint64_t> allIds = Rosen::DisplayManager::GetInstance().GetAllDisplayIds();
42     IPCSkeleton::SetCallingIdentity(identity);
43     std::vector<uint32_t> displayIds;
44     std::transform(allIds.begin(), allIds.end(), back_inserter(displayIds), [](uint64_t id) {
45         return static_cast<uint32_t>(id);
46     });
47     return displayIds;
48 }
49 
GetDisplayId()50 uint32_t ScreenAction::GetDisplayId()
51 {
52     return displayId_;
53 }
54 
GetDisplayState()55 DisplayState ScreenAction::GetDisplayState()
56 {
57     DisplayState state = DisplayState::DISPLAY_UNKNOWN;
58     Rosen::ScreenPowerState powerState = Rosen::ScreenManager::GetInstance().GetScreenPower(displayId_);
59     DISPLAY_HILOGI(FEAT_STATE, "ScreenPowerState=%{public}d", static_cast<uint32_t>(powerState));
60     switch (powerState) {
61         case Rosen::ScreenPowerState::POWER_ON:
62             state = DisplayState::DISPLAY_ON;
63             break;
64         case Rosen::ScreenPowerState::POWER_STAND_BY:
65             state = DisplayState::DISPLAY_DIM;
66             break;
67         case Rosen::ScreenPowerState::POWER_SUSPEND:
68             state = DisplayState::DISPLAY_SUSPEND;
69             break;
70         case Rosen::ScreenPowerState::POWER_OFF:
71             state = DisplayState::DISPLAY_OFF;
72             break;
73         default:
74             break;
75     }
76     DISPLAY_HILOGI(FEAT_STATE, "state=%{public}u displayId=%{public}u", static_cast<uint32_t>(state), displayId_);
77     return state;
78 }
79 
EnableSkipSetDisplayState(uint32_t reason)80 bool ScreenAction::EnableSkipSetDisplayState(uint32_t reason)
81 {
82     if (reason == static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS)) {
83         return true;
84     }
85     return false;
86 }
87 
SetDisplayState(DisplayState state,const std::function<void (DisplayState)> & callback)88 bool ScreenAction::SetDisplayState(DisplayState state, const std::function<void(DisplayState)>& callback)
89 {
90     DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayState displayId=%{public}u, state=%{public}u", displayId_,
91         static_cast<uint32_t>(state));
92     Rosen::DisplayState rds = Rosen::DisplayState::UNKNOWN;
93     switch (state) {
94         case DisplayState::DISPLAY_ON:
95             rds = Rosen::DisplayState::ON;
96             break;
97         case DisplayState::DISPLAY_OFF:
98             rds = Rosen::DisplayState::OFF;
99             break;
100         default:
101             break;
102     }
103     std::string identity = IPCSkeleton::ResetCallingIdentity();
104     bool ret = Rosen::DisplayManager::GetInstance().SetDisplayState(rds, [callback](Rosen::DisplayState rosenState) {
105         DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayState Callback:%{public}d", static_cast<uint32_t>(rosenState));
106         DisplayState state;
107         switch (rosenState) {
108             case Rosen::DisplayState::ON:
109                 state = DisplayState::DISPLAY_ON;
110                 break;
111             case Rosen::DisplayState::OFF:
112                 state = DisplayState::DISPLAY_OFF;
113                 break;
114             case Rosen::DisplayState::ON_SUSPEND:
115                 state = DisplayState::DISPLAY_SUSPEND;
116                 break;
117             default:
118                 return;
119         }
120         callback(state);
121     });
122     IPCSkeleton::SetCallingIdentity(identity);
123     // Notify screen state change event to battery statistics
124     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "SCREEN_STATE",
125         HiviewDFX::HiSysEvent::EventType::STATISTIC, "STATE", static_cast<int32_t>(state));
126     DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayState: ret=%{public}d", ret);
127     return ret;
128 }
129 
ParseSpecialReason(uint32_t reason)130 Rosen::PowerStateChangeReason ScreenAction::ParseSpecialReason(uint32_t reason)
131 {
132     auto changeReason = Rosen::PowerStateChangeReason::POWER_BUTTON;
133     switch (reason) {
134         case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT):
135             changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT;
136             break;
137         case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON):
138             changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON;
139             break;
140         case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS):
141             changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS;
142             break;
143         case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF):
144             changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF;
145             break;
146         case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_SWITCH):
147             changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_SWITCH;
148             break;
149         case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_POWER_KEY):
150             changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_POWER_KEY;
151             break;
152         default:
153             break;
154     }
155     return changeReason;
156 }
157 
SetDisplayPower(DisplayState state,uint32_t reason)158 bool ScreenAction::SetDisplayPower(DisplayState state, uint32_t reason)
159 {
160     DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayPower displayId=%{public}u, state=%{public}u, reason=%{public}u",
161                    displayId_, static_cast<uint32_t>(state), reason);
162     Rosen::ScreenPowerState status = Rosen::ScreenPowerState::INVALID_STATE;
163     switch (state) {
164         case DisplayState::DISPLAY_ON:
165             status = Rosen::ScreenPowerState::POWER_ON;
166             break;
167         case DisplayState::DISPLAY_DIM:
168             status = Rosen::ScreenPowerState::POWER_STAND_BY;
169             break;
170         case DisplayState::DISPLAY_SUSPEND:
171             status = Rosen::ScreenPowerState::POWER_SUSPEND;
172             break;
173         case DisplayState::DISPLAY_OFF:
174             status = Rosen::ScreenPowerState::POWER_OFF;
175             break;
176         default:
177             break;
178     }
179 
180     bool ret = false;
181     auto changeReason = ParseSpecialReason(reason);
182     if (coordinated_ && reason == static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_TIMEOUT)) {
183         ret = Rosen::ScreenManager::GetInstance().SetSpecifiedScreenPower(
184             displayId_, status, Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_COLLABORATION);
185     } else {
186         ret = Rosen::ScreenManager::GetInstance().SetScreenPowerForAll(status, changeReason);
187     }
188     DISPLAY_HILOGI(
189         FEAT_STATE, "[UL_POWER] Set screen power, ret=%{public}d, coordinated=%{public}d", ret, coordinated_);
190     return (state == DisplayState::DISPLAY_DIM || state == DisplayState::DISPLAY_SUSPEND) ? true : ret;
191 }
192 
GetBrightness()193 uint32_t ScreenAction::GetBrightness()
194 {
195     std::lock_guard lock(mutexBrightness_);
196     std::string identity = IPCSkeleton::ResetCallingIdentity();
197     brightness_ = Rosen::DisplayManager::GetInstance().GetScreenBrightness(displayId_);
198     IPCSkeleton::SetCallingIdentity(identity);
199     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "displayId=%{public}u, brightness=%{public}u", displayId_, brightness_);
200     return brightness_;
201 }
202 
SetBrightness(uint32_t value)203 bool ScreenAction::SetBrightness(uint32_t value)
204 {
205     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "displayId=%{public}u, brightness=%{public}u", displayId_, value);
206     std::string identity = IPCSkeleton::ResetCallingIdentity();
207     bool isSucc = Rosen::DisplayManager::GetInstance().SetScreenBrightness(displayId_, value);
208     IPCSkeleton::SetCallingIdentity(identity);
209     std::lock_guard lock(mutexBrightness_);
210     brightness_ = isSucc ? value : brightness_;
211     return isSucc;
212 }
213 
SetCoordinated(bool coordinated)214 void ScreenAction::SetCoordinated(bool coordinated)
215 {
216     coordinated_ = coordinated;
217 }
218 } // namespace DisplayPowerMgr
219 } // namespace OHOS
220