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