• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022-2023 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 #define LOG_TAG "HiViewAdapter"
17 
18 #include "hiview_adapter.h"
19 
20 #include <algorithm>
21 #include <unistd.h>
22 #include <pthread.h>
23 #include <thread>
24 
25 #include "def.h"
26 #include "pasteboard_hilog.h"
27 #include "pasteboard_error.h"
28 #include "time_service_client.h"
29 
30 namespace OHOS {
31 using namespace HiviewDFX;
32 namespace MiscServices {
33 namespace {
34 const std::map<int, std::string> EVENT_COVERT_TABLE = {
35     { DfxCodeConstant::PASTEBOARD_FAULT, "PASTEBOARD_FAULT" },
36     { DfxCodeConstant::TIME_CONSUMING_STATISTIC, "TIME_CONSUMING_STATISTIC" },
37     { DfxCodeConstant::PASTEBOARD_BEHAVIOUR, "PASTEBOARD_BEHAVIOUR" },
38     { DfxCodeConstant::USE_BEHAVIOUR, "USE_BEHAVIOUR" },
39 };
40 } // namespace
41 
42 bool HiViewAdapter::running_ = false;
43 std::mutex HiViewAdapter::runMutex_;
44 std::mutex HiViewAdapter::timeConsumingMutex_;
45 std::mutex HiViewAdapter::behaviourMutex_;
46 std::vector<std::map<int, int>> HiViewAdapter::copyTimeConsumingStat_;
47 std::vector<std::map<int, int>> HiViewAdapter::pasteTimeConsumingStat_;
48 std::vector<std::map<int, int>> HiViewAdapter::remotePasteTimeConsumingStat_;
49 
50 std::map<std::string, int> HiViewAdapter::copyPasteboardBehaviour_;
51 std::map<std::string, int> HiViewAdapter::pastePasteboardBehaviour_;
52 std::map<std::string, int> HiViewAdapter::remotePastePasteboardBehaviour_;
53 
54 std::map<int, int> HiViewAdapter::dataMap_ = HiViewAdapter::InitDataMap();
55 std::map<int, int> HiViewAdapter::timeMap_ = HiViewAdapter::InitTimeMap();
56 
InitDataMap()57 std::map<int, int> HiViewAdapter::InitDataMap()
58 {
59     std::map<int, int> dataMap;
60     dataMap.insert(std::pair<int, int>(
61         static_cast<int>(DataRange::DR_ZERO_TO_HUNDRED_KB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_ONE)));
62     dataMap.insert(std::pair<int, int>(static_cast<int>(DataRange::DR_HUNDRED_TO_FIVE_HUNDREDS_KB),
63         static_cast<int>(DataConsumingLevel::DATA_LEVEL_TWO)));
64     dataMap.insert(std::pair<int, int>(static_cast<int>(DataRange::DR_FIVE_HUNDREDS_TO_THOUSAND_KB),
65         static_cast<int>(DataConsumingLevel::DATA_LEVEL_THREE)));
66     dataMap.insert(std::pair<int, int>(
67         static_cast<int>(DataRange::DR_ONE_TO_FIVE_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_FOUR)));
68     dataMap.insert(std::pair<int, int>(
69         static_cast<int>(DataRange::DR_FIVE_TO_TEN_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_FIVE)));
70     dataMap.insert(std::pair<int, int>(
71         static_cast<int>(DataRange::DR_TEN_TO_FIFTY_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_SIX)));
72     dataMap.insert(std::pair<int, int>(
73         static_cast<int>(DataRange::DR_OVER_FIFTY_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_SEVEN)));
74     return dataMap;
75 }
76 
InitTimeMap()77 std::map<int, int> HiViewAdapter::InitTimeMap()
78 {
79     std::map<int, int> timeMap;
80     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_ONE),
81         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ONE)));
82     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_TWO),
83         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TWO)));
84     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_THREE),
85         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_THREE)));
86     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_FOUR),
87         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FOUR)));
88     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_FIVE),
89         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FIVE)));
90     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_SIX),
91         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SIX)));
92     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_SEVEN),
93         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SEVEN)));
94     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_EIGHT),
95         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_EIGHT)));
96     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_NINE),
97         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_NINE)));
98     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_TEN),
99         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TEN)));
100     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_ELEVEN),
101         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ELEVEN)));
102     return timeMap;
103 }
104 
ReportPasteboardFault(int dfxCode,const PasteboardFaultMsg & msg)105 void HiViewAdapter::ReportPasteboardFault(int dfxCode, const PasteboardFaultMsg &msg)
106 {
107     constexpr const char *USER_ID = "USER_ID";
108     constexpr const char *ERROR_TYPE = "ERROR_TYPE";
109     int ret = HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::PASTEBOARD, CoverEventID(dfxCode),
110         HiSysEvent::EventType::FAULT, USER_ID, msg.userId, ERROR_TYPE, msg.errorCode);
111     if (ret != 0) {
112         PASTEBOARD_HILOGD(
113             PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret %{public}d. errCode %{public}d", ret, dfxCode);
114     }
115 }
116 
InitializeTimeConsuming(int initFlag)117 void HiViewAdapter::InitializeTimeConsuming(int initFlag)
118 {
119     constexpr const int DATA_LEVEL_NUMBERS = 7;
120     std::map<int, int> initTimeConsuming;
121     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ONE), 0));
122     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TWO), 0));
123     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_THREE), 0));
124     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FOUR), 0));
125     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FIVE), 0));
126     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SIX), 0));
127     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SEVEN), 0));
128     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_EIGHT), 0));
129     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_NINE), 0));
130     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TEN), 0));
131     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ELEVEN), 0));
132 
133     if (initFlag == INIT_COPY_TIME_SONSUMING) {
134         for (int i = 0; i < DATA_LEVEL_NUMBERS; ++i) {
135             copyTimeConsumingStat_.push_back(initTimeConsuming);
136             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "copyTimeConsumingStat_.push_back");
137         }
138     } else if (initFlag == INIT_PASTE_TIME_SONSUMING) {
139         for (int i = 0; i < DATA_LEVEL_NUMBERS; ++i) {
140             pasteTimeConsumingStat_.push_back(initTimeConsuming);
141             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "pasteTimeConsumingStat_.push_back");
142         }
143     } else {
144         for (int i = 0; i < DATA_LEVEL_NUMBERS; ++i) {
145             remotePasteTimeConsumingStat_.push_back(initTimeConsuming);
146             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "remotePasteTimeConsumingStat_.push_back");
147         }
148     }
149 }
150 
ReportTimeConsumingStatistic(const TimeConsumingStat & stat)151 void HiViewAdapter::ReportTimeConsumingStatistic(const TimeConsumingStat &stat)
152 {
153     std::lock_guard<std::mutex> lock(timeConsumingMutex_);
154     if (copyTimeConsumingStat_.empty()) {
155         InitializeTimeConsuming(INIT_COPY_TIME_SONSUMING);
156     }
157     if (pasteTimeConsumingStat_.empty()) {
158         InitializeTimeConsuming(INIT_PASTE_TIME_SONSUMING);
159     }
160     if (remotePasteTimeConsumingStat_.empty()) {
161         InitializeTimeConsuming(INIT_REMOTE_PASTE_TIME_SONSUMING);
162     }
163 
164     if (stat.pasteboardState == static_cast<int>(StatisticPasteboardState::SPS_COPY_STATE)) {
165         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent pasteboard state is %{public}d", stat.pasteboardState);
166         auto iter = dataMap_.find(stat.dataSize);
167         if (iter != dataMap_.end()) {
168             CopyTimeConsuming(stat, iter->second);
169         } else {
170             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong data level");
171         }
172     } else if ((stat.pasteboardState == static_cast<int>(StatisticPasteboardState::SPS_PASTE_STATE)) ||
173                (stat.pasteboardState == static_cast<int>(StatisticPasteboardState::SPS_REMOTE_PASTE_STATE))) {
174         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent pasteboard state is %{public}d", stat.pasteboardState);
175         auto iter = dataMap_.find(stat.dataSize);
176         if (iter != dataMap_.end()) {
177             PasteTimeConsuming(stat, iter->second);
178         } else {
179             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong data level");
180         }
181     } else {
182         PASTEBOARD_HILOGD(
183             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong pasteboard state! errCode %{public}d", stat.pasteboardState);
184     }
185 }
186 
CopyTimeConsumingCount(int dataLevel,int timeLevel)187 void HiViewAdapter::CopyTimeConsumingCount(int dataLevel, int timeLevel)
188 {
189     if (static_cast<int>(copyTimeConsumingStat_.size()) <= dataLevel) {
190         return;
191     }
192     auto it = copyTimeConsumingStat_[dataLevel].find(timeLevel);
193     if (it != copyTimeConsumingStat_[dataLevel].end()) {
194         (it->second)++;
195     } else {
196         PASTEBOARD_HILOGD(
197             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong copy time level, tiem level:  %{public}d", timeLevel);
198     }
199 }
200 
PasteTimeConsumingCount(int dataLevel,int timeLevel)201 void HiViewAdapter::PasteTimeConsumingCount(int dataLevel, int timeLevel)
202 {
203     if (static_cast<int>(pasteTimeConsumingStat_.size()) <= dataLevel) {
204         return;
205     }
206     auto it = pasteTimeConsumingStat_[dataLevel].find(timeLevel);
207     if (it != pasteTimeConsumingStat_[dataLevel].end()) {
208         (it->second)++;
209     } else {
210         PASTEBOARD_HILOGD(
211             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong copy time level, tiem level:  %{public}d", timeLevel);
212     }
213 }
214 
RemotePasteTimeConsumingCount(int dataLevel,int timeLevel)215 void HiViewAdapter::RemotePasteTimeConsumingCount(int dataLevel, int timeLevel)
216 {
217     if (static_cast<int>(remotePasteTimeConsumingStat_.size()) <= dataLevel) {
218         return;
219     }
220     auto it = remotePasteTimeConsumingStat_[dataLevel].find(timeLevel);
221     if (it != remotePasteTimeConsumingStat_[dataLevel].end()) {
222         (it->second)++;
223     } else {
224         PASTEBOARD_HILOGD(
225             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong copy time level, tiem level:  %{public}d", timeLevel);
226     }
227 }
228 
CopyTimeConsuming(const TimeConsumingStat & stat,int level)229 void HiViewAdapter::CopyTimeConsuming(const TimeConsumingStat &stat, int level)
230 {
231     auto iter = timeMap_.find(stat.timeConsuming);
232     if (iter != timeMap_.end()) {
233         CopyTimeConsumingCount(level, iter->second);
234     } else {
235         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong time level");
236     }
237 }
238 
PasteTimeConsuming(const TimeConsumingStat & stat,int level)239 void HiViewAdapter::PasteTimeConsuming(const TimeConsumingStat &stat, int level)
240 {
241     auto iter = timeMap_.find(stat.timeConsuming);
242     if (iter != timeMap_.end()) {
243         if (stat.pasteboardState == SPS_PASTE_STATE) {
244             PasteTimeConsumingCount(level, iter->second);
245         } else {
246             RemotePasteTimeConsumingCount(level, iter->second);
247         }
248     } else {
249         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong time level");
250     }
251 }
252 
ReportPasteboardBehaviour(const PasteboardBehaviourMsg & msg)253 void HiViewAdapter::ReportPasteboardBehaviour(const PasteboardBehaviourMsg &msg)
254 {
255     std::lock_guard<std::mutex> lock(behaviourMutex_);
256 
257     if (msg.pasteboardState == static_cast<int>(BehaviourPasteboardState::BPS_COPY_STATE)) {
258         auto it = copyPasteboardBehaviour_.find(msg.bundleName);
259         if (it != copyPasteboardBehaviour_.end()) {
260             (it->second)++;
261         } else {
262             copyPasteboardBehaviour_.insert(std::pair<std::string, int>(msg.bundleName, 1));
263         }
264     } else if (msg.pasteboardState == static_cast<int>(BehaviourPasteboardState::BPS_PASTE_STATE)) {
265         auto it = pastePasteboardBehaviour_.find(msg.bundleName);
266         if (it != pastePasteboardBehaviour_.end()) {
267             (it->second)++;
268         } else {
269             pastePasteboardBehaviour_.insert(std::pair<std::string, int>(msg.bundleName, 1));
270         }
271     } else if (msg.pasteboardState == static_cast<int>(BehaviourPasteboardState::BPS_REMOTE_PASTE_STATE)) {
272         auto it = remotePastePasteboardBehaviour_.find(msg.bundleName);
273         if (it != remotePastePasteboardBehaviour_.end()) {
274             (it->second)++;
275         } else {
276             remotePastePasteboardBehaviour_.insert(std::pair<std::string, int>(msg.bundleName, 1));
277         }
278     } else {
279         PASTEBOARD_HILOGD(
280             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong pasteboard state! errCode %{public}d", msg.pasteboardState);
281     }
282 }
283 
GetDataLevel(int dataLevel)284 const char *HiViewAdapter::GetDataLevel(int dataLevel)
285 {
286     constexpr const char *WRONG_LEVEL = "WRONG_LEVEL";
287     switch (dataLevel) {
288         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_ONE): {
289             return ZERO_TO_HUNDRED_KB;
290         }
291         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_TWO): {
292             return HUNDRED_TO_FIVE_HUNDREDS_KB;
293         }
294         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_THREE): {
295             return FIVE_HUNDREDS_TO_THOUSAND_KB;
296         }
297         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_FOUR): {
298             return ONE_TO_FIVE_MB;
299         }
300         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_FIVE): {
301             return FIVE_TO_TEN_MB;
302         }
303         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_SIX): {
304             return TEN_TO_FIFTY_MB;
305         }
306         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_SEVEN): {
307             return OVER_FIFTY_MB;
308         }
309         default: {
310             return WRONG_LEVEL;
311         }
312     }
313 }
314 
InvokeTimeConsuming()315 void HiViewAdapter::InvokeTimeConsuming()
316 {
317     std::lock_guard<std::mutex> lock(timeConsumingMutex_);
318     ReportStatisticEvent(copyTimeConsumingStat_, COPY_STATE);
319     copyTimeConsumingStat_.clear();
320     ReportStatisticEvent(pasteTimeConsumingStat_, PASTE_STATE);
321     pasteTimeConsumingStat_.clear();
322     ReportStatisticEvent(remotePasteTimeConsumingStat_, REMOTE_PASTE_STATE);
323     remotePasteTimeConsumingStat_.clear();
324 }
325 
ReportStatisticEvent(const std::vector<std::map<int,int>> & timeConsumingStat,const std::string & pasteboardState)326 void HiViewAdapter::ReportStatisticEvent(
327     const std::vector<std::map<int, int>> &timeConsumingStat, const std::string &pasteboardState)
328 {
329     if (timeConsumingStat.empty()) {
330         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent timeConsumingStat is empty.");
331         return;
332     }
333     for (std::int32_t i = 0; i < static_cast<int>(timeConsumingStat.size()); ++i) {
334         std::string buffMsg = ": [";
335         for (std::int32_t j = TimeConsumingLevel::TIME_LEVEL_ONE; j <= TimeConsumingLevel::TIME_LEVEL_ELEVEN; ++j) {
336             buffMsg = buffMsg + std::to_string(timeConsumingStat[i].at(j)) + ",";
337         }
338         buffMsg += "]";
339 
340         int ret = -1;
341         if (pasteboardState == REMOTE_PASTE_STATE) {
342             std::string netType = "WIFI";
343             ret = HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::PASTEBOARD,
344                 CoverEventID(DfxCodeConstant::TIME_CONSUMING_STATISTIC),
345                 HiSysEvent::EventType::STATISTIC, PASTEBOARD_STATE, pasteboardState, NET_TYPE, netType, DATA_LEVEL,
346                 GetDataLevel(i), CONSUMING_DATA, buffMsg);
347         } else {
348             ret = HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::PASTEBOARD,
349                 CoverEventID(DfxCodeConstant::TIME_CONSUMING_STATISTIC),
350                 HiSysEvent::EventType::STATISTIC, PASTEBOARD_STATE, pasteboardState, DATA_LEVEL, GetDataLevel(i),
351                 CONSUMING_DATA, buffMsg);
352         }
353 
354         if (ret != HiviewDFX::SUCCESS) {
355             PASTEBOARD_HILOGD(
356                 PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret = %{public}d, i = %{public}d.", ret, i);
357         }
358     }
359 }
360 
ReportBehaviour(std::map<std::string,int> & behaviour,const char * pasteboardState)361 void HiViewAdapter::ReportBehaviour(std::map<std::string, int> &behaviour, const char *pasteboardState)
362 {
363     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ReportBehaviour  enter");
364     if (!behaviour.empty()) {
365         std::vector<std::pair<std::string, int>> vec;
366         constexpr const int TOTAL_APP_NUMBERS = 10;
367 
368         for (auto it = behaviour.begin(); it != behaviour.end(); ++it) {
369             vec.push_back(std::pair<std::string, int>(it->first, it->second));
370         }
371         // sort
372         sort(vec.begin(), vec.end(),
373             [](std::pair<std::string, int> a, std::pair<std::string, int> b) { return a.second > b.second; });
374 
375         std::vector<std::string> appPackName;
376         for (int i = 0; i < TOTAL_APP_NUMBERS; ++i) {
377             appPackName.push_back("default");
378         }
379 
380         int index = 0;
381         for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
382             appPackName[index] = iter->first + " :" + std::to_string(iter->second);
383             ++index;
384         }
385         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ReportBehaviour report  ");
386         int ret = HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::PASTEBOARD,
387             CoverEventID(DfxCodeConstant::PASTEBOARD_BEHAVIOUR),
388             HiSysEvent::EventType::BEHAVIOR, PASTEBOARD_STATE, pasteboardState, TOP_ONE_APP, appPackName[0],
389             TOP_TOW_APP, appPackName[1], TOP_THREE_APP, appPackName[2], TOP_FOUR_APP, appPackName[3], TOP_FIVE_APP,
390             appPackName[4], TOP_SIX_APP, appPackName[5], TOP_SEVEN_APP, appPackName[6], TOP_EIGHT_APP, appPackName[7],
391             TOP_NINE_APP, appPackName[8], TOP_TEN_APP, appPackName[9]);
392         if (ret != HiviewDFX::SUCCESS) {
393             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret %{public}d.", ret);
394         }
395     } else {
396         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "behaviour is empty!");
397     }
398     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ReportBehaviour end");
399 }
400 
InvokePasteBoardBehaviour()401 void HiViewAdapter::InvokePasteBoardBehaviour()
402 {
403     std::lock_guard<std::mutex> lock(behaviourMutex_);
404     if (!copyPasteboardBehaviour_.empty()) {
405         ReportBehaviour(copyPasteboardBehaviour_, COPY_STATE);
406         copyPasteboardBehaviour_.clear();
407     } else {
408         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "InvokePasteBoardBehaviour :copyPasteboardBehaviour_ is empty ");
409     }
410     if (!pastePasteboardBehaviour_.empty()) {
411         ReportBehaviour(pastePasteboardBehaviour_, PASTE_STATE);
412         pastePasteboardBehaviour_.clear();
413     } else {
414         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "InvokePasteBoardBehaviour :pastePasteboardBehaviour_ is empty ");
415     }
416     if (!remotePastePasteboardBehaviour_.empty()) {
417         ReportBehaviour(remotePastePasteboardBehaviour_, REMOTE_PASTE_STATE);
418         remotePastePasteboardBehaviour_.clear();
419     } else {
420         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "remotePastePasteboardBehaviour_ is empty ");
421     }
422 }
423 
StartTimerThread()424 void HiViewAdapter::StartTimerThread()
425 {
426     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread enter");
427     std::lock_guard<std::mutex> lock(runMutex_);
428     if (running_) {
429         return;
430     }
431     running_ = true;
432     auto fun = []() {
433         while (true) {
434             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread while");
435             time_t current = time(nullptr);
436             if (current == -1) {
437                 sleep(ONE_HOUR_IN_SECONDS);
438                 continue;
439             }
440 
441             tm localTime = { 0 };
442             tm *result = localtime_r(&current, &localTime);
443             if (result == nullptr) {
444                 sleep(ONE_HOUR_IN_SECONDS);
445                 continue;
446             }
447             int currentHour = localTime.tm_hour;
448             int currentMin = localTime.tm_min;
449             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread get");
450             if ((EXEC_MIN_TIME - currentMin) != EXEC_MIN_TIME) {
451                 int nHours = EXEC_HOUR_TIME - currentHour;
452                 int nMin = EXEC_MIN_TIME - currentMin;
453                 int nTime = (nMin)*ONE_MINUTE_IN_SECONDS + (nHours)*ONE_HOUR_IN_SECONDS;
454                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE,
455                     " StartTimerThread if needHours=%{public}d,needMin=%{public}d,needTime=%{public}d", nHours, nMin,
456                     nTime);
457                 sleep(nTime);
458                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread invoke");
459                 InvokePasteBoardBehaviour();
460                 InvokeTimeConsuming();
461             } else {
462                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread sleep");
463                 sleep(ONE_HOUR_IN_SECONDS * (ONE_DAY_IN_HOURS - currentHour));
464                 current = time(nullptr);
465                 InvokePasteBoardBehaviour();
466                 InvokeTimeConsuming();
467             }
468             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread end");
469         }
470     };
471     std::thread th = std::thread(fun);
472     pthread_setname_np(th.native_handle(), "HiViewReport");
473     th.detach();
474 }
475 
ReportUseBehaviour(PasteData & pastData,const char * state,int32_t result)476 void HiViewAdapter::ReportUseBehaviour(PasteData& pastData, const char* state, int32_t result)
477 {
478     std::string bundleName = pastData.GetBundleName();
479     std::string primaryMimeType = pastData.GetPrimaryMimeType() != nullptr? *pastData.GetPrimaryMimeType() : "null";
480     std::string shareOption;
481     PasteData::ShareOptionToString(pastData.GetShareOption(), shareOption);
482     auto isLocalPaste = pastData.IsLocalPaste();
483     auto isRemote = pastData.IsRemote();
484     std::thread thread([bundleName, primaryMimeType, shareOption, isLocalPaste, isRemote, state, result]() {
485         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "start.");
486         auto iter = PasteboardErrorMap.find(PasteboardError(result));
487         const char *appRet;
488         if (iter != PasteboardErrorMap.end()) {
489             appRet = iter->second;
490         } else {
491             PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Match error result: %{public}d.", result);
492             appRet = "MATCH ERROR";
493         }
494         int ret = HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::PASTEBOARD,
495             CoverEventID(DfxCodeConstant::USE_BEHAVIOUR),
496             HiSysEvent::EventType::BEHAVIOR, PASTEBOARD_STATE, state,
497             BOOTTIME, TimeServiceClient::GetInstance()->GetBootTimeMs(),
498             WALLTIME, TimeServiceClient::GetInstance()->GetWallTimeMs(),
499             RESULT, appRet,
500             OPERATE_APP, bundleName,
501             PRI_MIME_TYPE, primaryMimeType,
502             ISLOCALPASTE, isLocalPaste,
503             ISREMOTE, isRemote,
504             SHAREOPTION, shareOption);
505         if (ret != HiviewDFX::SUCCESS) {
506             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret %{public}d.", ret);
507         }
508         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "end.");
509     });
510     thread.detach();
511 }
512 
CoverEventID(int dfxCode)513 std::string HiViewAdapter::CoverEventID(int dfxCode)
514 {
515     std::string sysEventID = "";
516     auto operatorIter = EVENT_COVERT_TABLE.find(dfxCode);
517     if (operatorIter != EVENT_COVERT_TABLE.end()) {
518         sysEventID = operatorIter->second;
519     }
520     return sysEventID;
521 }
522 } // namespace MiscServices
523 } // namespace OHOS
524