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