1 /*
2 * Copyright (c) 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 #include <cinttypes>
17
18 #include "common_event_collect.h"
19
20 #include "ability_death_recipient.h"
21 #include "system_ability_manager_util.h"
22 #include "common_event_manager.h"
23 #include "common_event_support.h"
24 #include "matching_skills.h"
25 #include "parse_util.h"
26 #include "want.h"
27 #include "sam_log.h"
28 #include "sa_profiles.h"
29 #include "system_ability_manager.h"
30 #include "samgr_xcollie.h"
31
32 using namespace OHOS::AppExecFwk;
33 namespace OHOS {
34 namespace {
35 constexpr uint32_t INIT_EVENT = 10;
36 constexpr uint32_t SUB_COMMON_EVENT = 11;
37 constexpr uint32_t REMOVE_EXTRA_DATA_EVENT = 12;
38 constexpr uint32_t REMOVE_EXTRA_DATA_DELAY_TIME = 300000;
39 constexpr uint32_t UNSUB_DELAY_TIME = 10 * 1000;
40 constexpr int64_t MAX_EXTRA_DATA_ID = 1000000000;
41 constexpr int32_t COMMON_EVENT_SERVICE_ID = 3299;
42 constexpr const char* UID = "uid";
43 constexpr const char* NET_TYPE = "NetType";
44 constexpr const char* BUNDLE_NAME = "bundleName";
45 constexpr const char* COMMON_EVENT_ACTION_NAME = "common_event_action_name";
46 }
47
CommonEventCollect(const sptr<IReport> & report)48 CommonEventCollect::CommonEventCollect(const sptr<IReport>& report)
49 : ICollectPlugin(report)
50 {
51 }
52
RemoveWhiteCommonEvent()53 void CommonEventCollect::RemoveWhiteCommonEvent()
54 {
55 std::lock_guard<std::mutex> autoLock(commonEventStateLock_);
56 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED);
57 HILOGI("rm USER_UNLOCKED,size=%{public}zu", commonEventWhitelist.size());
58 }
59
CleanFfrt()60 void CommonEventCollect::CleanFfrt()
61 {
62 if (workHandler_ != nullptr) {
63 workHandler_->CleanFfrt();
64 }
65 if (unsubHandler_ != nullptr) {
66 unsubHandler_->CleanFfrt();
67 }
68 }
69
SetFfrt()70 void CommonEventCollect::SetFfrt()
71 {
72 if (workHandler_ != nullptr) {
73 workHandler_->SetFfrt();
74 }
75 if (unsubHandler_ != nullptr) {
76 unsubHandler_->SetFfrt();
77 }
78 }
79
OnStart()80 int32_t CommonEventCollect::OnStart()
81 {
82 HILOGI("CommonEventCollect OnStart called");
83 if (commonEventNames_.empty()) {
84 HILOGW("CommonEventCollect commonEventNames_ is empty");
85 return ERR_OK;
86 }
87
88 workHandler_ = std::make_shared<CommonHandler>(this);
89 unsubHandler_ = std::make_shared<CommonHandler>(this);
90 workHandler_->SendEvent(INIT_EVENT);
91 return ERR_OK;
92 }
93
OnStop()94 int32_t CommonEventCollect::OnStop()
95 {
96 if (workHandler_ != nullptr) {
97 workHandler_ = nullptr;
98 }
99 if (unsubHandler_ != nullptr) {
100 unsubHandler_ = nullptr;
101 }
102 return ERR_OK;
103 }
104
InitCommonEventState(const OnDemandEvent & event)105 void CommonEventCollect::InitCommonEventState(const OnDemandEvent& event)
106 {
107 if (event.eventId == COMMON_EVENT) {
108 std::lock_guard<std::mutex> autoLock(commomEventLock_);
109 commonEventNames_.insert(event.name);
110 for (auto [key, value] : event.extraMessages) {
111 extraDataKey_[event.name].insert(key);
112 }
113 }
114 for (auto& condition : event.conditions) {
115 if (condition.eventId != COMMON_EVENT) {
116 continue;
117 }
118 {
119 std::lock_guard<std::mutex> autoLock(commomEventLock_);
120 commonEventNames_.insert(condition.name);
121 }
122 if (condition.extraMessages.size() > 0) {
123 std::lock_guard<std::mutex> autoLock(commonEventStateLock_);
124 for (auto [key, value] : condition.extraMessages) {
125 commonEventConditionExtraData_[condition.name][key] = "";
126 }
127 }
128 }
129 }
130
Init(const std::list<SaProfile> & onDemandSaProfiles)131 void CommonEventCollect::Init(const std::list<SaProfile>& onDemandSaProfiles)
132 {
133 {
134 std::lock_guard<std::mutex> autoLock(commonEventStateLock_);
135 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
136 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING);
137 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
138 }
139 {
140 std::lock_guard<std::mutex> autoLock(commomEventLock_);
141 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
142 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
143 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_CHARGING);
144 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING);
145 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED);
146 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
147 commonEventNames_.insert(EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED);
148 }
149
150 for (auto& profile : onDemandSaProfiles) {
151 for (auto iterStart = profile.startOnDemand.onDemandEvents.begin();
152 iterStart != profile.startOnDemand.onDemandEvents.end(); iterStart++) {
153 InitCommonEventState(*iterStart);
154 }
155 for (auto iterStop = profile.stopOnDemand.onDemandEvents.begin();
156 iterStop != profile.stopOnDemand.onDemandEvents.end(); iterStop++) {
157 InitCommonEventState(*iterStop);
158 }
159 }
160 }
161
AddSkillsEvent(EventFwk::MatchingSkills & skill)162 void CommonEventCollect::AddSkillsEvent(EventFwk::MatchingSkills& skill)
163 {
164 std::lock_guard<std::mutex> autoLock(commomEventLock_);
165 for (auto& commonEventName : commonEventNames_) {
166 HILOGD("CommonEventCollect add event: %{public}s", commonEventName.c_str());
167 skill.AddEvent(commonEventName);
168 }
169 }
170
CleanFailedEventLocked(const std::string & eventName)171 void CommonEventCollect::CleanFailedEventLocked(const std::string& eventName)
172 {
173 if (commonEventSubscriber_ == nullptr) {
174 HILOGE("commonEventSubscriber_ is nullptr!");
175 return;
176 }
177 EventFwk::MatchingSkills skill = commonEventSubscriber_->GetSubscribeInfo().GetMatchingSkills();
178 skill.RemoveEvent(eventName);
179 std::lock_guard<std::mutex> autoLock(commomEventLock_);
180 commonEventNames_.erase(eventName);
181 }
182
CreateCommonEventSubscriber()183 bool CommonEventCollect::CreateCommonEventSubscriber()
184 {
185 std::lock_guard<std::mutex> autoLock(commonEventSubscriberLock_);
186 return CreateCommonEventSubscriberLocked();
187 }
188
CreateCommonEventSubscriberLocked()189 bool CommonEventCollect::CreateCommonEventSubscriberLocked()
190 {
191 int64_t begin = GetTickCount();
192 EventFwk::MatchingSkills skill = EventFwk::MatchingSkills();
193 AddSkillsEvent(skill);
194 EventFwk::CommonEventSubscribeInfo info(skill);
195 std::shared_ptr<EventFwk::CommonEventSubscriber> comEvtScrb = commonEventSubscriber_;
196 commonEventSubscriber_ = std::make_shared<CommonEventSubscriber>(info, this);
197 bool ret = EventFwk::CommonEventManager::SubscribeCommonEvent(commonEventSubscriber_);
198 HILOGI("SubsComEvt %{public}" PRId64 "ms %{public}s", (GetTickCount() - begin), ret ? "suc" : "fail");
199 if (comEvtScrb != nullptr) {
200 auto unsubTask = [comEvtScrb]() {
201 HILOGI("UnSubsComEvt start");
202 {
203 SamgrXCollie samgrXCollie("samgr--UnSubscribeCommonEvent");
204 bool isUnsubscribe = EventFwk::CommonEventManager::UnSubscribeCommonEvent(comEvtScrb);
205 if (!isUnsubscribe) {
206 HILOGE("CreateCommonEventSubscriberLocked isUnsubscribe failed!");
207 }
208 }
209 };
210 if (unsubHandler_ != nullptr) {
211 unsubHandler_->PostTask(unsubTask, UNSUB_DELAY_TIME);
212 } else {
213 HILOGE("CreateCommonEventSubscriberLocked unsubHandler is null!");
214 }
215 }
216 return ret;
217 }
218
SendEvent(uint32_t eventId)219 bool CommonEventCollect::SendEvent(uint32_t eventId)
220 {
221 if (workHandler_ == nullptr) {
222 HILOGI("CommonEventCollect workHandler is nullptr");
223 return false;
224 }
225 return workHandler_->SendEvent(eventId);
226 }
227
CommonEventListener(const sptr<CommonEventCollect> & commonEventCollect)228 CommonEventListener::CommonEventListener(const sptr<CommonEventCollect>& commonEventCollect)
229 : commonEventCollect_(commonEventCollect) {}
230
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)231 void CommonEventListener::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
232 {
233 if (commonEventCollect_ == nullptr) {
234 HILOGE("commonEventCollect_ is nullptr!");
235 return;
236 }
237 if (systemAbilityId == COMMON_EVENT_SERVICE_ID) {
238 HILOGI("CommonEventCollect ces is ready");
239 commonEventCollect_->SendEvent(SUB_COMMON_EVENT);
240 }
241 }
242
OnRemoveSystemAbility(int32_t systemAblityId,const std::string & deviceId)243 void CommonEventListener::OnRemoveSystemAbility(int32_t systemAblityId, const std::string& deviceId)
244 {
245 HILOGI("CommonEventListener OnRemoveSystemAblity systemAblityId:%{public}d", systemAblityId);
246 }
247
SaveAction(const std::string & action)248 void CommonEventCollect::SaveAction(const std::string& action)
249 {
250 std::lock_guard<std::mutex> autoLock(commonEventStateLock_);
251 if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON) {
252 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
253 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
254 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF) {
255 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
256 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
257 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_CHARGING) {
258 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_CHARGING);
259 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING);
260 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING) {
261 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING);
262 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_CHARGING);
263 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED) {
264 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED);
265 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
266 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED) {
267 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
268 commonEventWhitelist.erase(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED);
269 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED) {
270 commonEventWhitelist.insert(EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED);
271 }
272 }
273
CheckCondition(const OnDemandCondition & condition)274 bool CommonEventCollect::CheckCondition(const OnDemandCondition& condition)
275 {
276 std::lock_guard<std::mutex> autoLock(commonEventStateLock_);
277 std::map<std::string, std::string> stateMap = commonEventConditionExtraData_[condition.name];
278 for (auto [key, profileValue] : condition.extraMessages) {
279 if (!ParseUtil::CheckLogicRelationship(stateMap[key], profileValue)) {
280 return false;
281 }
282 }
283 if (commonEventConditionValue_[condition.name] != condition.value && condition.value != "") {
284 return false;
285 }
286 if (condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON ||
287 condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF ||
288 condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_CHARGING ||
289 condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING ||
290 condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED ||
291 condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED ||
292 condition.name == EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED) {
293 return commonEventWhitelist.count(condition.name) > 0;
294 }
295 return true;
296 }
297
CheckExtraMessage(int64_t extraDataId,const OnDemandEvent & profileEvent)298 bool CommonEventCollect::CheckExtraMessage(int64_t extraDataId, const OnDemandEvent& profileEvent)
299 {
300 OnDemandReasonExtraData extraData;
301 if (!GetOnDemandReasonExtraData(extraDataId, extraData)) {
302 return false;
303 }
304 std::map<std::string, std::string> eventExtraMessages = extraData.GetWant();
305 for (auto [key, profileValue] : profileEvent.extraMessages) {
306 if (!ParseUtil::CheckLogicRelationship(eventExtraMessages[key], profileValue)) {
307 return false;
308 }
309 }
310 return true;
311 }
312
GenerateExtraDataIdLocked()313 int64_t CommonEventCollect::GenerateExtraDataIdLocked()
314 {
315 extraDataId_++;
316 if (extraDataId_ > MAX_EXTRA_DATA_ID) {
317 extraDataId_ = 1;
318 }
319 return extraDataId_;
320 }
321
GetParamFromWant(const std::string & key,const AAFwk::Want & want)322 std::string CommonEventCollect::GetParamFromWant(const std::string& key, const AAFwk::Want& want)
323 {
324 std::string valueString;
325 int32_t valueInt = want.GetIntParam(key, -1);
326 if (valueInt == -1) {
327 valueString = want.GetStringParam(key);
328 } else {
329 valueString = std::to_string(valueInt);
330 }
331 if (want.GetBoolParam(key, false)) {
332 valueString = "true";
333 } else if (!want.GetBoolParam(key, true)) {
334 valueString = "false";
335 }
336 HILOGD("key:%{public}s || value:%{public}s", key.c_str(), valueString.c_str());
337 return valueString;
338 }
339
SaveOnDemandReasonExtraData(const EventFwk::CommonEventData & data)340 int64_t CommonEventCollect::SaveOnDemandReasonExtraData(const EventFwk::CommonEventData& data)
341 {
342 HILOGD("CommonEventCollect extraData code: %{public}d, data: %{public}s", data.GetCode(),
343 data.GetData().c_str());
344 AAFwk::Want want = data.GetWant();
345 auto keySet = want.GetParams().KeySet();
346 std::map<std::string, std::string> wantMap;
347 for (const auto& key : keySet) {
348 wantMap[key] = GetParamFromWant(key, want);
349 HILOGD("CommonEventCollect want key:%{public}s, val:%{public}s", key.c_str(), wantMap[key].c_str());
350 }
351 int32_t uid = want.GetIntParam(UID, -1);
352 int32_t netType = want.GetIntParam(NET_TYPE, -1);
353 wantMap[UID] = std::to_string(uid);
354 wantMap[NET_TYPE] = std::to_string(netType);
355 wantMap[BUNDLE_NAME] = want.GetBundle();
356 int64_t extraDataId = 0;
357 {
358 std::lock_guard<std::mutex> autoLock(extraDataLock_);
359 for (auto key : extraDataKey_[want.GetAction()]) {
360 wantMap[key] = GetParamFromWant(key, want);
361 }
362 wantMap[COMMON_EVENT_ACTION_NAME] = want.GetAction();
363 OnDemandReasonExtraData extraData(data.GetCode(), data.GetData(), wantMap);
364
365 extraDataId = GenerateExtraDataIdLocked();
366 extraDatas_[extraDataId] = extraData;
367 HILOGD("CommonEventCollect save extraData %{public}d,n:%{public}zu",
368 static_cast<int32_t>(extraDataId), extraDatas_.size());
369 }
370 if (workHandler_ == nullptr) {
371 HILOGI("CommonEventCollect workHandler is nullptr");
372 return -1;
373 }
374 workHandler_->SendEvent(REMOVE_EXTRA_DATA_EVENT, extraDataId, REMOVE_EXTRA_DATA_DELAY_TIME);
375 return extraDataId;
376 }
377
SaveOnDemandConditionExtraData(const EventFwk::CommonEventData & data)378 void CommonEventCollect::SaveOnDemandConditionExtraData(const EventFwk::CommonEventData& data)
379 {
380 std::lock_guard<std::mutex> autoLock(commonEventStateLock_);
381 AAFwk::Want want = data.GetWant();
382 commonEventConditionValue_[want.GetAction()] = std::to_string(data.GetCode());
383 for (auto& [key, value] : commonEventConditionExtraData_[want.GetAction()]) {
384 value = GetParamFromWant(key, want);
385 }
386 }
387
RemoveOnDemandReasonExtraData(int64_t extraDataId)388 void CommonEventCollect::RemoveOnDemandReasonExtraData(int64_t extraDataId)
389 {
390 {
391 std::lock_guard<std::mutex> autoLock(extraDataLock_);
392 extraDatas_.erase(extraDataId);
393 }
394 HILOGD("CommonEventCollect remove extraData %{public}d", static_cast<int32_t>(extraDataId));
395 RemoveSaExtraDataId(extraDataId);
396 }
397
GetOnDemandReasonExtraData(int64_t extraDataId,OnDemandReasonExtraData & extraData)398 bool CommonEventCollect::GetOnDemandReasonExtraData(int64_t extraDataId, OnDemandReasonExtraData& extraData)
399 {
400 std::lock_guard<std::mutex> autoLock(extraDataLock_);
401 HILOGD("CommonEventCollect get extraData %{public}d", static_cast<int32_t>(extraDataId));
402 if (extraDatas_.count(extraDataId) == 0) {
403 return false;
404 }
405 extraData = extraDatas_[extraDataId];
406 return true;
407 }
408
SaveCacheCommonEventSaExtraId(const OnDemandEvent & event,const std::list<SaControlInfo> & saControlList)409 void CommonEventCollect::SaveCacheCommonEventSaExtraId(const OnDemandEvent& event,
410 const std::list<SaControlInfo>& saControlList)
411 {
412 std::list<int32_t> saList = SamgrUtil::GetCacheCommonEventSa(event, saControlList);
413 if (saList.empty()) {
414 return;
415 }
416 for (auto& item : saList) {
417 SaveSaExtraDataId(item, event.extraDataId);
418 }
419 }
420
SaveSaExtraDataId(int32_t saId,int64_t extraDataId)421 void CommonEventCollect::SaveSaExtraDataId(int32_t saId, int64_t extraDataId)
422 {
423 std::lock_guard<std::mutex> autoLock(saExtraDataIdLock_);
424 auto& extraIdList = saExtraDataIdMap_[saId];
425 extraIdList.emplace_back(extraDataId);
426 HILOGI("save SA:%{public}d,exId:%{public}d,n:%{public}zu", saId, static_cast<int32_t>(extraDataId),
427 extraIdList.size());
428 }
429
RemoveSaExtraDataId(int64_t extraDataId)430 void CommonEventCollect::RemoveSaExtraDataId(int64_t extraDataId)
431 {
432 std::lock_guard<std::mutex> autoLock(saExtraDataIdLock_);
433 HILOGD("rm saExtraId:%{public}d", static_cast<int32_t>(extraDataId));
434 auto iter = saExtraDataIdMap_.begin();
435 while (iter != saExtraDataIdMap_.end()) {
436 auto& tmpList = iter->second;
437 auto listIter = std::find(tmpList.begin(), tmpList.end(), extraDataId);
438 if (listIter != tmpList.end()) {
439 HILOGI("rm SA:%{public}d,exId:%{public}d,n:%{public}zu", iter->first,
440 static_cast<int32_t>(extraDataId), tmpList.size());
441 tmpList.erase(listIter);
442 }
443 if (tmpList.size() == 0) {
444 HILOGI("rm exId SA:%{public}d", iter->first);
445 iter = saExtraDataIdMap_.erase(iter);
446 } else {
447 ++iter;
448 }
449 }
450 }
451
ClearSaExtraDataId(int32_t saId)452 void CommonEventCollect::ClearSaExtraDataId(int32_t saId)
453 {
454 std::lock_guard<std::mutex> autoLock(saExtraDataIdLock_);
455 if (saExtraDataIdMap_.count(saId) == 0) {
456 return;
457 }
458 HILOGI("clear SA:%{public}d,map n:%{public}zu", saId, saExtraDataIdMap_.size());
459 saExtraDataIdMap_[saId].clear();
460 saExtraDataIdMap_.erase(saId);
461 }
462
GetSaExtraDataIdList(int32_t saId,std::vector<int64_t> & extraDataidList,const std::string & eventName)463 int32_t CommonEventCollect::GetSaExtraDataIdList(int32_t saId, std::vector<int64_t>& extraDataidList,
464 const std::string& eventName)
465 {
466 std::list<int64_t> temp;
467 {
468 std::lock_guard<std::mutex> autoLock(saExtraDataIdLock_);
469 if (saExtraDataIdMap_.count(saId) == 0) {
470 HILOGD("NF exId SA:%{public}d", saId);
471 return ERR_OK;
472 }
473 HILOGD("get exId SA:%{public}d event:%{public}s", saId, eventName.c_str());
474 temp = saExtraDataIdMap_[saId];
475 }
476 if (eventName == "") {
477 std::copy(temp.begin(), temp.end(), std::back_inserter(extraDataidList));
478 return ERR_OK;
479 }
480 for (auto& item : temp) {
481 OnDemandReasonExtraData extraData;
482 if (!GetOnDemandReasonExtraData(item, extraData)) {
483 HILOGD("NF exId:%{public}d", static_cast<int32_t>(item));
484 continue;
485 }
486 std::map<std::string, std::string> want = extraData.GetWant();
487 std::string extraEventName = want[COMMON_EVENT_ACTION_NAME];
488 if (extraEventName != eventName) {
489 HILOGD("exId:%{public}d event:%{public}s not match extra:%{public}s", static_cast<int32_t>(item),
490 eventName.c_str(), extraEventName.c_str());
491 continue;
492 }
493 HILOGD("get exId:%{public}d", static_cast<int32_t>(item));
494 extraDataidList.push_back(item);
495 }
496 return ERR_OK;
497 }
498
AddCommonEventName(const std::string & eventName)499 bool CommonEventCollect::AddCommonEventName(const std::string& eventName)
500 {
501 std::lock_guard<std::mutex> autoLock(commomEventLock_);
502 auto iter = commonEventNames_.find(eventName);
503 if (iter != commonEventNames_.end()) {
504 return false;
505 }
506 HILOGI("CommonEventCollect add collect events: %{public}s", eventName.c_str());
507 commonEventNames_.insert(eventName);
508 return true;
509 }
510
AddCollectEvent(const OnDemandEvent & event)511 int32_t CommonEventCollect::AddCollectEvent(const OnDemandEvent& event)
512 {
513 std::lock_guard<std::mutex> autoLock(commonEventSubscriberLock_);
514 bool isInsertEventName = AddCommonEventName(event.name);
515 if (!CreateCommonEventSubscriberLocked()) {
516 if (isInsertEventName) {
517 CleanFailedEventLocked(event.name);
518 CreateCommonEventSubscriberLocked();
519 }
520 HILOGE("AddCollectEvent CreateCommonEventSubscriber failed!");
521 return ERR_INVALID_VALUE;
522 }
523 return ERR_OK;
524 }
525
RemoveUnusedEvent(const OnDemandEvent & event)526 int32_t CommonEventCollect::RemoveUnusedEvent(const OnDemandEvent& event)
527 {
528 std::lock_guard<std::mutex> autoLock(commomEventLock_);
529 auto iter = commonEventNames_.find(event.name);
530 if (iter != commonEventNames_.end()) {
531 HILOGI("CommonEventCollect remove event name: %{public}s", event.name.c_str());
532 commonEventNames_.erase(iter);
533 }
534 return ERR_OK;
535 }
536
PostTask(std::function<void ()> func,uint64_t delayTime)537 bool CommonHandler::PostTask(std::function<void()> func, uint64_t delayTime)
538 {
539 if (handler_ == nullptr) {
540 HILOGE("CommonEventCollect PostTask handler is null!");
541 return false;
542 }
543 return handler_->PostTask(func, delayTime);
544 }
CleanFfrt()545 void CommonHandler::CleanFfrt()
546 {
547 if (handler_ != nullptr) {
548 handler_->CleanFfrt();
549 }
550 }
551
SetFfrt()552 void CommonHandler::SetFfrt()
553 {
554 if (handler_ != nullptr) {
555 handler_->SetFfrt("CommonHandler");
556 }
557 }
558
ProcessEvent(uint32_t eventId,int64_t extraDataId)559 void CommonHandler::ProcessEvent(uint32_t eventId, int64_t extraDataId)
560 {
561 if (commonCollect_ == nullptr) {
562 HILOGE("CommonEventCollect ProcessEvent collect or event is null!");
563 return;
564 }
565 if (eventId != INIT_EVENT && eventId != REMOVE_EXTRA_DATA_EVENT && eventId != SUB_COMMON_EVENT) {
566 HILOGE("CommonEventCollect ProcessEvent error event code!");
567 return;
568 }
569 auto commonCollect = commonCollect_.promote();
570 if (commonCollect == nullptr) {
571 HILOGE("CommonEventCollect collect is nullptr");
572 return;
573 }
574 if (eventId == REMOVE_EXTRA_DATA_EVENT) {
575 commonCollect->RemoveOnDemandReasonExtraData(extraDataId);
576 return;
577 }
578 if (eventId == SUB_COMMON_EVENT) {
579 if (!commonCollect->CreateCommonEventSubscriber()) {
580 HILOGE("OnAddSystemAbility CreateCommonEventSubscriber failed!");
581 }
582 return;
583 }
584 sptr<CommonEventListener> listener = new CommonEventListener(commonCollect);
585 SystemAbilityManager::GetInstance()->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, listener);
586 }
587
SendEvent(uint32_t eventId)588 bool CommonHandler::SendEvent(uint32_t eventId)
589 {
590 if (handler_ == nullptr) {
591 HILOGE("CommonEventCollect SendEvent handler is null!");
592 return false;
593 }
594 auto task = [this, eventId] {this->ProcessEvent(eventId, 0);};
595 return handler_->PostTask(task);
596 }
597
SendEvent(uint32_t eventId,int64_t extraDataId,uint64_t delayTime)598 bool CommonHandler::SendEvent(uint32_t eventId, int64_t extraDataId, uint64_t delayTime)
599 {
600 if (handler_ == nullptr) {
601 HILOGE("CommonEventCollect SendEvent handler is null!");
602 return false;
603 }
604 auto task = [this, eventId, extraDataId] {this->ProcessEvent(eventId, extraDataId);};
605 return handler_->PostTask(task, delayTime);
606 }
607
CommonEventSubscriber(const EventFwk::CommonEventSubscribeInfo & subscribeInfo,const sptr<CommonEventCollect> & collect)608 CommonEventSubscriber::CommonEventSubscriber(const EventFwk::CommonEventSubscribeInfo& subscribeInfo,
609 const sptr<CommonEventCollect>& collect)
610 :EventFwk::CommonEventSubscriber(subscribeInfo), collect_(collect) {}
611
OnReceiveEvent(const EventFwk::CommonEventData & data)612 void CommonEventSubscriber::OnReceiveEvent(const EventFwk::CommonEventData& data)
613 {
614 SamgrXCollie samgrXCollie("samgr--OnReceiveEvent");
615 std::string action = data.GetWant().GetAction();
616 int32_t code = data.GetCode();
617 auto collect = collect_.promote();
618 if (collect == nullptr) {
619 HILOGE("CommonEventCollect collect is nullptr");
620 return;
621 }
622 collect->SaveAction(action);
623 int64_t extraDataId = collect->SaveOnDemandReasonExtraData(data);
624 HILOGI("RecvEvent:%{public}s,%{public}d_%{public}d", action.c_str(), code, static_cast<int32_t>(extraDataId));
625 collect->SaveOnDemandConditionExtraData(data);
626 OnDemandEvent event = {COMMON_EVENT, action, std::to_string(code), extraDataId};
627 collect->ReportEvent(event);
628 }
629 } // namespace OHOS
630