• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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