• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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