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