• 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_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, &notificationId);
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