• 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 "mission_manager.h"
17 
18 #include "ability_manager_client.h"
19 #include "event_handler.h"
20 #include "event_runner.h"
21 #include "hilog_wrapper.h"
22 #include "js_error_utils.h"
23 #include "js_mission_info_utils.h"
24 #include "js_mission_listener.h"
25 #include "js_runtime_utils.h"
26 #include "mission_snapshot.h"
27 #include "napi_common_start_options.h"
28 #include "permission_constants.h"
29 #ifdef SUPPORT_GRAPHICS
30 #include "pixel_map_napi.h"
31 #endif
32 #include "start_options.h"
33 
34 #include <mutex>
35 
36 namespace OHOS {
37 namespace AbilityRuntime {
38 using namespace OHOS::AppExecFwk;
39 using AbilityManagerClient = AAFwk::AbilityManagerClient;
40 namespace {
41 constexpr size_t ARGC_ONE = 1;
42 constexpr int32_t ARG_COUNT_TWO = 2;
43 }
44 class JsMissionManager {
45 public:
46     JsMissionManager() = default;
47     ~JsMissionManager() = default;
48 
Finalizer(NativeEngine * engine,void * data,void * hint)49     static void Finalizer(NativeEngine* engine, void* data, void* hint)
50     {
51         HILOG_INFO("JsMissionManager::Finalizer is called");
52         std::unique_ptr<JsMissionManager>(static_cast<JsMissionManager*>(data));
53     }
54 
RegisterMissionListener(NativeEngine * engine,NativeCallbackInfo * info)55     static NativeValue* RegisterMissionListener(NativeEngine* engine, NativeCallbackInfo* info)
56     {
57         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
58         return (me != nullptr) ? me->OnRegisterMissionListener(*engine, *info) : nullptr;
59     }
60 
UnregisterMissionListener(NativeEngine * engine,NativeCallbackInfo * info)61     static NativeValue* UnregisterMissionListener(NativeEngine* engine, NativeCallbackInfo* info)
62     {
63         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
64         return (me != nullptr) ? me->OnUnregisterMissionListener(*engine, *info) : nullptr;
65     }
66 
GetMissionInfos(NativeEngine * engine,NativeCallbackInfo * info)67     static NativeValue* GetMissionInfos(NativeEngine* engine, NativeCallbackInfo* info)
68     {
69         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
70         return (me != nullptr) ? me->OnGetMissionInfos(*engine, *info) : nullptr;
71     }
72 
GetMissionInfo(NativeEngine * engine,NativeCallbackInfo * info)73     static NativeValue* GetMissionInfo(NativeEngine* engine, NativeCallbackInfo* info)
74     {
75         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
76         return (me != nullptr) ? me->OnGetMissionInfo(*engine, *info) : nullptr;
77     }
78 
GetMissionSnapShot(NativeEngine * engine,NativeCallbackInfo * info)79     static NativeValue* GetMissionSnapShot(NativeEngine* engine, NativeCallbackInfo* info)
80     {
81         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
82         return (me != nullptr) ? me->OnGetMissionSnapShot(*engine, *info, false) : nullptr;
83     }
84 
GetLowResolutionMissionSnapShot(NativeEngine * engine,NativeCallbackInfo * info)85     static NativeValue* GetLowResolutionMissionSnapShot(NativeEngine* engine, NativeCallbackInfo* info)
86     {
87         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
88         return (me != nullptr) ? me->OnGetMissionSnapShot(*engine, *info, true) : nullptr;
89     }
90 
LockMission(NativeEngine * engine,NativeCallbackInfo * info)91     static NativeValue* LockMission(NativeEngine* engine, NativeCallbackInfo* info)
92     {
93         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
94         return (me != nullptr) ? me->OnLockMission(*engine, *info) : nullptr;
95     }
96 
UnlockMission(NativeEngine * engine,NativeCallbackInfo * info)97     static NativeValue* UnlockMission(NativeEngine* engine, NativeCallbackInfo* info)
98     {
99         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
100         return (me != nullptr) ? me->OnUnlockMission(*engine, *info) : nullptr;
101     }
102 
ClearMission(NativeEngine * engine,NativeCallbackInfo * info)103     static NativeValue* ClearMission(NativeEngine* engine, NativeCallbackInfo* info)
104     {
105         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
106         return (me != nullptr) ? me->OnClearMission(*engine, *info) : nullptr;
107     }
108 
ClearAllMissions(NativeEngine * engine,NativeCallbackInfo * info)109     static NativeValue* ClearAllMissions(NativeEngine* engine, NativeCallbackInfo* info)
110     {
111         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
112         return (me != nullptr) ? me->OnClearAllMissions(*engine, *info) : nullptr;
113     }
114 
MoveMissionToFront(NativeEngine * engine,NativeCallbackInfo * info)115     static NativeValue* MoveMissionToFront(NativeEngine* engine, NativeCallbackInfo* info)
116     {
117         JsMissionManager* me = CheckParamsAndGetThis<JsMissionManager>(engine, info);
118         return (me != nullptr) ? me->OnMoveMissionToFront(*engine, *info) : nullptr;
119     }
120 
121 private:
OnRegisterMissionListener(NativeEngine & engine,NativeCallbackInfo & info)122     NativeValue* OnRegisterMissionListener(NativeEngine &engine, NativeCallbackInfo &info)
123     {
124         HILOG_INFO("%{public}s is called", __FUNCTION__);
125         if (info.argc < 1) {
126             HILOG_ERROR("Params not match");
127             ThrowTooFewParametersError(engine);
128             return engine.CreateUndefined();
129         }
130 
131         missionListenerId_++;
132         if (missionListener_ != nullptr) {
133             missionListener_->AddJsListenerObject(missionListenerId_, info.argv[0]);
134             return engine.CreateNumber(missionListenerId_);
135         }
136 
137         missionListener_ = new JsMissionListener(&engine);
138         auto ret = AbilityManagerClient::GetInstance()->RegisterMissionListener(missionListener_);
139         if (ret == 0) {
140             missionListener_->AddJsListenerObject(missionListenerId_, info.argv[0]);
141             return engine.CreateNumber(missionListenerId_);
142         } else {
143             HILOG_ERROR("RegisterMissionListener failed, ret = %{public}d", ret);
144             missionListener_ = nullptr;
145             if (ret == CHECK_PERMISSION_FAILED) {
146                 ThrowNoPermissionError(engine, PermissionConstants::PERMISSION_MANAGE_MISSION);
147             } else {
148                 ThrowError(engine, AbilityErrorCode::ERROR_CODE_INNER);
149             }
150             return engine.CreateUndefined();
151         }
152     }
153 
OnUnregisterMissionListener(NativeEngine & engine,NativeCallbackInfo & info)154     NativeValue* OnUnregisterMissionListener(NativeEngine &engine, NativeCallbackInfo &info)
155     {
156         HILOG_INFO("%{public}s is called", __FUNCTION__);
157         if (info.argc < 1) {
158             HILOG_ERROR("Not enough params");
159             ThrowTooFewParametersError(engine);
160             return engine.CreateUndefined();
161         }
162 
163         int32_t missionListenerId = -1;
164         if (!ConvertFromJsValue(engine, info.argv[0], missionListenerId)) {
165             HILOG_ERROR("Parse missionListenerId failed");
166             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
167             return engine.CreateUndefined();
168         }
169 
170         AsyncTask::CompleteCallback complete =
171             [&missionListener = missionListener_, missionListenerId]
172             (NativeEngine &engine, AsyncTask &task, int32_t status) {
173                 if (!missionListener || !missionListener->RemoveJsListenerObject(missionListenerId)) {
174                     task.Reject(engine, CreateJsError(engine, AbilityErrorCode::ERROR_CODE_NO_MISSION_LISTENER));
175                     return;
176                 }
177 
178                 if (!missionListener->IsEmpty()) {
179                     task.Resolve(engine, engine.CreateUndefined());
180                     return;
181                 }
182                 auto ret = AbilityManagerClient::GetInstance()->UnRegisterMissionListener(missionListener);
183                 if (ret == 0) {
184                     task.Resolve(engine, engine.CreateUndefined());
185                     missionListener = nullptr;
186                 } else {
187                     task.Reject(engine,
188                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
189                 }
190             };
191 
192         NativeValue* lastParam = (info.argc <= 1) ? nullptr : info.argv[1];
193         NativeValue* result = nullptr;
194         AsyncTask::Schedule("MissioManager::OnUnregisterMissionListener",
195             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
196         return result;
197     }
198 
OnGetMissionInfos(NativeEngine & engine,NativeCallbackInfo & info)199     NativeValue* OnGetMissionInfos(NativeEngine &engine, NativeCallbackInfo &info)
200     {
201         HILOG_INFO("%{public}s is called", __FUNCTION__);
202         if (info.argc < 2) { // at least 2 parameters.
203             HILOG_ERROR("Not enough params");
204             ThrowTooFewParametersError(engine);
205             return engine.CreateUndefined();
206         }
207         std::string deviceId;
208         if (!ConvertFromJsValue(engine, info.argv[0], deviceId)) {
209             HILOG_ERROR("Parse deviceId failed");
210             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
211             return engine.CreateUndefined();
212         }
213         int numMax = -1;
214         if (!ConvertFromJsValue(engine, info.argv[1], numMax)) {
215             HILOG_ERROR("Parse numMax failed");
216             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
217             return engine.CreateUndefined();
218         }
219 
220         AsyncTask::CompleteCallback complete =
221             [deviceId, numMax](NativeEngine &engine, AsyncTask &task, int32_t status) {
222                 std::vector<AAFwk::MissionInfo> missionInfos;
223                 auto ret = AbilityManagerClient::GetInstance()->GetMissionInfos(deviceId, numMax, missionInfos);
224                 if (ret == 0) {
225                     task.Resolve(engine, CreateJsMissionInfoArray(engine, missionInfos));
226                 } else {
227                     task.Reject(engine,
228                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
229                 }
230             };
231 
232         NativeValue* lastParam = (info.argc <= 2) ? nullptr : info.argv[2];
233         NativeValue* result = nullptr;
234         AsyncTask::Schedule("MissioManager::OnGetMissionInfos",
235             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
236         return result;
237     }
238 
OnGetMissionInfo(NativeEngine & engine,NativeCallbackInfo & info)239     NativeValue* OnGetMissionInfo(NativeEngine &engine, NativeCallbackInfo &info)
240     {
241         HILOG_INFO("%{public}s is called", __FUNCTION__);
242         if (info.argc < 2) {
243             HILOG_ERROR("Not enough params");
244             ThrowTooFewParametersError(engine);
245             return engine.CreateUndefined();
246         }
247         std::string deviceId;
248         if (!ConvertFromJsValue(engine, info.argv[0], deviceId)) {
249             HILOG_ERROR("Parse deviceId failed");
250             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
251             return engine.CreateUndefined();
252         }
253         int32_t missionId = -1;
254         if (!ConvertFromJsValue(engine, info.argv[1], missionId)) {
255             HILOG_ERROR("Parse missionId failed");
256             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
257             return engine.CreateUndefined();
258         }
259 
260         AsyncTask::CompleteCallback complete =
261             [deviceId, missionId](NativeEngine &engine, AsyncTask &task, int32_t status) {
262                 AAFwk::MissionInfo missionInfo;
263                 auto ret = AbilityManagerClient::GetInstance()->GetMissionInfo(deviceId, missionId, missionInfo);
264                 if (ret == 0) {
265                     task.Resolve(engine, CreateJsMissionInfo(engine, missionInfo));
266                 } else {
267                     task.Reject(engine,
268                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
269                 }
270             };
271 
272         NativeValue* lastParam = (info.argc <= 2) ? nullptr : info.argv[2];
273         NativeValue* result = nullptr;
274         AsyncTask::Schedule("MissioManager::OnGetMissionInfo",
275             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
276         return result;
277     }
278 
OnGetMissionSnapShot(NativeEngine & engine,NativeCallbackInfo & info,bool isLowResolution)279     NativeValue* OnGetMissionSnapShot(NativeEngine &engine, NativeCallbackInfo &info, bool isLowResolution)
280     {
281         HILOG_INFO("%{public}s is called", __FUNCTION__);
282         std::string deviceId;
283         int32_t missionId = -1;
284         if (!CheckMissionSnapShotParams(engine, info, deviceId, missionId)) {
285             return engine.CreateUndefined();
286         }
287 
288         class MissionSnapshotWrap {
289         public:
290             int result = -1;
291             AAFwk::MissionSnapshot missionSnapshot;
292         };
293 
294         std::shared_ptr<MissionSnapshotWrap> snapshotWrap = std::make_shared<MissionSnapshotWrap>();
295         auto excute = [deviceId, missionId, isLowResolution, snapshotWrap]() {
296             snapshotWrap->result = AbilityManagerClient::GetInstance()->GetMissionSnapshot(
297                 deviceId, missionId, snapshotWrap->missionSnapshot, isLowResolution);
298         };
299 
300         auto complete = [snapshotWrap](NativeEngine &engine, AsyncTask &task, int32_t status) {
301             if (snapshotWrap->result == 0) {
302                 NativeValue* objValue = engine.CreateObject();
303                 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
304                 NativeValue* abilityValue = engine.CreateObject();
305                 NativeObject* abilityObj = ConvertNativeValueTo<NativeObject>(abilityValue);
306                 abilityObj->SetProperty(
307                     "bundleName", CreateJsValue(engine, snapshotWrap->missionSnapshot.topAbility.GetBundleName()));
308                 abilityObj->SetProperty(
309                     "abilityName", CreateJsValue(engine, snapshotWrap->missionSnapshot.topAbility.GetAbilityName()));
310                 object->SetProperty("ability", abilityValue);
311 #ifdef SUPPORT_GRAPHICS
312                 auto snapshotValue = reinterpret_cast<NativeValue*>(Media::PixelMapNapi::CreatePixelMap(
313                     reinterpret_cast<napi_env>(&engine), snapshotWrap->missionSnapshot.snapshot));
314                 object->SetProperty("snapshot", snapshotValue);
315 #endif
316                 task.Resolve(engine, objValue);
317             } else {
318                 task.Reject(engine, CreateJsErrorByNativeErr(engine, snapshotWrap->result,
319                     PermissionConstants::PERMISSION_MANAGE_MISSION));
320             }
321         };
322         NativeValue* lastParam = (info.argc > ARG_COUNT_TWO) ? info.argv[ARG_COUNT_TWO] : nullptr;
323         NativeValue* result = nullptr;
324         AsyncTask::Schedule("MissioManager::OnGetMissionSnapShot",
325             engine, CreateAsyncTaskWithLastParam(engine, lastParam, std::move(excute), std::move(complete), &result));
326         return result;
327     }
328 
CheckMissionSnapShotParams(NativeEngine & engine,NativeCallbackInfo & info,std::string & deviceId,int32_t & missionId)329     bool CheckMissionSnapShotParams(NativeEngine &engine, NativeCallbackInfo &info,
330         std::string &deviceId, int32_t &missionId)
331     {
332         if (info.argc < ARG_COUNT_TWO) {
333             ThrowTooFewParametersError(engine);
334             return false;
335         }
336 
337         if (!ConvertFromJsValue(engine, info.argv[0], deviceId)) {
338             HILOG_ERROR("missionSnapshot: Parse deviceId failed");
339             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
340             return false;
341         }
342 
343         if (!ConvertFromJsValue(engine, info.argv[1], missionId)) {
344             HILOG_ERROR("missionSnapshot: Parse missionId failed");
345             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
346             return false;
347         }
348 
349         return true;
350     }
351 
OnLockMission(NativeEngine & engine,NativeCallbackInfo & info)352     NativeValue* OnLockMission(NativeEngine &engine, NativeCallbackInfo &info)
353     {
354         HILOG_INFO("%{public}s is called", __FUNCTION__);
355         if (info.argc == 0) {
356             HILOG_ERROR("OnLockMission Not enough params");
357             ThrowTooFewParametersError(engine);
358             return engine.CreateUndefined();
359         }
360         int32_t missionId = -1;
361         if (!ConvertFromJsValue(engine, info.argv[0], missionId)) {
362             HILOG_ERROR("OnLockMission Parse missionId failed");
363             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
364             return engine.CreateUndefined();
365         }
366 
367         AsyncTask::CompleteCallback complete =
368             [missionId](NativeEngine &engine, AsyncTask &task, int32_t status) {
369                 auto ret = AbilityManagerClient::GetInstance()->LockMissionForCleanup(missionId);
370                 if (ret == 0) {
371                     task.Resolve(engine, engine.CreateUndefined());
372                 } else {
373                     task.Reject(engine,
374                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
375                 }
376             };
377 
378         NativeValue* lastParam = (info.argc > 1) ?  info.argv[1] : nullptr;
379         NativeValue* result = nullptr;
380         AsyncTask::Schedule("MissioManager::OnLockMission",
381             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
382         return result;
383     }
384 
OnUnlockMission(NativeEngine & engine,NativeCallbackInfo & info)385     NativeValue* OnUnlockMission(NativeEngine &engine, NativeCallbackInfo &info)
386     {
387         HILOG_INFO("%{public}s is called", __FUNCTION__);
388         if (info.argc == 0) {
389             HILOG_ERROR("OnUnlockMission Not enough params");
390             ThrowTooFewParametersError(engine);
391             return engine.CreateUndefined();
392         }
393         int32_t missionId = -1;
394         if (!ConvertFromJsValue(engine, info.argv[0], missionId)) {
395             HILOG_ERROR("OnUnlockMission Parse missionId failed");
396             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
397             return engine.CreateUndefined();
398         }
399 
400         AsyncTask::CompleteCallback complete =
401             [missionId](NativeEngine &engine, AsyncTask &task, int32_t status) {
402                 auto ret = AbilityManagerClient::GetInstance()->UnlockMissionForCleanup(missionId);
403                 if (ret == 0) {
404                     task.Resolve(engine, engine.CreateUndefined());
405                 } else {
406                     task.Reject(engine,
407                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
408                 }
409             };
410 
411         NativeValue* lastParam = (info.argc > 1) ? info.argv[1] : nullptr;
412         NativeValue* result = nullptr;
413         AsyncTask::Schedule("MissioManager::OnUnlockMission",
414             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
415         return result;
416     }
417 
OnClearMission(NativeEngine & engine,NativeCallbackInfo & info)418     NativeValue* OnClearMission(NativeEngine &engine, NativeCallbackInfo &info)
419     {
420         HILOG_INFO("%{public}s is called", __FUNCTION__);
421         if (info.argc == 0) {
422             HILOG_ERROR("OnClearMission Not enough params");
423             ThrowTooFewParametersError(engine);
424             return engine.CreateUndefined();
425         }
426         int32_t missionId = -1;
427         if (!ConvertFromJsValue(engine, info.argv[0], missionId)) {
428             HILOG_ERROR("OnClearMission Parse missionId failed");
429             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
430             return engine.CreateUndefined();
431         }
432 
433         AsyncTask::CompleteCallback complete =
434             [missionId](NativeEngine &engine, AsyncTask &task, int32_t status) {
435                 auto ret = AbilityManagerClient::GetInstance()->CleanMission(missionId);
436                 if (ret == 0) {
437                     task.Resolve(engine, engine.CreateUndefined());
438                 } else {
439                     task.Reject(engine,
440                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
441                 }
442             };
443 
444         NativeValue* lastParam = (info.argc > 1) ? info.argv[1] : nullptr;
445         NativeValue* result = nullptr;
446         AsyncTask::Schedule("MissioManager::OnClearMission",
447             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
448         return result;
449     }
450 
OnClearAllMissions(NativeEngine & engine,const NativeCallbackInfo & info)451     NativeValue* OnClearAllMissions(NativeEngine &engine, const NativeCallbackInfo &info)
452     {
453         HILOG_INFO("%{public}s is called", __FUNCTION__);
454         AsyncTask::CompleteCallback complete =
455             [](NativeEngine &engine, AsyncTask &task, int32_t status) {
456                 auto ret = AbilityManagerClient::GetInstance()->CleanAllMissions();
457                 if (ret == 0) {
458                     task.Resolve(engine, engine.CreateUndefined());
459                 } else {
460                     task.Reject(engine,
461                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
462                 }
463             };
464 
465         NativeValue* lastParam = (info.argc > 0) ? info.argv[0] : nullptr;
466         NativeValue* result = nullptr;
467         AsyncTask::Schedule("MissioManager::OnMoveMissionToFront",
468             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
469         return result;
470     }
471 
OnMoveMissionToFront(NativeEngine & engine,NativeCallbackInfo & info)472     NativeValue* OnMoveMissionToFront(NativeEngine &engine, NativeCallbackInfo &info)
473     {
474         HILOG_INFO("%{public}s is called", __FUNCTION__);
475         if (info.argc == 0) {
476             HILOG_ERROR("OnMoveMissionToFront Not enough params");
477             ThrowTooFewParametersError(engine);
478             return engine.CreateUndefined();
479         }
480         int32_t missionId = -1;
481         if (!ConvertFromJsValue(engine, info.argv[0], missionId)) {
482             HILOG_ERROR("OnMoveMissionToFront Parse missionId failed");
483             ThrowError(engine, AbilityErrorCode::ERROR_CODE_INVALID_PARAM);
484             return engine.CreateUndefined();
485         }
486         decltype(info.argc) unwrapArgc = 1;
487 
488         AAFwk::StartOptions startOptions;
489         if (info.argc > ARGC_ONE && info.argv[1]->TypeOf() == NATIVE_OBJECT) {
490             HILOG_INFO("OnMoveMissionToFront start options is used.");
491             AppExecFwk::UnwrapStartOptions(reinterpret_cast<napi_env>(&engine),
492                 reinterpret_cast<napi_value>(info.argv[1]), startOptions);
493             unwrapArgc++;
494         }
495         AsyncTask::CompleteCallback complete =
496             [missionId, startOptions, unwrapArgc](NativeEngine &engine, AsyncTask &task, int32_t status) {
497                 auto ret = (unwrapArgc == 1) ? AbilityManagerClient::GetInstance()->MoveMissionToFront(missionId) :
498                     AbilityManagerClient::GetInstance()->MoveMissionToFront(missionId, startOptions);
499                 if (ret == 0) {
500                     task.Resolve(engine, engine.CreateUndefined());
501                 } else {
502                     task.Reject(engine,
503                         CreateJsErrorByNativeErr(engine, ret, PermissionConstants::PERMISSION_MANAGE_MISSION));
504                 }
505             };
506 
507         NativeValue* lastParam = (info.argc > unwrapArgc) ? info.argv[unwrapArgc] : nullptr;
508         NativeValue* result = nullptr;
509         AsyncTask::Schedule("MissioManager::OnMoveMissionToFront",
510             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
511         return result;
512     }
513 
514     sptr<JsMissionListener> missionListener_ = nullptr;
515     uint32_t missionListenerId_ = 0;
516 };
517 
JsMissionManagerInit(NativeEngine * engine,NativeValue * exportObj)518 NativeValue* JsMissionManagerInit(NativeEngine* engine, NativeValue* exportObj)
519 {
520     HILOG_INFO("JsMissionManagerInit is called");
521     if (engine == nullptr || exportObj == nullptr) {
522         HILOG_INFO("Invalid input parameters");
523         return nullptr;
524     }
525 
526     NativeObject* object = ConvertNativeValueTo<NativeObject>(exportObj);
527     if (object == nullptr) {
528         HILOG_INFO("object is nullptr");
529         return nullptr;
530     }
531 
532     std::unique_ptr<JsMissionManager> jsMissionManager = std::make_unique<JsMissionManager>();
533     object->SetNativePointer(jsMissionManager.release(), JsMissionManager::Finalizer, nullptr);
534 
535     const char *moduleName = "JsMissionManager";
536     BindNativeFunction(*engine, *object, "registerMissionListener",
537         moduleName, JsMissionManager::RegisterMissionListener);
538     BindNativeFunction(*engine, *object, "unregisterMissionListener",
539         moduleName, JsMissionManager::UnregisterMissionListener);
540     BindNativeFunction(*engine, *object, "getMissionInfos", moduleName, JsMissionManager::GetMissionInfos);
541     BindNativeFunction(*engine, *object, "getMissionInfo", moduleName, JsMissionManager::GetMissionInfo);
542     BindNativeFunction(*engine, *object, "getMissionSnapShot", moduleName, JsMissionManager::GetMissionSnapShot);
543     BindNativeFunction(*engine, *object, "getLowResolutionMissionSnapShot", moduleName,
544         JsMissionManager::GetLowResolutionMissionSnapShot);
545     BindNativeFunction(*engine, *object, "lockMission", moduleName, JsMissionManager::LockMission);
546     BindNativeFunction(*engine, *object, "unlockMission", moduleName, JsMissionManager::UnlockMission);
547     BindNativeFunction(*engine, *object, "clearMission", moduleName, JsMissionManager::ClearMission);
548     BindNativeFunction(*engine, *object, "clearAllMissions", moduleName, JsMissionManager::ClearAllMissions);
549     BindNativeFunction(*engine, *object, "moveMissionToFront", moduleName, JsMissionManager::MoveMissionToFront);
550     return engine->CreateUndefined();
551 }
552 }  // namespace AbilityRuntime
553 }  // namespace OHOS
554