1 /*
2 * Copyright (c) 2023-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 "display_event_monitor.h"
17
18 #include "delegate_interface.h"
19 #include "input_event_handler.h"
20 #include "input_windows_manager.h"
21 #include "i_pointer_drawing_manager.h"
22 #include "input_event_handler.h"
23 #include "key_subscriber_handler.h"
24 #include "setting_datashare.h"
25 #include "system_ability_definition.h"
26
27 #ifdef OHOS_BUILD_ENABLE_COMBINATION_KEY
28 #include "stylus_key_handler.h"
29 #endif // OHOS_BUILD_ENABLE_COMBINATION_KEY
30
31 #undef MMI_LOG_DOMAIN
32 #define MMI_LOG_DOMAIN MMI_LOG_SERVER
33 #undef MMI_LOG_TAG
34 #define MMI_LOG_TAG "DisplayEventMonitor"
35
36 namespace OHOS {
37 namespace MMI {
DisplayEventMonitor()38 DisplayEventMonitor::DisplayEventMonitor() {}
~DisplayEventMonitor()39 DisplayEventMonitor::~DisplayEventMonitor() {}
40
41 #ifdef OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
42 class DisplyChangedReceiver : public EventFwk::CommonEventSubscriber {
43 public:
DisplyChangedReceiver(const OHOS::EventFwk::CommonEventSubscribeInfo & subscribeInfo)44 explicit DisplyChangedReceiver(const OHOS::EventFwk::CommonEventSubscribeInfo& subscribeInfo)
45 : OHOS::EventFwk::CommonEventSubscriber(subscribeInfo)
46 {
47 MMI_HILOGD("DisplyChangedReceiver register");
48 }
49
50 virtual ~DisplyChangedReceiver() = default;
51 __attribute__((no_sanitize("cfi")))
OnReceiveEvent(const EventFwk::CommonEventData & eventData)52 void OnReceiveEvent(const EventFwk::CommonEventData &eventData)
53 {
54 CALL_DEBUG_ENTER;
55 std::string action = eventData.GetWant().GetAction();
56 if (action.empty()) {
57 MMI_HILOGE("The action is empty");
58 return;
59 }
60 MMI_HILOGD("Received screen status:%{public}s", action.c_str());
61 JudgeAction(action);
62 }
63
JudgeAction(std::string & action)64 void JudgeAction(std::string &action)
65 {
66 if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON) {
67 MMI_HILOGI("Display screen on");
68 DISPLAY_MONITOR->SetScreenStatus(action);
69 #ifdef OHOS_BUILD_ENABLE_COMBINATION_KEY
70 STYLUS_HANDLER->IsLaunchAbility();
71 #endif // OHOS_BUILD_ENABLE_COMBINATION_KEY
72 CHKPV(FINGERSENSE_WRAPPER);
73 if (FINGERSENSE_WRAPPER->enableFingersense_ != nullptr) {
74 MMI_HILOGI("Start enable fingersense");
75 FINGERSENSE_WRAPPER->enableFingersense_();
76 }
77 DISPLAY_MONITOR->UpdateShieldStatusOnScreenOn();
78 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF) {
79 MMI_HILOGD("Display screen off");
80 DISPLAY_MONITOR->SetScreenStatus(action);
81 CHKPV(FINGERSENSE_WRAPPER);
82 if (FINGERSENSE_WRAPPER->disableFingerSense_ != nullptr) {
83 MMI_HILOGI("Disable fingersense");
84 FINGERSENSE_WRAPPER->disableFingerSense_();
85 }
86 DISPLAY_MONITOR->UpdateShieldStatusOnScreenOff();
87 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_LOCKED) {
88 MMI_HILOGD("Display screen locked");
89 DISPLAY_MONITOR->SetScreenLocked(true);
90 DISPLAY_MONITOR->SendCancelEventWhenLock();
91 #ifdef OHOS_BUILD_ENABLE_VKEYBOARD
92 ScreenLockHideCursor();
93 #endif // OHOS_BUILD_ENABLE_VKEYBOARD
94 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED) {
95 MMI_HILOGD("Display screen unlocked");
96 DISPLAY_MONITOR->SetScreenLocked(false);
97 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_DATA_SHARE_READY) {
98 MMI_HILOGI("Received data share ready event");
99 if (SettingDataShare::GetInstance(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID).CheckIfSettingsDataReady()) {
100 MMI_HILOGI("Data share has readyed");
101 IPointerDrawingManager::GetInstance()->InitPointerObserver();
102 auto keySubscriberHandler = InputHandler->GetSubscriberHandler();
103 CHKPV(keySubscriberHandler);
104 keySubscriberHandler->InitDataShareListener();
105 auto keyHandler = InputHandler->GetKeyCommandHandler();
106 if (keyHandler != nullptr) {
107 keyHandler->InitKeyObserver();
108 }
109 }
110 } else {
111 MMI_HILOGW("Screen changed receiver event: unknown");
112 }
113 }
114
115 #ifdef OHOS_BUILD_ENABLE_VKEYBOARD
ScreenLockHideCursor()116 void ScreenLockHideCursor()
117 {
118 if (IPointerDrawingManager::GetInstance() != nullptr &&
119 IPointerDrawingManager::GetInstance()->GetMouseDisplayState()) {
120 MMI_HILOGI("SCREEN_LOCKED hides mouse cursor.");
121 IPointerDrawingManager::GetInstance()->SetMouseDisplayState(false);
122 }
123 }
124 #endif // OHOS_BUILD_ENABLE_VKEYBOARD
125 };
126
UpdateShieldStatusOnScreenOn()127 void DisplayEventMonitor::UpdateShieldStatusOnScreenOn()
128 {
129 CALL_DEBUG_ENTER;
130 MMI_HILOGI("Shield mode before screen on:%{public}d", shieldModeBeforeSreenOff_);
131 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
132 if (shieldModeBeforeSreenOff_ != SHIELD_MODE::UNSET_MODE) {
133 KeyEventHdr->SetCurrentShieldMode(shieldModeBeforeSreenOff_);
134 } else {
135 MMI_HILOGD("Shield mode before screen on:%{public}d", shieldModeBeforeSreenOff_);
136 }
137 #else
138 MMI_HILOGW("Keyboard device does not support");
139 #endif // OHOS_BUILD_ENABLE_KEYBOARD
140 }
141
UpdateShieldStatusOnScreenOff()142 void DisplayEventMonitor::UpdateShieldStatusOnScreenOff()
143 {
144 CALL_DEBUG_ENTER;
145 MMI_HILOGI("Shield mode before screen off:%{public}d", shieldModeBeforeSreenOff_);
146 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
147 shieldModeBeforeSreenOff_ = KeyEventHdr->GetCurrentShieldMode();
148 if (shieldModeBeforeSreenOff_ != SHIELD_MODE::UNSET_MODE) {
149 KeyEventHdr->SetCurrentShieldMode(SHIELD_MODE::UNSET_MODE);
150 } else {
151 MMI_HILOGD("Shield mode before screen off:%{public}d", shieldModeBeforeSreenOff_);
152 }
153 #else
154 MMI_HILOGW("Keyboard device does not support");
155 #endif // OHOS_BUILD_ENABLE_KEYBOARD
156 }
157
InitCommonEventSubscriber()158 void DisplayEventMonitor::InitCommonEventSubscriber()
159 {
160 CALL_DEBUG_ENTER;
161 if (hasInit_) {
162 MMI_HILOGE("Current common event has subscribered");
163 return;
164 }
165 EventFwk::MatchingSkills matchingSkills;
166 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
167 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
168 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_LOCKED);
169 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED);
170 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_DATA_SHARE_READY);
171 EventFwk::CommonEventSubscribeInfo commonEventSubscribeInfo(matchingSkills);
172 hasInit_ = OHOS::EventFwk::CommonEventManager::SubscribeCommonEvent(
173 std::make_shared<DisplyChangedReceiver>(commonEventSubscribeInfo));
174 }
175
IsCommonEventSubscriberInit()176 bool DisplayEventMonitor::IsCommonEventSubscriberInit()
177 {
178 return hasInit_;
179 }
180
SendCancelEventWhenLock()181 void DisplayEventMonitor::SendCancelEventWhenLock()
182 {
183 CHKPV(delegateProxy_);
184 delegateProxy_->OnPostSyncTask([] {
185 WIN_MGR->SendCancelEventWhenLock();
186 return RET_OK;
187 });
188 }
189 #endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
190 } // namespace AppExecFwk
191 } // namespace OHOS