1 /*
2  * Copyright (c) 2020 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_stop_task.h"
17 
18 namespace OHOS {
AbilityStopTask(AbilityMgrContext * context,uint64_t token)19 AbilityStopTask::AbilityStopTask(AbilityMgrContext *context, uint64_t token)
20     : AbilityTask(context), token_(token)
21 {
22 }
23 
Execute()24 AbilityMsStatus AbilityStopTask::Execute()
25 {
26     PRINTD("AbilityStopTask", "start");
27     if (abilityMgrContext_ == nullptr) {
28         return AbilityMsStatus::TaskStatus("stop", "invalid argument");
29     }
30     AbilityStackManager &stackManager = AbilityStackManager::GetInstance();
31     // Step 1: Find stop ability record.
32     PageAbilityRecord *stopAbility = stackManager.FindPageAbility(*abilityMgrContext_, token_);
33     if (stopAbility == nullptr) {
34         return AbilityMsStatus::TaskStatus("stop", "ability record not found");
35     }
36     auto serviceConnects = const_cast<AbilityConnectMission *>(abilityMgrContext_->GetServiceConnects());
37     if (serviceConnects == nullptr) {
38         return AbilityMsStatus::TaskStatus("stop", "invalid argument");
39     }
40     stopAbility->SetCurrentState(STATE_INITIAL);
41     if (stopAbility->GetAbilityInfo().abilityType == AbilityType::SERVICE) {
42         if (stopAbility->GetConnectStatus() == ConnectStatus::STOPPED) {
43             return AbilityMsStatus::TaskStatus("stop", "service has stopped");
44         }
45         AbilityMsStatus status = stopAbility->StopAbilityDone();
46         bool existsPage = stackManager.ExistAppInStack(stopAbility->GetAbilityInfo(), *abilityMgrContext_);
47         int32_t count = serviceConnects->CountServiceInApp(stopAbility->GetAbilityInfo().bundleName);
48         if (!existsPage && count == 1) {
49             PRINTI("AbilityStopTask", "exit app");
50             status = stopAbility->ExitApp();
51         }
52         serviceConnects->RemoveServiceRecord(token_);
53         return status;
54     } else {
55         // Step 2: Ability is bottom in MissionRecord
56         AbilityMsStatus status = AbilityMsStatus::Ok();
57         if (stopAbility->IsBottomPageAbility() &&
58             serviceConnects->CountServiceInApp(stopAbility->GetAbilityInfo().bundleName) == 0) {
59             // exit process
60             status = stopAbility->ExitApp();
61         }
62         // Step 3: Delete ability from stack
63         stackManager.RemovePageAbility(*stopAbility, *abilityMgrContext_);
64         return status;
65     }
66 }
67 }  // namespace OHOS
68