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)28DisplayListenerAdapterImpl::DisplayListenerAdapterImpl( 29 std::shared_ptr<DisplayListenerAdapter> listener) : listener_(listener) {} 30 OnCreate(DisplayId id)31void DisplayListenerAdapterImpl::OnCreate(DisplayId id) 32 { 33 if (listener_ != nullptr) { 34 listener_->OnCreate(id); 35 } 36 } OnDestroy(DisplayId id)37void DisplayListenerAdapterImpl::OnDestroy(DisplayId id) 38 { 39 if (listener_ != nullptr) { 40 listener_->OnDestroy(id); 41 } 42 } OnChange(DisplayId id)43void DisplayListenerAdapterImpl::OnChange(DisplayId id) 44 { 45 if (listener_ != nullptr) { 46 listener_->OnChange(id); 47 } 48 } 49 FoldStatusListenerAdapterImpl(std::shared_ptr<FoldStatusListenerAdapter> listener)50FoldStatusListenerAdapterImpl::FoldStatusListenerAdapterImpl( 51 std::shared_ptr<FoldStatusListenerAdapter> listener) : listener_(listener) {} 52 ConvertFoldStatus(NativeDisplayManager_FoldDisplayMode displayMode)53OHOS::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)71void FoldStatusListenerAdapterImpl::OnFoldStatusChanged(NativeDisplayManager_FoldDisplayMode displayMode) 72 { 73 if (listener_ != nullptr) { 74 listener_->OnFoldStatusChanged(ConvertFoldStatus(displayMode)); 75 } 76 } 77 DisplayAdapterImpl(sptr<OHOS::Rosen::Display> display)78DisplayAdapterImpl::DisplayAdapterImpl(sptr<OHOS::Rosen::Display> display) 79 : display_(display) {} 80 ConvertRotationType(OHOS::Rosen::Rotation type)81OHOS::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)97OHOS::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)121OHOS::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)138OHOS::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()154DisplayId DisplayAdapterImpl::GetId() 155 { 156 if (display_ != nullptr) { 157 return display_->GetId(); 158 } 159 return static_cast<DisplayId>(-1); 160 } 161 GetWidth()162int32_t DisplayAdapterImpl::GetWidth() 163 { 164 if (display_ != nullptr) { 165 return display_->GetWidth(); 166 } 167 return -1; 168 } 169 GetHeight()170int32_t DisplayAdapterImpl::GetHeight() 171 { 172 if (display_ != nullptr) { 173 return display_->GetHeight(); 174 } 175 return -1; 176 } 177 GetVirtualPixelRatio()178float DisplayAdapterImpl::GetVirtualPixelRatio() 179 { 180 if (display_ != nullptr) { 181 return display_->GetVirtualPixelRatio(); 182 } 183 return -1; 184 } 185 GetRotation()186RotationType DisplayAdapterImpl::GetRotation() 187 { 188 if (display_ != nullptr) { 189 return ConvertRotationType(display_->GetRotation()); 190 } 191 return RotationType::ROTATION_BUTT; 192 } 193 GetOrientation()194OrientationType DisplayAdapterImpl::GetOrientation() 195 { 196 if (display_ != nullptr) { 197 return ConvertOrientationType(display_->GetOrientation()); 198 } 199 return OrientationType::BUTT; 200 } 201 GetDpi()202int32_t DisplayAdapterImpl::GetDpi() 203 { 204 if (display_ != nullptr) { 205 return display_->GetDpi(); 206 } 207 return -1; 208 } 209 GetDisplayOrientation()210DisplayOrientation 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()221FoldStatus 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()229bool DisplayAdapterImpl::IsFoldable() 230 { 231 return OH_NativeDisplayManager_IsFoldable(); 232 } 233 GetDefaultDisplayId()234DisplayId DisplayManagerAdapterImpl::GetDefaultDisplayId() 235 { 236 return DisplayManager::GetInstance().GetDefaultDisplayId(); 237 } 238 GetDefaultDisplay()239std::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)245uint32_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)268bool 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()281bool 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)289void 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)296uint32_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)314bool 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