1 /*
2 * Copyright (c) 2021-2024 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 "app_mgr_service_event_handler.h"
17
18 #include "app_mgr_service_inner.h"
19 #include "hilog_tag_wrapper.h"
20
21 namespace OHOS {
22 namespace AppExecFwk {
AMSEventHandler(const std::shared_ptr<AAFwk::TaskHandlerWrap> & taskHandler,const std::weak_ptr<AppMgrServiceInner> & appMgr)23 AMSEventHandler::AMSEventHandler(const std::shared_ptr<AAFwk::TaskHandlerWrap> &taskHandler,
24 const std::weak_ptr<AppMgrServiceInner> &appMgr)
25 : AAFwk::EventHandlerWrap(taskHandler), appMgr_(appMgr)
26 {
27 TAG_LOGI(AAFwkTag::APPMGR, "instance created");
28 }
29
~AMSEventHandler()30 AMSEventHandler::~AMSEventHandler()
31 {
32 TAG_LOGI(AAFwkTag::APPMGR, "instance destroyed");
33 }
34
ProcessEvent(const AAFwk::EventWrap & event)35 void AMSEventHandler::ProcessEvent(const AAFwk::EventWrap &event)
36 {
37 auto appManager = appMgr_.lock();
38 if (!appManager) {
39 TAG_LOGE(AAFwkTag::APPMGR, "null appManager");
40 return;
41 }
42 appManager->HandleTimeOut(event);
43 }
44
GetInstance()45 AppEventUtil &AppEventUtil::GetInstance()
46 {
47 static AppEventUtil instance;
48 return instance;
49 }
50
AddEvent(std::shared_ptr<AppRunningRecord> appRecord,uint32_t eventId,int64_t param)51 void AppEventUtil::AddEvent(std::shared_ptr<AppRunningRecord> appRecord, uint32_t eventId, int64_t param)
52 {
53 if (appRecord == nullptr) {
54 return;
55 }
56 std::lock_guard lock(appEventListMutex_);
57 appEventList_.emplace_back(eventId, param, appRecord);
58 }
59
HasEvent(std::shared_ptr<AppRunningRecord> appRecord,uint32_t eventId)60 bool AppEventUtil::HasEvent(std::shared_ptr<AppRunningRecord> appRecord, uint32_t eventId)
61 {
62 if (appRecord == nullptr) {
63 return false;
64 }
65 std::lock_guard lock(appEventListMutex_);
66 for (const auto &item : appEventList_) {
67 if (item.appRecord.lock() == appRecord && item.eventId == eventId) {
68 return true;
69 }
70 }
71 return false;
72 }
73
RemoveEvent(uint32_t eventId,int64_t param)74 std::shared_ptr<AppRunningRecord> AppEventUtil::RemoveEvent(uint32_t eventId, int64_t param)
75 {
76 std::lock_guard lock(appEventListMutex_);
77 for (auto it = appEventList_.begin(); it != appEventList_.end(); ++it) {
78 if (it->eventId == eventId && it->param == param) {
79 auto result = it->appRecord.lock();
80 appEventList_.erase(it);
81 return result;
82 }
83 }
84 return nullptr;
85 }
86
RemoveEvent(std::shared_ptr<AppRunningRecord> appRecord,uint32_t eventId)87 std::list<AppEventData> AppEventUtil::RemoveEvent(std::shared_ptr<AppRunningRecord> appRecord, uint32_t eventId)
88 {
89 std::list<AppEventData> result;
90 std::lock_guard lock(appEventListMutex_);
91 for (auto it = appEventList_.begin(); it != appEventList_.end();) {
92 auto appRecordItem = it->appRecord.lock();
93 if (appRecordItem == nullptr) {
94 it = appEventList_.erase(it);
95 continue;
96 }
97 if (appRecordItem == appRecord && it->eventId == eventId) {
98 result.emplace_back(*it);
99 it = appEventList_.erase(it);
100 continue;
101 }
102 ++it;
103 }
104 return result;
105 }
106 } // namespace AppExecFwk
107 } // namespace OHOS
108