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