1 /*
2 * Copyright (c) 2021-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 "continuation_manager.h"
17
18 #include "ability.h"
19 #include "ability_continuation_interface.h"
20 #include "ability_manager_client.h"
21 #include "bool_wrapper.h"
22 #include "continuation_handler.h"
23 #include "distributed_client.h"
24 #include "hilog_wrapper.h"
25 #include "operation_builder.h"
26 #include "string_ex.h"
27 #include "string_wrapper.h"
28 #include "want.h"
29
30 namespace OHOS {
31 namespace AppExecFwk {
32 const int ContinuationManager::TIMEOUT_MS_WAIT_DMS_NOTIFY_CONTINUATION_COMPLETE = 25000;
33 const int ContinuationManager::TIMEOUT_MS_WAIT_REMOTE_NOTIFY_BACK = 6000;
34 const std::string PAGE_STACK_PROPERTY_NAME = "pageStack";
35 const std::string SUPPORT_CONTINUE_PAGE_STACK_PROPERTY_NAME = "ohos.extra.param.key.supportContinuePageStack";
36 const int32_t CONTINUE_ABILITY_REJECTED = 29360197;
37 const int32_t CONTINUE_SAVE_DATA_FAILED = 29360198;
38 const int32_t CONTINUE_ON_CONTINUE_FAILED = 29360199;
39 const int32_t CONTINUE_ON_CONTINUE_MISMATCH = 29360204;
40 #ifdef SUPPORT_GRAPHICS
41 const int32_t CONTINUE_GET_CONTENT_FAILED = 29360200;
42 #endif
ContinuationManager()43 ContinuationManager::ContinuationManager()
44 {
45 progressState_ = ProgressState::INITIAL;
46 }
47
Init(const std::shared_ptr<Ability> & ability,const sptr<IRemoteObject> & continueToken,const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<ContinuationHandler> & continuationHandler)48 bool ContinuationManager::Init(const std::shared_ptr<Ability> &ability, const sptr<IRemoteObject> &continueToken,
49 const std::shared_ptr<AbilityInfo> &abilityInfo, const std::shared_ptr<ContinuationHandler> &continuationHandler)
50 {
51 HILOG_DEBUG("%{public}s called begin", __func__);
52 if (ability == nullptr) {
53 HILOG_ERROR("ContinuationManager::Init failed. ability is nullptr");
54 return false;
55 }
56 ability_ = ability;
57
58 std::shared_ptr<Ability> abilityTmp = nullptr;
59 abilityTmp = ability_.lock();
60 if (abilityTmp == nullptr) {
61 HILOG_ERROR("ContinuationManager::Init failed. get ability is nullptr");
62 return false;
63 }
64
65 if (abilityTmp->GetAbilityInfo() == nullptr) {
66 HILOG_ERROR("ContinuationManager::Init failed. abilityInfo is nullptr");
67 return false;
68 }
69 abilityInfo_ = abilityTmp->GetAbilityInfo();
70
71 if (continueToken == nullptr) {
72 HILOG_ERROR("ContinuationManager::Init failed. continueToken is nullptr");
73 return false;
74 }
75 continueToken_ = continueToken;
76
77 continuationHandler_ = continuationHandler;
78 HILOG_DEBUG("%{public}s called end", __func__);
79 return true;
80 }
81
GetContinuationState()82 ContinuationState ContinuationManager::GetContinuationState()
83 {
84 return continuationState_;
85 }
86
GetOriginalDeviceId()87 std::string ContinuationManager::GetOriginalDeviceId()
88 {
89 return originalDeviceId_;
90 }
91
ContinueAbilityWithStack(const std::string & deviceId,uint32_t versionCode)92 void ContinuationManager::ContinueAbilityWithStack(const std::string &deviceId, uint32_t versionCode)
93 {
94 HILOG_INFO("%{public}s called begin", __func__);
95
96 HandleContinueAbilityWithStack(deviceId, versionCode);
97 HILOG_INFO("%{public}s called end", __func__);
98 }
99
HandleContinueAbilityWithStack(const std::string & deviceId,uint32_t versionCode)100 bool ContinuationManager::HandleContinueAbilityWithStack(const std::string &deviceId, uint32_t versionCode)
101 {
102 HILOG_INFO("%{public}s called begin", __func__);
103
104 if (!CheckAbilityToken()) {
105 HILOG_ERROR("HandleContinueAbilityWithStack checkAbilityToken failed");
106 return false;
107 }
108
109 sptr<IRemoteObject> continueToken = continueToken_;
110 std::shared_ptr<ContinuationHandler> continuationHandler = continuationHandler_.lock();
111 if (continuationHandler == nullptr) {
112 HILOG_ERROR("HandleContinueAbilityWithStack continuationHandler is nullptr");
113 return false;
114 }
115
116 InitMainHandlerIfNeed();
117 auto task = [continuationHandler, continueToken, deviceId, versionCode]() {
118 continuationHandler->HandleStartContinuationWithStack(continueToken, deviceId, versionCode);
119 };
120 if (!mainHandler_->PostTask(task)) {
121 HILOG_ERROR("HandleContinueAbilityWithStack postTask failed");
122 return false;
123 }
124
125 HILOG_INFO("%{public}s called end", __func__);
126 return true;
127 }
128
OnStartAndSaveData(WantParams & wantParams)129 int32_t ContinuationManager::OnStartAndSaveData(WantParams &wantParams)
130 {
131 HILOG_INFO("%{public}s called begin", __func__);
132 std::shared_ptr<Ability> ability = nullptr;
133 ability = ability_.lock();
134 if (ability == nullptr) {
135 HILOG_ERROR("ability is nullptr");
136 return ERR_INVALID_VALUE;
137 }
138
139 if (!ability->OnStartContinuation()) {
140 HILOG_ERROR("Ability rejected.");
141 return CONTINUE_ABILITY_REJECTED;
142 }
143 if (!ability->OnSaveData(wantParams)) {
144 HILOG_ERROR("SaveData failed.");
145 return CONTINUE_SAVE_DATA_FAILED;
146 }
147 HILOG_INFO("%{public}s called end", __func__);
148 return ERR_OK;
149 }
150
IsContinuePageStack(const WantParams & wantParams)151 bool ContinuationManager::IsContinuePageStack(const WantParams &wantParams)
152 {
153 auto value = wantParams.GetParam(SUPPORT_CONTINUE_PAGE_STACK_PROPERTY_NAME);
154 IBoolean *ao = IBoolean::Query(value);
155 if (ao != nullptr) {
156 return AAFwk::Boolean::Unbox(ao);
157 }
158 return true;
159 }
160
OnContinueAndGetContent(WantParams & wantParams)161 int32_t ContinuationManager::OnContinueAndGetContent(WantParams &wantParams)
162 {
163 HILOG_INFO("%{public}s called begin", __func__);
164 std::shared_ptr<Ability> ability = nullptr;
165 ability = ability_.lock();
166 if (ability == nullptr) {
167 HILOG_ERROR("ability is nullptr");
168 return ERR_INVALID_VALUE;
169 }
170
171 HILOG_INFO("OnContinue begin");
172 int32_t status = ability->OnContinue(wantParams);
173 HILOG_INFO("OnContinue end, status: %{public}d", status);
174 if (status != OnContinueResult::AGREE) {
175 if (status == OnContinueResult::MISMATCH) {
176 HILOG_ERROR("OnContinue version mismatch.");
177 return CONTINUE_ON_CONTINUE_MISMATCH;
178 }
179 HILOG_ERROR("OnContinue failed.");
180 return CONTINUE_ON_CONTINUE_FAILED;
181 }
182
183 #ifdef SUPPORT_GRAPHICS
184 if (IsContinuePageStack(wantParams)) {
185 bool ret = GetContentInfo(wantParams);
186 if (!ret) {
187 HILOG_ERROR("GetContentInfo failed.");
188 return CONTINUE_GET_CONTENT_FAILED;
189 }
190 }
191 #endif
192 HILOG_INFO("%{public}s called end", __func__);
193 return ERR_OK;
194 }
195
OnContinue(WantParams & wantParams)196 int32_t ContinuationManager::OnContinue(WantParams &wantParams)
197 {
198 HILOG_INFO("%{public}s called begin", __func__);
199 auto ability = ability_.lock();
200 auto abilityInfo = abilityInfo_.lock();
201 if (ability == nullptr || abilityInfo == nullptr) {
202 HILOG_ERROR("ability or abilityInfo is nullptr");
203 return ERR_INVALID_VALUE;
204 }
205
206 bool stageBased = abilityInfo->isStageBasedModel;
207 HILOG_INFO("ability isStageBasedModel %{public}d", stageBased);
208 if (!stageBased) {
209 return OnStartAndSaveData(wantParams);
210 } else {
211 return OnContinueAndGetContent(wantParams);
212 }
213 }
214
215 #ifdef SUPPORT_GRAPHICS
GetContentInfo(WantParams & wantParams)216 bool ContinuationManager::GetContentInfo(WantParams &wantParams)
217 {
218 HILOG_INFO("%{public}s called begin", __func__);
219 std::shared_ptr<Ability> ability = nullptr;
220 ability = ability_.lock();
221 if (ability == nullptr) {
222 HILOG_ERROR("ability is nullptr");
223 return false;
224 }
225
226 std::string pageStack = ability->GetContentInfo();
227 if (pageStack.empty()) {
228 HILOG_ERROR("GetContentInfo failed.");
229 return false;
230 }
231 HILOG_INFO("ability pageStack: %{public}s", pageStack.c_str());
232 wantParams.SetParam(PAGE_STACK_PROPERTY_NAME, String::Box(pageStack));
233
234 HILOG_INFO("%{public}s called end", __func__);
235 return true;
236 }
237 #endif
238
ContinueAbility(bool reversible,const std::string & deviceId)239 void ContinuationManager::ContinueAbility(bool reversible, const std::string &deviceId)
240 {
241 HILOG_INFO("%{public}s called begin", __func__);
242 if (CheckContinuationIllegal()) {
243 HILOG_ERROR("ContinuationManager::ContinueAbility failed. Ability not available to continueAbility.");
244 return;
245 }
246
247 if (progressState_ != ProgressState::INITIAL) {
248 HILOG_ERROR(
249 "ContinuationManager::ContinueAbility failed. Another request in progress. progressState_: %{public}d",
250 progressState_);
251 return;
252 }
253
254 if (continuationState_ != ContinuationState::LOCAL_RUNNING) {
255 HILOG_ERROR(
256 "ContinuationManager::ContinueAbility failed. Illegal continuation state. Current state is %{public}d",
257 continuationState_);
258 return;
259 }
260
261 if (HandleContinueAbility(reversible, deviceId)) {
262 reversible_ = reversible;
263 ChangeProcessState(ProgressState::WAITING_SCHEDULE);
264 }
265 HILOG_INFO("%{public}s called end", __func__);
266 }
267
ReverseContinueAbility()268 bool ContinuationManager::ReverseContinueAbility()
269 {
270 HILOG_INFO("%{public}s called begin", __func__);
271 if (progressState_ != ProgressState::INITIAL) {
272 HILOG_ERROR(
273 "ContinuationManager::ReverseContinueAbility failed. progressState_ is %{public}d.", progressState_);
274 return false;
275 }
276
277 if (continuationState_ != ContinuationState::REMOTE_RUNNING) {
278 HILOG_ERROR("ContinuationManager::ReverseContinueAbility failed. continuationState_ is %{public}d.",
279 continuationState_);
280 return false;
281 }
282
283 std::shared_ptr<ContinuationHandler> continuationHandler = continuationHandler_.lock();
284 if (continuationHandler == nullptr) {
285 HILOG_ERROR("ContinuationManager::ReverseContinueAbility failed. continuationHandler_ is nullptr.");
286 return false;
287 }
288
289 bool requestSuccess = continuationHandler->ReverseContinueAbility();
290 if (requestSuccess) {
291 ChangeProcessState(ProgressState::WAITING_SCHEDULE);
292 RestoreStateWhenTimeout(TIMEOUT_MS_WAIT_REMOTE_NOTIFY_BACK, ProgressState::WAITING_SCHEDULE);
293 }
294 HILOG_INFO("%{public}s called end", __func__);
295 return requestSuccess;
296 }
297
StartContinuation()298 bool ContinuationManager::StartContinuation()
299 {
300 HILOG_INFO("%{public}s called begin", __func__);
301 ChangeProcessState(ProgressState::IN_PROGRESS);
302 bool result = DoScheduleStartContinuation();
303 if (!result) {
304 ChangeProcessState(ProgressState::INITIAL);
305 }
306 HILOG_INFO("%{public}s called end", __func__);
307 return result;
308 }
309
SaveData(WantParams & saveData)310 bool ContinuationManager::SaveData(WantParams &saveData)
311 {
312 HILOG_INFO("%{public}s called begin", __func__);
313 bool result = DoScheduleSaveData(saveData);
314 if (!result) {
315 ChangeProcessState(ProgressState::INITIAL);
316 } else {
317 RestoreStateWhenTimeout(TIMEOUT_MS_WAIT_DMS_NOTIFY_CONTINUATION_COMPLETE, ProgressState::IN_PROGRESS);
318 }
319 HILOG_INFO("%{public}s called end", __func__);
320 return result;
321 }
322
RestoreData(const WantParams & restoreData,bool reversible,const std::string & originalDeviceId)323 bool ContinuationManager::RestoreData(
324 const WantParams &restoreData, bool reversible, const std::string &originalDeviceId)
325 {
326 HILOG_INFO("%{public}s called begin", __func__);
327 ChangeProcessState(ProgressState::IN_PROGRESS);
328 bool result = DoScheduleRestoreData(restoreData);
329 if (reversible) {
330 continuationState_ = ContinuationState::REPLICA_RUNNING;
331 }
332 originalDeviceId_ = originalDeviceId;
333 ChangeProcessState(ProgressState::INITIAL);
334 HILOG_INFO("%{public}s called end", __func__);
335 return result;
336 }
337
NotifyCompleteContinuation(const std::string & originDeviceId,int sessionId,bool success,const sptr<IRemoteObject> & reverseScheduler)338 void ContinuationManager::NotifyCompleteContinuation(
339 const std::string &originDeviceId, int sessionId, bool success, const sptr<IRemoteObject> &reverseScheduler)
340 {
341 HILOG_INFO("%{public}s called begin", __func__);
342 AAFwk::AbilityManagerClient::GetInstance()->NotifyCompleteContinuation(
343 originDeviceId, sessionId, success);
344 HILOG_INFO("%{public}s called end", __func__);
345 }
346
CompleteContinuation(int result)347 void ContinuationManager::CompleteContinuation(int result)
348 {
349 HILOG_INFO("%{public}s called begin", __func__);
350 if (CheckContinuationIllegal()) {
351 HILOG_ERROR(
352 "ContinuationManager::CompleteContinuation failed. Ability not available to complete continuation.");
353 return;
354 }
355
356 std::shared_ptr<Ability> ability = nullptr;
357 ability = ability_.lock();
358 if (ability == nullptr) {
359 HILOG_ERROR("ContinuationManager::CheckContinuationIllegal failed. ability is nullptr");
360 return;
361 }
362
363 if (result == 0 && reversible_) {
364 continuationState_ = ContinuationState::REMOTE_RUNNING;
365 }
366 ChangeProcessState(ProgressState::INITIAL);
367
368 ability->OnCompleteContinuation(result);
369
370 if (!reversible_) {
371 ability->TerminateAbility();
372 }
373 HILOG_INFO("%{public}s called end", __func__);
374 }
375
RestoreFromRemote(const WantParams & restoreData)376 bool ContinuationManager::RestoreFromRemote(const WantParams &restoreData)
377 {
378 HILOG_INFO("%{public}s called begin", __func__);
379 ChangeProcessState(ProgressState::IN_PROGRESS);
380 bool result = DoRestoreFromRemote(restoreData);
381 /*
382 * No matter what the result is, we should reset the status. Because even it fail, we can do
383 * nothing but let the user send another reverse continuation request again.
384 */
385 ChangeProcessState(ProgressState::INITIAL);
386 if (result) {
387 continuationState_ = ContinuationState::LOCAL_RUNNING;
388 }
389 HILOG_INFO("%{public}s called end", __func__);
390 return result;
391 }
392
NotifyRemoteTerminated()393 bool ContinuationManager::NotifyRemoteTerminated()
394 {
395 HILOG_INFO("%{public}s called begin", __func__);
396 continuationState_ = ContinuationState::LOCAL_RUNNING;
397 ChangeProcessState(ProgressState::INITIAL);
398
399 std::shared_ptr<Ability> ability = nullptr;
400 ability = ability_.lock();
401 if (ability == nullptr) {
402 HILOG_ERROR("ContinuationManager::NotifyRemoteTerminated failed. ability is nullptr");
403 return false;
404 }
405
406 ability->OnRemoteTerminated();
407 HILOG_INFO("%{public}s called end", __func__);
408 return true;
409 }
410
CheckContinuationIllegal()411 bool ContinuationManager::CheckContinuationIllegal()
412 {
413 HILOG_INFO("%{public}s called begin", __func__);
414 std::shared_ptr<Ability> ability = nullptr;
415 ability = ability_.lock();
416 if (ability == nullptr) {
417 HILOG_ERROR("ContinuationManager::CheckContinuationIllegal failed. ability is nullptr");
418 return false;
419 }
420
421 if (ability->GetState() >= AbilityLifecycleExecutor::LifecycleState::UNINITIALIZED) {
422 HILOG_ERROR("ContinuationManager::CheckContinuationIllegal failed. ability state is wrong: %{public}d",
423 ability->GetState());
424 return true;
425 }
426 HILOG_INFO("%{public}s called end", __func__);
427 return false;
428 }
429
HandleContinueAbility(bool reversible,const std::string & deviceId)430 bool ContinuationManager::HandleContinueAbility(bool reversible, const std::string &deviceId)
431 {
432 HILOG_INFO("%{public}s called begin", __func__);
433
434 if (!CheckAbilityToken()) {
435 HILOG_ERROR("ContinuationManager::HandleContinueAbility failed. CheckAbilityToken failed");
436 return false;
437 }
438
439 sptr<IRemoteObject> continueToken = continueToken_;
440 std::shared_ptr<ContinuationHandler> continuationHandler = continuationHandler_.lock();
441 if (continuationHandler == nullptr) {
442 HILOG_ERROR("ContinuationManager::HandleContinueAbility failed. continuationHandler is nullptr");
443 return false;
444 }
445 continuationHandler->SetReversible(reversible);
446
447 InitMainHandlerIfNeed();
448 auto task = [continuationHandler, continueToken, deviceId]() {
449 continuationHandler->HandleStartContinuation(continueToken, deviceId);
450 };
451 if (!mainHandler_->PostTask(task)) {
452 HILOG_ERROR("ContinuationManager::HandleContinueAbility failed.PostTask failed");
453 return false;
454 }
455
456 HILOG_INFO("%{public}s called end", __func__);
457 return true;
458 }
459
GetProcessState()460 ContinuationManager::ProgressState ContinuationManager::GetProcessState()
461 {
462 return progressState_;
463 }
464
ChangeProcessState(const ProgressState & newState)465 void ContinuationManager::ChangeProcessState(const ProgressState &newState)
466 {
467 HILOG_INFO("%{public}s called begin. progressState_: %{public}d, newState: %{public}d",
468 __func__,
469 progressState_,
470 newState);
471
472 progressState_ = newState;
473 }
474
475
ChangeProcessStateToInit()476 void ContinuationManager::ChangeProcessStateToInit()
477 {
478 if (mainHandler_ != nullptr) {
479 mainHandler_->RemoveTask("Restore_State_When_Timeout");
480 HILOG_INFO("Restore_State_When_Timeout task removed");
481 }
482 ChangeProcessState(ProgressState::INITIAL);
483 }
484
RestoreStateWhenTimeout(long timeoutInMs,const ProgressState & preState)485 void ContinuationManager::RestoreStateWhenTimeout(long timeoutInMs, const ProgressState &preState)
486 {
487 HILOG_INFO("%{public}s called begin", __func__);
488 InitMainHandlerIfNeed();
489
490 auto timeoutTask = [continuationManager = shared_from_this(), preState]() {
491 HILOG_INFO(
492 "ContinuationManager::RestoreStateWhenTimeout called. preState = %{public}d, currentState = %{public}d.",
493 preState,
494 continuationManager->GetProcessState());
495 if (preState == continuationManager->GetProcessState()) {
496 continuationManager->ChangeProcessState(ProgressState::INITIAL);
497 }
498 };
499 mainHandler_->PostTask(timeoutTask, "Restore_State_When_Timeout", timeoutInMs);
500 HILOG_INFO("%{public}s called end", __func__);
501 }
502
InitMainHandlerIfNeed()503 void ContinuationManager::InitMainHandlerIfNeed()
504 {
505 HILOG_INFO("%{public}s called begin", __func__);
506 if (mainHandler_ == nullptr) {
507 HILOG_INFO("Try to init main handler.");
508 std::lock_guard<std::mutex> lock_l(lock_);
509 if ((mainHandler_ == nullptr) && (EventRunner::GetMainEventRunner() != nullptr)) {
510 mainHandler_ = std::make_shared<EventHandler>(EventRunner::GetMainEventRunner());
511 }
512 }
513 HILOG_INFO("%{public}s called end", __func__);
514 }
515
CheckAbilityToken()516 bool ContinuationManager::CheckAbilityToken()
517 {
518 HILOG_INFO("%{public}s called", __func__);
519 if (continueToken_ == nullptr) {
520 HILOG_INFO("%{public}s called failed", __func__);
521 return false;
522 }
523 HILOG_INFO("%{public}s called success", __func__);
524 return true;
525 }
526
CheckDmsInterfaceResult(int result,const std::string & interfaceName)527 void ContinuationManager::CheckDmsInterfaceResult(int result, const std::string &interfaceName)
528 {
529 HILOG_INFO("ContinuationManager::CheckDmsInterfaceResult called. interfaceName: %{public}s, result: %{public}d.",
530 interfaceName.c_str(),
531 result);
532 }
533
DoScheduleStartContinuation()534 bool ContinuationManager::DoScheduleStartContinuation()
535 {
536 HILOG_INFO("%{public}s called begin", __func__);
537 if (CheckContinuationIllegal()) {
538 HILOG_ERROR(
539 "ContinuationManager::DoScheduleStartContinuation called. Ability not available to startContinuation.");
540 return false;
541 }
542
543 std::shared_ptr<Ability> ability = nullptr;
544 ability = ability_.lock();
545 if (ability == nullptr) {
546 HILOG_ERROR("ContinuationManager::DoScheduleStartContinuation failed. ability is nullptr");
547 return false;
548 }
549 if (!ability->OnStartContinuation()) {
550 HILOG_INFO("%{public}s called failed to StartContinuation", __func__);
551 return false;
552 }
553 HILOG_INFO("%{public}s called end", __func__);
554 return true;
555 }
556
DoScheduleSaveData(WantParams & saveData)557 bool ContinuationManager::DoScheduleSaveData(WantParams &saveData)
558 {
559 HILOG_INFO("%{public}s called begin", __func__);
560 if (CheckContinuationIllegal()) {
561 HILOG_ERROR("ContinuationManager::DoScheduleSaveData failed. Ability not available to save data.");
562 return false;
563 }
564
565 std::shared_ptr<Ability> ability = nullptr;
566 ability = ability_.lock();
567 if (ability == nullptr) {
568 HILOG_ERROR("ContinuationManager::DoScheduleSaveData failed. ability is nullptr");
569 return false;
570 }
571
572 WantParams abilitySaveData;
573 bool ret = ability->OnSaveData(abilitySaveData);
574 for (std::string key : abilitySaveData.KeySet()) {
575 saveData.SetParam(key, abilitySaveData.GetParam(key).GetRefPtr());
576 }
577
578 if (!ret) {
579 HILOG_ERROR("ContinuationManager::DoScheduleSaveData failed. Ability save data failed.");
580 }
581 HILOG_INFO("%{public}s called end", __func__);
582 return ret;
583 }
584
DoScheduleRestoreData(const WantParams & restoreData)585 bool ContinuationManager::DoScheduleRestoreData(const WantParams &restoreData)
586 {
587 HILOG_INFO("%{public}s called begin", __func__);
588 if (CheckContinuationIllegal()) {
589 HILOG_ERROR("ContinuationManager::DoScheduleRestoreData failed. Ability not available to restore data.");
590 return false;
591 }
592
593 std::shared_ptr<Ability> ability = nullptr;
594 ability = ability_.lock();
595 if (ability == nullptr) {
596 HILOG_ERROR("ContinuationManager::DoScheduleRestoreData failed. ability is nullptr");
597 return false;
598 }
599
600 WantParams abilityRestoreData;
601 for (std::string key : restoreData.KeySet()) {
602 abilityRestoreData.SetParam(key, restoreData.GetParam(key).GetRefPtr());
603 }
604
605 bool ret = ability->OnRestoreData(abilityRestoreData);
606 if (!ret) {
607 HILOG_ERROR("ContinuationManager::DoScheduleRestoreData failed. Ability restore data failed.");
608 }
609 HILOG_INFO("%{public}s called end", __func__);
610 return ret;
611 }
612
DoRestoreFromRemote(const WantParams & restoreData)613 bool ContinuationManager::DoRestoreFromRemote(const WantParams &restoreData)
614 {
615 HILOG_INFO("%{public}s called begin", __func__);
616 std::shared_ptr<Ability> ability = nullptr;
617 ability = ability_.lock();
618 if (ability == nullptr) {
619 HILOG_ERROR("ContinuationManager::DoRestoreFromRemote failed. ability is nullptr");
620 return false;
621 }
622
623 WantParams abilityRestoreData;
624 for (std::string key : restoreData.KeySet()) {
625 abilityRestoreData.SetParam(key, restoreData.GetParam(key).GetRefPtr());
626 }
627
628 bool ret = ability->OnRestoreData(abilityRestoreData);
629 if (!ret) {
630 HILOG_ERROR("ContinuationManager::DoRestoreFromRemote failed. Ability restore data failed.");
631 }
632 HILOG_INFO("%{public}s called end", __func__);
633 return ret;
634 }
635 } // namespace AppExecFwk
636 } // namespace OHOS
637