• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 #include "bg_transient_task_mgr.h"
17 
18 #include <file_ex.h>
19 #include <ipc_skeleton.h>
20 #include <sstream>
21 #include <system_ability.h>
22 #include <system_ability_definition.h>
23 
24 #include "bundle_mgr_proxy.h"
25 #include "common_event_data.h"
26 #include "common_event_manager.h"
27 #include "common_event_support.h"
28 #include "if_system_ability_manager.h"
29 #include "iservice_registry.h"
30 #include "want.h"
31 
32 #include "background_task_mgr_service.h"
33 #include "bgtaskmgr_inner_errors.h"
34 #include "time_provider.h"
35 #include "transient_task_log.h"
36 
37 using namespace std;
38 
39 namespace OHOS {
40 namespace BackgroundTaskMgr {
41 namespace {
42 static const std::string ALL_BGTASKMGR_OPTION = "All";
43 static const std::string LOW_BATTARY_OPTION = "BATTARY_LOW";
44 static const std::string OKAY_BATTARY_OPTION = "BATTARY_OKAY";
45 static const std::string CANCEL_DUMP_OPTION = "DUMP_CANCEL";
46 
47 constexpr int32_t BG_INVALID_REMAIN_TIME = -1;
48 constexpr int32_t WATCHDOG_DELAY_TIME = 6 * MSEC_PER_SEC;
49 constexpr int32_t SERVICE_WAIT_TIME = 2000;
50 }
51 
BgTransientTaskMgr()52 BgTransientTaskMgr::BgTransientTaskMgr() {}
~BgTransientTaskMgr()53 BgTransientTaskMgr::~BgTransientTaskMgr() {}
54 
Init()55 void BgTransientTaskMgr::Init()
56 {
57     runner_ = AppExecFwk::EventRunner::Create(true);
58     if (!runner_) {
59         BGTASK_LOGE("Failed to init due to create runner error");
60         return;
61     }
62     handler_ = std::make_shared<AppExecFwk::EventHandler>(runner_);
63     if (!handler_) {
64         BGTASK_LOGE("Failed to init due to create handler error");
65     }
66     callbackDeathRecipient_ = new (std::nothrow)
67         ExpiredCallbackDeathRecipient(DelayedSingleton<BackgroundTaskMgrService>::GetInstance().get());
68     susriberDeathRecipient_ = new (std::nothrow)
69         SubscriberDeathRecipient(DelayedSingleton<BackgroundTaskMgrService>::GetInstance().get());
70 
71     InitNecessaryState();
72 }
73 
InitNecessaryState()74 void BgTransientTaskMgr::InitNecessaryState()
75 {
76     sptr<ISystemAbilityManager> systemAbilityManager
77         = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
78     if (systemAbilityManager == nullptr
79         || systemAbilityManager->CheckSystemAbility(APP_MGR_SERVICE_ID) == nullptr
80         || systemAbilityManager->CheckSystemAbility(COMMON_EVENT_SERVICE_ID) == nullptr
81         || systemAbilityManager->CheckSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID) == nullptr) {
82         isReady_.store(false);
83         BGTASK_LOGI("request system service is not ready yet!");
84         std::function <void()> InitNecessaryStateFunc = std::bind(&BgTransientTaskMgr::InitNecessaryState, this);
85         handler_->PostTask(InitNecessaryStateFunc, SERVICE_WAIT_TIME);
86         return;
87     }
88 
89     deviceInfoManeger_ = make_shared<DeviceInfoManager>();
90     timerManager_ = make_shared<TimerManager>(DelayedSingleton<BackgroundTaskMgrService>::GetInstance().get());
91     decisionMaker_ = make_shared<DecisionMaker>(timerManager_, deviceInfoManeger_);
92     watchdog_ = make_shared<Watchdog>(DelayedSingleton<BackgroundTaskMgrService>::GetInstance().get(), decisionMaker_);
93 
94     inputManager_ = make_shared<InputManager>();
95     if (inputManager_ == nullptr) {
96         BGTASK_LOGE("Fail to make inputManager");
97         return;
98     }
99     inputManager_->RegisterEventHub();
100     inputManager_->RegisterEventListener(deviceInfoManeger_);
101     inputManager_->RegisterEventListener(decisionMaker_);
102     isReady_.store(true);
103 }
104 
GetBundleNamesForUid(int32_t uid,std::string & bundleName)105 bool BgTransientTaskMgr::GetBundleNamesForUid(int32_t uid, std::string &bundleName)
106 {
107     sptr<ISystemAbilityManager> systemMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
108     if (systemMgr == nullptr) {
109         BGTASK_LOGE("Fail to get system ability mgr");
110         return false;
111     }
112 
113     sptr<IRemoteObject> remoteObject = systemMgr->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
114     if (remoteObject == nullptr) {
115         BGTASK_LOGE("Fail to get bundle manager proxy");
116         return false;
117     }
118 
119     sptr<OHOS::AppExecFwk::IBundleMgr> bundleMgrProxy = iface_cast<OHOS::AppExecFwk::IBundleMgr>(remoteObject);
120     if (bundleMgrProxy == nullptr) {
121         BGTASK_LOGE("Bundle mgr proxy is nullptr");
122         return false;
123     }
124 
125     if (!bundleMgrProxy->GetBundleNameForUid(uid, bundleName)) {
126         BGTASK_LOGE("Get bundle name failed");
127         return false;
128     }
129     return true;
130 }
131 
IsCallingInfoLegal(int32_t uid,int32_t pid,std::string & name,const sptr<IExpiredCallback> & callback)132 ErrCode BgTransientTaskMgr::IsCallingInfoLegal(int32_t uid, int32_t pid, std::string &name,
133     const sptr<IExpiredCallback>& callback)
134 {
135     if (!VerifyCallingInfo(uid, pid)) {
136         BGTASK_LOGE("pid or uid is invalid.");
137         return ERR_BGTASK_INVALID_PID_OR_UID;
138     }
139 
140     if (!GetBundleNamesForUid(uid, name)) {
141         BGTASK_LOGE("GetBundleNamesForUid fail.");
142         return ERR_BGTASK_INVALID_BUNDLE_NAME;
143     }
144 
145     if (callback == nullptr) {
146         BGTASK_LOGE("callback is null.");
147         return ERR_BGTASK_INVALID_CALLBACK;
148     }
149 
150     if (callback->AsObject() == nullptr) {
151         BGTASK_LOGE("remote in callback is null.");
152         return ERR_BGTASK_INVALID_CALLBACK;
153     }
154     return ERR_OK;
155 }
156 
RequestSuspendDelay(const std::u16string & reason,const sptr<IExpiredCallback> & callback,std::shared_ptr<DelaySuspendInfo> & delayInfo)157 ErrCode BgTransientTaskMgr::RequestSuspendDelay(const std::u16string& reason,
158     const sptr<IExpiredCallback>& callback, std::shared_ptr<DelaySuspendInfo> &delayInfo)
159 {
160     if (!isReady_.load()) {
161         BGTASK_LOGW("Transient task manager is not ready.");
162         return ERR_BGTASK_SYS_NOT_READY;
163     }
164     auto uid = IPCSkeleton::GetCallingUid();
165     auto pid = IPCSkeleton::GetCallingPid();
166     std::string name = "";
167     ErrCode ret = IsCallingInfoLegal(uid, pid, name, callback);
168     if (ret != ERR_OK) {
169         BGTASK_LOGI("Request suspend delay failed, calling info is illegal.");
170         return ret;
171     }
172     BGTASK_LOGD("request suspend delay pkg : %{public}s, reason : %{public}s, uid : %{public}d, pid : %{public}d",
173         name.c_str(), Str16ToStr8(reason).c_str(), uid, pid);
174 
175     auto infoEx = make_shared<DelaySuspendInfoEx>(pid);
176     delayInfo = infoEx;
177     auto remote = callback->AsObject();
178     lock_guard<mutex> lock(expiredCallbackLock_);
179     auto findCallback = [&callback](const auto& callbackMap) {
180         return callback->AsObject() == callbackMap.second->AsObject();
181     };
182 
183     auto callbackIter = find_if(expiredCallbackMap_.begin(), expiredCallbackMap_.end(), findCallback);
184     if (callbackIter != expiredCallbackMap_.end()) {
185         BGTASK_LOGI("%{public}s request suspend failed, callback is already exists.", name.c_str());
186         return ERR_BGTASK_CALLBACK_EXISTS;
187     }
188 
189     auto keyInfo = make_shared<KeyInfo>(name, uid, pid);
190     ret = decisionMaker_->Decide(keyInfo, infoEx);
191     if (ret != ERR_OK) {
192         BGTASK_LOGI("%{public}s request suspend failed.", name.c_str());
193         return ret;
194     }
195     BGTASK_LOGI("request suspend success, pkg : %{public}s, uid : %{public}d, requestId: %{public}d,"
196         "delayTime: %{public}d", name.c_str(), uid, infoEx->GetRequestId(), infoEx->GetActualDelayTime());
197     expiredCallbackMap_[infoEx->GetRequestId()] = callback;
198     keyInfoMap_[infoEx->GetRequestId()] = keyInfo;
199     if (callbackDeathRecipient_ != nullptr) {
200         (void)remote->AddDeathRecipient(callbackDeathRecipient_);
201     }
202 
203     return ERR_OK;
204 }
205 
HandleTransientTaskSuscriberTask(const shared_ptr<TransientTaskAppInfo> & appInfo,const TransientTaskEventType type)206 void BgTransientTaskMgr::HandleTransientTaskSuscriberTask(const shared_ptr<TransientTaskAppInfo>& appInfo,
207     const TransientTaskEventType type)
208 {
209     if (handler_ == nullptr) {
210         BGTASK_LOGE("HandleTransientTaskSuscriberTask handler is not init.");
211         return;
212     }
213     handler_->PostTask([=]() {
214         NotifyTransientTaskSuscriber(appInfo, type);
215     });
216 }
217 
NotifyTransientTaskSuscriber(const shared_ptr<TransientTaskAppInfo> & appInfo,const TransientTaskEventType type)218 void BgTransientTaskMgr::NotifyTransientTaskSuscriber(const shared_ptr<TransientTaskAppInfo>& appInfo,
219     const TransientTaskEventType type)
220 {
221     if (appInfo == nullptr) {
222         BGTASK_LOGE("NotifyTransientTaskSuscriber failed, appInfo is null.");
223         return;
224     }
225     if (subscriberList_.empty()) {
226         BGTASK_LOGI("Transient Task Subscriber List is empty");
227         return;
228     }
229     switch (type) {
230         case TransientTaskEventType::TASK_START:
231             for (auto iter = subscriberList_.begin(); iter != subscriberList_.end(); iter++) {
232                 (*iter)->OnTransientTaskStart(appInfo);
233             }
234             break;
235         case TransientTaskEventType::TASK_END:
236             for (auto iter = subscriberList_.begin(); iter != subscriberList_.end(); iter++) {
237                 (*iter)->OnTransientTaskEnd(appInfo);
238             }
239             break;
240         case TransientTaskEventType::APP_TASK_START:
241             for (auto iter = subscriberList_.begin(); iter != subscriberList_.end(); iter++) {
242                 (*iter)->OnAppTransientTaskStart(appInfo);
243             }
244             break;
245         case TransientTaskEventType::APP_TASK_END:
246             for (auto iter = subscriberList_.begin(); iter != subscriberList_.end(); iter++) {
247                 (*iter)->OnAppTransientTaskEnd(appInfo);
248             }
249             break;
250         default:
251             break;
252     }
253 }
254 
CancelSuspendDelay(int32_t requestId)255 ErrCode BgTransientTaskMgr::CancelSuspendDelay(int32_t requestId)
256 {
257     if (!isReady_.load()) {
258         BGTASK_LOGE("Transient task manager is not ready.");
259         return ERR_BGTASK_SYS_NOT_READY;
260     }
261     auto uid = IPCSkeleton::GetCallingUid();
262     auto pid = IPCSkeleton::GetCallingPid();
263     if (!VerifyCallingInfo(uid, pid)) {
264         BGTASK_LOGI("cancel suspend delay failed, pid or uid is invalid.");
265         return ERR_BGTASK_INVALID_PID_OR_UID;
266     }
267 
268     std::string name = "";
269     if (!GetBundleNamesForUid(uid, name)) {
270         BGTASK_LOGW("GetBundleNamesForUid fail, uid : %{public}d.", uid);
271         return ERR_BGTASK_SERVICE_INNER_ERROR;
272     }
273     BGTASK_LOGI("cancel suspend delay pkg : %{public}s, uid : %{public}d, requestId : %{public}d",
274         name.c_str(), uid, requestId);
275 
276     lock_guard<mutex> lock(expiredCallbackLock_);
277     if (!VerifyRequestIdLocked(name, uid, requestId)) {
278         BGTASK_LOGI(" cancel suspend delay failed, requestId is illegal.");
279         return ERR_BGTASK_INVALID_REQUEST_ID;
280     }
281 
282     return CancelSuspendDelayLocked(requestId);
283 }
284 
CancelSuspendDelayLocked(int32_t requestId)285 ErrCode BgTransientTaskMgr::CancelSuspendDelayLocked(int32_t requestId)
286 {
287     watchdog_->RemoveWatchdog(requestId);
288     decisionMaker_->RemoveRequest(keyInfoMap_[requestId], requestId);
289     keyInfoMap_.erase(requestId);
290 
291     auto iter = expiredCallbackMap_.find(requestId);
292     if (iter == expiredCallbackMap_.end()) {
293         BGTASK_LOGI("CancelSuspendDelayLocked Callback not found.");
294         return ERR_BGTASK_CALLBACK_NOT_EXIST;
295     }
296     auto remote = iter->second->AsObject();
297     if (remote != nullptr) {
298         remote->RemoveDeathRecipient(callbackDeathRecipient_);
299     }
300     expiredCallbackMap_.erase(iter);
301     return ERR_OK;
302 }
303 
ForceCancelSuspendDelay(int32_t requestId)304 void BgTransientTaskMgr::ForceCancelSuspendDelay(int32_t requestId)
305 {
306     lock_guard<mutex> lock(expiredCallbackLock_);
307     auto keyInfoIter = keyInfoMap_.find(requestId);
308     if (keyInfoIter == keyInfoMap_.end()) {
309         BGTASK_LOGI("force cancel suspend delay failed callback not found.");
310         return;
311     }
312 
313     CancelSuspendDelayLocked(requestId);
314 }
315 
GetRemainingDelayTime(int32_t requestId,int32_t & delayTime)316 ErrCode BgTransientTaskMgr::GetRemainingDelayTime(int32_t requestId, int32_t &delayTime)
317 {
318     if (!isReady_.load()) {
319         BGTASK_LOGW("Transient task manager is not ready.");
320         return ERR_BGTASK_SYS_NOT_READY;
321     }
322     auto uid = IPCSkeleton::GetCallingUid();
323     auto pid = IPCSkeleton::GetCallingPid();
324     if (!VerifyCallingInfo(uid, pid)) {
325         BGTASK_LOGI("get remain time failed, uid or pid is invalid");
326         delayTime = BG_INVALID_REMAIN_TIME;
327         return ERR_BGTASK_INVALID_PID_OR_UID;
328     }
329 
330     std::string name = "";
331     if (!GetBundleNamesForUid(uid, name)) {
332         BGTASK_LOGE("GetBundleNamesForUid fail.");
333         delayTime = BG_INVALID_REMAIN_TIME;
334         return ERR_BGTASK_SERVICE_INNER_ERROR;
335     }
336     BGTASK_LOGI("get remain time pkg : %{public}s, uid : %{public}d, requestId : %{public}d",
337         name.c_str(), uid, requestId);
338 
339     lock_guard<mutex> lock(expiredCallbackLock_);
340     if (!VerifyRequestIdLocked(name, uid, requestId)) {
341         BGTASK_LOGE("get remain time failed, requestId is illegal.");
342         delayTime = BG_INVALID_REMAIN_TIME;
343         return ERR_BGTASK_INVALID_REQUEST_ID;
344     }
345 
346     delayTime = decisionMaker_->GetRemainingDelayTime(keyInfoMap_[requestId], requestId);
347     return ERR_OK;
348 }
349 
VerifyCallingInfo(int32_t uid,int32_t pid)350 bool BgTransientTaskMgr::VerifyCallingInfo(int32_t uid, int32_t pid)
351 {
352     return (uid >= 0) && (pid >= 0);
353 }
354 
VerifyRequestIdLocked(const std::string & name,int32_t uid,int32_t requestId)355 bool BgTransientTaskMgr::VerifyRequestIdLocked(const std::string& name, int32_t uid, int32_t requestId)
356 {
357     auto keyInfoIter = keyInfoMap_.find(requestId);
358     if (keyInfoIter == keyInfoMap_.end()) {
359         return false;
360     }
361     return keyInfoIter->second->IsEqual(name, uid);
362 }
363 
HandleExpiredCallbackDeath(const wptr<IRemoteObject> & remote)364 void BgTransientTaskMgr::HandleExpiredCallbackDeath(const wptr<IRemoteObject>& remote)
365 {
366     if (remote == nullptr) {
367         BGTASK_LOGE("expiredCallback death, remote in callback is null.");
368         return;
369     }
370 
371     lock_guard<mutex> lock(expiredCallbackLock_);
372     auto findCallback = [&remote](const auto& callbackMap) {
373         return callbackMap.second->AsObject() == remote;
374     };
375 
376     auto callbackIter = find_if(expiredCallbackMap_.begin(), expiredCallbackMap_.end(), findCallback);
377     if (callbackIter == expiredCallbackMap_.end()) {
378         BGTASK_LOGI("expiredCallback death, remote in callback not found.");
379         return;
380     }
381 
382     watchdog_->RemoveWatchdog(callbackIter->first);
383     auto keyInfoIter = keyInfoMap_.find(callbackIter->first);
384     expiredCallbackMap_.erase(callbackIter);
385     if (keyInfoIter == keyInfoMap_.end()) {
386         BGTASK_LOGI("expiredCallback death, keyInfo not found.");
387         return;
388     }
389 
390     BGTASK_LOGI("expiredCallback death, %{public}s, requestId : %{public}d", keyInfoIter->second->ToString().c_str(),
391         keyInfoIter->first);
392     decisionMaker_->RemoveRequest(keyInfoIter->second, keyInfoIter->first);
393     keyInfoMap_.erase(keyInfoIter);
394 }
395 
HandleSubscriberDeath(const wptr<IRemoteObject> & remote)396 void BgTransientTaskMgr::HandleSubscriberDeath(const wptr<IRemoteObject>& remote)
397 {
398     if (remote == nullptr) {
399         BGTASK_LOGE("suscriber death, remote in suscriber is null.");
400         return;
401     }
402 
403     handler_->PostSyncTask([&]() {
404         auto findSuscriber = [&remote](const auto& subscriberList) {
405             return remote == subscriberList->AsObject();
406         };
407         auto subscriberIter = find_if(subscriberList_.begin(), subscriberList_.end(), findSuscriber);
408         if (subscriberIter == subscriberList_.end()) {
409             BGTASK_LOGI("suscriber death, remote in suscriber not found.");
410             return;
411         }
412 
413         subscriberList_.erase(subscriberIter);
414         BGTASK_LOGI("suscriber death, remove it.");
415     });
416 }
417 
HandleRequestExpired(const int32_t requestId)418 void BgTransientTaskMgr::HandleRequestExpired(const int32_t requestId)
419 {
420     BGTASK_LOGI("request expired, id : %{public}d", requestId);
421 
422     std::lock_guard<std::mutex> lock(expiredCallbackLock_);
423     auto callbackIter = expiredCallbackMap_.find(requestId);
424     if (callbackIter == expiredCallbackMap_.end()) {
425         BGTASK_LOGE("request expired, callback not found.");
426         return;
427     }
428     callbackIter->second->OnExpired();
429 
430     auto keyInfoIter = keyInfoMap_.find(requestId);
431     if (keyInfoIter == keyInfoMap_.end()) {
432         BGTASK_LOGE("request expired, keyinfo not found.");
433         return;
434     }
435     watchdog_->AddWatchdog(requestId, keyInfoIter->second, WATCHDOG_DELAY_TIME);
436 }
437 
SubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber> & subscriber)438 ErrCode BgTransientTaskMgr::SubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber>& subscriber)
439 {
440     if (subscriber == nullptr) {
441         BGTASK_LOGI("subscriber is null.");
442         return ERR_BGTASK_INVALID_PARAM;
443     }
444     auto remote = subscriber->AsObject();
445     if (remote == nullptr) {
446         BGTASK_LOGE("request suspend delay failed, remote in subscriber is null.");
447         return ERR_BGTASK_INVALID_PARAM;
448     }
449 
450     handler_->PostTask([=]() {
451         auto findSuscriber = [&remote](const auto& subscriberList) {
452             return remote == subscriberList->AsObject();
453         };
454         auto subscriberIter = find_if(subscriberList_.begin(), subscriberList_.end(), findSuscriber);
455         if (subscriberIter != subscriberList_.end()) {
456             BGTASK_LOGE("request subscriber is already exists.");
457             return;
458         }
459 
460         if (susriberDeathRecipient_ != nullptr) {
461             remote->AddDeathRecipient(susriberDeathRecipient_);
462         }
463         subscriberList_.emplace_back(subscriber);
464         BGTASK_LOGI("subscribe transient task success.");
465     });
466     return ERR_OK;
467 }
468 
UnsubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber> & subscriber)469 ErrCode BgTransientTaskMgr::UnsubscribeBackgroundTask(const sptr<IBackgroundTaskSubscriber>& subscriber)
470 {
471     if (subscriber == nullptr) {
472         BGTASK_LOGE("subscriber is null.");
473         return ERR_BGTASK_INVALID_PARAM;
474     }
475     auto remote = subscriber->AsObject();
476     if (remote == nullptr) {
477         BGTASK_LOGE("request suspend delay failed, remote in subscriber is null.");
478         return ERR_BGTASK_INVALID_PARAM;
479     }
480 
481     handler_->PostTask([=]() {
482         auto findSuscriber = [&remote](const auto& subscriberList) {
483             return remote == subscriberList->AsObject();
484         };
485         auto subscriberIter = find_if(subscriberList_.begin(), subscriberList_.end(), findSuscriber);
486         if (subscriberIter == subscriberList_.end()) {
487             BGTASK_LOGE("request subscriber is not exists.");
488             return;
489         }
490         remote->RemoveDeathRecipient(susriberDeathRecipient_);
491         subscriberList_.erase(subscriberIter);
492         BGTASK_LOGI("unsubscribe transient task success.");
493     });
494     return ERR_OK;
495 }
496 
GetTransientTaskApps(std::vector<std::shared_ptr<TransientTaskAppInfo>> & list)497 ErrCode BgTransientTaskMgr::GetTransientTaskApps(std::vector<std::shared_ptr<TransientTaskAppInfo>> &list)
498 {
499     lock_guard<mutex> lock(expiredCallbackLock_);
500     if (keyInfoMap_.empty()) {
501         return ERR_OK;
502     }
503 
504     for (auto record : keyInfoMap_) {
505         auto findInfo = [&record](const auto& info) {
506             return (record.second->GetPkg() == info->GetPackageName()) &&
507                 (record.second->GetUid() == info->GetUid());
508         };
509         auto findInfoIter = std::find_if(list.begin(), list.end(), findInfo);
510         if (findInfoIter == list.end()) {
511             auto appInfo = make_shared<TransientTaskAppInfo>(record.second->GetPkg(),
512                 record.second->GetUid());
513             list.push_back(appInfo);
514         }
515     }
516     return ERR_OK;
517 }
518 
ShellDump(const std::vector<std::string> & dumpOption,std::vector<std::string> & dumpInfo)519 ErrCode BgTransientTaskMgr::ShellDump(const std::vector<std::string> &dumpOption, std::vector<std::string> &dumpInfo)
520 {
521     if (!isReady_.load()) {
522         BGTASK_LOGE("Transient task manager is not ready.");
523         return ERR_BGTASK_SYS_NOT_READY;
524     }
525     bool result = false;
526     if (dumpOption[1] == ALL_BGTASKMGR_OPTION) {
527         result = DumpAllRequestId(dumpInfo);
528     } else if (dumpOption[1] == LOW_BATTARY_OPTION) {
529         deviceInfoManeger_->SetDump(true);
530         SendLowBatteryEvent(dumpInfo);
531         result = true;
532     } else if (dumpOption[1] == OKAY_BATTARY_OPTION) {
533         deviceInfoManeger_->SetDump(true);
534         SendOkayBatteryEvent(dumpInfo);
535         result = true;
536     } else if (dumpOption[1] == CANCEL_DUMP_OPTION) {
537         deviceInfoManeger_->SetDump(false);
538         result = true;
539     } else {
540         dumpInfo.push_back("Error transient dump command!\n");
541     }
542 
543     return result ? ERR_OK : ERR_BGTASK_PERMISSION_DENIED;
544 }
545 
SendLowBatteryEvent(std::vector<std::string> & dumpInfo)546 void BgTransientTaskMgr::SendLowBatteryEvent(std::vector<std::string> &dumpInfo)
547 {
548     AAFwk::Want want;
549     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_BATTERY_LOW);
550     EventFwk::CommonEventData data;
551     data.SetWant(want);
552     EventFwk::CommonEventPublishInfo publishInfo;
553     publishInfo.SetOrdered(true);
554 
555     data.SetCode(0);
556     data.SetData("dump");
557     if (EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo)) {
558         dumpInfo.push_back("Publish COMMON_EVENT_BATTERY_LOW succeed!\n");
559     } else {
560         dumpInfo.push_back("Publish COMMON_EVENT_BATTERY_LOW failed!\n");
561     }
562 }
563 
SendOkayBatteryEvent(std::vector<std::string> & dumpInfo)564 void BgTransientTaskMgr::SendOkayBatteryEvent(std::vector<std::string> &dumpInfo)
565 {
566     AAFwk::Want want;
567     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_BATTERY_OKAY);
568     EventFwk::CommonEventData data;
569     data.SetWant(want);
570     EventFwk::CommonEventPublishInfo publishInfo;
571     publishInfo.SetOrdered(true);
572 
573     data.SetCode(0);
574     data.SetData("dump");
575     if (EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo)) {
576         dumpInfo.push_back("Publish COMMON_EVENT_BATTERY_OKAY succeed!\n");
577     } else {
578         dumpInfo.push_back("Publish COMMON_EVENT_BATTERY_OKAY failed!\n");
579     }
580 }
581 
DumpAllRequestId(std::vector<std::string> & dumpInfo)582 bool BgTransientTaskMgr::DumpAllRequestId(std::vector<std::string> &dumpInfo)
583 {
584     if (keyInfoMap_.empty()) {
585         dumpInfo.push_back("No Transient Task!\n");
586         return true;
587     }
588     std::stringstream stream;
589     int32_t index = 1;
590     for (auto record : keyInfoMap_) {
591         stream.clear();
592         stream.str("");
593         stream << "No." << std::to_string(index++) << "\n";
594         stream << "\tRequestId: " << record.first << "\n";
595         stream << "\tAppName: " << record.second->GetPkg() << "\n";
596         stream << "\tAppUid: " << record.second->GetUid() << "\n";
597         stream << "\tAppPid: " << record.second->GetPid() << "\n";
598         stream << "\tActualDelayTime: " << decisionMaker_->GetRemainingDelayTime(record.second, record.first) << "\n";
599         stream << "\tRemainingQuota: " << decisionMaker_->GetQuota(record.second) << "\n";
600         stream << "\n";
601         dumpInfo.push_back(stream.str());
602     }
603 
604     return true;
605 }
606 
ExpiredCallbackDeathRecipient(const wptr<BackgroundTaskMgrService> & service)607 ExpiredCallbackDeathRecipient::ExpiredCallbackDeathRecipient(const wptr<BackgroundTaskMgrService>& service)
608     : service_(service) {}
609 
~ExpiredCallbackDeathRecipient()610 ExpiredCallbackDeathRecipient::~ExpiredCallbackDeathRecipient() {}
611 
OnRemoteDied(const wptr<IRemoteObject> & remote)612 void ExpiredCallbackDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
613 {
614     auto service = service_.promote();
615     if (service == nullptr) {
616         BGTASK_LOGE("expired callback died, BackgroundTaskMgrService dead.");
617         return;
618     }
619     service->HandleExpiredCallbackDeath(remote);
620 }
621 
SubscriberDeathRecipient(const wptr<BackgroundTaskMgrService> & service)622 SubscriberDeathRecipient::SubscriberDeathRecipient(const wptr<BackgroundTaskMgrService>& service)
623     : service_(service) {}
624 
~SubscriberDeathRecipient()625 SubscriberDeathRecipient::~SubscriberDeathRecipient() {}
626 
OnRemoteDied(const wptr<IRemoteObject> & remote)627 void SubscriberDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
628 {
629     auto service = service_.promote();
630     if (service == nullptr) {
631         BGTASK_LOGE("suscriber died, BackgroundTaskMgrService dead.");
632         return;
633     }
634     service->HandleSubscriberDeath(remote);
635 }
636 }  // namespace BackgroundTaskMgr
637 }  // namespace OHOS