• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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