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