1 /*
2 * Copyright (c) 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 #include "unistd.h"
16 #include "ffrt.h"
17 #include "bundle_active_log.h"
18 #include "bundle_active_client.h"
19
20 namespace OHOS {
21 namespace DeviceUsageStats {
22 namespace {
23 static const int32_t DELAY_TIME = 5000;
24 static const int32_t SLEEP_TIME_SECOND = 1;
25 static const int32_t MS_TO_US = 1000;
26 }
27 ffrt::recursive_mutex mutex_;
GetInstance()28 BundleActiveClient& BundleActiveClient::GetInstance()
29 {
30 static BundleActiveClient instance;
31 return instance;
32 }
33
GetBundleActiveProxy()34 ErrCode BundleActiveClient::GetBundleActiveProxy()
35 {
36 if (bundleActiveProxy_ != nullptr) {
37 return ERR_OK;
38 }
39 sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
40 if (!samgr) {
41 BUNDLE_ACTIVE_LOGE("Failed to get SystemAbilityManager.");
42 return ERR_GET_SYSTEM_ABILITY_MANAGER_FAILED;
43 }
44
45 sptr<IRemoteObject> object = samgr->GetSystemAbility(DEVICE_USAGE_STATISTICS_SYS_ABILITY_ID);
46 if (!object) {
47 BUNDLE_ACTIVE_LOGE("Failed to get SystemAbility[1907] .");
48 return ERR_GET_SYSTEM_ABILITY_FAILED;
49 }
50
51 bundleActiveProxy_ = iface_cast<IBundleActiveService>(object);
52 if (!bundleActiveProxy_) {
53 BUNDLE_ACTIVE_LOGE("Failed to get BundleActiveProxy.");
54 return ERR_REMOTE_OBJECT_IF_CAST_FAILED;
55 }
56 if (!recipient_) {
57 recipient_ = new (std::nothrow) BundleActiveClientDeathRecipient();
58 }
59 if (recipient_) {
60 bundleActiveProxy_->AsObject()->AddDeathRecipient(recipient_);
61 }
62 return ERR_OK;
63 }
64
ReportEvent(BundleActiveEvent event,const int32_t userId)65 ErrCode BundleActiveClient::ReportEvent(BundleActiveEvent event, const int32_t userId)
66 {
67 BUNDLE_ACTIVE_LOGD("BundleActiveClient::ReportEvent called");
68 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
69 ErrCode ret = GetBundleActiveProxy();
70 if (ret != ERR_OK) {
71 return ret;
72 }
73 return bundleActiveProxy_->ReportEvent(event, userId);
74 }
75
IsBundleIdle(bool & isBundleIdle,const std::string & bundleName,int32_t userId)76 ErrCode BundleActiveClient::IsBundleIdle(bool& isBundleIdle, const std::string& bundleName, int32_t userId)
77 {
78 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
79 ErrCode ret = GetBundleActiveProxy();
80 if (ret != ERR_OK) {
81 return ret;
82 }
83 return bundleActiveProxy_->IsBundleIdle(isBundleIdle, bundleName, userId);
84 }
85
IsBundleUsePeriod(bool & IsUsePeriod,const std::string & bundleName,int32_t userId)86 ErrCode BundleActiveClient::IsBundleUsePeriod(bool& IsUsePeriod, const std::string& bundleName, int32_t userId)
87 {
88 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
89 ErrCode ret = GetBundleActiveProxy();
90 if (ret != ERR_OK) {
91 return ret;
92 }
93 return bundleActiveProxy_->IsBundleUsePeriod(IsUsePeriod, bundleName, userId);
94 }
95
QueryBundleStatsInfoByInterval(std::vector<BundleActivePackageStats> & PackageStats,const int32_t intervalType,const int64_t beginTime,const int64_t endTime,int32_t userId)96 ErrCode BundleActiveClient::QueryBundleStatsInfoByInterval(std::vector<BundleActivePackageStats>& PackageStats,
97 const int32_t intervalType, const int64_t beginTime, const int64_t endTime, int32_t userId)
98 {
99 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
100 ErrCode ret = GetBundleActiveProxy();
101 if (ret != ERR_OK) {
102 return ret;
103 }
104 return bundleActiveProxy_->QueryBundleStatsInfoByInterval(PackageStats, intervalType, beginTime, endTime, userId);
105 }
106
QueryBundleTodayLatestUsedTime(int64_t & latestUsedTime,const std::string & bundleName,int32_t userId)107 ErrCode BundleActiveClient::QueryBundleTodayLatestUsedTime(
108 int64_t& latestUsedTime, const std::string& bundleName, int32_t userId)
109 {
110 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
111 ErrCode ret = GetBundleActiveProxy();
112 if (ret != ERR_OK) {
113 return ret;
114 }
115 return bundleActiveProxy_->QueryBundleTodayLatestUsedTime(latestUsedTime, bundleName, userId);
116 }
117
QueryHighFrequencyPeriodBundle(std::vector<BundleActiveHighFrequencyPeriod> & appFreqHours,int32_t userId)118 ErrCode BundleActiveClient::QueryHighFrequencyPeriodBundle(
119 std::vector<BundleActiveHighFrequencyPeriod>& appFreqHours, int32_t userId)
120 {
121 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
122 ErrCode ret = GetBundleActiveProxy();
123 if (ret != ERR_OK) {
124 return ret;
125 }
126 auto err = bundleActiveProxy_->QueryHighFrequencyPeriodBundle(appFreqHours, userId);
127 BUNDLE_ACTIVE_LOGI("QueryHighFrequencyPeriodBundle appFreqHour is %{public}zu", appFreqHours.size());
128 return err;
129 }
130
QueryBundleEvents(std::vector<BundleActiveEvent> & bundleActiveEvents,const int64_t beginTime,const int64_t endTime,int32_t userId)131 ErrCode BundleActiveClient::QueryBundleEvents(std::vector<BundleActiveEvent>& bundleActiveEvents,
132 const int64_t beginTime, const int64_t endTime, int32_t userId)
133 {
134 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
135 ErrCode ret = GetBundleActiveProxy();
136 if (ret != ERR_OK) {
137 return ret;
138 }
139 auto err = bundleActiveProxy_->QueryBundleEvents(bundleActiveEvents, beginTime, endTime, userId);
140 BUNDLE_ACTIVE_LOGI("QueryBundleEvents bundleActiveEvents is %{public}zu", bundleActiveEvents.size());
141 return err;
142 }
143
SetAppGroup(std::string bundleName,const int32_t newGroup,int32_t userId)144 ErrCode BundleActiveClient::SetAppGroup(std::string bundleName, const int32_t newGroup, int32_t userId)
145 {
146 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
147 ErrCode ret = GetBundleActiveProxy();
148 if (ret != ERR_OK) {
149 return ret;
150 }
151 return bundleActiveProxy_->SetAppGroup(bundleName, newGroup, userId);
152 }
153
QueryBundleStatsInfos(std::vector<BundleActivePackageStats> & bundleActivePackageStats,const int32_t intervalType,const int64_t beginTime,const int64_t endTime)154 ErrCode BundleActiveClient::QueryBundleStatsInfos(std::vector<BundleActivePackageStats>& bundleActivePackageStats,
155 const int32_t intervalType, const int64_t beginTime, const int64_t endTime)
156 {
157 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
158 ErrCode ret = GetBundleActiveProxy();
159 if (ret != ERR_OK) {
160 return ret;
161 }
162 return bundleActiveProxy_->QueryBundleStatsInfos(bundleActivePackageStats, intervalType, beginTime, endTime);
163 }
164
QueryCurrentBundleEvents(std::vector<BundleActiveEvent> & bundleActiveEvents,const int64_t beginTime,const int64_t endTime)165 ErrCode BundleActiveClient::QueryCurrentBundleEvents(std::vector<BundleActiveEvent>& bundleActiveEvents,
166 const int64_t beginTime, const int64_t endTime)
167 {
168 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
169 ErrCode ret = GetBundleActiveProxy();
170 if (ret != ERR_OK) {
171 return ret;
172 }
173 return bundleActiveProxy_->QueryCurrentBundleEvents(bundleActiveEvents, beginTime, endTime);
174 }
175
QueryAppGroup(int32_t & appGroup,std::string & bundleName,const int32_t userId)176 ErrCode BundleActiveClient::QueryAppGroup(int32_t& appGroup, std::string& bundleName, const int32_t userId)
177 {
178 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
179 ErrCode ret = GetBundleActiveProxy();
180 if (ret != ERR_OK) {
181 return ret;
182 }
183 return bundleActiveProxy_->QueryAppGroup(appGroup, bundleName, userId);
184 }
185
QueryModuleUsageRecords(int32_t maxNum,std::vector<BundleActiveModuleRecord> & results,int32_t userId)186 ErrCode BundleActiveClient::QueryModuleUsageRecords(int32_t maxNum, std::vector<BundleActiveModuleRecord>& results,
187 int32_t userId)
188 {
189 if (maxNum <= 0 || maxNum > MAXNUM_UP_LIMIT) {
190 BUNDLE_ACTIVE_LOGI("maxNum is illegal, maxNum is %{public}d", maxNum);
191 return ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND;
192 }
193 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
194 ErrCode ret = GetBundleActiveProxy();
195 if (ret != ERR_OK) {
196 return ret;
197 }
198 return bundleActiveProxy_->QueryModuleUsageRecords(maxNum, results, userId);
199 }
200
RegisterAppGroupCallBack(const sptr<IAppGroupCallback> & observer)201 ErrCode BundleActiveClient::RegisterAppGroupCallBack(const sptr<IAppGroupCallback> &observer)
202 {
203 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
204 ErrCode ret = GetBundleActiveProxy();
205 if (ret != ERR_OK) {
206 return ret;
207 }
208 ret = bundleActiveProxy_->RegisterAppGroupCallBack(observer);
209 if (recipient_ && ret == ERR_OK) {
210 recipient_->AddObserver(observer);
211 }
212 return ret;
213 }
214
UnRegisterAppGroupCallBack(const sptr<IAppGroupCallback> & observer)215 ErrCode BundleActiveClient::UnRegisterAppGroupCallBack(const sptr<IAppGroupCallback> &observer)
216 {
217 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
218 ErrCode ret = GetBundleActiveProxy();
219 if (ret != ERR_OK) {
220 return ret;
221 }
222 ret = bundleActiveProxy_->UnRegisterAppGroupCallBack(observer);
223 if (recipient_ && ret == ERR_OK) {
224 recipient_->RemoveObserver();
225 }
226 return ret;
227 }
228
QueryDeviceEventStats(int64_t beginTime,int64_t endTime,std::vector<BundleActiveEventStats> & eventStats,int32_t userId)229 ErrCode BundleActiveClient::QueryDeviceEventStats(int64_t beginTime, int64_t endTime,
230 std::vector<BundleActiveEventStats>& eventStats, int32_t userId)
231 {
232 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
233 ErrCode ret = GetBundleActiveProxy();
234 if (ret != ERR_OK) {
235 return ret;
236 }
237 return bundleActiveProxy_->QueryDeviceEventStats(beginTime, endTime, eventStats, userId);
238 }
239
QueryNotificationEventStats(int64_t beginTime,int64_t endTime,std::vector<BundleActiveEventStats> & eventStats,int32_t userId)240 ErrCode BundleActiveClient::QueryNotificationEventStats(int64_t beginTime, int64_t endTime,
241 std::vector<BundleActiveEventStats>& eventStats, int32_t userId)
242 {
243 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
244 ErrCode ret = GetBundleActiveProxy();
245 if (ret != ERR_OK) {
246 return ret;
247 }
248 return bundleActiveProxy_->QueryNotificationEventStats(beginTime, endTime, eventStats, userId);
249 }
250
AddObserver(const sptr<IAppGroupCallback> & observer)251 void BundleActiveClient::BundleActiveClientDeathRecipient::AddObserver(const sptr<IAppGroupCallback> &observer)
252 {
253 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
254 if (observer) {
255 observer_ = observer;
256 }
257 }
258
RemoveObserver()259 void BundleActiveClient::BundleActiveClientDeathRecipient::RemoveObserver()
260 {
261 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
262 if (observer_) {
263 observer_ = nullptr;
264 }
265 }
266
OnRemoteDied(const wptr<IRemoteObject> & object)267 void BundleActiveClient::BundleActiveClientDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
268 {
269 (void)object;
270 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
271 BundleActiveClient::GetInstance().bundleActiveProxy_ = nullptr;
272 ffrt::submit([this]() {
273 this->OnServiceDiedInner();
274 }, {}, {}, ffrt::task_attr().delay(DELAY_TIME * MS_TO_US));
275 }
276
OnServiceDiedInner()277 void BundleActiveClient::BundleActiveClientDeathRecipient::OnServiceDiedInner()
278 {
279 std::lock_guard<ffrt::recursive_mutex> lock(mutex_);
280 while (BundleActiveClient::GetInstance().GetBundleActiveProxy() != ERR_OK) {
281 sleep(SLEEP_TIME_SECOND);
282 }
283 if (observer_) {
284 BundleActiveClient::GetInstance().RegisterAppGroupCallBack(observer_);
285 }
286 }
287 } // namespace DeviceUsageStats
288 } // namespace OHOS