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