1 /*
2 * Copyright (C) 2025-2025 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 // LCOV_EXCL_START
17 #include "window_magnification_manager.h"
18 #include "accessibility_display_manager.h"
19 #include "accessible_ability_manager_service.h"
20 #include "magnification_menu_manager.h"
21 #include "utils.h"
22 #include "magnification_def.h"
23
24 namespace OHOS {
25 namespace Accessibility {
26
WindowMagnificationManager(std::shared_ptr<MagnificationWindowProxy> proxy)27 WindowMagnificationManager::WindowMagnificationManager(
28 std::shared_ptr<MagnificationWindowProxy> proxy) : windowProxy_(proxy)
29 {
30 }
31
EnableWindowMagnification(int32_t centerX,int32_t centerY)32 void WindowMagnificationManager::EnableWindowMagnification(int32_t centerX, int32_t centerY)
33 {
34 HILOG_INFO("centerX = %{public}d, centerY = %{public}d.", centerX, centerY);
35 CHECK_PROXY_PTR_VOID()
36 float scale = Singleton<AccessibleAbilityManagerService>::GetInstance().GetMagnificationScale();
37 windowProxy_->InitMagnificationParam(scale);
38 windowProxy_->EnableMagnification(WINDOW_MAGNIFICATION, centerX, centerY);
39 }
40
ShowWindowMagnification()41 void WindowMagnificationManager::ShowWindowMagnification()
42 {
43 CHECK_PROXY_PTR_VOID()
44 windowProxy_->ShowMagnification(WINDOW_MAGNIFICATION);
45 }
46
ShowWindowMagnificationWithPosition(PointerPos pos)47 void WindowMagnificationManager::ShowWindowMagnificationWithPosition(PointerPos pos)
48 {
49 if (pos.posX == 0 && pos.posY == 0) {
50 ShowWindowMagnification();
51 } else {
52 EnableWindowMagnification(pos.posX, pos.posY);
53 }
54 }
55
DisableWindowMagnification(bool needClear)56 void WindowMagnificationManager::DisableWindowMagnification(bool needClear)
57 {
58 HILOG_INFO();
59 CHECK_PROXY_PTR_VOID()
60 std::lock_guard<ffrt::mutex> lock(mutex_);
61 windowProxy_->DisableMagnification(WINDOW_MAGNIFICATION, needClear);
62 }
63
SetScale(float deltaSpan)64 void WindowMagnificationManager::SetScale(float deltaSpan)
65 {
66 HILOG_DEBUG();
67 CHECK_PROXY_PTR_VOID()
68 windowProxy_->SetScale(WINDOW_MAGNIFICATION, deltaSpan);
69 }
70
MoveMagnificationWindow(int32_t deltaX,int32_t deltaY)71 void WindowMagnificationManager::MoveMagnificationWindow(int32_t deltaX, int32_t deltaY)
72 {
73 CHECK_PROXY_PTR_VOID()
74 windowProxy_->MoveMagnification(WINDOW_MAGNIFICATION, deltaX, deltaY);
75 }
76
IsTapOnHotArea(int32_t posX,int32_t posY)77 bool WindowMagnificationManager::IsTapOnHotArea(int32_t posX, int32_t posY)
78 {
79 if (windowProxy_ == nullptr) {
80 HILOG_ERROR("windowProxy_ is nullptr.");
81 return false;
82 }
83 return windowProxy_->IsTapOnHotArea(posX, posY);
84 }
85
RefreshWindowParam(RotationType type)86 void WindowMagnificationManager::RefreshWindowParam(RotationType type)
87 {
88 HILOG_DEBUG();
89 CHECK_PROXY_PTR_VOID()
90 windowProxy_->RefreshWindowParam(WINDOW_MAGNIFICATION, type);
91 }
92
IsTapOnMagnificationWindow(int32_t posX,int32_t posY)93 bool WindowMagnificationManager::IsTapOnMagnificationWindow(int32_t posX, int32_t posY)
94 {
95 if (windowProxy_ == nullptr) {
96 HILOG_ERROR("windowProxy_ is nullptr.");
97 return false;
98 }
99 return windowProxy_->IsTapOnMagnificationWindow(posX, posY);
100 }
101
ConvertCoordinates(int32_t posX,int32_t posY)102 PointerPos WindowMagnificationManager::ConvertCoordinates(int32_t posX, int32_t posY)
103 {
104 PointerPos pos = {posX, posY};
105 if (windowProxy_ == nullptr) {
106 HILOG_ERROR("windowProxy_ is nullptr.");
107 return pos;
108 }
109 return windowProxy_->ConvertCoordinates(posX, posY);
110 }
111
FixSourceCenter(bool needFix)112 void WindowMagnificationManager::FixSourceCenter(bool needFix)
113 {
114 CHECK_PROXY_PTR_VOID()
115 windowProxy_->FixSourceCenter(needFix);
116 }
117
PersistScale()118 void WindowMagnificationManager::PersistScale()
119 {
120 CHECK_PROXY_PTR_VOID()
121 float scale = windowProxy_->GetScale();
122 HILOG_DEBUG("scale = %{public}f", scale);
123 Singleton<AccessibleAbilityManagerService>::GetInstance().SetMagnificationScale(scale);
124 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
125 AnnounceType::ANNOUNCE_MAGNIFICATION_SCALE);
126 }
127
GetSourceCenter()128 PointerPos WindowMagnificationManager::GetSourceCenter()
129 {
130 PointerPos pos = {0, 0};
131 if (windowProxy_ == nullptr) {
132 HILOG_ERROR("windowProxy_ is nullptr.");
133 return pos;
134 }
135 return windowProxy_->GetSourceCenter();
136 }
137
FollowFocuseElement(int32_t centerX,int32_t centerY)138 void WindowMagnificationManager::FollowFocuseElement(int32_t centerX, int32_t centerY)
139 {
140 HILOG_DEBUG();
141 CHECK_PROXY_PTR_VOID()
142 windowProxy_->FollowFocuseElement(WINDOW_MAGNIFICATION, centerX, centerY);
143 }
144
IsMagnificationWindowShow()145 bool WindowMagnificationManager::IsMagnificationWindowShow()
146 {
147 if (windowProxy_ == nullptr) {
148 HILOG_ERROR("windowProxy_ is nullptr.");
149 return false;
150 }
151 return windowProxy_->IsMagnificationWindowShow(WINDOW_MAGNIFICATION);
152 }
153
GetScale()154 float WindowMagnificationManager::GetScale()
155 {
156 if (windowProxy_ == nullptr) {
157 HILOG_ERROR("windowProxy_ is nullptr.");
158 return DEFAULT_SCALE;
159 }
160 return windowProxy_->GetScale();
161 }
162 } // namespace Accessibility
163 } // namespace OHOS
164 // LCOV_EXCL_STOP