• 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 <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 &params, 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, &params.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, &params.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 &params, 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, &params.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 &params)
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 &params, 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, &params.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 &params, 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, &params.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 &params, 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, &params.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 &params)
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, &params.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