1 /*
2 * Copyright (c) 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 "fold_screen_controller/fold_screen_controller.h"
17 #include "fold_screen_controller/single_display_fold_policy.h"
18 #include "fold_screen_controller/single_display_pocket_fold_policy.h"
19 #include "fold_screen_controller/dual_display_fold_policy.h"
20 #include "fold_screen_controller/fold_screen_sensor_manager.h"
21 #include "fold_screen_controller/sensor_fold_state_manager/dual_display_sensor_fold_state_manager.h"
22 #include "fold_screen_controller/sensor_fold_state_manager/single_display_sensor_fold_state_manager.h"
23 #include "fold_screen_controller/sensor_fold_state_manager/single_display_sensor_pocket_fold_state_manager.h"
24 #include "fold_screen_state_internel.h"
25
26 #include "window_manager_hilog.h"
27
28 namespace OHOS::Rosen {
FoldScreenController(std::recursive_mutex & displayInfoMutex,std::shared_ptr<TaskScheduler> screenPowerTaskScheduler)29 FoldScreenController::FoldScreenController(std::recursive_mutex& displayInfoMutex,
30 std::shared_ptr<TaskScheduler> screenPowerTaskScheduler)
31 : displayInfoMutex_(displayInfoMutex), screenPowerTaskScheduler_(screenPowerTaskScheduler)
32 {
33 if (FoldScreenStateInternel::IsDualDisplayFoldDevice()) {
34 foldScreenPolicy_ = GetFoldScreenPolicy(DisplayDeviceType::DOUBLE_DISPLAY_DEVICE);
35 sensorFoldStateManager_ = new DualDisplaySensorFoldStateManager();
36 TLOGI(WmsLogTag::DMS, "fold polocy: DOUBLE_DISPLAY_DEVICE");
37 } else if (FoldScreenStateInternel::IsSingleDisplayFoldDevice()) {
38 foldScreenPolicy_ = GetFoldScreenPolicy(DisplayDeviceType::SINGLE_DISPLAY_DEVICE);
39 sensorFoldStateManager_ = new SingleDisplaySensorFoldStateManager();
40 TLOGI(WmsLogTag::DMS, "fold polocy: SINGLE_DISPLAY_DEVICE");
41 } else if (FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice()) {
42 foldScreenPolicy_ = GetFoldScreenPolicy(DisplayDeviceType::SINGLE_DISPLAY_POCKET_DEVICE);
43 sensorFoldStateManager_ = new SingleDisplaySensorPocketFoldStateManager();
44 TLOGI(WmsLogTag::DMS, "fold polocy: SINGLE_DISPLAY_POCKET_DEVICE");
45 }
46 if (foldScreenPolicy_ == nullptr) {
47 TLOGE(WmsLogTag::DMS, "FoldScreenPolicy is null");
48 return;
49 }
50 if (sensorFoldStateManager_ == nullptr) {
51 TLOGE(WmsLogTag::DMS, "SensorFoldStateManager is null");
52 return;
53 }
54 #ifdef SENSOR_ENABLE
55 FoldScreenSensorManager::GetInstance().SetFoldScreenPolicy(foldScreenPolicy_);
56 FoldScreenSensorManager::GetInstance().SetSensorFoldStateManager(sensorFoldStateManager_);
57 #endif
58 }
59
~FoldScreenController()60 FoldScreenController::~FoldScreenController()
61 {
62 TLOGI(WmsLogTag::DMS, "FoldScreenController is destructed");
63 }
64
GetFoldScreenPolicy(DisplayDeviceType productType)65 sptr<FoldScreenPolicy> FoldScreenController::GetFoldScreenPolicy(DisplayDeviceType productType)
66 {
67 sptr<FoldScreenPolicy> tempPolicy = nullptr;
68 switch (productType) {
69 case DisplayDeviceType::SINGLE_DISPLAY_DEVICE: {
70 tempPolicy = new SingleDisplayFoldPolicy(displayInfoMutex_, screenPowerTaskScheduler_);
71 break;
72 }
73 case DisplayDeviceType::DOUBLE_DISPLAY_DEVICE: {
74 tempPolicy = new DualDisplayFoldPolicy(displayInfoMutex_, screenPowerTaskScheduler_);
75 break;
76 }
77 case DisplayDeviceType::SINGLE_DISPLAY_POCKET_DEVICE:{
78 tempPolicy = new SingleDisplayPocketFoldPolicy(displayInfoMutex_, screenPowerTaskScheduler_);
79 break;
80 }
81 default: {
82 TLOGE(WmsLogTag::DMS, "GetFoldScreenPolicy DisplayDeviceType is invalid");
83 break;
84 }
85 }
86
87 return tempPolicy;
88 }
89
SetDisplayMode(const FoldDisplayMode displayMode)90 void FoldScreenController::SetDisplayMode(const FoldDisplayMode displayMode)
91 {
92 if (foldScreenPolicy_ == nullptr) {
93 TLOGW(WmsLogTag::DMS, "SetDisplayMode: foldScreenPolicy_ is null");
94 return;
95 }
96 foldScreenPolicy_->ChangeScreenDisplayMode(displayMode);
97 }
98
RecoverDisplayMode()99 void FoldScreenController::RecoverDisplayMode()
100 {
101 if (foldScreenPolicy_ == nullptr) {
102 TLOGW(WmsLogTag::DMS, "foldScreenPolicy_ is null");
103 return;
104 }
105 FoldDisplayMode displayMode = foldScreenPolicy_->GetModeMatchStatus();
106 FoldDisplayMode currentDisplayMode = foldScreenPolicy_->GetScreenDisplayMode();
107 if (displayMode == currentDisplayMode) {
108 TLOGI(WmsLogTag::DMS, "current displayMode is correct, skip");
109 return;
110 }
111 if (!FoldScreenStateInternel::IsSingleDisplayFoldDevice() &&
112 !FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice()) {
113 TLOGI(WmsLogTag::DMS, "not single display fold (pocket) device, skip");
114 return;
115 }
116 TLOGI(WmsLogTag::DMS, "%{public}d -> %{public}d", currentDisplayMode, displayMode);
117 foldScreenPolicy_->ChangeScreenDisplayMode(displayMode, DisplayModeChangeReason::RECOVER);
118 }
119
LockDisplayStatus(bool locked)120 void FoldScreenController::LockDisplayStatus(bool locked)
121 {
122 if (foldScreenPolicy_ == nullptr) {
123 TLOGW(WmsLogTag::DMS, "LockDisplayStatus: foldScreenPolicy_ is null");
124 return;
125 }
126 foldScreenPolicy_->LockDisplayStatus(locked);
127 }
128
GetDisplayMode()129 FoldDisplayMode FoldScreenController::GetDisplayMode()
130 {
131 if (foldScreenPolicy_ == nullptr) {
132 TLOGW(WmsLogTag::DMS, "GetDisplayMode: foldScreenPolicy_ is null");
133 return FoldDisplayMode::UNKNOWN;
134 }
135 return foldScreenPolicy_->GetScreenDisplayMode();
136 }
137
IsFoldable()138 bool FoldScreenController::IsFoldable()
139 {
140 return true;
141 }
142
GetFoldStatus()143 FoldStatus FoldScreenController::GetFoldStatus()
144 {
145 if (foldScreenPolicy_ == nullptr) {
146 TLOGW(WmsLogTag::DMS, "GetFoldStatus: foldScreenPolicy_ is null");
147 return FoldStatus::UNKNOWN;
148 }
149 return foldScreenPolicy_->GetFoldStatus();
150 }
151
SetFoldStatus(FoldStatus foldStatus)152 void FoldScreenController::SetFoldStatus(FoldStatus foldStatus)
153 {
154 if (foldScreenPolicy_ == nullptr) {
155 TLOGW(WmsLogTag::DMS, "SetFoldStatus: foldScreenPolicy_ is null");
156 return;
157 }
158 foldScreenPolicy_->SetFoldStatus(foldStatus);
159 }
160
GetTentMode()161 bool FoldScreenController::GetTentMode()
162 {
163 if (sensorFoldStateManager_ == nullptr) {
164 TLOGW(WmsLogTag::DMS, "GetTentMode: sensorFoldStateManager_ is null");
165 return false;
166 }
167 return sensorFoldStateManager_->IsTentMode();
168 }
169
OnTentModeChanged(bool isTentMode)170 void FoldScreenController::OnTentModeChanged(bool isTentMode)
171 {
172 if (sensorFoldStateManager_ == nullptr) {
173 TLOGW(WmsLogTag::DMS, "OnTentModeChanged: sensorFoldStateManager_ is null");
174 return;
175 }
176 return sensorFoldStateManager_->HandleTentChange(isTentMode, foldScreenPolicy_);
177 }
178
GetCurrentFoldCreaseRegion()179 sptr<FoldCreaseRegion> FoldScreenController::GetCurrentFoldCreaseRegion()
180 {
181 if (foldScreenPolicy_ == nullptr) {
182 TLOGW(WmsLogTag::DMS, "GetFoldStatus: foldScreenPolicy_ is null");
183 return nullptr;
184 }
185 return foldScreenPolicy_->GetCurrentFoldCreaseRegion();
186 }
187
GetCurrentScreenId()188 ScreenId FoldScreenController::GetCurrentScreenId()
189 {
190 if (foldScreenPolicy_ == nullptr) {
191 TLOGW(WmsLogTag::DMS, "GetCurrentScreenId: foldScreenPolicy_ is null");
192 return 0;
193 }
194 return foldScreenPolicy_->GetCurrentScreenId();
195 }
196
BootAnimationFinishPowerInit()197 void FoldScreenController::BootAnimationFinishPowerInit()
198 {
199 if (foldScreenPolicy_ == nullptr) {
200 TLOGW(WmsLogTag::DMS, "foldScreenPolicy_ is null");
201 return;
202 }
203 foldScreenPolicy_->BootAnimationFinishPowerInit();
204 foldScreenPolicy_->currentDisplayMode_ = FoldDisplayMode::UNKNOWN;
205 }
206
SetOnBootAnimation(bool onBootAnimation)207 void FoldScreenController::SetOnBootAnimation(bool onBootAnimation)
208 {
209 if (foldScreenPolicy_ == nullptr) {
210 TLOGW(WmsLogTag::DMS, "SetOnBootAnimation: foldScreenPolicy_ is null");
211 return;
212 }
213 foldScreenPolicy_->SetOnBootAnimation(onBootAnimation);
214 }
215
UpdateForPhyScreenPropertyChange()216 void FoldScreenController::UpdateForPhyScreenPropertyChange()
217 {
218 if (foldScreenPolicy_ == nullptr) {
219 TLOGW(WmsLogTag::DMS, "UpdateForPhyScreenPropertyChange: foldScreenPolicy_ is null");
220 return;
221 }
222 foldScreenPolicy_->UpdateForPhyScreenPropertyChange();
223 }
224
ExitCoordination()225 void FoldScreenController::ExitCoordination()
226 {
227 if (foldScreenPolicy_ == nullptr) {
228 TLOGW(WmsLogTag::DMS, "foldScreenPolicy_ is null");
229 return;
230 }
231 foldScreenPolicy_->ExitCoordination();
232 }
233
AddOrRemoveDisplayNodeToTree(ScreenId screenId,int32_t command)234 void FoldScreenController::AddOrRemoveDisplayNodeToTree(ScreenId screenId, int32_t command)
235 {
236 if (foldScreenPolicy_ == nullptr) {
237 TLOGW(WmsLogTag::DMS, "foldScreenPolicy_ is null");
238 return;
239 }
240 foldScreenPolicy_->AddOrRemoveDisplayNodeToTree(screenId, command);
241 }
242
GetModeChangeRunningStatus()243 bool FoldScreenController::GetModeChangeRunningStatus()
244 {
245 return foldScreenPolicy_->GetModeChangeRunningStatus();
246 }
247
SetdisplayModeChangeStatus(bool status)248 void FoldScreenController::SetdisplayModeChangeStatus(bool status)
249 {
250 foldScreenPolicy_->SetdisplayModeChangeStatus(status);
251 }
252
GetdisplayModeRunningStatus()253 bool FoldScreenController::GetdisplayModeRunningStatus()
254 {
255 return foldScreenPolicy_->GetdisplayModeRunningStatus();
256 }
257
GetLastCacheDisplayMode()258 FoldDisplayMode FoldScreenController::GetLastCacheDisplayMode()
259 {
260 return foldScreenPolicy_->GetLastCacheDisplayMode();
261 }
262 } // namespace OHOS::Rosen