1 /*
2 * Copyright (c) 2023-2024 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_auto_startup_client.h"
17
18 #include "hilog_tag_wrapper.h"
19 #include "iservice_registry.h"
20 #include "system_ability_definition.h"
21
22 namespace OHOS {
23 namespace AAFwk {
24
25 std::shared_ptr<AbilityAutoStartupClient> AbilityAutoStartupClient::instance_ = nullptr;
26 std::recursive_mutex AbilityAutoStartupClient::mutex_;
27
28 #define CHECK_POINTER_RETURN_NOT_CONNECTED(object) \
29 if (!(object)) { \
30 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null proxy"); \
31 return ABILITY_SERVICE_NOT_CONNECTED; \
32 }
33
GetInstance()34 std::shared_ptr<AbilityAutoStartupClient> AbilityAutoStartupClient::GetInstance()
35 {
36 if (instance_ == nullptr) {
37 std::lock_guard<std::recursive_mutex> lock_l(mutex_);
38 if (instance_ == nullptr) {
39 instance_ = std::make_shared<AbilityAutoStartupClient>();
40 }
41 }
42 return instance_;
43 }
44
AbilityAutoStartupClient()45 AbilityAutoStartupClient::AbilityAutoStartupClient()
46 {}
47
~AbilityAutoStartupClient()48 AbilityAutoStartupClient::~AbilityAutoStartupClient()
49 {}
50
GetAbilityManager()51 sptr<IAbilityManager> AbilityAutoStartupClient::GetAbilityManager()
52 {
53 std::lock_guard<std::recursive_mutex> lock(mutex_);
54 if (!proxy_) {
55 (void)Connect();
56 }
57
58 return proxy_;
59 }
60
Connect()61 ErrCode AbilityAutoStartupClient::Connect()
62 {
63 std::lock_guard<std::recursive_mutex> lock(mutex_);
64 if (proxy_ != nullptr) {
65 return ERR_OK;
66 }
67 sptr<ISystemAbilityManager> systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
68 if (systemManager == nullptr) {
69 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Get registry failed");
70 return GET_ABILITY_SERVICE_FAILED;
71 }
72 sptr<IRemoteObject> remoteObj = systemManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
73 if (remoteObj == nullptr) {
74 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Connect AbilityManagerService failed");
75 return GET_ABILITY_SERVICE_FAILED;
76 }
77
78 deathRecipient_ = sptr<IRemoteObject::DeathRecipient>(new AbilityMgrDeathRecipient());
79 if (deathRecipient_ == nullptr) {
80 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Create AbilityMgrDeathRecipient failed");
81 return GET_ABILITY_SERVICE_FAILED;
82 }
83 if ((remoteObj->IsProxyObject()) && (!remoteObj->AddDeathRecipient(deathRecipient_))) {
84 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Add death recipient to AbilityManagerService failed");
85 return GET_ABILITY_SERVICE_FAILED;
86 }
87
88 proxy_ = iface_cast<IAbilityManager>(remoteObj);
89 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Connect AbilityManagerService success");
90 return ERR_OK;
91 }
92
SetApplicationAutoStartupByEDM(const AutoStartupInfo & info,bool flag)93 ErrCode AbilityAutoStartupClient::SetApplicationAutoStartupByEDM(const AutoStartupInfo &info, bool flag)
94 {
95 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called");
96 auto abms = GetAbilityManager();
97 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
98 return abms->SetApplicationAutoStartupByEDM(info, flag);
99 }
100
CancelApplicationAutoStartupByEDM(const AutoStartupInfo & info,bool flag)101 ErrCode AbilityAutoStartupClient::CancelApplicationAutoStartupByEDM(const AutoStartupInfo &info, bool flag)
102 {
103 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called");
104 auto abms = GetAbilityManager();
105 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
106 return abms->CancelApplicationAutoStartupByEDM(info, flag);
107 }
108
QueryAllAutoStartupApplications(std::vector<AutoStartupInfo> & infoList)109 ErrCode AbilityAutoStartupClient::QueryAllAutoStartupApplications(std::vector<AutoStartupInfo> &infoList)
110 {
111 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called");
112 auto abms = GetAbilityManager();
113 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
114 return abms->QueryAllAutoStartupApplications(infoList);
115 }
116
OnRemoteDied(const wptr<IRemoteObject> & remote)117 void AbilityAutoStartupClient::AbilityMgrDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
118 {
119 TAG_LOGI(AAFwkTag::AUTO_STARTUP, "Handle remote died");
120 AbilityAutoStartupClient::GetInstance()->ResetProxy(remote);
121 }
122
ResetProxy(wptr<IRemoteObject> remote)123 void AbilityAutoStartupClient::ResetProxy(wptr<IRemoteObject> remote)
124 {
125 std::lock_guard<std::recursive_mutex> lock(mutex_);
126 if (!proxy_) {
127 return;
128 }
129
130 auto serviceRemote = proxy_->AsObject();
131 if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) {
132 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Remove death recipient");
133 serviceRemote->RemoveDeathRecipient(deathRecipient_);
134 proxy_ = nullptr;
135 }
136 }
137 } // namespace AAFwk
138 } // namespace OHOS
139