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_continuous_task_napi_module.h"
17
18 #include "ability.h"
19 #include "bundle_mgr_interface.h"
20 #include "hitrace_meter.h"
21 #include "iservice_registry.h"
22 #include "napi_base_context.h"
23 #include "system_ability_definition.h"
24 #include "want_agent.h"
25 #ifdef SUPPORT_JSSTACK
26 #include "xpower_event_js.h"
27 #endif
28
29 #include "background_mode.h"
30 #include "background_task_mgr_helper.h"
31 #include "bgtaskmgr_inner_errors.h"
32 #include "common.h"
33 #include "continuous_task_log.h"
34 #include "continuous_task_param.h"
35 #include "js_backgroundtask_subscriber.h"
36 #include "js_runtime_utils.h"
37
38 namespace OHOS {
39 namespace BackgroundTaskMgr {
40 namespace {
41 static constexpr uint32_t MAX_START_BG_RUNNING_PARAMS = 4;
42 static constexpr uint32_t MAX_STOP_BG_RUNNING_PARAMS = 2;
43 static constexpr uint32_t MAX_UPDATE_BG_RUNNING_PARAMS = 2;
44 static constexpr uint32_t CALLBACK_RESULT_PARAMS_NUM = 2;
45 static constexpr uint32_t BG_MODE_ID_BEGIN = 1;
46 static constexpr uint32_t BG_MODE_ID_END = 9;
47 static constexpr int32_t SYSTEM_LIVE_CONTENT_TYPE = 8;
48 static constexpr int32_t SLOT_TYPE = 4;
49 static constexpr uint32_t ARGC_ONE = 1;
50 static constexpr uint32_t ARGC_TWO = 2;
51 static constexpr uint32_t INDEX_ZERO = 0;
52 static constexpr uint32_t INDEX_ONE = 1;
53 static std::shared_ptr<JsBackgroundTaskSubscriber> backgroundTaskSubscriber_ = nullptr;
54 static std::vector<std::string> g_backgroundModes = {
55 "dataTransfer",
56 "audioPlayback",
57 "audioRecording",
58 "location",
59 "bluetoothInteraction",
60 "multiDeviceConnection",
61 "wifiInteraction",
62 "voip",
63 "taskKeeping"
64 };
65 }
66
67 struct AsyncCallbackInfo : public AsyncWorkData {
AsyncCallbackInfoOHOS::BackgroundTaskMgr::AsyncCallbackInfo68 explicit AsyncCallbackInfo(napi_env env) : AsyncWorkData(env) {}
69 std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext {nullptr};
70 uint32_t bgMode {0};
71 std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> wantAgent {nullptr};
72 std::vector<uint32_t> bgModes {};
73 bool isBatchApi {false};
74 int32_t notificationId {-1}; // out
75 int32_t continuousTaskId {-1}; // out
76 };
77
WrapVoidToJS(napi_env env)78 napi_value WrapVoidToJS(napi_env env)
79 {
80 napi_value result = nullptr;
81 NAPI_CALL(env, napi_get_null(env, &result));
82 return result;
83 }
84
WrapUndefinedToJS(napi_env env)85 napi_value WrapUndefinedToJS(napi_env env)
86 {
87 napi_value result = nullptr;
88 NAPI_CALL(env, napi_get_undefined(env, &result));
89 return result;
90 }
91
GetCallbackErrorValue(napi_env env,int32_t errCode)92 napi_value GetCallbackErrorValue(napi_env env, int32_t errCode)
93 {
94 napi_value jsObject = nullptr;
95 napi_value jsValue = nullptr;
96 NAPI_CALL(env, napi_create_int32(env, errCode, &jsValue));
97 NAPI_CALL(env, napi_create_object(env, &jsObject));
98 NAPI_CALL(env, napi_set_named_property(env, jsObject, "code", jsValue));
99 return jsObject;
100 }
101
GetAbilityContext(const napi_env & env,const napi_value & value,std::shared_ptr<AbilityRuntime::AbilityContext> & abilityContext)102 napi_value GetAbilityContext(const napi_env &env, const napi_value &value,
103 std::shared_ptr<AbilityRuntime::AbilityContext> &abilityContext)
104 {
105 bool stageMode = false;
106 napi_status status = OHOS::AbilityRuntime::IsStageContext(env, value, stageMode);
107 BGTASK_LOGD("is stage mode: %{public}s", stageMode ? "true" : "false");
108
109 if (status != napi_ok || !stageMode) {
110 BGTASK_LOGI("Getting context with FA model");
111 auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env);
112 if (!ability) {
113 BGTASK_LOGE("Failed to get native ability instance");
114 return nullptr;
115 }
116 abilityContext = ability->GetAbilityContext();
117 if (!abilityContext) {
118 BGTASK_LOGE("get FA model ability context failed");
119 return nullptr;
120 }
121 return WrapVoidToJS(env);
122 } else {
123 BGTASK_LOGD("Getting context with stage model");
124 auto context = AbilityRuntime::GetStageModeContext(env, value);
125 if (!context) {
126 BGTASK_LOGE("get context failed");
127 return nullptr;
128 }
129 abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context);
130 if (!abilityContext) {
131 BGTASK_LOGE("get Stage model ability context failed");
132 return nullptr;
133 }
134 return WrapVoidToJS(env);
135 }
136 }
137
GetMainAbilityLabel(const std::string & bundleName)138 std::string GetMainAbilityLabel(const std::string &bundleName)
139 {
140 sptr<ISystemAbilityManager> systemAbilityManager =
141 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
142 if (systemAbilityManager == nullptr) {
143 BGTASK_LOGE("get SystemAbilityManager failed");
144 return "";
145 }
146
147 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
148 if (remoteObject == nullptr) {
149 BGTASK_LOGE("get Bundle Manager object failed");
150 return "";
151 }
152
153 auto bundleMgr = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
154 if (bundleMgr == nullptr) {
155 BGTASK_LOGE("get Bundle Manager Proxy failed");
156 return "";
157 }
158
159 AAFwk::Want want;
160 want.SetAction("action.system.home");
161 want.AddEntity("entity.system.home");
162 want.SetElementName("", bundleName, "", "");
163 AppExecFwk::AbilityInfo abilityInfo;
164 bundleMgr->QueryAbilityInfo(want, abilityInfo);
165 return bundleMgr->GetAbilityLabel(bundleName, abilityInfo.name);
166 }
167
CheckBackgroundMode(napi_env env,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)168 bool CheckBackgroundMode(napi_env env, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
169 {
170 if (!asyncCallbackInfo->isBatchApi) {
171 if (asyncCallbackInfo->bgMode < BG_MODE_ID_BEGIN || asyncCallbackInfo->bgMode > BG_MODE_ID_END) {
172 BGTASK_LOGE("request background mode id: %{public}u out of range", asyncCallbackInfo->bgMode);
173 Common::HandleParamErr(env, ERR_BGMODE_RANGE_ERR, isThrow);
174 asyncCallbackInfo->errCode = ERR_BGMODE_RANGE_ERR;
175 return false;
176 }
177 } else {
178 for (unsigned int i = 0; i < asyncCallbackInfo->bgModes.size(); i++) {
179 if (asyncCallbackInfo->bgModes[i] < BG_MODE_ID_BEGIN || asyncCallbackInfo->bgModes[i] > BG_MODE_ID_END) {
180 BGTASK_LOGE("request background mode id: %{public}u out of range", asyncCallbackInfo->bgModes[i]);
181 Common::HandleParamErr(env, ERR_BGMODE_RANGE_ERR, isThrow);
182 asyncCallbackInfo->errCode = ERR_BGMODE_RANGE_ERR;
183 return false;
184 }
185 }
186 }
187 return true;
188 }
189
StartBackgroundRunningCheckParam(napi_env env,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)190 bool StartBackgroundRunningCheckParam(napi_env env, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
191 {
192 if (asyncCallbackInfo == nullptr) {
193 BGTASK_LOGE("asyncCallbackInfo is nullptr");
194 return false;
195 }
196 if (asyncCallbackInfo->errCode != ERR_OK) {
197 BGTASK_LOGE("input params parse failed");
198 return false;
199 }
200 if (asyncCallbackInfo->abilityContext == nullptr) {
201 asyncCallbackInfo->errCode = ERR_CONTEXT_NULL_OR_TYPE_ERR;
202 Common::HandleParamErr(env, ERR_CONTEXT_NULL_OR_TYPE_ERR, isThrow);
203 BGTASK_LOGE("abilityContext is null");
204 return false;
205 }
206 const std::shared_ptr<AppExecFwk::AbilityInfo> info = asyncCallbackInfo->abilityContext->GetAbilityInfo();
207 if (info == nullptr) {
208 BGTASK_LOGE("ability info is null");
209 Common::HandleParamErr(env, ERR_ABILITY_INFO_EMPTY, isThrow);
210 asyncCallbackInfo->errCode = ERR_ABILITY_INFO_EMPTY;
211 return false;
212 }
213 if (asyncCallbackInfo->wantAgent == nullptr) {
214 BGTASK_LOGE("wantAgent param is nullptr");
215 Common::HandleParamErr(env, ERR_WANTAGENT_NULL_OR_TYPE_ERR, isThrow);
216 asyncCallbackInfo->errCode = ERR_WANTAGENT_NULL_OR_TYPE_ERR;
217 return false;
218 }
219 sptr<IRemoteObject> token = asyncCallbackInfo->abilityContext->GetToken();
220 if (!token) {
221 BGTASK_LOGE("get ability token info failed");
222 Common::HandleParamErr(env, ERR_GET_TOKEN_ERR, isThrow);
223 asyncCallbackInfo->errCode = ERR_GET_TOKEN_ERR;
224 return false;
225 }
226 if (!CheckBackgroundMode(env, asyncCallbackInfo, isThrow)) {
227 BGTASK_LOGE("check background mode failed.");
228 return false;
229 }
230 return true;
231 }
232
UpdateBackgroundRunningExecuteCB(napi_env env,void * data)233 void UpdateBackgroundRunningExecuteCB(napi_env env, void *data)
234 {
235 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
236 "BackgroundTaskManager::ContinuousTask::Napi::UpdateBackgroundRunningExecuteCB");
237 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
238 if (asyncCallbackInfo == nullptr || asyncCallbackInfo->errCode != ERR_OK) {
239 BGTASK_LOGE("input params error");
240 return;
241 }
242 const std::shared_ptr<AppExecFwk::AbilityInfo> info = asyncCallbackInfo->abilityContext->GetAbilityInfo();
243 ContinuousTaskParam taskParam = ContinuousTaskParam(true, asyncCallbackInfo->bgMode, nullptr, info->name,
244 asyncCallbackInfo->abilityContext->GetToken(),
245 GetMainAbilityLabel(info->bundleName), true, asyncCallbackInfo->bgModes,
246 asyncCallbackInfo->abilityContext->GetAbilityRecordId());
247 BGTASK_LOGI("RequestUpdateBackgroundRunning isBatch: %{public}d, bgModeSize: %{public}u",
248 taskParam.isBatchApi_, static_cast<uint32_t>(taskParam.bgModeIds_.size()));
249 asyncCallbackInfo->errCode = BackgroundTaskMgrHelper::RequestUpdateBackgroundRunning(taskParam);
250 asyncCallbackInfo->notificationId = taskParam.notificationId_;
251 asyncCallbackInfo->continuousTaskId = taskParam.continuousTaskId_;
252 BGTASK_LOGI("notification %{public}d, continuousTaskId %{public}d", taskParam.notificationId_,
253 taskParam.continuousTaskId_);
254 }
255
StartBackgroundRunningExecuteCB(napi_env env,void * data)256 void StartBackgroundRunningExecuteCB(napi_env env, void *data)
257 {
258 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
259 "BackgroundTaskManager::ContinuousTask::Napi::StartBackgroundRunningExecuteCB");
260 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
261 if (asyncCallbackInfo == nullptr || asyncCallbackInfo->errCode != ERR_OK) {
262 BGTASK_LOGE("input params error");
263 return;
264 }
265 const std::shared_ptr<AppExecFwk::AbilityInfo> info = asyncCallbackInfo->abilityContext->GetAbilityInfo();
266 ContinuousTaskParam taskParam = ContinuousTaskParam(true, asyncCallbackInfo->bgMode, asyncCallbackInfo->wantAgent,
267 info->name, asyncCallbackInfo->abilityContext->GetToken(), GetMainAbilityLabel(info->bundleName),
268 asyncCallbackInfo->isBatchApi, asyncCallbackInfo->bgModes,
269 asyncCallbackInfo->abilityContext->GetAbilityRecordId());
270 BGTASK_LOGI("RequestStartBackgroundRunning isBatch: %{public}d, bgModeSize: %{public}u",
271 taskParam.isBatchApi_, static_cast<uint32_t>(taskParam.bgModeIds_.size()));
272 asyncCallbackInfo->errCode = BackgroundTaskMgrHelper::RequestStartBackgroundRunning(taskParam);
273 asyncCallbackInfo->notificationId = taskParam.notificationId_;
274 asyncCallbackInfo->continuousTaskId = taskParam.continuousTaskId_;
275 BGTASK_LOGI("notification %{public}d, continuousTaskId %{public}d", taskParam.notificationId_,
276 taskParam.continuousTaskId_);
277 }
278
CallbackCompletedCB(napi_env env,napi_status status,void * data)279 void CallbackCompletedCB(napi_env env, napi_status status, void *data)
280 {
281 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
282 "BackgroundTaskManager::ContinuousTask::Napi::CallbackCompletedCB");
283 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
284 std::unique_ptr<AsyncCallbackInfo> callbackPtr {asyncCallbackInfo};
285 napi_value callback {nullptr};
286 napi_value undefined {nullptr};
287 napi_value result[CALLBACK_RESULT_PARAMS_NUM] = {nullptr};
288 napi_value callResult = {nullptr};
289 NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
290 if (asyncCallbackInfo->errCode == ERR_OK) {
291 result[0] = WrapUndefinedToJS(env);
292 napi_create_int32(env, 0, &result[1]);
293 } else {
294 result[1] = WrapUndefinedToJS(env);
295 std::string errMsg = Common::FindErrMsg(env, asyncCallbackInfo->errCode);
296 int32_t errCodeInfo = Common::FindErrCode(env, asyncCallbackInfo->errCode);
297 result[0] = Common::GetCallbackErrorValue(env, errCodeInfo, errMsg);
298 }
299
300 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
301 NAPI_CALL_RETURN_VOID(env,
302 napi_call_function(env, undefined, callback, CALLBACK_RESULT_PARAMS_NUM, result, &callResult));
303 }
304
PromiseCompletedCB(napi_env env,napi_status status,void * data)305 void PromiseCompletedCB(napi_env env, napi_status status, void *data)
306 {
307 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
308 "BackgroundTaskManager::ContinuousTask::Napi::PromiseCompletedCB");
309 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
310 std::unique_ptr<AsyncCallbackInfo> callbackPtr {asyncCallbackInfo};
311 napi_value result {nullptr};
312 if (asyncCallbackInfo->errCode == ERR_OK) {
313 if (asyncCallbackInfo->bgModes.size() > 0) {
314 napi_value slotType = nullptr;
315 napi_value contentType = nullptr;
316 napi_value notificationId = nullptr;
317 napi_value continuousTaskId = nullptr;
318 napi_create_object(env, &result);
319 napi_create_int32(env, SLOT_TYPE, &slotType);
320 napi_create_int32(env, SYSTEM_LIVE_CONTENT_TYPE, &contentType);
321 napi_create_int32(env, asyncCallbackInfo->notificationId, ¬ificationId);
322 napi_create_int32(env, asyncCallbackInfo->continuousTaskId, &continuousTaskId);
323 napi_set_named_property(env, result, "slotType", slotType);
324 napi_set_named_property(env, result, "contentType", contentType);
325 napi_set_named_property(env, result, "notificationId", notificationId);
326 napi_set_named_property(env, result, "continuousTaskId", continuousTaskId);
327 } else {
328 napi_create_int32(env, 0, &result);
329 }
330 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result));
331 } else {
332 std::string errMsg = Common::FindErrMsg(env, asyncCallbackInfo->errCode);
333 int32_t errCodeInfo = Common::FindErrCode(env, asyncCallbackInfo->errCode);
334 result = Common::GetCallbackErrorValue(env, errCodeInfo, errMsg);
335 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result));
336 }
337 }
338
ReportXPowerJsStackSysEventByType(napi_env env,const std::string & taskType)339 void ReportXPowerJsStackSysEventByType(napi_env env, const std::string &taskType)
340 {
341 #ifdef SUPPORT_JSSTACK
342 HiviewDFX::ReportXPowerJsStackSysEvent(env, taskType);
343 #endif
344 }
345
StartBackgroundRunningAsync(napi_env env,napi_value * argv,const uint32_t argCallback,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)346 napi_value StartBackgroundRunningAsync(napi_env env, napi_value *argv,
347 const uint32_t argCallback, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
348 {
349 if (argv == nullptr || asyncCallbackInfo == nullptr) {
350 BGTASK_LOGE("param is nullptr");
351 return nullptr;
352 }
353 if (isThrow && asyncCallbackInfo->errCode != ERR_OK) {
354 return nullptr;
355 }
356 napi_value resourceName {nullptr};
357 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
358
359 napi_valuetype valuetype = napi_undefined;
360 NAPI_CALL(env, napi_typeof(env, argv[argCallback], &valuetype));
361 if (valuetype != napi_function) {
362 Common::HandleParamErr(env, ERR_CALLBACK_NULL_OR_TYPE_ERR, isThrow);
363 BGTASK_LOGE("valuetype is no napi_function.");
364 return nullptr;
365 }
366 NAPI_CALL(env, napi_create_reference(env, argv[argCallback], 1, &asyncCallbackInfo->callback));
367 if (!StartBackgroundRunningCheckParam(env, asyncCallbackInfo, isThrow) && isThrow) {
368 BGTASK_LOGE("start bgytask check param fail.");
369 return nullptr;
370 }
371
372 NAPI_CALL(env, napi_create_async_work(env,
373 nullptr,
374 resourceName,
375 StartBackgroundRunningExecuteCB,
376 CallbackCompletedCB,
377 static_cast<void *>(asyncCallbackInfo),
378 &asyncCallbackInfo->asyncWork));
379 NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
380
381 return WrapVoidToJS(env);
382 }
383
UpdateBackgroundRunningPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)384 napi_value UpdateBackgroundRunningPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
385 {
386 if (asyncCallbackInfo == nullptr) {
387 BGTASK_LOGE("param is nullptr");
388 return nullptr;
389 }
390 if (!CheckBackgroundMode(env, asyncCallbackInfo, isThrow)) {
391 return nullptr;
392 }
393 napi_value resourceName;
394 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
395 napi_deferred deferred;
396 napi_value promise {nullptr};
397 NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
398 asyncCallbackInfo->deferred = deferred;
399 NAPI_CALL(env, napi_create_async_work(env,
400 nullptr,
401 resourceName,
402 UpdateBackgroundRunningExecuteCB,
403 PromiseCompletedCB,
404 static_cast<void *>(asyncCallbackInfo),
405 &asyncCallbackInfo->asyncWork));
406 NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
407 return promise;
408 }
409
StartBackgroundRunningPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)410 napi_value StartBackgroundRunningPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
411 {
412 if (asyncCallbackInfo == nullptr) {
413 BGTASK_LOGE("param is nullptr");
414 return nullptr;
415 }
416 napi_value resourceName;
417 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
418 napi_deferred deferred;
419 napi_value promise {nullptr};
420 NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
421 asyncCallbackInfo->deferred = deferred;
422 if (!StartBackgroundRunningCheckParam(env, asyncCallbackInfo, isThrow) && isThrow) {
423 BGTASK_LOGE("start bgytask check param fail.");
424 return nullptr;
425 }
426 NAPI_CALL(env, napi_create_async_work(env,
427 nullptr,
428 resourceName,
429 StartBackgroundRunningExecuteCB,
430 PromiseCompletedCB,
431 static_cast<void *>(asyncCallbackInfo),
432 &asyncCallbackInfo->asyncWork));
433 NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
434 return promise;
435 }
436
CheckTypeForNapiValue(napi_env env,napi_value param,napi_valuetype expectType)437 bool CheckTypeForNapiValue(napi_env env, napi_value param, napi_valuetype expectType)
438 {
439 napi_valuetype valueType = napi_undefined;
440 if (napi_typeof(env, param, &valueType) != napi_ok) {
441 return false;
442 }
443 return valueType == expectType;
444 }
445
GetMode(const napi_env & env,const napi_value & value,AsyncCallbackInfo * asyncCallbackInfo)446 napi_value GetMode(const napi_env &env, const napi_value &value, AsyncCallbackInfo *asyncCallbackInfo)
447 {
448 napi_valuetype valuetype = napi_undefined;
449 NAPI_CALL(env, napi_typeof(env, value, &valuetype));
450 if (valuetype != napi_number) {
451 Common::HandleParamErr(env, ERR_BGMODE_NULL_OR_TYPE_ERR, true);
452 return nullptr;
453 }
454 napi_get_value_uint32(env, value, &asyncCallbackInfo->bgMode);
455 asyncCallbackInfo->isBatchApi = false;
456 BGTASK_LOGI("get bgmode info: %{public}u", asyncCallbackInfo->bgMode);
457 return WrapVoidToJS(env);
458 }
459
GetModes(const napi_env & env,const napi_value & value,AsyncCallbackInfo * asyncCallbackInfo)460 napi_value GetModes(const napi_env &env, const napi_value &value, AsyncCallbackInfo *asyncCallbackInfo)
461 {
462 uint32_t arrayLen = 0;
463 napi_get_array_length(env, value, &arrayLen);
464 BGTASK_LOGI("get bgModes arraylen: %{public}u", arrayLen);
465 if (arrayLen == 0) {
466 BGTASK_LOGE("get bgModes arraylen is 0");
467 Common::HandleParamErr(env, ERR_BGMODE_NULL_OR_TYPE_ERR, true);
468 return nullptr;
469 }
470 asyncCallbackInfo->isBatchApi = true;
471 for (uint32_t i = 0; i < arrayLen; i++) {
472 napi_value mode = nullptr;
473 napi_get_element(env, value, i, &mode);
474 std::string result;
475 if (Common::GetStringValue(env, mode, result) == nullptr) {
476 BGTASK_LOGE("GetStringValue failed.");
477 Common::HandleParamErr(env, ERR_BGMODE_NULL_OR_TYPE_ERR, true);
478 return nullptr;
479 }
480 BGTASK_LOGI("GetBackgroundMode %{public}s.", result.c_str());
481 auto it = std::find(g_backgroundModes.begin(), g_backgroundModes.end(), result);
482 if (it != g_backgroundModes.end()) {
483 auto index = std::distance(g_backgroundModes.begin(), it);
484 auto modeIter = std::find(asyncCallbackInfo->bgModes.begin(), asyncCallbackInfo->bgModes.end(), index + 1);
485 if (modeIter == asyncCallbackInfo->bgModes.end()) {
486 asyncCallbackInfo->bgModes.push_back(index + 1);
487 }
488 } else {
489 BGTASK_LOGE("mode string is invalid");
490 Common::HandleParamErr(env, ERR_BGMODE_NULL_OR_TYPE_ERR, true);
491 return nullptr;
492 }
493 }
494 return WrapVoidToJS(env);
495 }
496
GetBackgroundMode(const napi_env & env,const napi_value & value,AsyncCallbackInfo * asyncCallbackInfo)497 napi_value GetBackgroundMode(const napi_env &env, const napi_value &value, AsyncCallbackInfo *asyncCallbackInfo)
498 {
499 bool isArray = false;
500 if (napi_is_array(env, value, &isArray) != napi_ok || isArray == false) {
501 return GetMode(env, value, asyncCallbackInfo);
502 } else {
503 return GetModes(env, value, asyncCallbackInfo);
504 }
505 }
506
GetWantAgent(const napi_env & env,const napi_value & value,std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> & wantAgent)507 napi_value GetWantAgent(const napi_env &env, const napi_value &value,
508 std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> &wantAgent)
509 {
510 napi_valuetype valuetype = napi_undefined;
511 AbilityRuntime::WantAgent::WantAgent *wantAgentPtr = nullptr;
512 NAPI_CALL(env, napi_typeof(env, value, &valuetype));
513 if (valuetype != napi_object) {
514 Common::HandleParamErr(env, ERR_WANTAGENT_NULL_OR_TYPE_ERR, true);
515 return nullptr;
516 }
517 napi_unwrap(env, value, (void **)&wantAgentPtr);
518 if (wantAgentPtr == nullptr) {
519 return nullptr;
520 }
521 wantAgent = std::make_shared<AbilityRuntime::WantAgent::WantAgent>(*wantAgentPtr);
522
523 return WrapVoidToJS(env);
524 }
525
StartBackgroundRunningCheckParamBeforeSubmit(napi_env env,napi_value * argv,size_t len,bool isThrow,AsyncCallbackInfo * asyncCallbackInfo)526 bool StartBackgroundRunningCheckParamBeforeSubmit(napi_env env, napi_value *argv, size_t len, bool isThrow,
527 AsyncCallbackInfo *asyncCallbackInfo)
528 {
529 // argv[0] : context : AbilityContext
530 if (GetAbilityContext(env, argv[0], asyncCallbackInfo->abilityContext) == nullptr) {
531 BGTASK_LOGE("Get ability context failed");
532 Common::HandleParamErr(env, ERR_CONTEXT_NULL_OR_TYPE_ERR, isThrow);
533 asyncCallbackInfo->errCode = ERR_CONTEXT_NULL_OR_TYPE_ERR;
534 return false;
535 }
536
537 // argv[1] : bgMode : BackgroundMode
538 if (GetBackgroundMode(env, argv[1], asyncCallbackInfo) == nullptr) {
539 BGTASK_LOGE("input bgmode param not number");
540 Common::HandleParamErr(env, ERR_BGMODE_NULL_OR_TYPE_ERR, isThrow);
541 asyncCallbackInfo->errCode = ERR_BGMODE_NULL_OR_TYPE_ERR;
542 return false;
543 }
544
545 // argv[2] : wantAgent: WantAgent
546 if (GetWantAgent(env, argv[2], asyncCallbackInfo->wantAgent) == nullptr) {
547 BGTASK_LOGE("input wantAgent param is not object");
548 Common::HandleParamErr(env, ERR_WANTAGENT_NULL_OR_TYPE_ERR, isThrow);
549 asyncCallbackInfo->errCode = ERR_WANTAGENT_NULL_OR_TYPE_ERR;
550 return false;
551 }
552 return true;
553 }
554
555
UpdateBackgroundRunning(napi_env env,napi_callback_info info,bool isThrow)556 napi_value UpdateBackgroundRunning(napi_env env, napi_callback_info info, bool isThrow)
557 {
558 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
559 "BackgroundTaskManager::ContinuousTask::Napi::UpdateBackgroundRunning");
560 ReportXPowerJsStackSysEventByType(env, "CONTINUOUS_TASK_UPDATE");
561 AsyncCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncCallbackInfo(env);
562 if (asyncCallbackInfo == nullptr) {
563 BGTASK_LOGE("asyncCallbackInfo == nullpter");
564 return WrapVoidToJS(env);
565 }
566 std::unique_ptr<AsyncCallbackInfo> callbackPtr {asyncCallbackInfo};
567
568 size_t argc = MAX_UPDATE_BG_RUNNING_PARAMS;
569 napi_value argv[MAX_UPDATE_BG_RUNNING_PARAMS] = {nullptr};
570 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
571 if (argc != MAX_UPDATE_BG_RUNNING_PARAMS) {
572 BGTASK_LOGE("wrong param nums");
573 Common::HandleParamErr(env, ERR_PARAM_NUMBER_ERR, isThrow);
574 return WrapVoidToJS(env);
575 }
576
577 // argv[0] : context : AbilityContext
578 if (GetAbilityContext(env, argv[0], asyncCallbackInfo->abilityContext) == nullptr) {
579 BGTASK_LOGE("Get ability context failed");
580 Common::HandleParamErr(env, ERR_CONTEXT_NULL_OR_TYPE_ERR, isThrow);
581 asyncCallbackInfo->errCode = ERR_CONTEXT_NULL_OR_TYPE_ERR;
582 return WrapVoidToJS(env);
583 }
584
585 // argv[1] : bgMode : BackgroundMode
586 if (GetBackgroundMode(env, argv[1], asyncCallbackInfo) == nullptr) {
587 BGTASK_LOGE("input bgmode param not number");
588 Common::HandleParamErr(env, ERR_BGMODE_NULL_OR_TYPE_ERR, isThrow);
589 asyncCallbackInfo->errCode = ERR_BGMODE_NULL_OR_TYPE_ERR;
590 return WrapVoidToJS(env);
591 }
592
593 napi_value ret {nullptr};
594 ret = UpdateBackgroundRunningPromise(env, asyncCallbackInfo, isThrow);
595 if (ret == nullptr) {
596 BGTASK_LOGE("ret is nullpter");
597 if (asyncCallbackInfo != nullptr) {
598 delete asyncCallbackInfo;
599 asyncCallbackInfo = nullptr;
600 }
601 ret = WrapVoidToJS(env);
602 }
603 callbackPtr.release();
604 return ret;
605 }
606
StartBackgroundRunning(napi_env env,napi_callback_info info,bool isThrow)607 napi_value StartBackgroundRunning(napi_env env, napi_callback_info info, bool isThrow)
608 {
609 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
610 "BackgroundTaskManager::ContinuousTask::Napi::StartBackgroundRunning");
611 ReportXPowerJsStackSysEventByType(env, "CONTINUOUS_TASK_APPLY");
612 AsyncCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncCallbackInfo(env);
613 if (asyncCallbackInfo == nullptr) {
614 BGTASK_LOGE("asyncCallbackInfo == nullpter");
615 return WrapVoidToJS(env);
616 }
617 std::unique_ptr<AsyncCallbackInfo> callbackPtr {asyncCallbackInfo};
618
619 size_t argc = MAX_START_BG_RUNNING_PARAMS;
620 napi_value argv[MAX_START_BG_RUNNING_PARAMS] = {nullptr};
621 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
622 if (argc > MAX_START_BG_RUNNING_PARAMS) {
623 BGTASK_LOGE("wrong param nums");
624 Common::HandleParamErr(env, ERR_PARAM_NUMBER_ERR, isThrow);
625 return WrapVoidToJS(env);
626 }
627
628 if (!StartBackgroundRunningCheckParamBeforeSubmit(env, argv, MAX_START_BG_RUNNING_PARAMS, isThrow,
629 asyncCallbackInfo)) {
630 BGTASK_LOGE("failed to check parameters before start bgtask running.");
631 return WrapVoidToJS(env);
632 }
633
634 napi_value ret {nullptr};
635
636 if (argc == MAX_START_BG_RUNNING_PARAMS) {
637 ret = StartBackgroundRunningAsync(env, argv, MAX_START_BG_RUNNING_PARAMS - 1, asyncCallbackInfo, isThrow);
638 } else {
639 ret = StartBackgroundRunningPromise(env, asyncCallbackInfo, isThrow);
640 }
641
642 if (ret == nullptr) {
643 BGTASK_LOGE("ret is nullpter");
644 if (asyncCallbackInfo != nullptr) {
645 delete asyncCallbackInfo;
646 asyncCallbackInfo = nullptr;
647 }
648 ret = WrapVoidToJS(env);
649 }
650 callbackPtr.release();
651 return ret;
652 }
653
StopBackgroundRunningCheckParam(napi_env env,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)654 bool StopBackgroundRunningCheckParam(napi_env env, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
655 {
656 if (asyncCallbackInfo == nullptr) {
657 BGTASK_LOGE("asyncCallbackInfo is nullptr");
658 return false;
659 }
660 if (asyncCallbackInfo->abilityContext == nullptr) {
661 BGTASK_LOGE("ability context is null");
662 Common::HandleParamErr(env, ERR_CONTEXT_NULL_OR_TYPE_ERR, isThrow);
663 asyncCallbackInfo->errCode = ERR_CONTEXT_NULL_OR_TYPE_ERR;
664 return false;
665 }
666 const std::shared_ptr<AppExecFwk::AbilityInfo> info = asyncCallbackInfo->abilityContext->GetAbilityInfo();
667 if (info == nullptr) {
668 BGTASK_LOGE("abilityInfo is null");
669 Common::HandleParamErr(env, ERR_ABILITY_INFO_EMPTY, isThrow);
670 asyncCallbackInfo->errCode = ERR_ABILITY_INFO_EMPTY;
671 return false;
672 }
673
674 sptr<IRemoteObject> token = asyncCallbackInfo->abilityContext->GetToken();
675 if (!token) {
676 BGTASK_LOGE("get ability token info failed");
677 Common::HandleParamErr(env, ERR_GET_TOKEN_ERR, isThrow);
678 asyncCallbackInfo->errCode = ERR_GET_TOKEN_ERR;
679 return false;
680 }
681 return true;
682 }
683
StopBackgroundRunningExecuteCB(napi_env env,void * data)684 void StopBackgroundRunningExecuteCB(napi_env env, void *data)
685 {
686 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
687 "BackgroundTaskManager::ContinuousTask::Napi::StopBackgroundRunningExecuteCB");
688 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
689 if (asyncCallbackInfo == nullptr || asyncCallbackInfo->errCode != ERR_OK) {
690 BGTASK_LOGE("input param error");
691 return;
692 }
693 const std::shared_ptr<AppExecFwk::AbilityInfo> info = asyncCallbackInfo->abilityContext->GetAbilityInfo();
694 sptr<IRemoteObject> token = asyncCallbackInfo->abilityContext->GetToken();
695 int32_t abilityId = asyncCallbackInfo->abilityContext->GetAbilityRecordId();
696 asyncCallbackInfo->errCode = BackgroundTaskMgrHelper::RequestStopBackgroundRunning(info->name, token, abilityId);
697 }
698
StopBackgroundRunningAsync(napi_env env,napi_value * argv,const uint32_t argCallback,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)699 napi_value StopBackgroundRunningAsync(napi_env env, napi_value *argv,
700 const uint32_t argCallback, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
701 {
702 if (argv == nullptr || asyncCallbackInfo == nullptr) {
703 BGTASK_LOGE("param is nullptr");
704 return nullptr;
705 }
706 if (isThrow && asyncCallbackInfo->errCode != ERR_OK) {
707 return nullptr;
708 }
709 napi_value resourceName {nullptr};
710 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
711
712 napi_valuetype valuetype = napi_undefined;
713 NAPI_CALL(env, napi_typeof(env, argv[argCallback], &valuetype));
714 if (valuetype == napi_function) {
715 NAPI_CALL(env, napi_create_reference(env, argv[argCallback], 1, &asyncCallbackInfo->callback));
716 }
717 if (!StopBackgroundRunningCheckParam(env, asyncCallbackInfo, isThrow) && isThrow) {
718 return nullptr;
719 }
720
721 NAPI_CALL(env, napi_create_async_work(env,
722 nullptr,
723 resourceName,
724 StopBackgroundRunningExecuteCB,
725 CallbackCompletedCB,
726 static_cast<void *>(asyncCallbackInfo),
727 &asyncCallbackInfo->asyncWork));
728 NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
729 return WrapVoidToJS(env);
730 }
731
StopBackgroundRunningPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo,bool isThrow)732 napi_value StopBackgroundRunningPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo, bool isThrow)
733 {
734 if (asyncCallbackInfo == nullptr) {
735 BGTASK_LOGE("param is nullptr");
736 return nullptr;
737 }
738 napi_value resourceName {nullptr};
739 napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
740 napi_deferred deferred;
741 napi_value promise {nullptr};
742 napi_create_promise(env, &deferred, &promise);
743
744 asyncCallbackInfo->deferred = deferred;
745 if (!StopBackgroundRunningCheckParam(env, asyncCallbackInfo, isThrow) && isThrow) {
746 return nullptr;
747 }
748
749 napi_create_async_work(
750 env,
751 nullptr,
752 resourceName,
753 StopBackgroundRunningExecuteCB,
754 PromiseCompletedCB,
755 static_cast<void *>(asyncCallbackInfo),
756 &asyncCallbackInfo->asyncWork);
757 napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
758 return promise;
759 }
760
StopBackgroundRunning(napi_env env,napi_callback_info info,bool isThrow)761 napi_value StopBackgroundRunning(napi_env env, napi_callback_info info, bool isThrow)
762 {
763 HitraceScoped traceScoped(HITRACE_TAG_OHOS,
764 "BackgroundTaskManager::ContinuousTask::Napi::StopBackgroundRunning");
765 ReportXPowerJsStackSysEventByType(env, "CONTINUOUS_TASK_CANCEL");
766 AsyncCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncCallbackInfo(env);
767 if (asyncCallbackInfo == nullptr) {
768 BGTASK_LOGE("asyncCallbackInfo is nullpter");
769 return WrapVoidToJS(env);
770 }
771 std::unique_ptr<AsyncCallbackInfo> callbackPtr {asyncCallbackInfo};
772
773 size_t argc = MAX_STOP_BG_RUNNING_PARAMS;
774 napi_value argv[MAX_STOP_BG_RUNNING_PARAMS] = {nullptr};
775
776 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
777 if (argc > MAX_STOP_BG_RUNNING_PARAMS) {
778 BGTASK_LOGE("wrong param nums");
779 Common::HandleParamErr(env, ERR_PARAM_NUMBER_ERR, isThrow);
780 return nullptr;
781 }
782
783 // argv[0] : context : AbilityContext
784 if (GetAbilityContext(env, argv[0], asyncCallbackInfo->abilityContext) == nullptr) {
785 BGTASK_LOGE("Get ability context failed");
786 Common::HandleParamErr(env, ERR_CONTEXT_NULL_OR_TYPE_ERR, isThrow);
787 asyncCallbackInfo->errCode = ERR_CONTEXT_NULL_OR_TYPE_ERR;
788 return nullptr;
789 }
790
791 napi_value ret {nullptr};
792 if (argc == MAX_STOP_BG_RUNNING_PARAMS) {
793 ret = StopBackgroundRunningAsync(env, argv, MAX_STOP_BG_RUNNING_PARAMS - 1, asyncCallbackInfo, isThrow);
794 } else {
795 ret = StopBackgroundRunningPromise(env, asyncCallbackInfo, isThrow);
796 }
797
798 if (ret == nullptr) {
799 BGTASK_LOGE("ret is nullpter");
800 if (asyncCallbackInfo != nullptr) {
801 delete asyncCallbackInfo;
802 asyncCallbackInfo = nullptr;
803 }
804 ret = WrapVoidToJS(env);
805 }
806 callbackPtr.release();
807 return ret;
808 }
809
CheckOnParam(napi_env env,uint32_t argc,napi_value argv[],int size)810 bool CheckOnParam(napi_env env, uint32_t argc, napi_value argv[], int size)
811 {
812 if (argc < ARGC_TWO) {
813 BGTASK_LOGE("wrong param nums");
814 return false;
815 }
816 // argv[0] : type
817 std::string type;
818 if (!AbilityRuntime::ConvertFromJsValue(env, argv[INDEX_ZERO], type)) {
819 BGTASK_LOGE("type must be string");
820 return false;
821 }
822 if (type != "continuousTaskCancel") {
823 BGTASK_LOGE("type must be continuousTaskCancel");
824 return false;
825 }
826 // arg[1] : callback
827 if (!CheckTypeForNapiValue(env, argv[INDEX_ONE], napi_function)) {
828 return false;
829 }
830 return true;
831 }
832
OnOnContinuousTaskCancel(napi_env env,napi_callback_info info)833 napi_value OnOnContinuousTaskCancel(napi_env env, napi_callback_info info)
834 {
835 size_t argc = ARGC_TWO;
836 napi_value argv[ARGC_TWO] = {nullptr};
837 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
838 if (!CheckOnParam(env, argc, argv, ARGC_TWO)) {
839 Common::HandleParamErr(env, ERR_BGTASK_INVALID_PARAM, true);
840 return WrapUndefinedToJS(env);
841 }
842
843 if (backgroundTaskSubscriber_ == nullptr) {
844 backgroundTaskSubscriber_ = std::make_shared<JsBackgroundTaskSubscriber>(env);
845 if (backgroundTaskSubscriber_ == nullptr) {
846 BGTASK_LOGE("ret is nullptr");
847 Common::HandleErrCode(env, ERR_BGTASK_SERVICE_INNER_ERROR, true);
848 return WrapUndefinedToJS(env);
849 }
850 }
851 if (backgroundTaskSubscriber_->IsEmpty()) {
852 ErrCode errCode = BackgroundTaskMgrHelper::SubscribeBackgroundTask(*backgroundTaskSubscriber_);
853 if (errCode != ERR_OK) {
854 BGTASK_LOGE("SubscribeBackgroundTask failed.");
855 Common::HandleErrCode(env, errCode, true);
856 return WrapUndefinedToJS(env);
857 }
858 }
859 backgroundTaskSubscriber_->AddJsObserverObject(argv[INDEX_ONE]);
860 backgroundTaskSubscriber_->SubscriberBgtaskSaStatusChange();
861 return WrapUndefinedToJS(env);
862 }
863
CheckOffParam(napi_env env,uint32_t argc,napi_value argv[],int size)864 bool CheckOffParam(napi_env env, uint32_t argc, napi_value argv[], int size)
865 {
866 if (argc < ARGC_ONE) {
867 BGTASK_LOGE("wrong param nums < 1");
868 return false;
869 }
870
871 // argv[0] : type
872 std::string type;
873 if (!AbilityRuntime::ConvertFromJsValue(env, argv[INDEX_ZERO], type)) {
874 BGTASK_LOGE("type must be string");
875 return false;
876 }
877 if (type != "continuousTaskCancel") {
878 BGTASK_LOGE("type must be continuousTaskCancel");
879 return false;
880 }
881 // arg[1] : callback
882 if (argc == ARGC_TWO) {
883 if (!CheckTypeForNapiValue(env, argv[INDEX_ONE], napi_function)) {
884 return false;
885 }
886 }
887 return true;
888 }
889
OffOnContinuousTaskCancel(napi_env env,napi_callback_info info)890 napi_value OffOnContinuousTaskCancel(napi_env env, napi_callback_info info)
891 {
892 size_t argc = ARGC_TWO;
893 napi_value argv[ARGC_TWO] = {nullptr};
894 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
895 if (!CheckOffParam(env, argc, argv, ARGC_TWO)) {
896 Common::HandleParamErr(env, ERR_BGTASK_INVALID_PARAM, true);
897 return WrapUndefinedToJS(env);
898 }
899 if (!backgroundTaskSubscriber_) {
900 BGTASK_LOGD("backgroundTaskSubscriber_ is null, return");
901 return WrapUndefinedToJS(env);
902 }
903 if (argc == ARGC_ONE) {
904 backgroundTaskSubscriber_->RemoveAllJsObserverObjects();
905 } else if (argc == ARGC_TWO) {
906 backgroundTaskSubscriber_->RemoveJsObserverObject(argv[INDEX_ONE]);
907 }
908
909 if (backgroundTaskSubscriber_->IsEmpty()) {
910 ErrCode errCode = BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*backgroundTaskSubscriber_);
911 if (errCode != ERR_OK) {
912 BGTASK_LOGE("UnsubscribeBackgroundTask failed.");
913 Common::HandleErrCode(env, errCode, true);
914 return WrapUndefinedToJS(env);
915 }
916 backgroundTaskSubscriber_->UnSubscriberBgtaskSaStatusChange();
917 backgroundTaskSubscriber_ = nullptr;
918 }
919 return WrapUndefinedToJS(env);
920 }
921
StartBackgroundRunning(napi_env env,napi_callback_info info)922 napi_value StartBackgroundRunning(napi_env env, napi_callback_info info)
923 {
924 return StartBackgroundRunning(env, info, false);
925 }
926
StopBackgroundRunning(napi_env env,napi_callback_info info)927 napi_value StopBackgroundRunning(napi_env env, napi_callback_info info)
928 {
929 return StopBackgroundRunning(env, info, false);
930 }
931
StartBackgroundRunningThrow(napi_env env,napi_callback_info info)932 napi_value StartBackgroundRunningThrow(napi_env env, napi_callback_info info)
933 {
934 return StartBackgroundRunning(env, info, true);
935 }
936
UpdateBackgroundRunningThrow(napi_env env,napi_callback_info info)937 napi_value UpdateBackgroundRunningThrow(napi_env env, napi_callback_info info)
938 {
939 return UpdateBackgroundRunning(env, info, true);
940 }
941
StopBackgroundRunningThrow(napi_env env,napi_callback_info info)942 napi_value StopBackgroundRunningThrow(napi_env env, napi_callback_info info)
943 {
944 return StopBackgroundRunning(env, info, true);
945 }
946 } // namespace BackgroundTaskMgr
947 } // namespace OHOS