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 <string>
17 #include "securec.h"
18
19 #include "bundle_active_log.h"
20 #include "bundle_state_common.h"
21 #include "bundle_state_data.h"
22 #include "bundle_state_query_napi.h"
23 #include "app_group_observer_napi.h"
24 #include "bundle_state_inner_errors.h"
25
26 namespace OHOS {
27 namespace DeviceUsageStats {
28 const uint32_t IS_IDLE_STATE_MIN_PARAMS = 1;
29 const uint32_t IS_IDLE_STATE_PARAMS = 2;
30 const uint32_t STATES_MIN_PARAMS = 2;
31 const uint32_t STATES_PARAMS = 3;
32 const uint32_t APP_USAGE_MIN_PARAMS_BY_INTERVAL = 3;
33 const uint32_t APP_USAGE_PARAMS_BY_INTERVAL = 4;
34 const uint32_t APP_USAGE_MIN_PARAMS = 2;
35 const uint32_t APP_USAGE_PARAMS = 3;
36 const uint32_t MODULE_RECORDS_MIN_PARAMS = 0;
37 const uint32_t MODULE_RECORDS_MIDDLE_PARAMS = 1;
38 const uint32_t MODULE_RECORDS_PARAMS = 2;
39 const uint32_t SECOND_ARG = 2;
40 const uint32_t THIRD_ARG = 3;
41 const int32_t MAXNUM_UP_LIMIT = 1000;
42 const std::vector<int32_t> GROUP_TYPE {10, 20, 30, 40, 50, 60};
43 const uint32_t EVENT_STATES_MIN_PARAMS = 2;
44 const uint32_t EVENT_STATES_PARAMS = 3;
45
ParseQueryModuleUsageRecords(const napi_env & env,const napi_callback_info & info,ModuleRecordParamsInfo & params,AsyncCallbackInfoModuleRecord * & asyncCallbackInfo)46 napi_value ParseQueryModuleUsageRecords(const napi_env &env, const napi_callback_info &info,
47 ModuleRecordParamsInfo ¶ms, AsyncCallbackInfoModuleRecord*& asyncCallbackInfo)
48 {
49 size_t argc = MODULE_RECORDS_PARAMS;
50 napi_value argv[MODULE_RECORDS_PARAMS] = {nullptr};
51 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
52 if ((argc != MODULE_RECORDS_MIN_PARAMS) && (argc != MODULE_RECORDS_MIDDLE_PARAMS) &&
53 (argc != MODULE_RECORDS_PARAMS)) {
54 params.errorCode = ERR_PARAMETERS_NUMBER;
55 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
56 }
57
58 if (argc == MODULE_RECORDS_MIN_PARAMS) {
59 params.maxNum = MAXNUM_UP_LIMIT;
60 }
61 if (argc == MODULE_RECORDS_MIDDLE_PARAMS) {
62 if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.maxNum) == nullptr) {
63 BUNDLE_ACTIVE_LOGI("get module info has only one callback param");
64 napi_valuetype valuetype = napi_undefined;
65 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
66 if (valuetype != napi_function) {
67 params.errorCode = ERR_CALL_BACK_TYPE;
68 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
69 }
70 params.maxNum = MAXNUM_UP_LIMIT;
71 napi_create_reference(env, argv[0], 1, ¶ms.callback);
72 } else if (params.maxNum > MAXNUM_UP_LIMIT || params.maxNum <= 0) {
73 BUNDLE_ACTIVE_LOGI("get module info has only one maxNum param");
74 BUNDLE_ACTIVE_LOGE("ParseQueryModuleUsageRecords failed, maxNum is larger than 1000 or less/equal than 0");
75 params.errorCode = ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND;
76 return BundleStateCommon::HandleParamErr(env, ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND, "");
77 }
78 }
79 if (argc == MODULE_RECORDS_PARAMS) {
80 // argv[0] : maxNum
81 if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.maxNum) == nullptr) {
82 BUNDLE_ACTIVE_LOGE("ParseQueryModuleUsageRecords failed, maxNum type is invalid.");
83 params.errorCode = ERR_MAX_RECORDS_NUM_TYPE;
84 return BundleStateCommon::HandleParamErr(env, ERR_MAX_RECORDS_NUM_TYPE, "");
85 }
86
87 if (params.maxNum > MAXNUM_UP_LIMIT || params.maxNum <= 0) {
88 BUNDLE_ACTIVE_LOGE("ParseQueryModuleUsageRecords failed, maxNum is larger than 1000 or less/equal than 0");
89 params.errorCode = ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND;
90 return BundleStateCommon::HandleParamErr(env, ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND, "");
91 }
92
93 // argv[1] : callback
94 napi_valuetype valuetype = napi_undefined;
95 NAPI_CALL(env, napi_typeof(env, argv[1], &valuetype));
96 if (valuetype != napi_function) {
97 params.errorCode = ERR_CALL_BACK_TYPE;
98 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
99 }
100 napi_create_reference(env, argv[1], 1, ¶ms.callback);
101 }
102 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
103 return BundleStateCommon::NapiGetNull(env);
104 }
105
QueryModuleUsageRecords(napi_env env,napi_callback_info info)106 napi_value QueryModuleUsageRecords(napi_env env, napi_callback_info info)
107 {
108 ModuleRecordParamsInfo params;
109 AsyncCallbackInfoModuleRecord *asyncCallbackInfo = nullptr;
110 ParseQueryModuleUsageRecords(env, info, params, asyncCallbackInfo);
111 if (params.errorCode != ERR_OK) {
112 return BundleStateCommon::NapiGetNull(env);
113 }
114 napi_value promise = nullptr;
115 std::unique_ptr<AsyncCallbackInfoModuleRecord> callbackPtr {asyncCallbackInfo};
116 callbackPtr->maxNum = params.maxNum;
117 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
118 napi_value resourceName = nullptr;
119 NAPI_CALL(env, napi_create_string_latin1(env, "QueryModuleUsageRecords", NAPI_AUTO_LENGTH, &resourceName));
120 NAPI_CALL(env, napi_create_async_work(env,
121 nullptr,
122 resourceName,
123 [](napi_env env, void *data) {
124 AsyncCallbackInfoModuleRecord *asyncCallbackInfo = (AsyncCallbackInfoModuleRecord *)data;
125 if (asyncCallbackInfo != nullptr) {
126 asyncCallbackInfo->errorCode =
127 BundleActiveClient::GetInstance().QueryModuleUsageRecords(asyncCallbackInfo->maxNum,
128 asyncCallbackInfo->moduleRecords);
129 } else {
130 BUNDLE_ACTIVE_LOGE("QueryBundleStatsInfoByInterval, asyncCallbackInfo == nullptr");
131 }
132 },
133 [](napi_env env, napi_status status, void *data) {
134 AsyncCallbackInfoModuleRecord *asyncCallbackInfo = (AsyncCallbackInfoModuleRecord *)data;
135 if (asyncCallbackInfo != nullptr) {
136 napi_value result = nullptr;
137 napi_create_array(env, &result);
138 BundleStateCommon::GetModuleRecordForResult(env, asyncCallbackInfo->moduleRecords, result);
139 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
140 }
141 },
142 static_cast<void*>(asyncCallbackInfo),
143 &asyncCallbackInfo->asyncWork));
144 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
145 if (callbackPtr->isCallback) {
146 callbackPtr.release();
147 return BundleStateCommon::NapiGetNull(env);
148 } else {
149 callbackPtr.release();
150 return promise;
151 }
152 }
153
ParseIsIdleStateParameters(const napi_env & env,const napi_callback_info & info,IsIdleStateParamsInfo & params,AsyncCallbackInfoIsIdleState * & asyncCallbackInfo)154 napi_value ParseIsIdleStateParameters(const napi_env &env, const napi_callback_info &info,
155 IsIdleStateParamsInfo ¶ms, AsyncCallbackInfoIsIdleState*& asyncCallbackInfo)
156 {
157 size_t argc = IS_IDLE_STATE_PARAMS;
158 napi_value argv[IS_IDLE_STATE_PARAMS] = {nullptr};
159 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
160 NAPI_ASSERT(env, argc == IS_IDLE_STATE_MIN_PARAMS || argc == IS_IDLE_STATE_PARAMS,
161 "Invalid number of parameters");
162 if ((argc != IS_IDLE_STATE_MIN_PARAMS) && (argc != IS_IDLE_STATE_PARAMS)) {
163 params.errorCode = ERR_PARAMETERS_NUMBER;
164 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
165 }
166
167 // argv[0] : bundleName
168 std::string result = "";
169 napi_valuetype valuetype;
170 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
171 if ((valuetype != napi_string) && (params.errorCode == ERR_OK)) {
172 BUNDLE_ACTIVE_LOGE("Wrong argument type, string expected.");
173 params.errorCode = ERR_BUNDLE_NAME_TYPE;
174 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
175 }
176
177 params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
178 if (params.bundleName.empty()) {
179 BUNDLE_ACTIVE_LOGE("ParseIsIdleStateParameters failed, bundleName is empty.");
180 params.errorCode = ERR_PARAMETERS_EMPTY;
181 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "bundleName");
182 }
183
184 // argv[1]: callback
185 if (argc == IS_IDLE_STATE_PARAMS) {
186 napi_valuetype inputValueType = napi_undefined;
187 NAPI_CALL(env, napi_typeof(env, argv[1], &inputValueType));
188 if (inputValueType != napi_function) {
189 params.errorCode = ERR_CALL_BACK_TYPE;
190 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
191 }
192 napi_create_reference(env, argv[1], 1, ¶ms.callback);
193 }
194 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
195 return BundleStateCommon::NapiGetNull(env);
196 }
197
IsIdleState(napi_env env,napi_callback_info info)198 napi_value IsIdleState(napi_env env, napi_callback_info info)
199 {
200 IsIdleStateParamsInfo params;
201 AsyncCallbackInfoIsIdleState *asyncCallbackInfo = nullptr;
202 ParseIsIdleStateParameters(env, info, params, asyncCallbackInfo);
203 if (params.errorCode != ERR_OK) {
204 return BundleStateCommon::NapiGetNull(env);
205 }
206 napi_value promise = nullptr;
207 std::unique_ptr<AsyncCallbackInfoIsIdleState> callbackPtr {asyncCallbackInfo};
208 callbackPtr->bundleName = params.bundleName;
209 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
210 napi_value resourceName = nullptr;
211 NAPI_CALL(env, napi_create_string_latin1(env, "IsIdleState", NAPI_AUTO_LENGTH, &resourceName));
212 NAPI_CALL(env, napi_create_async_work(env,
213 nullptr,
214 resourceName,
215 [](napi_env env, void *data) {
216 AsyncCallbackInfoIsIdleState *asyncCallbackInfo = (AsyncCallbackInfoIsIdleState *)data;
217 if (asyncCallbackInfo != nullptr) {
218 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance().IsBundleIdle(
219 asyncCallbackInfo->state, asyncCallbackInfo->bundleName);
220 } else {
221 BUNDLE_ACTIVE_LOGE("IsIdleState, asyncCallbackInfo == nullptr");
222 }
223 },
224 [](napi_env env, napi_status status, void *data) {
225 AsyncCallbackInfoIsIdleState *asyncCallbackInfo = (AsyncCallbackInfoIsIdleState *)data;
226 if (asyncCallbackInfo != nullptr) {
227 napi_value result = nullptr;
228 napi_get_boolean(env, asyncCallbackInfo->state, &result);
229 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
230 }
231 },
232 static_cast<void*>(asyncCallbackInfo),
233 &asyncCallbackInfo->asyncWork));
234 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
235 if (callbackPtr->isCallback) {
236 callbackPtr.release();
237 return BundleStateCommon::NapiGetNull(env);
238 } else {
239 callbackPtr.release();
240 return promise;
241 }
242 }
243
ParseIsIdleStateSyncParameters(const napi_env & env,const napi_callback_info & info,IsIdleStateParamsInfo & params)244 napi_value ParseIsIdleStateSyncParameters(const napi_env &env, const napi_callback_info &info,
245 IsIdleStateParamsInfo ¶ms)
246 {
247 size_t argc = IS_IDLE_STATE_PARAMS;
248 napi_value argv[IS_IDLE_STATE_PARAMS] = {nullptr};
249 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
250 NAPI_ASSERT(env, argc == IS_IDLE_STATE_MIN_PARAMS, "Invalid number of parameters");
251 if ((argc != IS_IDLE_STATE_MIN_PARAMS)) {
252 params.errorCode = ERR_PARAMETERS_NUMBER;
253 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
254 }
255
256 // argv[0] : bundleName
257 std::string result = "";
258 napi_valuetype valuetype;
259 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
260 if ((valuetype != napi_string) && (params.errorCode == ERR_OK)) {
261 BUNDLE_ACTIVE_LOGE("Wrong argument type, string expected.");
262 params.errorCode = ERR_BUNDLE_NAME_TYPE;
263 return BundleStateCommon::HandleParamErr(env, ERR_BUNDLE_NAME_TYPE, "");
264 }
265
266 params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
267 if (params.bundleName.empty()) {
268 BUNDLE_ACTIVE_LOGE("ParseIsIdleStateParameters failed, bundleName is empty.");
269 params.errorCode = ERR_PARAMETERS_EMPTY;
270 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_EMPTY, "bundleName");
271 }
272 return BundleStateCommon::NapiGetNull(env);
273 }
274
IsIdleStateSync(napi_env env,napi_callback_info info)275 napi_value IsIdleStateSync(napi_env env, napi_callback_info info)
276 {
277 IsIdleStateParamsInfo params;
278 ParseIsIdleStateSyncParameters(env, info, params);
279 bool isIdleState = false;
280 ErrCode errorCode = BundleActiveClient::GetInstance().IsBundleIdle(
281 isIdleState, params.bundleName);
282 if (errorCode == ERR_OK) {
283 napi_value napiValue = nullptr;
284 NAPI_CALL(env, napi_get_boolean(env, isIdleState, &napiValue));
285 return napiValue;
286 }
287 return BundleStateCommon::GetErrorValue(env, errorCode);
288 }
289
ParseQueryCurrentBundleEventsParameters(const napi_env & env,const napi_callback_info & info,StatesParamsInfo & params,AsyncCallbackInfoStates * & asyncCallbackInfo)290 napi_value ParseQueryCurrentBundleEventsParameters(const napi_env &env, const napi_callback_info &info,
291 StatesParamsInfo ¶ms, AsyncCallbackInfoStates*& asyncCallbackInfo)
292 {
293 size_t argc = STATES_PARAMS;
294 napi_value argv[STATES_PARAMS] = {nullptr};
295 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
296 if ((argc != STATES_MIN_PARAMS) && (argc != STATES_PARAMS)) {
297 params.errorCode = ERR_PARAMETERS_NUMBER;
298 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
299 }
300
301 // argv[0] : beginTime
302 if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
303 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters failed, beginTime type is invalid.");
304 params.errorCode = ERR_BEGIN_TIME_TYPE;
305 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
306 }
307 if ((params.errorCode == ERR_OK)
308 && (params.beginTime < TIME_NUMBER_MIN)) {
309 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters failed, beginTime value is invalid.");
310 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
311 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
312 }
313
314 // argv[1] : endTime
315 if ((params.errorCode == ERR_OK)
316 && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr)) {
317 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters failed, endTime type is invalid.");
318 params.errorCode = ERR_END_TIME_TYPE;
319 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
320 }
321 if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
322 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters endTime(%{public}lld) <= beginTime(%{public}lld)",
323 (long long)params.endTime, (long long)params.beginTime);
324 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
325 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_LESS_THEN_BEGIN_TIME, "");
326 }
327
328 // argv[SECOND_ARG]: callback
329 if (argc == STATES_PARAMS) {
330 napi_valuetype valuetype = napi_undefined;
331 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
332 if (valuetype != napi_function) {
333 params.errorCode = ERR_CALL_BACK_TYPE;
334 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
335 }
336 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
337 }
338 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
339 return BundleStateCommon::NapiGetNull(env);
340 }
341
QueryCurrentBundleEvents(napi_env env,napi_callback_info info)342 napi_value QueryCurrentBundleEvents(napi_env env, napi_callback_info info)
343 {
344 StatesParamsInfo params;
345 AsyncCallbackInfoStates *asyncCallbackInfo = nullptr;
346 ParseQueryCurrentBundleEventsParameters(env, info, params, asyncCallbackInfo);
347 if (params.errorCode != ERR_OK) {
348 return BundleStateCommon::NapiGetNull(env);
349 }
350 napi_value promise = nullptr;
351 std::unique_ptr<AsyncCallbackInfoStates> callbackPtr {asyncCallbackInfo};
352 callbackPtr->beginTime = params.beginTime;
353 BUNDLE_ACTIVE_LOGD("QueryCurrentBundleEvents callbackPtr->beginTime: %{public}lld",
354 (long long)callbackPtr->beginTime);
355 callbackPtr->endTime = params.endTime;
356 BUNDLE_ACTIVE_LOGD("QueryCurrentBundleEvents callbackPtr->endTime: %{public}lld",
357 (long long)callbackPtr->endTime);
358 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
359
360 napi_value resourceName = nullptr;
361 NAPI_CALL(env, napi_create_string_latin1(env, "QueryCurrentBundleEvents", NAPI_AUTO_LENGTH, &resourceName));
362 NAPI_CALL(env, napi_create_async_work(env,
363 nullptr,
364 resourceName,
365 [](napi_env env, void *data) {
366 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
367 if (asyncCallbackInfo != nullptr) {
368 asyncCallbackInfo->errorCode =
369 BundleActiveClient::GetInstance().QueryCurrentBundleEvents(asyncCallbackInfo->BundleActiveState,
370 asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
371 } else {
372 BUNDLE_ACTIVE_LOGE("QueryCurrentBundleEvents, asyncCallbackInfo == nullptr");
373 }
374 },
375 [](napi_env env, napi_status status, void *data) {
376 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
377 if (asyncCallbackInfo != nullptr) {
378 napi_value result = nullptr;
379 napi_create_array(env, &result);
380 BundleStateCommon::GetBundleActiveEventForResult(
381 env, asyncCallbackInfo->BundleActiveState, result, true);
382 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
383 }
384 },
385 static_cast<void*>(asyncCallbackInfo),
386 &asyncCallbackInfo->asyncWork));
387 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
388 if (callbackPtr->isCallback) {
389 callbackPtr.release();
390 return BundleStateCommon::NapiGetNull(env);
391 } else {
392 callbackPtr.release();
393 return promise;
394 }
395 }
396
QueryBundleEvents(napi_env env,napi_callback_info info)397 napi_value QueryBundleEvents(napi_env env, napi_callback_info info)
398 {
399 StatesParamsInfo params;
400 AsyncCallbackInfoStates *asyncCallbackInfo = nullptr;
401 ParseQueryCurrentBundleEventsParameters(env, info, params, asyncCallbackInfo);
402 if (params.errorCode != ERR_OK) {
403 return BundleStateCommon::NapiGetNull(env);
404 }
405 napi_value promise = nullptr;
406 std::unique_ptr<AsyncCallbackInfoStates> callbackPtr {asyncCallbackInfo};
407 callbackPtr->beginTime = params.beginTime;
408 BUNDLE_ACTIVE_LOGD("QueryBundleEvents callbackPtr->beginTime: %{public}lld",
409 (long long)callbackPtr->beginTime);
410 callbackPtr->endTime = params.endTime;
411 BUNDLE_ACTIVE_LOGD("QueryBundleEvents callbackPtr->endTime: %{public}lld",
412 (long long)callbackPtr->endTime);
413 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
414
415 napi_value resourceName = nullptr;
416 NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleEvents", NAPI_AUTO_LENGTH, &resourceName));
417
418 NAPI_CALL(env, napi_create_async_work(env,
419 nullptr,
420 resourceName,
421 [](napi_env env, void *data) {
422 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
423 if (asyncCallbackInfo != nullptr) {
424 asyncCallbackInfo->errorCode =
425 BundleActiveClient::GetInstance().QueryBundleEvents(asyncCallbackInfo->BundleActiveState,
426 asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
427 } else {
428 BUNDLE_ACTIVE_LOGE("QueryBundleEvents, asyncCallbackInfo == nullptr");
429 }
430 },
431 [](napi_env env, napi_status status, void *data) {
432 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
433 if (asyncCallbackInfo != nullptr) {
434 napi_value result = nullptr;
435 napi_create_array(env, &result);
436 BundleStateCommon::GetBundleActiveEventForResult(
437 env, asyncCallbackInfo->BundleActiveState, result, true);
438 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
439 }
440 },
441 static_cast<void*>(asyncCallbackInfo),
442 &asyncCallbackInfo->asyncWork));
443 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
444 if (callbackPtr->isCallback) {
445 callbackPtr.release();
446 return BundleStateCommon::NapiGetNull(env);
447 } else {
448 callbackPtr.release();
449 return promise;
450 }
451 }
452
ParseQueryBundleStatsInfoByInterval(const napi_env & env,const napi_callback_info & info,AppUsageParamsByIntervalInfo & params,AsyncCallbackInfoAppUsageByInterval * & asyncCallbackInfo)453 napi_value ParseQueryBundleStatsInfoByInterval(const napi_env &env, const napi_callback_info &info,
454 AppUsageParamsByIntervalInfo ¶ms, AsyncCallbackInfoAppUsageByInterval*& asyncCallbackInfo)
455 {
456 size_t argc = APP_USAGE_PARAMS_BY_INTERVAL;
457 napi_value argv[APP_USAGE_PARAMS_BY_INTERVAL] = {nullptr};
458 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
459 if ((argc != APP_USAGE_MIN_PARAMS_BY_INTERVAL) && (argc != APP_USAGE_PARAMS_BY_INTERVAL)) {
460 params.errorCode = ERR_PARAMETERS_NUMBER;
461 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
462 }
463
464 // argv[0] : intervalType
465 if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.intervalType) == nullptr) {
466 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, intervalType is invalid.");
467 params.errorCode = ERR_INTERVAL_TYPE;
468 return BundleStateCommon::HandleParamErr(env, ERR_INTERVAL_TYPE, "");
469 }
470 if ((params.errorCode == ERR_OK) && ((params.intervalType < INTERVAL_NUMBER_MIN)
471 || (params.intervalType > INTERVAL_NUMBER_MAX))) {
472 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, intervalType number is invalid.");
473 params.errorCode = ERR_INTERVAL_OUT_OF_RANGE;
474 return BundleStateCommon::HandleParamErr(env, ERR_INTERVAL_OUT_OF_RANGE, "");
475 }
476
477 // argv[1] : beginTime
478 if ((params.errorCode == ERR_OK)
479 && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.beginTime) == nullptr)) {
480 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, beginTime type is invalid.");
481 params.errorCode = ERR_BEGIN_TIME_TYPE;
482 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
483 }
484 if ((params.errorCode == ERR_OK)
485 && (params.beginTime < TIME_NUMBER_MIN)) {
486 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, beginTime value is invalid.");
487 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
488 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
489 }
490
491 // argv[SECOND_ARG] : endTime
492 if ((params.errorCode == ERR_OK)
493 && (BundleStateCommon::GetInt64NumberValue(env, argv[SECOND_ARG], params.endTime) == nullptr)) {
494 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, endTime type is invalid.");
495 params.errorCode = ERR_END_TIME_TYPE;
496 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
497 }
498 if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
499 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval endTime(%{public}lld) <= beginTime(%{public}lld)",
500 (long long)params.endTime, (long long)params.beginTime);
501 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
502 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_LESS_THEN_BEGIN_TIME, "");
503 }
504
505 // argv[THIRD_ARG]: callback
506 if (argc == APP_USAGE_PARAMS_BY_INTERVAL) {
507 napi_valuetype valuetype = napi_undefined;
508 NAPI_CALL(env, napi_typeof(env, argv[THIRD_ARG], &valuetype));
509 if (valuetype != napi_function) {
510 params.errorCode = ERR_CALL_BACK_TYPE;
511 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
512 }
513 napi_create_reference(env, argv[THIRD_ARG], 1, ¶ms.callback);
514 }
515 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
516 return BundleStateCommon::NapiGetNull(env);
517 }
518
QueryBundleStatsInfoByInterval(napi_env env,napi_callback_info info)519 napi_value QueryBundleStatsInfoByInterval(napi_env env, napi_callback_info info)
520 {
521 AppUsageParamsByIntervalInfo params;
522 AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = nullptr;
523 ParseQueryBundleStatsInfoByInterval(env, info, params, asyncCallbackInfo);
524 if (params.errorCode != ERR_OK) {
525 return BundleStateCommon::NapiGetNull(env);
526 }
527 napi_value promise = nullptr;
528 std::unique_ptr<AsyncCallbackInfoAppUsageByInterval> callbackPtr {asyncCallbackInfo};
529 callbackPtr->intervalType = params.intervalType;
530 callbackPtr->beginTime = params.beginTime;
531 callbackPtr->endTime = params.endTime;
532 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
533 napi_value resourceName = nullptr;
534 NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleStatsInfoByInterval", NAPI_AUTO_LENGTH, &resourceName));
535 NAPI_CALL(env, napi_create_async_work(env,
536 nullptr,
537 resourceName,
538 [](napi_env env, void *data) {
539 AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = (AsyncCallbackInfoAppUsageByInterval *)data;
540 if (asyncCallbackInfo != nullptr) {
541 asyncCallbackInfo->errorCode =
542 BundleActiveClient::GetInstance().QueryBundleStatsInfoByInterval(asyncCallbackInfo->packageStats,
543 asyncCallbackInfo->intervalType, asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
544 } else {
545 BUNDLE_ACTIVE_LOGE("QueryBundleStatsInfoByInterval, asyncCallbackInfo == nullptr");
546 }
547 },
548 [](napi_env env, napi_status status, void *data) {
549 AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = (AsyncCallbackInfoAppUsageByInterval *)data;
550 if (asyncCallbackInfo != nullptr) {
551 napi_value result = nullptr;
552 napi_create_array(env, &result);
553 BundleStateCommon::GetBundleStateInfoByIntervalForResult(env, asyncCallbackInfo->packageStats, result);
554 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
555 }
556 },
557 static_cast<void*>(asyncCallbackInfo),
558 &asyncCallbackInfo->asyncWork));
559 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
560 if (callbackPtr->isCallback) {
561 callbackPtr.release();
562 return BundleStateCommon::NapiGetNull(env);
563 } else {
564 callbackPtr.release();
565 return promise;
566 }
567 }
568
ParseQueryBundleStatsInfos(const napi_env & env,const napi_callback_info & info,QueryBundleStatsParamsInfo & params,AsyncCallbackInfoAppUsage * & asyncCallbackInfo)569 napi_value ParseQueryBundleStatsInfos(const napi_env &env, const napi_callback_info &info,
570 QueryBundleStatsParamsInfo ¶ms, AsyncCallbackInfoAppUsage*& asyncCallbackInfo)
571 {
572 size_t argc = APP_USAGE_PARAMS;
573 napi_value argv[APP_USAGE_PARAMS] = {nullptr};
574 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
575 if ((argc != APP_USAGE_MIN_PARAMS) && (argc != APP_USAGE_PARAMS)) {
576 params.errorCode = ERR_PARAMETERS_NUMBER;
577 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
578 }
579
580 // argv[0] : beginTime
581 if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
582 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos failed, beginTime type is invalid.");
583 params.errorCode = ERR_BEGIN_TIME_TYPE;
584 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
585 }
586 if ((params.errorCode == ERR_OK) && (params.beginTime < TIME_NUMBER_MIN)) {
587 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos failed failed, beginTime value is invalid.");
588 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
589 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
590 }
591
592 // argv[1] : endTime
593 if ((params.errorCode == ERR_OK)
594 && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr)) {
595 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos failed, endTime type is invalid.");
596 params.errorCode = ERR_END_TIME_TYPE;
597 }
598 if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
599 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos endTime(%{public}lld) <= beginTime(%{public}lld)",
600 (long long)params.endTime, (long long)params.beginTime);
601 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
602 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
603 }
604
605 // argv[SECOND_ARG]: callback
606 if (argc == APP_USAGE_PARAMS) {
607 napi_valuetype valuetype = napi_undefined;
608 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
609 if (valuetype != napi_function) {
610 params.errorCode = ERR_CALL_BACK_TYPE;
611 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
612 }
613 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
614 }
615 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
616 return BundleStateCommon::NapiGetNull(env);
617 }
618
QueryBundleStatsInfos(napi_env env,napi_callback_info info)619 napi_value QueryBundleStatsInfos(napi_env env, napi_callback_info info)
620 {
621 QueryBundleStatsParamsInfo params;
622 AsyncCallbackInfoAppUsage *asyncCallbackInfo = nullptr;
623 ParseQueryBundleStatsInfos(env, info, params, asyncCallbackInfo);
624 if (params.errorCode != ERR_OK) {
625 return BundleStateCommon::NapiGetNull(env);
626 }
627 napi_value promise = nullptr;
628 std::unique_ptr<AsyncCallbackInfoAppUsage> callbackPtr {asyncCallbackInfo};
629 callbackPtr->beginTime = params.beginTime;
630 BUNDLE_ACTIVE_LOGD("queryBundleStatsInfos callbackPtr->beginTime: %{public}lld",
631 (long long)callbackPtr->beginTime);
632 callbackPtr->endTime = params.endTime;
633 BUNDLE_ACTIVE_LOGD("queryBundleStatsInfos callbackPtr->endTime: %{public}lld",
634 (long long)callbackPtr->endTime);
635 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
636 napi_value resourceName = nullptr;
637 NAPI_CALL(env, napi_create_string_latin1(env, "queryBundleStatsInfos", NAPI_AUTO_LENGTH, &resourceName));
638 NAPI_CALL(env, napi_create_async_work(env,
639 nullptr,
640 resourceName,
641 [](napi_env env, void *data) {
642 AsyncCallbackInfoAppUsage *asyncCallbackInfo = (AsyncCallbackInfoAppUsage *)data;
643 if (asyncCallbackInfo != nullptr) {
644 asyncCallbackInfo->packageStats = BundleStateCommon::QueryBundleStatsInfos(asyncCallbackInfo->beginTime,
645 asyncCallbackInfo->endTime, asyncCallbackInfo->errorCode);
646 } else {
647 BUNDLE_ACTIVE_LOGE("queryBundleStatsInfos asyncCallbackInfo == nullptr");
648 }
649 },
650 [](napi_env env, napi_status status, void *data) {
651 AsyncCallbackInfoAppUsage *asyncCallbackInfo = (AsyncCallbackInfoAppUsage *)data;
652 if (asyncCallbackInfo != nullptr) {
653 napi_value result = nullptr;
654 napi_create_object(env, &result);
655 BundleStateCommon::GetBundleStateInfoForResult(env, asyncCallbackInfo->packageStats, result);
656 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
657 }
658 },
659 static_cast<void*>(asyncCallbackInfo),
660 &asyncCallbackInfo->asyncWork));
661 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
662 if (callbackPtr->isCallback) {
663 callbackPtr.release();
664 return BundleStateCommon::NapiGetNull(env);
665 } else {
666 callbackPtr.release();
667 return promise;
668 }
669 }
670
ParseDeviceEventStates(const napi_env & env,const napi_callback_info & info,EventStatesParamsInfo & params)671 napi_value ParseDeviceEventStates(const napi_env &env, const napi_callback_info &info,
672 EventStatesParamsInfo ¶ms)
673 {
674 size_t argc = EVENT_STATES_PARAMS;
675 napi_value argv[EVENT_STATES_PARAMS] = {nullptr};
676 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
677 if ((argc != EVENT_STATES_MIN_PARAMS) && (argc != EVENT_STATES_PARAMS)) {
678 params.errorCode = ERR_PARAMETERS_NUMBER;
679 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
680 }
681
682 // argv[0] : beginTime
683 if ((params.errorCode == ERR_OK)
684 && BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
685 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates failed, beginTime is invalid.");
686 params.errorCode = ERR_BEGIN_TIME_TYPE;
687 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
688 }
689 if ((params.errorCode == ERR_OK) && (params.beginTime < TIME_NUMBER_MIN)) {
690 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates failed, beginTime less then 0.");
691 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
692 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
693 }
694
695 // argv[1] : endTime
696 if ((params.errorCode == ERR_OK)
697 && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr)) {
698 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates failed, endTime is invalid.");
699 params.errorCode = ERR_END_TIME_TYPE;
700 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
701 }
702 if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
703 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates endTime(%{public}lld) <= beginTime(%{public}lld)",
704 (long long)params.endTime, (long long)params.beginTime);
705 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
706 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_LESS_THEN_BEGIN_TIME, "");
707 }
708
709 // argv[SECOND_ARG]: callback
710 if (argc == EVENT_STATES_PARAMS) {
711 napi_valuetype valuetype = napi_undefined;
712 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
713 if (valuetype != napi_function) {
714 params.errorCode = ERR_CALL_BACK_TYPE;
715 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
716 }
717 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
718 }
719 return BundleStateCommon::NapiGetNull(env);
720 }
721
QueryDeviceEventStats(napi_env env,napi_callback_info info)722 napi_value QueryDeviceEventStats(napi_env env, napi_callback_info info)
723 {
724 EventStatesParamsInfo params;
725 ParseDeviceEventStates(env, info, params);
726 if (params.errorCode != ERR_OK) {
727 return BundleStateCommon::NapiGetNull(env);
728 }
729 napi_value promise = nullptr;
730 AsyncCallbackInfoEventStats *asyncCallbackInfo =
731 new (std::nothrow) AsyncCallbackInfoEventStats(env);
732 std::unique_ptr<AsyncCallbackInfoEventStats> callbackPtr =
733 BundleStateCommon::HandleEventStatsInfo(env, asyncCallbackInfo, params);
734 if (!callbackPtr) {
735 return BundleStateCommon::NapiGetNull(env);
736 }
737 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
738 napi_value resourceName = nullptr;
739 NAPI_CALL(env, napi_create_string_latin1(env, "QueryDeviceEventStats", NAPI_AUTO_LENGTH, &resourceName));
740 NAPI_CALL(env, napi_create_async_work(env,
741 nullptr,
742 resourceName,
743 [](napi_env env, void *data) {
744 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
745 if (asyncCallbackInfo != nullptr) {
746 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance()
747 .QueryDeviceEventStats(asyncCallbackInfo->beginTime,
748 asyncCallbackInfo->endTime, asyncCallbackInfo->eventStats);
749 } else {
750 BUNDLE_ACTIVE_LOGE("QueryDeviceEventStats, asyncCallbackInfo == nullptr");
751 }
752 },
753 [](napi_env env, napi_status status, void *data) {
754 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
755 if (asyncCallbackInfo != nullptr) {
756 napi_value result = nullptr;
757 napi_create_array(env, &result);
758 BundleStateCommon::GetBundleActiveEventStatsForResult(env, asyncCallbackInfo->eventStats, result);
759 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
760 }
761 },
762 static_cast<void*>(asyncCallbackInfo),
763 &asyncCallbackInfo->asyncWork));
764 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
765 if (callbackPtr->isCallback) {
766 callbackPtr.release();
767 return BundleStateCommon::NapiGetNull(env);
768 } else {
769 callbackPtr.release();
770 return promise;
771 }
772 }
773
QueryNotificationEventStats(napi_env env,napi_callback_info info)774 napi_value QueryNotificationEventStats(napi_env env, napi_callback_info info)
775 {
776 EventStatesParamsInfo params;
777 ParseDeviceEventStates(env, info, params);
778 if (params.errorCode != ERR_OK) {
779 return BundleStateCommon::NapiGetNull(env);
780 }
781 napi_value promise = nullptr;
782 AsyncCallbackInfoEventStats *asyncCallbackInfo =
783 new (std::nothrow) AsyncCallbackInfoEventStats(env);
784 std::unique_ptr<AsyncCallbackInfoEventStats> callbackPtr =
785 BundleStateCommon::HandleEventStatsInfo(env, asyncCallbackInfo, params);
786 if (!callbackPtr) {
787 return BundleStateCommon::NapiGetNull(env);
788 }
789 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
790 napi_value resourceName = nullptr;
791 NAPI_CALL(env, napi_create_string_latin1(env, "QueryNotificationEventStats", NAPI_AUTO_LENGTH, &resourceName));
792 NAPI_CALL(env, napi_create_async_work(env,
793 nullptr,
794 resourceName,
795 [](napi_env env, void *data) {
796 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
797 if (asyncCallbackInfo != nullptr) {
798 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance()
799 .QueryNotificationEventStats(asyncCallbackInfo->beginTime,
800 asyncCallbackInfo->endTime, asyncCallbackInfo->eventStats);
801 } else {
802 BUNDLE_ACTIVE_LOGE("QueryNotificationEventStats, asyncCallbackInfo == nullptr");
803 }
804 },
805 [](napi_env env, napi_status status, void *data) {
806 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
807 if (asyncCallbackInfo != nullptr) {
808 napi_value result = nullptr;
809 napi_create_array(env, &result);
810 BundleStateCommon::GetBundleActiveNotificationNumberForResult(env,
811 asyncCallbackInfo->eventStats, result);
812 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
813 }
814 },
815 static_cast<void*>(asyncCallbackInfo),
816 &asyncCallbackInfo->asyncWork));
817 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
818 if (callbackPtr->isCallback) {
819 callbackPtr.release();
820 return BundleStateCommon::NapiGetNull(env);
821 } else {
822 callbackPtr.release();
823 return promise;
824 }
825 }
826 } // namespace DeviceUsageStats
827 } // namespace OHOS