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