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 #define private public
17 #define protected public
18 #include "ability_manager_client.h"
19 #undef private
20 #undef protected
21 #include "ability_manager_interface.h"
22 #include "string_ex.h"
23 #include "hilog_tag_wrapper.h"
24 #include "ipc_skeleton.h"
25 #include "if_system_ability_manager.h"
26 #include "iservice_registry.h"
27 #include "system_ability_definition.h"
28 #include "sys_mgr_client.h"
29 
30 namespace OHOS {
31 namespace AAFwk {
32 std::shared_ptr<AbilityManagerClient> mockMTInstance_ = nullptr;
33 std::mutex mockMTMutex_;
34 sptr<IRemoteObject> remoteObject_;
35 
GetInstance()36 std::shared_ptr<AbilityManagerClient> AbilityManagerClient::GetInstance()
37 {
38     if (mockMTInstance_ == nullptr) {
39         std::lock_guard<std::mutex> lock_l(mockMTMutex_);
40         if (mockMTInstance_ == nullptr) {
41             mockMTInstance_ = std::make_shared<AbilityManagerClient>();
42         }
43     }
44     return mockMTInstance_;
45 }
46 
AbilityManagerClient()47 AbilityManagerClient::AbilityManagerClient()
48 {}
49 
~AbilityManagerClient()50 AbilityManagerClient::~AbilityManagerClient()
51 {}
52 
AttachAbilityThread(sptr<IAbilityScheduler> scheduler,sptr<IRemoteObject> token)53 ErrCode AbilityManagerClient::AttachAbilityThread(
54     sptr<IAbilityScheduler> scheduler, sptr<IRemoteObject> token)
55 {
56     TAG_LOGI(AAFwkTag::TEST, "AbilityManagerClient::AttachAbilityThread start");
57     ErrCode err = Connect();
58     if (err != ERR_OK) {
59         return ABILITY_SERVICE_NOT_CONNECTED;
60     }
61 
62     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
63     return abms->AttachAbilityThread(scheduler, token);
64 }
65 
AbilityTransitionDone(sptr<IRemoteObject> token,int state,const PacMap & saveData)66 ErrCode AbilityManagerClient::AbilityTransitionDone(sptr<IRemoteObject> token, int state, const PacMap& saveData)
67 {
68     if (remoteObject_ == nullptr) {
69         return ABILITY_SERVICE_NOT_CONNECTED;
70     }
71     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
72     return abms->AbilityTransitionDone(token, state, saveData);
73 }
74 
ScheduleConnectAbilityDone(sptr<IRemoteObject> token,sptr<IRemoteObject> remoteObject)75 ErrCode AbilityManagerClient::ScheduleConnectAbilityDone(
76     sptr<IRemoteObject> token, sptr<IRemoteObject> remoteObject)
77 {
78     if (remoteObject_ == nullptr) {
79         return ABILITY_SERVICE_NOT_CONNECTED;
80     }
81     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
82     return abms->ScheduleConnectAbilityDone(token, remoteObject);
83 }
84 
ScheduleDisconnectAbilityDone(sptr<IRemoteObject> token)85 ErrCode AbilityManagerClient::ScheduleDisconnectAbilityDone(sptr<IRemoteObject> token)
86 {
87     if (remoteObject_ == nullptr) {
88         return ABILITY_SERVICE_NOT_CONNECTED;
89     }
90     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
91     return abms->ScheduleDisconnectAbilityDone(token);
92 }
93 
ScheduleCommandAbilityDone(sptr<IRemoteObject> token)94 ErrCode AbilityManagerClient::ScheduleCommandAbilityDone(sptr<IRemoteObject> token)
95 {
96     if (remoteObject_ == nullptr) {
97         TAG_LOGE(AAFwkTag::TEST, "%{private}s:ability service not command", __func__);
98         return ABILITY_SERVICE_NOT_CONNECTED;
99     }
100     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
101     return abms->ScheduleCommandAbilityDone(token);
102 }
103 
ScheduleCommandAbilityWindowDone(sptr<IRemoteObject> token,sptr<SessionInfo> sessionInfo,WindowCommand winCmd,AbilityCommand abilityCmd)104 ErrCode AbilityManagerClient::ScheduleCommandAbilityWindowDone(
105     sptr<IRemoteObject> token,
106     sptr<SessionInfo> sessionInfo,
107     WindowCommand winCmd,
108     AbilityCommand abilityCmd)
109 {
110     if (remoteObject_ == nullptr) {
111         return ABILITY_SERVICE_NOT_CONNECTED;
112     }
113     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
114     return abms->ScheduleCommandAbilityWindowDone(token, sessionInfo, winCmd, abilityCmd);
115 }
116 
StartAbility(const Want & want,int requestCode,int32_t userId)117 ErrCode AbilityManagerClient::StartAbility(const Want& want, int requestCode, int32_t userId)
118 {
119     if (remoteObject_ == nullptr) {
120         return ABILITY_SERVICE_NOT_CONNECTED;
121     }
122     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
123     return abms->StartAbility(want, userId, requestCode);
124 }
125 
TerminateAbility(sptr<IRemoteObject> token,int resultCode,const Want * resultWant)126 ErrCode AbilityManagerClient::TerminateAbility(sptr<IRemoteObject> token, int resultCode, const Want* resultWant)
127 {
128     TAG_LOGI(AAFwkTag::TEST, "AbilityManagerClient::TerminateAbility start");
129     if (remoteObject_ == nullptr) {
130         remoteObject_ =
131             OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
132     }
133     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
134     TAG_LOGI(AAFwkTag::TEST, "AbilityManagerClient::TerminateAbility end");
135     return abms->TerminateAbility(token, resultCode, resultWant);
136 }
137 
ConnectAbility(const Want & want,sptr<IAbilityConnection> connect,sptr<IRemoteObject> callerToken,int32_t userId)138 ErrCode AbilityManagerClient::ConnectAbility(
139     const Want& want, sptr<IAbilityConnection> connect, sptr<IRemoteObject> callerToken, int32_t userId)
140 {
141     if (remoteObject_ == nullptr) {
142         remoteObject_ =
143             OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
144     }
145     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
146     return abms->ConnectAbility(want, connect, callerToken);
147 }
148 
DisconnectAbility(sptr<IAbilityConnection> connect)149 ErrCode AbilityManagerClient::DisconnectAbility(sptr<IAbilityConnection> connect)
150 {
151     if (remoteObject_ == nullptr) {
152         remoteObject_ =
153             OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
154     }
155     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
156     return abms->DisconnectAbility(connect);
157 }
158 
DumpState(const std::string & args,std::vector<std::string> & state)159 ErrCode AbilityManagerClient::DumpState(const std::string& args, std::vector<std::string>& state)
160 {
161     if (remoteObject_ == nullptr) {
162         return ABILITY_SERVICE_NOT_CONNECTED;
163     }
164     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
165     abms->DumpState(args, state);
166     return ERR_OK;
167 }
168 
Connect()169 ErrCode AbilityManagerClient::Connect()
170 {
171     std::lock_guard<std::mutex> lock(mockMTMutex_);
172     remoteObject_ =
173         OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
174     if (remoteObject_ == nullptr) {
175         TAG_LOGE(AAFwkTag::TEST, "AbilityManagerClient::Connect remoteObject_ == nullptr");
176         return ERR_NO_MEMORY;
177     }
178 
179     return ERR_OK;
180 }
181 
StopServiceAbility(const Want & want,sptr<IRemoteObject> token)182 ErrCode AbilityManagerClient::StopServiceAbility(const Want& want, sptr<IRemoteObject> token)
183 {
184     if (remoteObject_ == nullptr) {
185         remoteObject_ =
186             OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
187     }
188     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
189     return abms->StopServiceAbility(want);
190 }
191 
AcquireDataAbility(const Uri & uri,bool tryBind,sptr<IRemoteObject> callerToken)192 sptr<IAbilityScheduler> AbilityManagerClient::AcquireDataAbility(
193     const Uri& uri, bool tryBind, sptr<IRemoteObject> callerToken)
194 {
195     remoteObject_ =
196         OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
197     if (remoteObject_ == nullptr) {
198         return nullptr;
199     }
200 
201     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
202     return abms->AcquireDataAbility(uri, tryBind, callerToken);
203 }
204 
ReleaseDataAbility(sptr<IAbilityScheduler> dataAbilityScheduler,sptr<IRemoteObject> callerToken)205 ErrCode AbilityManagerClient::ReleaseDataAbility(
206     sptr<IAbilityScheduler> dataAbilityScheduler, sptr<IRemoteObject> callerToken)
207 {
208     remoteObject_ =
209         OHOS::DelayedSingleton<AppExecFwk::SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
210     if (remoteObject_ == nullptr) {
211         return -1;
212     }
213 
214     sptr<IAbilityManager> abms = iface_cast<IAbilityManager>(remoteObject_);
215     return abms->ReleaseDataAbility(dataAbilityScheduler, callerToken);
216 }
217 }  // namespace AAFwk
218 }  // namespace OHOS
219