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