1 /*
2  * Copyright (C) 2024 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 "accessibility_display_manager.h"
17 #include "accessible_ability_manager_service.h"
18 #include "hilog_wrapper.h"
19 #include "accessibility_ut_helper.h"
20 
21 namespace OHOS {
22 namespace Accessibility {
23 
24 constexpr int32_t DEFAULT_DPI = 540;
25 constexpr int32_t DEFAULT_WIDTH = 1260;
26 constexpr int32_t DEFAULT_HEIGHT = 2720;
27 constexpr float DEFAULT_SCALE = 2.0f;
28 constexpr float NORMAL_SCALE = 1.0f;
29 
AccessibilityDisplayManager()30 AccessibilityDisplayManager::AccessibilityDisplayManager()
31 {
32 }
33 
~AccessibilityDisplayManager()34 AccessibilityDisplayManager::~AccessibilityDisplayManager()
35 {
36     UnregisterDisplayListener();
37 }
38 
GetDisplay(uint64_t id)39 const sptr<Rosen::Display> AccessibilityDisplayManager::GetDisplay(uint64_t id)
40 {
41     HILOG_DEBUG();
42     return Rosen::DisplayManager::GetInstance().GetDisplayById(id);
43 }
44 
GetDisplays()45 std::vector<sptr<Rosen::Display>> AccessibilityDisplayManager::GetDisplays()
46 {
47     HILOG_DEBUG();
48     return Rosen::DisplayManager::GetInstance().GetAllDisplays();
49 }
50 
GetDefaultDisplay()51 const sptr<Rosen::Display> AccessibilityDisplayManager::GetDefaultDisplay()
52 {
53     HILOG_DEBUG();
54     return Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
55 }
56 
GetDefaultDisplayId()57 uint64_t AccessibilityDisplayManager::GetDefaultDisplayId()
58 {
59     HILOG_DEBUG();
60     return Rosen::DisplayManager::GetInstance().GetDefaultDisplayId();
61 }
62 
GetWidth()63 int32_t AccessibilityDisplayManager::GetWidth()
64 {
65     HILOG_DEBUG();
66     sptr<Rosen::Display> displaySync = GetDefaultDisplaySync();
67     if (displaySync == nullptr) {
68         HILOG_ERROR("default displaySync is null");
69         return DEFAULT_WIDTH;
70     }
71 
72     return displaySync->GetWidth();
73 }
74 
GetHeight()75 int32_t AccessibilityDisplayManager::GetHeight()
76 {
77     HILOG_DEBUG();
78     sptr<Rosen::Display> displaySync = GetDefaultDisplaySync();
79     if (displaySync == nullptr) {
80         HILOG_ERROR("default displaySync is null");
81         return DEFAULT_HEIGHT;
82     }
83 
84     return displaySync->GetHeight();
85 }
86 
GetOrientation()87 OHOS::Rosen::DisplayOrientation AccessibilityDisplayManager::GetOrientation()
88 {
89     HILOG_DEBUG();
90     sptr<Rosen::Display> displaySync = GetDefaultDisplaySync();
91     if (displaySync == nullptr) {
92         HILOG_ERROR("default displaySync is null");
93         return OHOS::Rosen::DisplayOrientation::PORTRAIT;
94     }
95 
96     auto displayInfo = displaySync->GetDisplayInfo();
97     if (displayInfo == nullptr) {
98         HILOG_ERROR("default displayInfo is null");
99         return OHOS::Rosen::DisplayOrientation::PORTRAIT;
100     }
101 
102     return displayInfo->GetDisplayOrientation();
103 }
104 
GetDefaultDisplaySync()105 sptr<Rosen::Display> AccessibilityDisplayManager::GetDefaultDisplaySync()
106 {
107     HILOG_DEBUG();
108     return Rosen::DisplayManager::GetInstance().GetDefaultDisplaySync();
109 }
110 
GetDefaultDisplayDpi()111 int32_t AccessibilityDisplayManager::GetDefaultDisplayDpi()
112 {
113     HILOG_DEBUG();
114     if (GetDefaultDisplay() == nullptr) {
115         HILOG_ERROR("default display is null");
116         return DEFAULT_DPI;
117     }
118 
119     return GetDefaultDisplay()->GetDpi();
120 }
121 
IsFoldable()122 bool AccessibilityDisplayManager::IsFoldable()
123 {
124     HILOG_DEBUG();
125     return Rosen::DisplayManager::GetInstance().IsFoldable();
126 }
127 
GetFoldDisplayMode()128 Rosen::FoldDisplayMode AccessibilityDisplayManager::GetFoldDisplayMode()
129 {
130     HILOG_DEBUG();
131     return Rosen::DisplayManager::GetInstance().GetFoldDisplayMode();
132 }
133 
GetFoldStatus()134 Rosen::FoldStatus AccessibilityDisplayManager::GetFoldStatus()
135 {
136     HILOG_DEBUG();
137     return Rosen::DisplayManager::GetInstance().GetFoldStatus();
138 }
139 
SetDisplayScale(const uint64_t screenId,float scaleX,float scaleY,float pivotX,float pivotY)140 void AccessibilityDisplayManager::SetDisplayScale(const uint64_t screenId,
141     float scaleX, float scaleY, float pivotX, float pivotY)
142 {
143     HILOG_DEBUG("scaleX = %{public}f, scaleY = %{public}f, pivotX = %{public}f, pivotY = %{public}f",
144         scaleX, scaleY, pivotX, pivotY);
145     if ((scaleX >= DEFAULT_SCALE) || (scaleY >= DEFAULT_SCALE)) {
146         Accessibility::AccessibilityAbilityHelper::GetInstance().SetZoomState(true);
147     }
148 
149     if ((scaleX == NORMAL_SCALE) || (scaleY == NORMAL_SCALE)) {
150         Accessibility::AccessibilityAbilityHelper::GetInstance().SetZoomState(false);
151     }
152 }
153 
RegisterDisplayListener(const std::shared_ptr<AppExecFwk::EventHandler> & handler)154 void AccessibilityDisplayManager::RegisterDisplayListener(
155     const std::shared_ptr<AppExecFwk::EventHandler> &handler)
156 {
157     HILOG_DEBUG();
158     if (listener_) {
159         HILOG_DEBUG("Display listener is already registed!");
160         return;
161     }
162     handler_ = handler;
163     listener_ = new(std::nothrow) DisplayListener();
164     if (!listener_) {
165         HILOG_ERROR("Create display listener fail!");
166         return;
167     }
168     Rosen::DisplayManager::GetInstance().RegisterDisplayListener(listener_);
169 }
170 
UnregisterDisplayListener()171 void AccessibilityDisplayManager::UnregisterDisplayListener()
172 {
173     HILOG_DEBUG();
174     if (listener_) {
175         Rosen::DisplayManager::GetInstance().UnregisterDisplayListener(listener_);
176         listener_ = nullptr;
177         handler_ = nullptr;
178     }
179 }
180 } // namespace Accessibility
181 } // namespace OHOS