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