1 /*
2 * Copyright (c) 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 #ifdef WINDOW_MANAGER_ENABLE
16 #include "event_focus_listener.h"
17
18 #include "ffrt.h"
19 #include "hiview_logger.h"
20 #include "parameter_ex.h"
21 #include "time_util.h"
22
23 namespace OHOS {
24 namespace HiviewDFX {
25 DEFINE_LOG_LABEL(0xD002D01, "EventFocusListener");
26 sptr<EventFocusListener> EventFocusListener::instance_ = nullptr;
27 std::recursive_mutex EventFocusListener::mutex_;
28 EventFocusListener::REGISTER_STATE EventFocusListener::registerState_ = UNREGISTERED;
29 uint64_t EventFocusListener::lastChangedTime_ = TimeUtil::GetMilliseconds();
30
GetInstance()31 sptr<EventFocusListener> EventFocusListener::GetInstance()
32 {
33 std::lock_guard<std::recursive_mutex> lock_l(mutex_);
34 if (instance_ == nullptr) {
35 instance_ = new (std::nothrow) EventFocusListener();
36 }
37 return instance_;
38 }
39
RegisterFocusListener()40 void EventFocusListener::RegisterFocusListener()
41 {
42 if (!Parameter::IsBetaVersion()) {
43 return;
44 }
45
46 if (registerState_ == REGISTERED) {
47 HIVIEW_LOGD("eventFocusListener is registered");
48 return;
49 }
50 if (GetInstance() == nullptr) {
51 HIVIEW_LOGE("register eventFocusListener failed, listener is null");
52 return;
53 }
54 if (registerState_ == REGISTERING) {
55 HIVIEW_LOGI("register eventFocusListener task is executing");
56 return;
57 }
58
59 auto registerTask = [] {
60 registerState_ = REGISTERING;
61 Rosen::WMError ret = Rosen::WindowManager::GetInstance().RegisterFocusChangedListener(GetInstance());
62 if (ret == Rosen::WMError::WM_OK) {
63 HIVIEW_LOGI("register eventFocusListener succeed.");
64 registerState_ = REGISTERED;
65 } else {
66 HIVIEW_LOGI("register eventFocusListener failed.");
67 registerState_ = UNREGISTERED;
68 }
69 };
70 HIVIEW_LOGI("before submit registerFocusListener task to ffrt");
71 ffrt::submit(registerTask, {}, {}, ffrt::task_attr().name("rgs_fcs_lst"));
72 HIVIEW_LOGI("after submit registerFocusListener task to ffrt");
73 }
74
UnRegisterFocusListener()75 void EventFocusListener::UnRegisterFocusListener()
76 {
77 if (registerState_ != REGISTERED) {
78 HIVIEW_LOGD("eventFocusListener not need unRegistered");
79 return;
80 }
81 if (GetInstance() == nullptr) {
82 HIVIEW_LOGE("unRegister eventFocusListener failed, listener is null");
83 return;
84 }
85
86 Rosen::WMError ret = Rosen::WindowManager::GetInstance().UnregisterFocusChangedListener(GetInstance());
87 if (ret == Rosen::WMError::WM_OK) {
88 HIVIEW_LOGI("unRegister eventFocusListener succeed");
89 registerState_ = UNREGISTERED;
90 }
91 }
92
OnFocused(const sptr<Rosen::FocusChangeInfo> & focusChangeInfo)93 void EventFocusListener::OnFocused(const sptr<Rosen::FocusChangeInfo>& focusChangeInfo)
94 {
95 lastChangedTime_ = TimeUtil::GetMilliseconds();
96 }
97
OnUnfocused(const sptr<Rosen::FocusChangeInfo> & focusChangeInfo)98 void EventFocusListener::OnUnfocused(const sptr<Rosen::FocusChangeInfo>& focusChangeInfo)
99 {
100 lastChangedTime_ = TimeUtil::GetMilliseconds();
101 }
102 } // namespace HiviewDFX
103 } // namespace OHOS
104 #endif // WINDOW_MANAGER_ENABLE
105