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