1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "cooperate_client.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
19c29fa5a6Sopenharmony_ci#include <algorithm>
20c29fa5a6Sopenharmony_ci#include <numeric>
21c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
22c29fa5a6Sopenharmony_ci
23c29fa5a6Sopenharmony_ci#include "cooperate_hisysevent.h"
24c29fa5a6Sopenharmony_ci#include "cooperate_params.h"
25c29fa5a6Sopenharmony_ci#include "default_params.h"
26c29fa5a6Sopenharmony_ci#include "devicestatus_define.h"
27c29fa5a6Sopenharmony_ci#include "utility.h"
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_ci#undef LOG_TAG
30c29fa5a6Sopenharmony_ci#define LOG_TAG "CooperateClient"
31c29fa5a6Sopenharmony_ci
32c29fa5a6Sopenharmony_cinamespace OHOS {
33c29fa5a6Sopenharmony_cinamespace Msdp {
34c29fa5a6Sopenharmony_cinamespace DeviceStatus {
35c29fa5a6Sopenharmony_cinamespace {
36c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
37c29fa5a6Sopenharmony_ciconstexpr int32_t PERCENTAGE { 100 };
38c29fa5a6Sopenharmony_ciconstexpr int32_t FAILURE_DURATION { -100 };
39c29fa5a6Sopenharmony_ciconstexpr int32_t INVALID_INDEX { -1 };
40c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
41c29fa5a6Sopenharmony_ci} // namespace
42c29fa5a6Sopenharmony_ci
43c29fa5a6Sopenharmony_ciint32_t CooperateClient::RegisterListener(ITunnelClient &tunnel,
44c29fa5a6Sopenharmony_ci    CooperateListenerPtr listener, bool isCheckPermission)
45c29fa5a6Sopenharmony_ci{
46c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
47c29fa5a6Sopenharmony_ci    CHKPR(listener, RET_ERR);
48c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
49c29fa5a6Sopenharmony_ci    for (const auto &item : devCooperateListener_) {
50c29fa5a6Sopenharmony_ci        if (item == listener) {
51c29fa5a6Sopenharmony_ci            FI_HILOGE("The listener already exists");
52c29fa5a6Sopenharmony_ci            return RET_ERR;
53c29fa5a6Sopenharmony_ci        }
54c29fa5a6Sopenharmony_ci    }
55c29fa5a6Sopenharmony_ci    if (!isListeningProcess_) {
56c29fa5a6Sopenharmony_ci        FI_HILOGI("Start monitoring");
57c29fa5a6Sopenharmony_ci        DefaultParam param;
58c29fa5a6Sopenharmony_ci        DefaultReply reply;
59c29fa5a6Sopenharmony_ci
60c29fa5a6Sopenharmony_ci        int32_t ret = tunnel.AddWatch(Intention::COOPERATE, CooperateRequestID::REGISTER_LISTENER, param, reply);
61c29fa5a6Sopenharmony_ci        if (ret != RET_OK) {
62c29fa5a6Sopenharmony_ci            FI_HILOGE("Failed to register, ret:%{public}d", ret);
63c29fa5a6Sopenharmony_ci            return ret;
64c29fa5a6Sopenharmony_ci        }
65c29fa5a6Sopenharmony_ci        isListeningProcess_ = true;
66c29fa5a6Sopenharmony_ci    }
67c29fa5a6Sopenharmony_ci    devCooperateListener_.push_back(listener);
68c29fa5a6Sopenharmony_ci    return RET_OK;
69c29fa5a6Sopenharmony_ci}
70c29fa5a6Sopenharmony_ci
71c29fa5a6Sopenharmony_ciint32_t CooperateClient::UnregisterListener(ITunnelClient &tunnel,
72c29fa5a6Sopenharmony_ci    CooperateListenerPtr listener, bool isCheckPermission)
73c29fa5a6Sopenharmony_ci{
74c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
75c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
76c29fa5a6Sopenharmony_ci    if (listener == nullptr) {
77c29fa5a6Sopenharmony_ci        devCooperateListener_.clear();
78c29fa5a6Sopenharmony_ci        goto listenerLabel;
79c29fa5a6Sopenharmony_ci    }
80c29fa5a6Sopenharmony_ci    for (auto it = devCooperateListener_.begin(); it != devCooperateListener_.end(); ++it) {
81c29fa5a6Sopenharmony_ci        if (*it == listener) {
82c29fa5a6Sopenharmony_ci            devCooperateListener_.erase(it);
83c29fa5a6Sopenharmony_ci            goto listenerLabel;
84c29fa5a6Sopenharmony_ci        }
85c29fa5a6Sopenharmony_ci    }
86c29fa5a6Sopenharmony_ci
87c29fa5a6Sopenharmony_cilistenerLabel:
88c29fa5a6Sopenharmony_ci    if (isListeningProcess_ && devCooperateListener_.empty()) {
89c29fa5a6Sopenharmony_ci        isListeningProcess_ = false;
90c29fa5a6Sopenharmony_ci        DefaultParam param;
91c29fa5a6Sopenharmony_ci        DefaultReply reply;
92c29fa5a6Sopenharmony_ci        return tunnel.RemoveWatch(Intention::COOPERATE, CooperateRequestID::UNREGISTER_LISTENER, param, reply);
93c29fa5a6Sopenharmony_ci    }
94c29fa5a6Sopenharmony_ci    return RET_OK;
95c29fa5a6Sopenharmony_ci}
96c29fa5a6Sopenharmony_ci
97c29fa5a6Sopenharmony_ciint32_t CooperateClient::Enable(ITunnelClient &tunnel,
98c29fa5a6Sopenharmony_ci    CooperateMessageCallback callback, bool isCheckPermission)
99c29fa5a6Sopenharmony_ci{
100c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
101c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
102c29fa5a6Sopenharmony_ci    CooperateEvent event { callback };
103c29fa5a6Sopenharmony_ci    DefaultParam param { GenerateRequestID() };
104c29fa5a6Sopenharmony_ci    DefaultReply reply;
105c29fa5a6Sopenharmony_ci
106c29fa5a6Sopenharmony_ci    int32_t ret = tunnel.Enable(Intention::COOPERATE, param, reply);
107c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
108c29fa5a6Sopenharmony_ci        FI_HILOGE("Prepare cooperate failed");
109c29fa5a6Sopenharmony_ci        return ret;
110c29fa5a6Sopenharmony_ci    }
111c29fa5a6Sopenharmony_ci    devCooperateEvent_.insert_or_assign(param.userData, event);
112c29fa5a6Sopenharmony_ci    return RET_OK;
113c29fa5a6Sopenharmony_ci}
114c29fa5a6Sopenharmony_ci
115c29fa5a6Sopenharmony_ciint32_t CooperateClient::Disable(ITunnelClient &tunnel,
116c29fa5a6Sopenharmony_ci    CooperateMessageCallback callback, bool isCheckPermission)
117c29fa5a6Sopenharmony_ci{
118c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
119c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
120c29fa5a6Sopenharmony_ci    CooperateEvent event { callback };
121c29fa5a6Sopenharmony_ci    DefaultParam param { GenerateRequestID() };
122c29fa5a6Sopenharmony_ci    DefaultReply reply;
123c29fa5a6Sopenharmony_ci
124c29fa5a6Sopenharmony_ci    int32_t ret = tunnel.Disable(Intention::COOPERATE, param, reply);
125c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
126c29fa5a6Sopenharmony_ci        FI_HILOGE("Unprepare cooperate failed");
127c29fa5a6Sopenharmony_ci        return ret;
128c29fa5a6Sopenharmony_ci    }
129c29fa5a6Sopenharmony_ci    devCooperateEvent_.insert_or_assign(param.userData, event);
130c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
131c29fa5a6Sopenharmony_ci    DumpPerformanceInfo();
132c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
133c29fa5a6Sopenharmony_ci    return RET_OK;
134c29fa5a6Sopenharmony_ci}
135c29fa5a6Sopenharmony_ci
136c29fa5a6Sopenharmony_ciint32_t CooperateClient::Start(ITunnelClient &tunnel, const std::string &remoteNetworkId,
137c29fa5a6Sopenharmony_ci    int32_t startDeviceId, CooperateMessageCallback callback, bool isCheckPermission)
138c29fa5a6Sopenharmony_ci{
139c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
140c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
141c29fa5a6Sopenharmony_ci    CooperateEvent event { callback };
142c29fa5a6Sopenharmony_ci    auto userData = GenerateRequestID();
143c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
144c29fa5a6Sopenharmony_ci    StartTrace(userData);
145c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
146c29fa5a6Sopenharmony_ci    StartCooperateParam param { userData, remoteNetworkId, startDeviceId, isCheckPermission };
147c29fa5a6Sopenharmony_ci    DefaultReply reply;
148c29fa5a6Sopenharmony_ci
149c29fa5a6Sopenharmony_ci    int32_t ret = tunnel.Start(Intention::COOPERATE, param, reply);
150c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
151c29fa5a6Sopenharmony_ci        CooperateDFX::WriteStart(OHOS::HiviewDFX::HiSysEvent::EventType::FAULT);
152c29fa5a6Sopenharmony_ci        FI_HILOGE("Activate cooperate failed");
153c29fa5a6Sopenharmony_ci        return ret;
154c29fa5a6Sopenharmony_ci    }
155c29fa5a6Sopenharmony_ci    devCooperateEvent_.insert_or_assign(param.userData, event);
156c29fa5a6Sopenharmony_ci    CooperateDFX::WriteStart(OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR);
157c29fa5a6Sopenharmony_ci    return RET_OK;
158c29fa5a6Sopenharmony_ci}
159c29fa5a6Sopenharmony_ci
160c29fa5a6Sopenharmony_ciint32_t CooperateClient::Stop(ITunnelClient &tunnel,
161c29fa5a6Sopenharmony_ci    bool isUnchained, CooperateMessageCallback callback, bool isCheckPermission)
162c29fa5a6Sopenharmony_ci{
163c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
164c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
165c29fa5a6Sopenharmony_ci    CooperateEvent event { callback };
166c29fa5a6Sopenharmony_ci    StopCooperateParam param { GenerateRequestID(), isUnchained, isCheckPermission };
167c29fa5a6Sopenharmony_ci    DefaultReply reply;
168c29fa5a6Sopenharmony_ci
169c29fa5a6Sopenharmony_ci    int32_t ret = tunnel.Stop(Intention::COOPERATE, param, reply);
170c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
171c29fa5a6Sopenharmony_ci        CooperateDFX::WriteStop(OHOS::HiviewDFX::HiSysEvent::EventType::FAULT);
172c29fa5a6Sopenharmony_ci        FI_HILOGE("Deactivate cooperate failed");
173c29fa5a6Sopenharmony_ci        return ret;
174c29fa5a6Sopenharmony_ci    }
175c29fa5a6Sopenharmony_ci    CooperateDFX::WriteStop(OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR);
176c29fa5a6Sopenharmony_ci    devCooperateEvent_.insert_or_assign(param.userData, event);
177c29fa5a6Sopenharmony_ci    return RET_OK;
178c29fa5a6Sopenharmony_ci}
179c29fa5a6Sopenharmony_ci
180c29fa5a6Sopenharmony_ciint32_t CooperateClient::GetCooperateState(ITunnelClient &tunnel,
181c29fa5a6Sopenharmony_ci    const std::string &networkId, CooperateStateCallback callback, bool isCheckPermission)
182c29fa5a6Sopenharmony_ci{
183c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
184c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
185c29fa5a6Sopenharmony_ci    CooperateEvent event { callback };
186c29fa5a6Sopenharmony_ci    GetCooperateStateParam param { GenerateRequestID(), networkId, isCheckPermission };
187c29fa5a6Sopenharmony_ci    DefaultReply reply;
188c29fa5a6Sopenharmony_ci
189c29fa5a6Sopenharmony_ci    int32_t ret = tunnel.GetParam(Intention::COOPERATE, CooperateRequestID::GET_COOPERATE_STATE, param, reply);
190c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
191c29fa5a6Sopenharmony_ci        FI_HILOGE("Get cooperate state failed");
192c29fa5a6Sopenharmony_ci        return ret;
193c29fa5a6Sopenharmony_ci    }
194c29fa5a6Sopenharmony_ci    devCooperateEvent_.insert_or_assign(param.userData, event);
195c29fa5a6Sopenharmony_ci    return RET_OK;
196c29fa5a6Sopenharmony_ci}
197c29fa5a6Sopenharmony_ci
198c29fa5a6Sopenharmony_ciint32_t CooperateClient::GetCooperateState(ITunnelClient &tunnel, const std::string &udId, bool &state)
199c29fa5a6Sopenharmony_ci{
200c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
201c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
202c29fa5a6Sopenharmony_ci    GetCooperateStateSyncParam param { udId };
203c29fa5a6Sopenharmony_ci    BooleanReply reply;
204c29fa5a6Sopenharmony_ci    if (tunnel.GetParam(Intention::COOPERATE, CooperateRequestID::GET_COOPERATE_STATE_SYNC, param, reply) != RET_OK) {
205c29fa5a6Sopenharmony_ci        FI_HILOGE("Get cooperate state failed udId: %{public}s", Utility::Anonymize(udId).c_str());
206c29fa5a6Sopenharmony_ci        return RET_ERR;
207c29fa5a6Sopenharmony_ci    }
208c29fa5a6Sopenharmony_ci    FI_HILOGI("GetCooperateState for udId: %{public}s successfully,state: %{public}s",
209c29fa5a6Sopenharmony_ci        Utility::Anonymize(udId).c_str(), reply.state ? "true" : "false");
210c29fa5a6Sopenharmony_ci    state = reply.state;
211c29fa5a6Sopenharmony_ci    return RET_OK;
212c29fa5a6Sopenharmony_ci}
213c29fa5a6Sopenharmony_ci
214c29fa5a6Sopenharmony_ciint32_t CooperateClient::RegisterEventListener(ITunnelClient &tunnel,
215c29fa5a6Sopenharmony_ci    const std::string &networkId, MouseLocationListenerPtr listener)
216c29fa5a6Sopenharmony_ci{
217c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
218c29fa5a6Sopenharmony_ci    CHKPR(listener, COMMON_PARAMETER_ERROR);
219c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
220c29fa5a6Sopenharmony_ci    if (eventListener_.find(networkId) != eventListener_.end() &&
221c29fa5a6Sopenharmony_ci        eventListener_[networkId].find(listener) != eventListener_[networkId].end()) {
222c29fa5a6Sopenharmony_ci        FI_HILOGE("This listener for networkId:%{public}s already exists", Utility::Anonymize(networkId).c_str());
223c29fa5a6Sopenharmony_ci        return RET_ERR;
224c29fa5a6Sopenharmony_ci    }
225c29fa5a6Sopenharmony_ci    RegisterEventListenerParam param { networkId };
226c29fa5a6Sopenharmony_ci    DefaultReply reply;
227c29fa5a6Sopenharmony_ci    if (int32_t ret = tunnel.AddWatch(Intention::COOPERATE, CooperateRequestID::REGISTER_EVENT_LISTENER, param, reply);
228c29fa5a6Sopenharmony_ci        ret != RET_OK) {
229c29fa5a6Sopenharmony_ci        FI_HILOGE("RegisterEventListener failed, ret:%{public}d", ret);
230c29fa5a6Sopenharmony_ci        return ret;
231c29fa5a6Sopenharmony_ci    }
232c29fa5a6Sopenharmony_ci    eventListener_[networkId].insert(listener);
233c29fa5a6Sopenharmony_ci    FI_HILOGI("Add listener for networkId:%{public}s successfully", Utility::Anonymize(networkId).c_str());
234c29fa5a6Sopenharmony_ci    return RET_OK;
235c29fa5a6Sopenharmony_ci}
236c29fa5a6Sopenharmony_ci
237c29fa5a6Sopenharmony_ciint32_t CooperateClient::UnregisterEventListener(ITunnelClient &tunnel,
238c29fa5a6Sopenharmony_ci    const std::string &networkId, MouseLocationListenerPtr listener)
239c29fa5a6Sopenharmony_ci{
240c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
241c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
242c29fa5a6Sopenharmony_ci    if (eventListener_.find(networkId) == eventListener_.end()) {
243c29fa5a6Sopenharmony_ci        FI_HILOGE("No listener for networkId:%{public}s is registered", Utility::Anonymize(networkId).c_str());
244c29fa5a6Sopenharmony_ci        return RET_ERR;
245c29fa5a6Sopenharmony_ci    }
246c29fa5a6Sopenharmony_ci    if (eventListener_.find(networkId) != eventListener_.end() && listener != nullptr &&
247c29fa5a6Sopenharmony_ci        eventListener_[networkId].find(listener) == eventListener_[networkId].end()) {
248c29fa5a6Sopenharmony_ci        FI_HILOGE("Current listener for networkId:%{public}s is not registered", Utility::Anonymize(networkId).c_str());
249c29fa5a6Sopenharmony_ci        return RET_ERR;
250c29fa5a6Sopenharmony_ci    }
251c29fa5a6Sopenharmony_ci    if (listener == nullptr) {
252c29fa5a6Sopenharmony_ci        eventListener_.erase(networkId);
253c29fa5a6Sopenharmony_ci        FI_HILOGI("Remove all listener for networkId:%{public}s", Utility::Anonymize(networkId).c_str());
254c29fa5a6Sopenharmony_ci    } else {
255c29fa5a6Sopenharmony_ci        eventListener_[networkId].erase(listener);
256c29fa5a6Sopenharmony_ci        FI_HILOGI("Remove listener for networkId:%{public}s", Utility::Anonymize(networkId).c_str());
257c29fa5a6Sopenharmony_ci        if (eventListener_[networkId].empty()) {
258c29fa5a6Sopenharmony_ci            eventListener_.erase(networkId);
259c29fa5a6Sopenharmony_ci            FI_HILOGD("No listener for networkId:%{public}s, clean current networkId",
260c29fa5a6Sopenharmony_ci                Utility::Anonymize(networkId).c_str());
261c29fa5a6Sopenharmony_ci        }
262c29fa5a6Sopenharmony_ci    }
263c29fa5a6Sopenharmony_ci    if (eventListener_.find(networkId) != eventListener_.end()) {
264c29fa5a6Sopenharmony_ci        FI_HILOGD("UnregisterEventListener for networkId:%{public}s successfully",
265c29fa5a6Sopenharmony_ci            Utility::Anonymize(networkId).c_str());
266c29fa5a6Sopenharmony_ci        return RET_OK;
267c29fa5a6Sopenharmony_ci    }
268c29fa5a6Sopenharmony_ci    UnregisterEventListenerParam param { networkId };
269c29fa5a6Sopenharmony_ci    DefaultReply reply;
270c29fa5a6Sopenharmony_ci    if (int32_t ret = tunnel.RemoveWatch(Intention::COOPERATE,
271c29fa5a6Sopenharmony_ci        CooperateRequestID::UNREGISTER_EVENT_LISTENER, param, reply); ret != RET_OK) {
272c29fa5a6Sopenharmony_ci        FI_HILOGE("UnregisterEventListener failed, ret:%{public}d", ret);
273c29fa5a6Sopenharmony_ci        return ret;
274c29fa5a6Sopenharmony_ci    }
275c29fa5a6Sopenharmony_ci    FI_HILOGD("Unregister all Listener for networkId:%{public}s successfully", Utility::Anonymize(networkId).c_str());
276c29fa5a6Sopenharmony_ci    return RET_OK;
277c29fa5a6Sopenharmony_ci}
278c29fa5a6Sopenharmony_ci
279c29fa5a6Sopenharmony_ciint32_t CooperateClient::AddHotAreaListener(ITunnelClient &tunnel, HotAreaListenerPtr listener)
280c29fa5a6Sopenharmony_ci{
281c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
282c29fa5a6Sopenharmony_ci    CHKPR(listener, RET_ERR);
283c29fa5a6Sopenharmony_ci    if (std::find(devHotAreaListener_.begin(), devHotAreaListener_.end(), listener) != devHotAreaListener_.end()) {
284c29fa5a6Sopenharmony_ci        FI_HILOGD("Current listener is registered already");
285c29fa5a6Sopenharmony_ci        return RET_ERR;
286c29fa5a6Sopenharmony_ci    }
287c29fa5a6Sopenharmony_ci    RegisterHotAreaListenerParam param { GenerateRequestID(), false };
288c29fa5a6Sopenharmony_ci    DefaultReply reply;
289c29fa5a6Sopenharmony_ci    if (int32_t ret = tunnel.AddWatch(Intention::COOPERATE,
290c29fa5a6Sopenharmony_ci        CooperateRequestID::REGISTER_HOTAREA_LISTENER, param, reply); ret != RET_OK) {
291c29fa5a6Sopenharmony_ci        FI_HILOGE("AddHotAreaListener failed, ret:%{public}d", ret);
292c29fa5a6Sopenharmony_ci        return ret;
293c29fa5a6Sopenharmony_ci    }
294c29fa5a6Sopenharmony_ci    devHotAreaListener_.push_back(listener);
295c29fa5a6Sopenharmony_ci    return RET_OK;
296c29fa5a6Sopenharmony_ci}
297c29fa5a6Sopenharmony_ci
298c29fa5a6Sopenharmony_ciint32_t CooperateClient::RemoveHotAreaListener(ITunnelClient &tunnel, HotAreaListenerPtr listener)
299c29fa5a6Sopenharmony_ci{
300c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
301c29fa5a6Sopenharmony_ci    if (listener != nullptr &&
302c29fa5a6Sopenharmony_ci        std::find(devHotAreaListener_.begin(), devHotAreaListener_.end(), listener) == devHotAreaListener_.end()) {
303c29fa5a6Sopenharmony_ci        FI_HILOGD("Current listener is not registered");
304c29fa5a6Sopenharmony_ci        return RET_ERR;
305c29fa5a6Sopenharmony_ci    }
306c29fa5a6Sopenharmony_ci    if (listener == nullptr) {
307c29fa5a6Sopenharmony_ci        devHotAreaListener_.clear();
308c29fa5a6Sopenharmony_ci    } else {
309c29fa5a6Sopenharmony_ci        for (auto it = devHotAreaListener_.begin(); it != devHotAreaListener_.end(); ++it) {
310c29fa5a6Sopenharmony_ci            if (*it == listener) {
311c29fa5a6Sopenharmony_ci                devHotAreaListener_.erase(it);
312c29fa5a6Sopenharmony_ci            }
313c29fa5a6Sopenharmony_ci        }
314c29fa5a6Sopenharmony_ci    }
315c29fa5a6Sopenharmony_ci    if (!devHotAreaListener_.empty()) {
316c29fa5a6Sopenharmony_ci        FI_HILOGI("RemoveHotAreaListener successfully");
317c29fa5a6Sopenharmony_ci        return RET_OK;
318c29fa5a6Sopenharmony_ci    }
319c29fa5a6Sopenharmony_ci    UnregisterHotAreaListenerParam param { GenerateRequestID(), false };
320c29fa5a6Sopenharmony_ci    DefaultReply reply;
321c29fa5a6Sopenharmony_ci    if (int32_t ret = tunnel.RemoveWatch(Intention::COOPERATE,
322c29fa5a6Sopenharmony_ci        CooperateRequestID::UNREGISTER_HOTAREA_LISTENER, param, reply); ret != RET_OK) {
323c29fa5a6Sopenharmony_ci        FI_HILOGE("RemoveHotAreaListener failed, ret:%{public}d", ret);
324c29fa5a6Sopenharmony_ci        return ret;
325c29fa5a6Sopenharmony_ci    }
326c29fa5a6Sopenharmony_ci    FI_HILOGI("Remove all hot area listener successfully");
327c29fa5a6Sopenharmony_ci    return RET_OK;
328c29fa5a6Sopenharmony_ci}
329c29fa5a6Sopenharmony_ci
330c29fa5a6Sopenharmony_ciint32_t CooperateClient::GenerateRequestID()
331c29fa5a6Sopenharmony_ci{
332c29fa5a6Sopenharmony_ci    static int32_t requestId { 0 };
333c29fa5a6Sopenharmony_ci
334c29fa5a6Sopenharmony_ci    if (requestId == std::numeric_limits<int32_t>::max()) {
335c29fa5a6Sopenharmony_ci        FI_HILOGE("Request ID exceeds the maximum");
336c29fa5a6Sopenharmony_ci        requestId = 0;
337c29fa5a6Sopenharmony_ci    }
338c29fa5a6Sopenharmony_ci    return requestId++;
339c29fa5a6Sopenharmony_ci}
340c29fa5a6Sopenharmony_ci
341c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnCoordinationListener(const StreamClient &client, NetPacket &pkt)
342c29fa5a6Sopenharmony_ci{
343c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
344c29fa5a6Sopenharmony_ci    int32_t userData = 0;
345c29fa5a6Sopenharmony_ci    std::string networkId;
346c29fa5a6Sopenharmony_ci    int32_t nType = 0;
347c29fa5a6Sopenharmony_ci    pkt >> userData >> networkId >> nType;
348c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
349c29fa5a6Sopenharmony_ci        FI_HILOGE("Packet read type failed");
350c29fa5a6Sopenharmony_ci        return RET_ERR;
351c29fa5a6Sopenharmony_ci    }
352c29fa5a6Sopenharmony_ci    FI_HILOGI("NetworkId:%{public}s, nType:%{public}d", Utility::Anonymize(networkId).c_str(), nType);
353c29fa5a6Sopenharmony_ci    OnDevCooperateListener(networkId, CoordinationMessage(nType));
354c29fa5a6Sopenharmony_ci    return RET_OK;
355c29fa5a6Sopenharmony_ci}
356c29fa5a6Sopenharmony_ci
357c29fa5a6Sopenharmony_civoid CooperateClient::OnDevCooperateListener(const std::string &networkId, CoordinationMessage msg)
358c29fa5a6Sopenharmony_ci{
359c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
360c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
361c29fa5a6Sopenharmony_ci    for (const auto &item : devCooperateListener_) {
362c29fa5a6Sopenharmony_ci        item->OnCoordinationMessage(networkId, msg);
363c29fa5a6Sopenharmony_ci    }
364c29fa5a6Sopenharmony_ci}
365c29fa5a6Sopenharmony_ci
366c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnCoordinationMessage(const StreamClient &client, NetPacket &pkt)
367c29fa5a6Sopenharmony_ci{
368c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
369c29fa5a6Sopenharmony_ci    int32_t userData = 0;
370c29fa5a6Sopenharmony_ci    std::string networkId;
371c29fa5a6Sopenharmony_ci    int32_t nType = 0;
372c29fa5a6Sopenharmony_ci    int32_t errCode = -1;
373c29fa5a6Sopenharmony_ci    pkt >> userData >> networkId >> nType >> errCode;
374c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
375c29fa5a6Sopenharmony_ci        FI_HILOGE("Packet read coordination msg failed");
376c29fa5a6Sopenharmony_ci        return RET_ERR;
377c29fa5a6Sopenharmony_ci    }
378c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
379c29fa5a6Sopenharmony_ci    FinishTrace(userData, CoordinationMessage(nType));
380c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
381c29fa5a6Sopenharmony_ci    FI_HILOGI("NetworkId:%{public}s, nType:%{public}d", Utility::Anonymize(networkId).c_str(), nType);
382c29fa5a6Sopenharmony_ci    CoordinationMsgInfo msgInfo {
383c29fa5a6Sopenharmony_ci        .msg = static_cast<CoordinationMessage> (nType),
384c29fa5a6Sopenharmony_ci        .errCode = errCode
385c29fa5a6Sopenharmony_ci    };
386c29fa5a6Sopenharmony_ci    OnCooperateMessageEvent(userData, networkId, msgInfo);
387c29fa5a6Sopenharmony_ci    return RET_OK;
388c29fa5a6Sopenharmony_ci}
389c29fa5a6Sopenharmony_ci
390c29fa5a6Sopenharmony_civoid CooperateClient::OnCooperateMessageEvent(int32_t userData,
391c29fa5a6Sopenharmony_ci    const std::string &networkId, const CoordinationMsgInfo &msgInfo)
392c29fa5a6Sopenharmony_ci{
393c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
394c29fa5a6Sopenharmony_ci    CHK_PID_AND_TID();
395c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
396c29fa5a6Sopenharmony_ci    auto iter = devCooperateEvent_.find(userData);
397c29fa5a6Sopenharmony_ci    if (iter == devCooperateEvent_.end()) {
398c29fa5a6Sopenharmony_ci        return;
399c29fa5a6Sopenharmony_ci    }
400c29fa5a6Sopenharmony_ci    CooperateMessageCallback callback = iter->second.msgCb;
401c29fa5a6Sopenharmony_ci    CHKPV(callback);
402c29fa5a6Sopenharmony_ci    callback(networkId, msgInfo);
403c29fa5a6Sopenharmony_ci    devCooperateEvent_.erase(iter);
404c29fa5a6Sopenharmony_ci}
405c29fa5a6Sopenharmony_ci
406c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnCoordinationState(const StreamClient &client, NetPacket &pkt)
407c29fa5a6Sopenharmony_ci{
408c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
409c29fa5a6Sopenharmony_ci    int32_t userData = 0;
410c29fa5a6Sopenharmony_ci    bool state = false;
411c29fa5a6Sopenharmony_ci    int32_t errCode = -1;
412c29fa5a6Sopenharmony_ci    pkt >> userData >> state >> errCode;
413c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
414c29fa5a6Sopenharmony_ci        FI_HILOGE("Packet read coordination msg failed");
415c29fa5a6Sopenharmony_ci        return RET_ERR;
416c29fa5a6Sopenharmony_ci    }
417c29fa5a6Sopenharmony_ci    FI_HILOGI("State%{public}s", state ? "true" : "false");
418c29fa5a6Sopenharmony_ci    OnCooperateStateEvent(userData, state);
419c29fa5a6Sopenharmony_ci    return RET_OK;
420c29fa5a6Sopenharmony_ci}
421c29fa5a6Sopenharmony_ci
422c29fa5a6Sopenharmony_civoid CooperateClient::OnCooperateStateEvent(int32_t userData, bool state)
423c29fa5a6Sopenharmony_ci{
424c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
425c29fa5a6Sopenharmony_ci    CHK_PID_AND_TID();
426c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
427c29fa5a6Sopenharmony_ci    auto iter = devCooperateEvent_.find(userData);
428c29fa5a6Sopenharmony_ci    if (iter == devCooperateEvent_.end()) {
429c29fa5a6Sopenharmony_ci        return;
430c29fa5a6Sopenharmony_ci    }
431c29fa5a6Sopenharmony_ci    CooperateStateCallback event = iter->second.stateCb;
432c29fa5a6Sopenharmony_ci    CHKPV(event);
433c29fa5a6Sopenharmony_ci    event(state);
434c29fa5a6Sopenharmony_ci    devCooperateEvent_.erase(iter);
435c29fa5a6Sopenharmony_ci    FI_HILOGD("Coordination state event callback, userData:%{public}d, state:(%{public}d)", userData, state);
436c29fa5a6Sopenharmony_ci}
437c29fa5a6Sopenharmony_ci
438c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnHotAreaListener(const StreamClient &client, NetPacket &pkt)
439c29fa5a6Sopenharmony_ci{
440c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
441c29fa5a6Sopenharmony_ci    int32_t positionX = 0;
442c29fa5a6Sopenharmony_ci    int32_t positionY = 0;
443c29fa5a6Sopenharmony_ci    int32_t type = 0;
444c29fa5a6Sopenharmony_ci    bool isEdge = false;
445c29fa5a6Sopenharmony_ci    pkt >> positionX >> positionY >> type >> isEdge;
446c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
447c29fa5a6Sopenharmony_ci        FI_HILOGE("Packet read type failed");
448c29fa5a6Sopenharmony_ci        return RET_ERR;
449c29fa5a6Sopenharmony_ci    }
450c29fa5a6Sopenharmony_ci    OnDevHotAreaListener(positionX, positionY, HotAreaType(type), isEdge);
451c29fa5a6Sopenharmony_ci    return RET_OK;
452c29fa5a6Sopenharmony_ci}
453c29fa5a6Sopenharmony_ci
454c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnMouseLocationListener(const StreamClient &client, NetPacket &pkt)
455c29fa5a6Sopenharmony_ci{
456c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
457c29fa5a6Sopenharmony_ci    std::string networkId;
458c29fa5a6Sopenharmony_ci    Event event;
459c29fa5a6Sopenharmony_ci    pkt >> networkId >> event.displayX >> event.displayY >> event.displayWidth >> event.displayHeight;
460c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
461c29fa5a6Sopenharmony_ci        FI_HILOGE("Packet read type failed");
462c29fa5a6Sopenharmony_ci        return RET_ERR;
463c29fa5a6Sopenharmony_ci    }
464c29fa5a6Sopenharmony_ci    OnDevMouseLocationListener(networkId, event);
465c29fa5a6Sopenharmony_ci    return RET_OK;
466c29fa5a6Sopenharmony_ci}
467c29fa5a6Sopenharmony_ci
468c29fa5a6Sopenharmony_civoid CooperateClient::OnDevHotAreaListener(int32_t displayX,
469c29fa5a6Sopenharmony_ci    int32_t displayY, HotAreaType type, bool isEdge)
470c29fa5a6Sopenharmony_ci{
471c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
472c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
473c29fa5a6Sopenharmony_ci    for (const auto &item : devHotAreaListener_) {
474c29fa5a6Sopenharmony_ci        item->OnHotAreaMessage(displayX, displayY, type, isEdge);
475c29fa5a6Sopenharmony_ci    }
476c29fa5a6Sopenharmony_ci}
477c29fa5a6Sopenharmony_ci
478c29fa5a6Sopenharmony_civoid CooperateClient::OnDevMouseLocationListener(const std::string &networkId, const Event &event)
479c29fa5a6Sopenharmony_ci{
480c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
481c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mtx_);
482c29fa5a6Sopenharmony_ci    if (eventListener_.find(networkId) == eventListener_.end()) {
483c29fa5a6Sopenharmony_ci        FI_HILOGI("No listener for networkId:%{public}s is registered", Utility::Anonymize(networkId).c_str());
484c29fa5a6Sopenharmony_ci        return;
485c29fa5a6Sopenharmony_ci    }
486c29fa5a6Sopenharmony_ci    for (const auto &listener : eventListener_[networkId]) {
487c29fa5a6Sopenharmony_ci            CHKPC(listener);
488c29fa5a6Sopenharmony_ci            listener->OnMouseLocationEvent(networkId, event);
489c29fa5a6Sopenharmony_ci            FI_HILOGD("Trigger listener for networkId:%{public}s,"
490c29fa5a6Sopenharmony_ci            "displayX:%{public}d, displayY:%{public}d, displayWidth:%{public}d, displayHeight:%{public}d",
491c29fa5a6Sopenharmony_ci                Utility::Anonymize(networkId).c_str(), event.displayX, event.displayY,
492c29fa5a6Sopenharmony_ci                event.displayWidth, event.displayHeight);
493c29fa5a6Sopenharmony_ci    }
494c29fa5a6Sopenharmony_ci}
495c29fa5a6Sopenharmony_ci
496c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
497c29fa5a6Sopenharmony_ciint32_t CooperateClient::GetFirstSuccessIndex()
498c29fa5a6Sopenharmony_ci{
499c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
500c29fa5a6Sopenharmony_ci    size_t durationLen = performanceInfo_.durationList.size();
501c29fa5a6Sopenharmony_ci    for (size_t i = 0; i < durationLen; ++i) {
502c29fa5a6Sopenharmony_ci        if (performanceInfo_.durationList[i] != FAILURE_DURATION) {
503c29fa5a6Sopenharmony_ci            performanceInfo_.successNum = 1;
504c29fa5a6Sopenharmony_ci            FI_HILOGI("[PERF] First success index:%{public}zu", i);
505c29fa5a6Sopenharmony_ci            return static_cast<int32_t>(i);
506c29fa5a6Sopenharmony_ci        }
507c29fa5a6Sopenharmony_ci    }
508c29fa5a6Sopenharmony_ci    return INVALID_INDEX;
509c29fa5a6Sopenharmony_ci}
510c29fa5a6Sopenharmony_civoid CooperateClient::StartTrace(int32_t userData)
511c29fa5a6Sopenharmony_ci{
512c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
513c29fa5a6Sopenharmony_ci    std::lock_guard guard { performanceLock_ };
514c29fa5a6Sopenharmony_ci    performanceInfo_.traces_.emplace(userData, std::chrono::steady_clock::now());
515c29fa5a6Sopenharmony_ci    performanceInfo_.activateNum += 1;
516c29fa5a6Sopenharmony_ci    FI_HILOGI("[PERF] Start tracing \'%{public}d\'", userData);
517c29fa5a6Sopenharmony_ci}
518c29fa5a6Sopenharmony_ci
519c29fa5a6Sopenharmony_civoid CooperateClient::FinishTrace(int32_t userData, CoordinationMessage msg)
520c29fa5a6Sopenharmony_ci{
521c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
522c29fa5a6Sopenharmony_ci    std::lock_guard guard { performanceLock_ };
523c29fa5a6Sopenharmony_ci    if (msg == CoordinationMessage::ACTIVATE_SUCCESS) {
524c29fa5a6Sopenharmony_ci        if (auto iter = performanceInfo_.traces_.find(userData); iter != performanceInfo_.traces_.end()) {
525c29fa5a6Sopenharmony_ci            auto curDuration = std::chrono::duration_cast<std::chrono::milliseconds>(
526c29fa5a6Sopenharmony_ci                std::chrono::steady_clock::now() - iter->second).count();
527c29fa5a6Sopenharmony_ci            FI_HILOGI("[PERF] Finish tracing \'%{public}d\', elapsed: %{public}lld ms", userData, curDuration);
528c29fa5a6Sopenharmony_ci            performanceInfo_.traces_.erase(iter);
529c29fa5a6Sopenharmony_ci            performanceInfo_.durationList.push_back(curDuration);
530c29fa5a6Sopenharmony_ci        } else {
531c29fa5a6Sopenharmony_ci            FI_HILOGW("[PERF] FinishTrace with something wrong");
532c29fa5a6Sopenharmony_ci        }
533c29fa5a6Sopenharmony_ci    } else if (msg == CoordinationMessage::ACTIVATE_FAIL) {
534c29fa5a6Sopenharmony_ci        FI_HILOGW("[PERF] Activate coordination failed");
535c29fa5a6Sopenharmony_ci        performanceInfo_.traces_.erase(userData);
536c29fa5a6Sopenharmony_ci        performanceInfo_.durationList.push_back(FAILURE_DURATION);
537c29fa5a6Sopenharmony_ci    }
538c29fa5a6Sopenharmony_ci}
539c29fa5a6Sopenharmony_ci
540c29fa5a6Sopenharmony_civoid CooperateClient::DumpPerformanceInfo()
541c29fa5a6Sopenharmony_ci{
542c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
543c29fa5a6Sopenharmony_ci    std::lock_guard guard { performanceLock_ };
544c29fa5a6Sopenharmony_ci    int32_t firstSuccessIndex = GetFirstSuccessIndex();
545c29fa5a6Sopenharmony_ci    int32_t durationLen = static_cast<int32_t>(performanceInfo_.durationList.size());
546c29fa5a6Sopenharmony_ci    if (firstSuccessIndex < 0 || firstSuccessIndex >= durationLen) {
547c29fa5a6Sopenharmony_ci        FI_HILOGE("[PERF] DumpPerformanceInfo failed, invalid first success index");
548c29fa5a6Sopenharmony_ci        return;
549c29fa5a6Sopenharmony_ci    }
550c29fa5a6Sopenharmony_ci    performanceInfo_.failNum = firstSuccessIndex;
551c29fa5a6Sopenharmony_ci    performanceInfo_.failBeforeSuccess = firstSuccessIndex;
552c29fa5a6Sopenharmony_ci    performanceInfo_.firstSuccessDuration = performanceInfo_.durationList[firstSuccessIndex];
553c29fa5a6Sopenharmony_ci    int32_t successDurationSumWithoutFirst { 0 };
554c29fa5a6Sopenharmony_ci    for (int32_t i = firstSuccessIndex + 1; i < durationLen; i++) {
555c29fa5a6Sopenharmony_ci        if (performanceInfo_.durationList[i] != FAILURE_DURATION) {
556c29fa5a6Sopenharmony_ci            successDurationSumWithoutFirst += performanceInfo_.durationList[i];
557c29fa5a6Sopenharmony_ci            performanceInfo_.minDuration = std::min(performanceInfo_.durationList[i], performanceInfo_.minDuration);
558c29fa5a6Sopenharmony_ci            performanceInfo_.maxDuration = std::max(performanceInfo_.durationList[i], performanceInfo_.maxDuration);
559c29fa5a6Sopenharmony_ci            performanceInfo_.successNum += 1;
560c29fa5a6Sopenharmony_ci        } else {
561c29fa5a6Sopenharmony_ci            performanceInfo_.failNum += 1;
562c29fa5a6Sopenharmony_ci        }
563c29fa5a6Sopenharmony_ci    }
564c29fa5a6Sopenharmony_ci    int32_t validActivateNum = performanceInfo_.activateNum - performanceInfo_.failBeforeSuccess;
565c29fa5a6Sopenharmony_ci    if (validActivateNum > 0) {
566c29fa5a6Sopenharmony_ci        performanceInfo_.successRate = (static_cast<float>(performanceInfo_.successNum) * PERCENTAGE) /
567c29fa5a6Sopenharmony_ci            validActivateNum;
568c29fa5a6Sopenharmony_ci    }
569c29fa5a6Sopenharmony_ci    if (int32_t successNumWithoutFirst = performanceInfo_.successNum - 1; successNumWithoutFirst > 0) {
570c29fa5a6Sopenharmony_ci        performanceInfo_.averageDuration = successDurationSumWithoutFirst / successNumWithoutFirst;
571c29fa5a6Sopenharmony_ci    }
572c29fa5a6Sopenharmony_ci    FI_HILOGI("[PERF] performanceInfo:"
573c29fa5a6Sopenharmony_ci        "activateNum:%{public}d successNum:%{public}d failNum:%{public}d successRate:%{public}.2f "
574c29fa5a6Sopenharmony_ci        "averageDuration:%{public}d ms maxDuration:%{public}d ms minDuration:%{public}d ms failBeforeSucc:%{public}d "
575c29fa5a6Sopenharmony_ci        "firstSuccessDuration:%{public}d ms",
576c29fa5a6Sopenharmony_ci        performanceInfo_.activateNum, performanceInfo_.successNum, performanceInfo_.failNum,
577c29fa5a6Sopenharmony_ci        performanceInfo_.successRate, performanceInfo_.averageDuration, performanceInfo_.maxDuration,
578c29fa5a6Sopenharmony_ci        performanceInfo_.minDuration, performanceInfo_.failBeforeSuccess, performanceInfo_.firstSuccessDuration);
579c29fa5a6Sopenharmony_ci    std::string durationStr;
580c29fa5a6Sopenharmony_ci    for (auto duration : performanceInfo_.durationList) {
581c29fa5a6Sopenharmony_ci        durationStr += std::to_string(duration) + ", ";
582c29fa5a6Sopenharmony_ci    }
583c29fa5a6Sopenharmony_ci    FI_HILOGI("[PERF] Duration: %{public}s", durationStr.c_str());
584c29fa5a6Sopenharmony_ci    performanceInfo_ = PerformanceInfo();
585c29fa5a6Sopenharmony_ci}
586c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
587c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
588c29fa5a6Sopenharmony_ci} // namespace Msdp
589c29fa5a6Sopenharmony_ci} // namespace OHOS
590