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(¤t, &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