1 /*
2 * Copyright (c) 2025 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 "ability_manager_errors.h"
17 #include "extension_ability_info.h"
18 #include "hilog_tag_wrapper.h"
19 #include "hitrace_meter.h"
20 #include "iservice_registry.h"
21 #include "mission_manager_client.h"
22 #include "mission_manager_proxy.h"
23 #include "scene_board_judgement.h"
24 #include "system_ability_definition.h"
25 #include "want.h"
26
27 namespace OHOS {
28 namespace AAFwk {
29 namespace {
30 #ifdef SUPPORT_SCREEN
31 static std::unordered_map<Rosen::WSError, int32_t> SCB_TO_MISSION_ERROR_CODE_MAP {
32 { Rosen::WSError::WS_ERROR_INVALID_PERMISSION, CHECK_PERMISSION_FAILED },
33 { Rosen::WSError::WS_ERROR_NOT_SYSTEM_APP, ERR_NOT_SYSTEM_APP },
34 { Rosen::WSError::WS_ERROR_INVALID_PARAM, INVALID_PARAMETERS_ERR },
35 };
36 #endif // SUPPORT_SCREEN
37 }
38 #ifdef SUPPORT_SCREEN
39 using OHOS::Rosen::SessionManagerLite;
40 #endif // SUPPORT_SCREEN
41
42 #define CHECK_POINTER_RETURN(object) \
43 if (!object) { \
44 TAG_LOGE(AAFwkTag::MISSION, "null proxy"); \
45 return; \
46 }
47
48 #define CHECK_POINTER_RETURN_NOT_CONNECTED(object) \
49 if (!object) { \
50 TAG_LOGE(AAFwkTag::MISSION, "null proxy"); \
51 return ABILITY_SERVICE_NOT_CONNECTED; \
52 }
53
54 #define CHECK_POINTER_RETURN_INVALID_VALUE(object) \
55 if (!object) { \
56 TAG_LOGE(AAFwkTag::MISSION, "null proxy"); \
57 return ERR_INVALID_VALUE; \
58 }
59
GetInstance()60 MissionManagerClient& MissionManagerClient::GetInstance()
61 {
62 static MissionManagerClient instance;
63 return instance;
64 }
65
GetMissionManager()66 sptr<IMissionManager> MissionManagerClient::GetMissionManager()
67 {
68 std::lock_guard<std::mutex> lock(mutex_);
69 if (proxy_ == nullptr) {
70 Connect();
71 }
72
73 return proxy_;
74 }
75
Connect()76 void MissionManagerClient::Connect()
77 {
78 auto systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
79 if (systemManager == nullptr) {
80 TAG_LOGE(AAFwkTag::MISSION, "Get SAMgr failed");
81 return;
82 }
83 auto remoteObj = systemManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
84 if (remoteObj == nullptr) {
85 TAG_LOGE(AAFwkTag::MISSION, "Connect AMS failed");
86 return;
87 }
88
89 deathRecipient_ = new MissionMgrDeathRecipient();
90 if (remoteObj->IsProxyObject() && !remoteObj->AddDeathRecipient(deathRecipient_)) {
91 TAG_LOGE(AAFwkTag::MISSION, "AddDeathRecipient failed");
92 return;
93 }
94
95 proxy_ = sptr<IMissionManager>(new MissionManagerProxy(remoteObj));
96 TAG_LOGD(AAFwkTag::MISSION, "Connect AMS success");
97 }
98
ResetProxy(const wptr<IRemoteObject> & remote)99 void MissionManagerClient::ResetProxy(const wptr<IRemoteObject> &remote)
100 {
101 std::lock_guard<std::mutex> lock(mutex_);
102 if (proxy_ == nullptr) {
103 TAG_LOGI(AAFwkTag::MISSION, "null proxy_, no need reset");
104 return;
105 }
106
107 auto serviceRemote = proxy_->AsObject();
108 if (serviceRemote != nullptr && serviceRemote == remote.promote()) {
109 serviceRemote->RemoveDeathRecipient(deathRecipient_);
110 proxy_ = nullptr;
111 }
112 }
113
OnRemoteDied(const wptr<IRemoteObject> & remote)114 void MissionManagerClient::MissionMgrDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
115 {
116 TAG_LOGI(AAFwkTag::MISSION, "called");
117 MissionManagerClient::GetInstance().ResetProxy(remote);
118 }
119
Release()120 ErrCode MissionManagerClient::Release()
121 {
122 TAG_LOGI(AAFwkTag::MISSION, "Release");
123 return RemoveDeathRecipient();
124 }
125
RemoveDeathRecipient()126 ErrCode MissionManagerClient::RemoveDeathRecipient()
127 {
128 TAG_LOGI(AAFwkTag::MISSION, "RemoveDeathRecipient");
129 std::lock_guard<std::mutex> lock(mutex_);
130 if (proxy_ == nullptr) {
131 TAG_LOGW(AAFwkTag::MISSION, "null proxy_");
132 return ERR_NULL_OBJECT;
133 }
134 if (deathRecipient_ == nullptr) {
135 TAG_LOGW(AAFwkTag::MISSION, "null deathRecipient_");
136 return ERR_NULL_OBJECT;
137 }
138 auto serviceRemote = proxy_->AsObject();
139 if (serviceRemote == nullptr) {
140 TAG_LOGW(AAFwkTag::MISSION, "null serviceRemote");
141 return ERR_NULL_OBJECT;
142 }
143 bool ret = serviceRemote->RemoveDeathRecipient(deathRecipient_);
144 if (!ret) {
145 TAG_LOGW(AAFwkTag::MISSION, "RemoveDeathRecipient fail");
146 return ERR_INVALID_VALUE;
147 }
148 proxy_ = nullptr;
149 deathRecipient_ = nullptr;
150 TAG_LOGI(AAFwkTag::MISSION, "RemoveDeathRecipient success");
151 return ERR_OK;
152 }
153
154
ContinueMission(const std::string & srcDeviceId,const std::string & dstDeviceId,int32_t missionId,sptr<IRemoteObject> callback,AAFwk::WantParams & wantParams)155 ErrCode MissionManagerClient::ContinueMission(const std::string &srcDeviceId, const std::string &dstDeviceId,
156 int32_t missionId, sptr<IRemoteObject> callback, AAFwk::WantParams &wantParams)
157 {
158 if (srcDeviceId.empty() || dstDeviceId.empty() || callback == nullptr) {
159 TAG_LOGE(AAFwkTag::MISSION, "srcDeviceId or dstDeviceId or callback null");
160 return ERR_INVALID_VALUE;
161 }
162
163 auto abms = GetMissionManager();
164 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
165 int result = abms->ContinueMission(srcDeviceId, dstDeviceId, missionId, callback, wantParams);
166 return result;
167 }
168
169
ContinueMission(AAFwk::ContinueMissionInfo continueMissionInfo,const sptr<IRemoteObject> & callback)170 ErrCode MissionManagerClient::ContinueMission(AAFwk::ContinueMissionInfo continueMissionInfo,
171 const sptr<IRemoteObject> &callback)
172
173 {
174 if (continueMissionInfo.srcDeviceId.empty() || continueMissionInfo.dstDeviceId.empty() || callback == nullptr) {
175 TAG_LOGE(AAFwkTag::MISSION, "srcDeviceId or dstDeviceId or callback null");
176 return ERR_INVALID_VALUE;
177 }
178
179 auto abms = GetMissionManager();
180 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
181 int result = abms->ContinueMission(continueMissionInfo, callback);
182 return result;
183 }
184
185
LockMissionForCleanup(int32_t missionId)186 ErrCode MissionManagerClient::LockMissionForCleanup(int32_t missionId)
187 {
188 #ifdef SUPPORT_SCREEN
189 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
190 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
191 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
192 TAG_LOGI(AAFwkTag::MISSION, "scb call, LockMissionForCleanup");
193 auto err = sceneSessionManager->LockSession(missionId);
194 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
195 TAG_LOGE(AAFwkTag::MISSION, "scb call, LockMissionForCleanup err");
196 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
197 }
198 return static_cast<int>(err);
199 }
200 #endif //SUPPORT_SCREEN
201 auto abms = GetMissionManager();
202 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
203 return abms->LockMissionForCleanup(missionId);
204 }
205
206
UnlockMissionForCleanup(int32_t missionId)207 ErrCode MissionManagerClient::UnlockMissionForCleanup(int32_t missionId)
208 {
209 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
210 #ifdef SUPPORT_SCREEN
211 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
212 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
213 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
214 TAG_LOGI(AAFwkTag::MISSION, "scb call, UnlockMissionForCleanup");
215 auto err = sceneSessionManager->UnlockSession(missionId);
216 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
217 TAG_LOGE(AAFwkTag::MISSION, "scb call, UnlockMissionForCleanup err");
218 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
219 }
220 return static_cast<int>(err);
221 }
222 #endif //SUPPORT_SCREEN
223 auto abms = GetMissionManager();
224 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
225 return abms->UnlockMissionForCleanup(missionId);
226 }
227
228
RegisterMissionListener(sptr<IMissionListener> listener)229 ErrCode MissionManagerClient::RegisterMissionListener(sptr<IMissionListener> listener)
230 {
231 #ifdef SUPPORT_SCREEN
232 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
233 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
234 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
235 TAG_LOGI(AAFwkTag::MISSION, "scb call, RegisterMissionListener");
236 auto err = sceneSessionManager->RegisterSessionListener(listener);
237 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
238 TAG_LOGE(AAFwkTag::MISSION, "scb call, RegisterMissionListener err");
239 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
240 }
241 return static_cast<int>(err);
242 }
243 #endif //SUPPORT_SCREEN
244 auto abms = GetMissionManager();
245 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
246 return abms->RegisterMissionListener(listener);
247 }
248
249
UnRegisterMissionListener(sptr<IMissionListener> listener)250 ErrCode MissionManagerClient::UnRegisterMissionListener(sptr<IMissionListener> listener)
251 {
252 #ifdef SUPPORT_SCREEN
253 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
254 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
255 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
256 TAG_LOGI(AAFwkTag::MISSION, "scb call, UnRegisterMissionListener");
257 auto err = sceneSessionManager->UnRegisterSessionListener(listener);
258 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
259 TAG_LOGE(AAFwkTag::MISSION, "scb call, UnRegisterMissionListener err");
260 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
261 }
262 return static_cast<int>(err);
263 }
264 #endif //SUPPORT_SCREEN
265 auto abms = GetMissionManager();
266 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
267 return abms->UnRegisterMissionListener(listener);
268 }
269
270
RegisterMissionListener(const std::string & deviceId,sptr<IRemoteMissionListener> listener)271 ErrCode MissionManagerClient::RegisterMissionListener(const std::string &deviceId,
272 sptr<IRemoteMissionListener> listener)
273 {
274 auto abms = GetMissionManager();
275 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
276 return abms->RegisterMissionListener(deviceId, listener);
277 }
278
UnRegisterMissionListener(const std::string & deviceId,sptr<IRemoteMissionListener> listener)279 ErrCode MissionManagerClient::UnRegisterMissionListener(const std::string &deviceId,
280 sptr<IRemoteMissionListener> listener)
281 {
282 auto abms = GetMissionManager();
283 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
284 return abms->UnRegisterMissionListener(deviceId, listener);
285 }
286
287
GetMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)288 ErrCode MissionManagerClient::GetMissionInfos(const std::string &deviceId, int32_t numMax,
289 std::vector<MissionInfo> &missionInfos)
290 {
291 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
292 #ifdef SUPPORT_SCREEN
293 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
294 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
295 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
296 TAG_LOGI(AAFwkTag::MISSION, "scb call, GetMissionInfos");
297 auto err = sceneSessionManager->GetSessionInfos(deviceId, numMax, missionInfos);
298 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
299 TAG_LOGE(AAFwkTag::MISSION, "scb call, GetMissionInfos err");
300 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
301 }
302 return static_cast<int>(err);
303 }
304 #endif //SUPPORT_SCREEN
305 auto abms = GetMissionManager();
306 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
307 return abms->GetMissionInfos(deviceId, numMax, missionInfos);
308 }
309
GetMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)310 ErrCode MissionManagerClient::GetMissionInfo(const std::string &deviceId, int32_t missionId,
311 MissionInfo &missionInfo)
312 {
313 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
314 #ifdef SUPPORT_SCREEN
315 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
316 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
317 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
318 TAG_LOGI(AAFwkTag::MISSION, "scb call, GetMissionInfo");
319 auto err = sceneSessionManager->GetSessionInfo(deviceId, missionId, missionInfo);
320 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
321 TAG_LOGE(AAFwkTag::MISSION, "scb call, GetMissionInfo err");
322 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
323 }
324 return static_cast<int>(err);
325 }
326 #endif //SUPPORT_SCREEN
327 auto abms = GetMissionManager();
328 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
329 return abms->GetMissionInfo(deviceId, missionId, missionInfo);
330 }
331
332
GetMissionSnapshot(const std::string & deviceId,int32_t missionId,MissionSnapshot & snapshot,bool isLowResolution)333 ErrCode MissionManagerClient::GetMissionSnapshot(const std::string &deviceId, int32_t missionId,
334 MissionSnapshot &snapshot, bool isLowResolution)
335 {
336 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
337 #ifdef SUPPORT_SCREEN
338 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
339 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
340 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
341 TAG_LOGI(AAFwkTag::MISSION, "scb call, GetMissionSnapshot");
342 auto err = sceneSessionManager->GetSessionSnapshot(deviceId, missionId, snapshot, isLowResolution);
343 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
344 TAG_LOGE(AAFwkTag::MISSION, "scb call, GetMissionSnapshot err");
345 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
346 }
347 return static_cast<int>(err);
348 }
349 #endif //SUPPORT_SCREEN
350 auto abms = GetMissionManager();
351 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
352 return abms->GetMissionSnapshot(deviceId, missionId, snapshot, isLowResolution);
353 }
354
355
CleanMission(int32_t missionId)356 ErrCode MissionManagerClient::CleanMission(int32_t missionId)
357 {
358 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
359 #ifdef SUPPORT_SCREEN
360 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
361 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
362 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
363 TAG_LOGI(AAFwkTag::MISSION, "scb call, CleanMission");
364 auto err = sceneSessionManager->ClearSession(missionId);
365 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
366 TAG_LOGE(AAFwkTag::MISSION, "scb call, CleanMission err");
367 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
368 }
369 return static_cast<int>(err);
370 }
371 #endif //SUPPORT_SCREEN
372 auto abms = GetMissionManager();
373 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
374 return abms->CleanMission(missionId);
375 }
376
377
CleanAllMissions()378 ErrCode MissionManagerClient::CleanAllMissions()
379 {
380 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
381 #ifdef SUPPORT_SCREEN
382 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
383 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
384 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
385 TAG_LOGI(AAFwkTag::MISSION, "scb call, CleanAllMissions");
386 auto err = sceneSessionManager->ClearAllSessions();
387 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
388 TAG_LOGE(AAFwkTag::MISSION, "scb call, CleanAllMissions err");
389 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
390 }
391 return static_cast<int>(err);
392 }
393 #endif //SUPPORT_SCREEN
394 auto abms = GetMissionManager();
395 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
396 return abms->CleanAllMissions();
397 }
398
399
MoveMissionToFront(int32_t missionId)400 ErrCode MissionManagerClient::MoveMissionToFront(int32_t missionId)
401 {
402 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
403 auto abms = GetMissionManager();
404 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
405 return abms->MoveMissionToFront(missionId);
406 }
407
MoveMissionToFront(int32_t missionId,const StartOptions & startOptions)408 ErrCode MissionManagerClient::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions)
409 {
410 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
411 auto abms = GetMissionManager();
412 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
413 return abms->MoveMissionToFront(missionId, startOptions);
414 }
415
416
MoveMissionsToForeground(const std::vector<int32_t> & missionIds,int32_t topMissionId)417 ErrCode MissionManagerClient::MoveMissionsToForeground(const std::vector<int32_t> &missionIds, int32_t topMissionId)
418 {
419 TAG_LOGI(AAFwkTag::MISSION, "call,topMissionId:%{public}d", topMissionId);
420 #ifdef SUPPORT_SCREEN
421 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
422 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
423 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
424 TAG_LOGI(AAFwkTag::MISSION, "scb call, MoveMissionsToForeground");
425 auto err = sceneSessionManager->MoveSessionsToForeground(missionIds, topMissionId);
426 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
427 TAG_LOGE(AAFwkTag::MISSION, "scb call, MoveMissionsToForeground err");
428 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
429 }
430 auto abms = GetMissionManager();
431 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
432 if (missionIds.empty()) {
433 return ERR_INVALID_VALUE;
434 }
435 int32_t missionId = topMissionId;
436 if (topMissionId > 0) {
437 missionId = topMissionId;
438 } else {
439 missionId = missionIds[0];
440 }
441 auto errAMS = abms->MoveMissionToFront(missionId);
442 return static_cast<int>(errAMS);
443 }
444 #endif //SUPPORT_SCREEN
445 auto abms = GetMissionManager();
446 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
447 return abms->MoveMissionsToForeground(missionIds, topMissionId);
448 }
449
MoveMissionsToBackground(const std::vector<int32_t> & missionIds,std::vector<int32_t> & result)450 ErrCode MissionManagerClient::MoveMissionsToBackground(const std::vector<int32_t> &missionIds,
451 std::vector<int32_t> &result)
452 {
453 TAG_LOGI(AAFwkTag::MISSION, "call");
454 #ifdef SUPPORT_SCREEN
455 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
456 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
457 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
458 TAG_LOGI(AAFwkTag::MISSION, "scb call, MoveMissionsToBackground");
459 auto err = sceneSessionManager->MoveSessionsToBackground(missionIds, result);
460 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
461 TAG_LOGE(AAFwkTag::MISSION, "scb call, MoveMissionsToBackground err");
462 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
463 }
464 return static_cast<int>(err);
465 }
466 #endif //SUPPORT_SCREEN
467 auto abms = GetMissionManager();
468 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
469 return abms->MoveMissionsToBackground(missionIds, result);
470 }
471
GetMissionIdByToken(sptr<IRemoteObject> token,int32_t & missionId)472 ErrCode MissionManagerClient::GetMissionIdByToken(sptr<IRemoteObject> token, int32_t &missionId)
473 {
474 auto abms = GetMissionManager();
475 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
476 missionId = abms->GetMissionIdByToken(token);
477 if (missionId <= 0) {
478 TAG_LOGE(AAFwkTag::MISSION, "get missionid failed");
479 return MISSION_NOT_FOUND;
480 }
481 return ERR_OK;
482 }
483
484 /**
485 * Start synchronizing remote device mission
486 * @param devId, deviceId.
487 * @param fixConflict, resolve synchronizing conflicts flag.
488 * @param tag, call tag.
489 * @return Returns ERR_OK on success, others on failure.
490 */
StartSyncRemoteMissions(const std::string & devId,bool fixConflict,int64_t tag)491 ErrCode MissionManagerClient::StartSyncRemoteMissions(const std::string &devId, bool fixConflict, int64_t tag)
492 {
493 auto abms = GetMissionManager();
494 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
495 return abms->StartSyncRemoteMissions(devId, fixConflict, tag);
496 }
497
StopSyncRemoteMissions(const std::string & devId)498 ErrCode MissionManagerClient::StopSyncRemoteMissions(const std::string &devId)
499 {
500 auto abms = GetMissionManager();
501 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
502 return abms->StopSyncRemoteMissions(devId);
503 }
504
SetMissionContinueState(sptr<IRemoteObject> token,const AAFwk::ContinueState & state,sptr<IRemoteObject> sessionToken)505 ErrCode MissionManagerClient::SetMissionContinueState(sptr<IRemoteObject> token,
506 const AAFwk::ContinueState &state, sptr<IRemoteObject> sessionToken)
507 {
508 TAG_LOGI(AAFwkTag::MISSION,
509 "called state:%{public}d", state);
510 #ifdef SUPPORT_SCREEN
511 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken) {
512 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
513 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
514 uint32_t value = static_cast<uint32_t>(state);
515 Rosen::ContinueState continueState = static_cast<Rosen::ContinueState>(value);
516 TAG_LOGI(AAFwkTag::MISSION, "scb call, SetMissionContinueState");
517 auto ret = static_cast<int>(sceneSessionManager->SetSessionContinueState(sessionToken, continueState));
518 if (ret != ERR_OK) {
519 TAG_LOGE(AAFwkTag::MISSION, "scb call, SetMissionContinueState err");
520 }
521 return ret;
522 }
523 #endif //SUPPORT_SCREEN
524 auto abms = GetMissionManager();
525 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
526 return abms->SetMissionContinueState(token, state);
527 }
528
529
530 #ifdef SUPPORT_SCREEN
SetMissionLabel(sptr<IRemoteObject> token,const std::string & label)531 ErrCode MissionManagerClient::SetMissionLabel(sptr<IRemoteObject> token, const std::string &label)
532 {
533 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
534 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
535 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
536 TAG_LOGI(AAFwkTag::MISSION, "scb call, SetMissionLabel");
537 auto err = sceneSessionManager->SetSessionLabel(token, label);
538 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
539 TAG_LOGE(AAFwkTag::MISSION, "scb call, SetMissionLabel err");
540 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
541 }
542 return static_cast<int>(err);
543 }
544 auto abms = GetMissionManager();
545 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
546 return abms->SetMissionLabel(token, label);
547 }
548
SetMissionIcon(sptr<IRemoteObject> abilityToken,std::shared_ptr<OHOS::Media::PixelMap> icon)549 ErrCode MissionManagerClient::SetMissionIcon(
550 sptr<IRemoteObject> abilityToken, std::shared_ptr<OHOS::Media::PixelMap> icon)
551 {
552 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
553 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
554 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
555 TAG_LOGI(AAFwkTag::MISSION, "scb call, SetMissionIcon");
556 auto err = sceneSessionManager->SetSessionIcon(abilityToken, icon);
557 if (SCB_TO_MISSION_ERROR_CODE_MAP.count(err)) {
558 TAG_LOGE(AAFwkTag::MISSION, "scb call, SetMissionIcon err");
559 return SCB_TO_MISSION_ERROR_CODE_MAP[err];
560 }
561 return static_cast<int>(err);
562 }
563 auto abms = GetMissionManager();
564 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
565 return abms->SetMissionIcon(abilityToken, icon);
566 }
567
UpdateMissionSnapShot(sptr<IRemoteObject> token,std::shared_ptr<Media::PixelMap> pixelMap)568 void MissionManagerClient::UpdateMissionSnapShot(sptr<IRemoteObject> token,
569 std::shared_ptr<Media::PixelMap> pixelMap)
570 {
571 auto abms = GetMissionManager();
572 CHECK_POINTER_RETURN(abms);
573 return abms->UpdateMissionSnapShot(token, pixelMap);
574 }
575
576 #endif
577
IsValidMissionIds(const std::vector<int32_t> & missionIds,std::vector<MissionValidResult> & results)578 int32_t MissionManagerClient::IsValidMissionIds(
579 const std::vector<int32_t> &missionIds, std::vector<MissionValidResult> &results)
580 {
581 TAG_LOGI(AAFwkTag::MISSION, "call");
582 #ifdef SUPPORT_SCREEN
583 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
584 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
585 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
586 std::vector<bool> isValidList;
587 auto err = sceneSessionManager->IsValidSessionIds(missionIds, isValidList);
588 TAG_LOGI(AAFwkTag::MISSION, "scb call, IsValidSessionIds: %{public}d, size: %{public}d",
589 static_cast<int>(err), static_cast<int32_t>(isValidList.size()));
590 for (auto i = 0; i < static_cast<int32_t>(isValidList.size()); ++i) {
591 MissionValidResult missionResult = {};
592 missionResult.missionId = missionIds.at(i);
593 missionResult.isValid = isValidList.at(i);
594 results.push_back(missionResult);
595 }
596 return static_cast<int>(err);
597 }
598 #endif //SUPPORT_SCREEN
599 auto abms = GetMissionManager();
600 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
601 return abms->IsValidMissionIds(missionIds, results);
602 }
603
PreStartMission(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & startTime)604 ErrCode MissionManagerClient::PreStartMission(const std::string &bundleName, const std::string &moduleName,
605 const std::string &abilityName, const std::string &startTime)
606 {
607 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
608 auto abms = GetMissionManager();
609 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
610 return abms->PreStartMission(bundleName, moduleName, abilityName, startTime);
611 }
612
613
TerminateMission(int32_t missionId)614 ErrCode MissionManagerClient::TerminateMission(int32_t missionId)
615 {
616 #ifdef SUPPORT_SCREEN
617 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
618 auto sceneSessionManager = SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
619 CHECK_POINTER_RETURN_INVALID_VALUE(sceneSessionManager);
620 TAG_LOGI(AAFwkTag::MISSION, "scb call, TerminateMission");
621 auto err = sceneSessionManager->TerminateSessionByPersistentId(missionId);
622 if (err != OHOS::Rosen::WMError::WM_OK) {
623 TAG_LOGE(AAFwkTag::MISSION, "scb call, TerminateMission err: %{public}d.", static_cast<int32_t>(err));
624 }
625 if (err == Rosen::WMError::WM_ERROR_INVALID_PERMISSION) {
626 return CHECK_PERMISSION_FAILED;
627 }
628 if (err == Rosen::WMError::WM_ERROR_NOT_SYSTEM_APP) {
629 return ERR_NOT_SYSTEM_APP;
630 }
631 return static_cast<int32_t>(err);
632 }
633 #endif //SUPPORT_SCREEN
634 auto abms = GetMissionManager();
635 CHECK_POINTER_RETURN_INVALID_VALUE(abms);
636 int32_t ret = abms->TerminateMission(missionId);
637 if (ret != ERR_OK) {
638 TAG_LOGE(AAFwkTag::MISSION, "failed,err:%{public}d", ret);
639 }
640 return ret;
641 }
642 } // namespace AAFwk
643 } // namespace OHOS
644