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