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