• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "display_manager_adapter_impl.h"
17 
18 #include "display_info.h"
19 #include "nweb_log.h"
20 #include "syspara/parameters.h"
21 #include "oh_display_manager.h"
22 #include "oh_display_info.h"
23 
24 using namespace OHOS::Rosen;
25 using namespace OHOS::NWeb;
26 
27 namespace OHOS::NWeb {
DisplayListenerAdapterImpl(std::shared_ptr<DisplayListenerAdapter> listener)28 DisplayListenerAdapterImpl::DisplayListenerAdapterImpl(
29     std::shared_ptr<DisplayListenerAdapter> listener) : listener_(listener) {}
30 
OnCreate(DisplayId id)31 void DisplayListenerAdapterImpl::OnCreate(DisplayId id)
32 {
33     if (listener_ != nullptr) {
34         listener_->OnCreate(id);
35     }
36 }
OnDestroy(DisplayId id)37 void DisplayListenerAdapterImpl::OnDestroy(DisplayId id)
38 {
39     if (listener_ != nullptr) {
40         listener_->OnDestroy(id);
41     }
42 }
OnChange(DisplayId id)43 void DisplayListenerAdapterImpl::OnChange(DisplayId id)
44 {
45     if (listener_ != nullptr) {
46         listener_->OnChange(id);
47     }
48 }
49 
FoldStatusListenerAdapterImpl(std::shared_ptr<FoldStatusListenerAdapter> listener)50 FoldStatusListenerAdapterImpl::FoldStatusListenerAdapterImpl(
51     std::shared_ptr<FoldStatusListenerAdapter> listener) : listener_(listener) {}
52 
ConvertFoldStatus(NativeDisplayManager_FoldDisplayMode displayMode)53 OHOS::NWeb::FoldStatus FoldStatusListenerAdapterImpl::ConvertFoldStatus(
54     NativeDisplayManager_FoldDisplayMode displayMode)
55 {
56     switch (displayMode) {
57         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_FULL:
58             return OHOS::NWeb::FoldStatus::FULL;
59         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_MAIN:
60             return OHOS::NWeb::FoldStatus::MAIN;
61         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_SUB:
62             return OHOS::NWeb::FoldStatus::SUB;
63         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_COORDINATION:
64             return OHOS::NWeb::FoldStatus::COORDINATION;
65         default:
66             return OHOS::NWeb::FoldStatus::UNKNOWN;
67     }
68 }
69 
70 
OnFoldStatusChanged(NativeDisplayManager_FoldDisplayMode displayMode)71 void FoldStatusListenerAdapterImpl::OnFoldStatusChanged(NativeDisplayManager_FoldDisplayMode displayMode)
72 {
73     if (listener_ != nullptr) {
74         listener_->OnFoldStatusChanged(ConvertFoldStatus(displayMode));
75     }
76 }
77 
DisplayAdapterImpl(sptr<OHOS::Rosen::Display> display)78 DisplayAdapterImpl::DisplayAdapterImpl(sptr<OHOS::Rosen::Display> display)
79     : display_(display) {}
80 
ConvertRotationType(OHOS::Rosen::Rotation type)81 OHOS::NWeb::RotationType DisplayAdapterImpl::ConvertRotationType(OHOS::Rosen::Rotation type)
82 {
83     switch (type) {
84         case OHOS::Rosen::Rotation::ROTATION_0:
85             return OHOS::NWeb::RotationType::ROTATION_0;
86         case OHOS::Rosen::Rotation::ROTATION_90:
87             return OHOS::NWeb::RotationType::ROTATION_90;
88         case OHOS::Rosen::Rotation::ROTATION_180:
89             return OHOS::NWeb::RotationType::ROTATION_180;
90         case OHOS::Rosen::Rotation::ROTATION_270:
91             return OHOS::NWeb::RotationType::ROTATION_270;
92         default:
93             return OHOS::NWeb::RotationType::ROTATION_BUTT;
94     }
95 }
96 
ConvertOrientationType(OHOS::Rosen::Orientation type)97 OHOS::NWeb::OrientationType DisplayAdapterImpl::ConvertOrientationType(OHOS::Rosen::Orientation type)
98 {
99     switch (type) {
100         case OHOS::Rosen::Orientation::UNSPECIFIED:
101             return OHOS::NWeb::OrientationType::UNSPECIFIED;
102         case OHOS::Rosen::Orientation::VERTICAL:
103             return OHOS::NWeb::OrientationType::VERTICAL;
104         case OHOS::Rosen::Orientation::HORIZONTAL:
105             return OHOS::NWeb::OrientationType::HORIZONTAL;
106         case OHOS::Rosen::Orientation::REVERSE_VERTICAL:
107             return OHOS::NWeb::OrientationType::REVERSE_VERTICAL;
108         case OHOS::Rosen::Orientation::REVERSE_HORIZONTAL:
109             return OHOS::NWeb::OrientationType::REVERSE_HORIZONTAL;
110         case OHOS::Rosen::Orientation::SENSOR:
111             return OHOS::NWeb::OrientationType::SENSOR;
112         case OHOS::Rosen::Orientation::SENSOR_VERTICAL:
113             return OHOS::NWeb::OrientationType::SENSOR_VERTICAL;
114         case OHOS::Rosen::Orientation::SENSOR_HORIZONTAL:
115             return OHOS::NWeb::OrientationType::SENSOR_HORIZONTAL;
116         default:
117             return OHOS::NWeb::OrientationType::BUTT;
118     }
119 }
120 
ConvertDisplayOrientationType(OHOS::Rosen::DisplayOrientation type)121 OHOS::NWeb::DisplayOrientation DisplayAdapterImpl::ConvertDisplayOrientationType(OHOS::Rosen::DisplayOrientation type)
122 {
123     switch (type) {
124         case OHOS::Rosen::DisplayOrientation::PORTRAIT:
125             return OHOS::NWeb::DisplayOrientation::PORTRAIT;
126         case OHOS::Rosen::DisplayOrientation::LANDSCAPE:
127             return OHOS::NWeb::DisplayOrientation::LANDSCAPE;
128         case OHOS::Rosen::DisplayOrientation::PORTRAIT_INVERTED:
129             return OHOS::NWeb::DisplayOrientation::PORTRAIT_INVERTED;
130         case OHOS::Rosen::DisplayOrientation::LANDSCAPE_INVERTED:
131             return OHOS::NWeb::DisplayOrientation::LANDSCAPE_INVERTED;
132         default:
133             return OHOS::NWeb::DisplayOrientation::UNKNOWN;
134     }
135 }
136 
137 
ConvertFoldStatus(NativeDisplayManager_FoldDisplayMode displayMode)138 OHOS::NWeb::FoldStatus DisplayAdapterImpl::ConvertFoldStatus(NativeDisplayManager_FoldDisplayMode displayMode)
139 {
140     switch (displayMode) {
141         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_FULL:
142             return OHOS::NWeb::FoldStatus::FULL;
143         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_MAIN:
144             return OHOS::NWeb::FoldStatus::MAIN;
145         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_SUB:
146             return OHOS::NWeb::FoldStatus::SUB;
147         case DISPLAY_MANAGER_FOLD_DISPLAY_MODE_COORDINATION:
148             return OHOS::NWeb::FoldStatus::COORDINATION;
149         default:
150             return OHOS::NWeb::FoldStatus::UNKNOWN;
151     }
152 }
153 
GetId()154 DisplayId DisplayAdapterImpl::GetId()
155 {
156     if (display_ != nullptr) {
157         return display_->GetId();
158     }
159     return static_cast<DisplayId>(-1);
160 }
161 
GetWidth()162 int32_t DisplayAdapterImpl::GetWidth()
163 {
164     if (display_ != nullptr) {
165         return display_->GetWidth();
166     }
167     return -1;
168 }
169 
GetHeight()170 int32_t DisplayAdapterImpl::GetHeight()
171 {
172     if (display_ != nullptr) {
173         return display_->GetHeight();
174     }
175     return -1;
176 }
177 
GetVirtualPixelRatio()178 float DisplayAdapterImpl::GetVirtualPixelRatio()
179 {
180     if (display_ != nullptr) {
181         return display_->GetVirtualPixelRatio();
182     }
183     return -1;
184 }
185 
GetRotation()186 RotationType DisplayAdapterImpl::GetRotation()
187 {
188     if (display_ != nullptr) {
189         return ConvertRotationType(display_->GetRotation());
190     }
191     return RotationType::ROTATION_BUTT;
192 }
193 
GetOrientation()194 OrientationType DisplayAdapterImpl::GetOrientation()
195 {
196     if (display_ != nullptr) {
197         return ConvertOrientationType(display_->GetOrientation());
198     }
199     return OrientationType::BUTT;
200 }
201 
GetDpi()202 int32_t DisplayAdapterImpl::GetDpi()
203 {
204     if (display_ != nullptr) {
205         return display_->GetDpi();
206     }
207     return -1;
208 }
209 
GetDisplayOrientation()210 DisplayOrientation DisplayAdapterImpl::GetDisplayOrientation()
211 {
212     if (display_ != nullptr) {
213         auto displayInfo = display_->GetDisplayInfo();
214         if (displayInfo != nullptr) {
215             return ConvertDisplayOrientationType(displayInfo->GetDisplayOrientation());
216         }
217     }
218     return DisplayOrientation::UNKNOWN;
219 }
220 
GetFoldStatus()221 FoldStatus DisplayAdapterImpl::GetFoldStatus()
222 {
223     NativeDisplayManager_FoldDisplayMode displayMode =
224         NativeDisplayManager_FoldDisplayMode::DISPLAY_MANAGER_FOLD_DISPLAY_MODE_UNKNOWN;
225     OH_NativeDisplayManager_GetFoldDisplayMode(&displayMode);
226     return ConvertFoldStatus(displayMode);
227 }
228 
IsFoldable()229 bool DisplayAdapterImpl::IsFoldable()
230 {
231     return OH_NativeDisplayManager_IsFoldable();
232 }
233 
GetDefaultDisplayId()234 DisplayId DisplayManagerAdapterImpl::GetDefaultDisplayId()
235 {
236     return DisplayManager::GetInstance().GetDefaultDisplayId();
237 }
238 
GetDefaultDisplay()239 std::shared_ptr<DisplayAdapter> DisplayManagerAdapterImpl::GetDefaultDisplay()
240 {
241     sptr<Display> display = DisplayManager::GetInstance().GetDefaultDisplay();
242     return std::make_shared<DisplayAdapterImpl>(display);
243 }
244 
RegisterDisplayListener(std::shared_ptr<DisplayListenerAdapter> listener)245 uint32_t DisplayManagerAdapterImpl::RegisterDisplayListener(
246     std::shared_ptr<DisplayListenerAdapter> listener)
247 {
248     static uint32_t count = 1;
249     sptr<DisplayListenerAdapterImpl> reg =
250         new (std::nothrow) DisplayListenerAdapterImpl(listener);
251     if (reg == nullptr) {
252         return false;
253     }
254 
255     uint32_t id = count++;
256     if (count == 0) {
257         count++;
258     }
259 
260     reg_.emplace(std::make_pair(id, reg));
261     if (DisplayManager::GetInstance().RegisterDisplayListener(reg) == DMError::DM_OK) {
262         return id;
263     } else {
264         return 0;
265     }
266 }
267 
UnregisterDisplayListener(uint32_t id)268 bool DisplayManagerAdapterImpl::UnregisterDisplayListener(uint32_t id)
269 {
270     ListenerMap::iterator iter = reg_.find(id);
271     if (iter == reg_.end()) {
272         return false;
273     }
274     if (DisplayManager::GetInstance().UnregisterDisplayListener(iter->second) == DMError::DM_OK) {
275         reg_.erase(iter);
276         return true;
277     }
278     return false;
279 }
280 
IsDefaultPortrait()281 bool DisplayManagerAdapterImpl::IsDefaultPortrait()
282 {
283     std::string deviceType = OHOS::system::GetDeviceType();
284     return deviceType == "phone" || deviceType == "default";
285 }
286 
287 FoldStatusListenerMap DisplayManagerAdapterImpl::foldStatusReg_;
288 
FoldChangeCallBack(NativeDisplayManager_FoldDisplayMode displayMode)289 void FoldChangeCallBack(NativeDisplayManager_FoldDisplayMode displayMode)
290 {
291     for (auto& iter : DisplayManagerAdapterImpl::foldStatusReg_) {
292         iter.second->OnFoldStatusChanged(displayMode);
293     }
294 }
295 
RegisterFoldStatusListener(std::shared_ptr<FoldStatusListenerAdapter> listener)296 uint32_t DisplayManagerAdapterImpl::RegisterFoldStatusListener(
297     std::shared_ptr<FoldStatusListenerAdapter> listener)
298 {
299     sptr<FoldStatusListenerAdapterImpl> reg =
300         new (std::nothrow) FoldStatusListenerAdapterImpl(listener);
301     if (reg == nullptr) {
302         return false;
303     }
304     uint32_t id = 1;
305     if (OH_NativeDisplayManager_RegisterFoldDisplayModeChangeListener(
306         FoldChangeCallBack, &id) == NativeDisplayManager_ErrorCode::DISPLAY_MANAGER_OK) {
307         foldStatusReg_.emplace(std::make_pair(id, reg));
308         return id;
309     } else {
310         return 0;
311     }
312 }
313 
UnregisterFoldStatusListener(uint32_t id)314 bool DisplayManagerAdapterImpl::UnregisterFoldStatusListener(uint32_t id)
315 {
316     FoldStatusListenerMap::iterator iter = foldStatusReg_.find(id);
317     if (iter == foldStatusReg_.end()) {
318         return false;
319     }
320     if (OH_NativeDisplayManager_UnregisterFoldDisplayModeChangeListener(id) ==
321         NativeDisplayManager_ErrorCode::DISPLAY_MANAGER_OK) {
322         foldStatusReg_.erase(iter);
323         return true;
324     }
325     return false;
326 }
327 }
328