1 /*
2 * Copyright (c) 2021 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 "battery_stats_client.h"
17
18 #include "datetime_ex.h"
19 #include "if_system_ability_manager.h"
20 #include "ipc_skeleton.h"
21 #include "iservice_registry.h"
22 #include "string_ex.h"
23 #include "system_ability_definition.h"
24
25 #include "battery_stats_proxy.h"
26 #include "stats_common.h"
27
28 namespace OHOS {
29 namespace PowerMgr {
BatteryStatsClient()30 BatteryStatsClient::BatteryStatsClient() {}
~BatteryStatsClient()31 BatteryStatsClient::~BatteryStatsClient() {}
32
Connect()33 ErrCode BatteryStatsClient::Connect()
34 {
35 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
36 std::lock_guard<std::mutex> lock(mutex_);
37 if (proxy_ != nullptr) {
38 return ERR_OK;
39 }
40 sptr<ISystemAbilityManager> sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
41 if (sam == nullptr) {
42 STATS_HILOGE(STATS_MODULE_INNERKIT, "Fail to get Registry");
43 return E_STATS_GET_SYSTEM_ABILITY_MANAGER_FAILED;
44 }
45 sptr<IRemoteObject> remoteObject_ = sam->CheckSystemAbility(POWER_MANAGER_BATT_STATS_SERVICE_ID);
46 if (remoteObject_ == nullptr) {
47 STATS_HILOGE(STATS_MODULE_INNERKIT, "GetSystemAbility failed.");
48 return E_STATS_GET_SERVICE_FAILED;
49 }
50 proxy_ = iface_cast<IBatteryStats>(remoteObject_);
51 STATS_HILOGI(STATS_MODULE_INNERKIT, "Connect BatteryStatsService ok.");
52 STATS_HILOGI(STATS_MODULE_INNERKIT, "Exit");
53 return ERR_OK;
54 }
55
ResetProxy(const wptr<IRemoteObject> & remote)56 void BatteryStatsClient::ResetProxy(const wptr<IRemoteObject>& remote)
57 {
58 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
59 std::lock_guard<std::mutex> lock(mutex_);
60 STATS_RETURN_IF(proxy_ == nullptr);
61 auto serviceRemote = proxy_->AsObject();
62 if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) {
63 serviceRemote->RemoveDeathRecipient(deathRecipient_);
64 proxy_ = nullptr;
65 }
66 STATS_HILOGI(STATS_MODULE_INNERKIT, "Exit");
67 }
68
OnRemoteDied(const wptr<IRemoteObject> & remote)69 void BatteryStatsClient::BatteryStatsDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
70 {
71 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
72 if (remote == nullptr) {
73 STATS_HILOGE(STATS_MODULE_INNERKIT, "BatteryStatsDeathRecipient::OnRemoteDied failed, remote is nullptr.");
74 return;
75 }
76 BatteryStatsClient::GetInstance().ResetProxy(remote);
77 STATS_HILOGI(STATS_MODULE_INNERKIT, "BatteryStatsDeathRecipient::Recv death notice.");
78 STATS_HILOGI(STATS_MODULE_INNERKIT, "Exit");
79 }
80
GetBatteryStats()81 BatteryStatsInfoList BatteryStatsClient::GetBatteryStats()
82 {
83 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
84 BatteryStatsInfoList entityList;
85 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, entityList);
86 entityList = proxy_->GetBatteryStats();
87 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetBatteryStats Success!");
88 return entityList;
89 }
90
GetAppStatsMah(const int32_t & uid)91 double BatteryStatsClient::GetAppStatsMah(const int32_t& uid)
92 {
93 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
94 double appStatsMah = StatsUtils::DEFAULT_VALUE;
95 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, appStatsMah);
96 appStatsMah = proxy_->GetAppStatsMah(uid);
97 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetAppStatsMah Success!");
98 return appStatsMah;
99 }
100
SetOnBattery(bool isOnBattery)101 void BatteryStatsClient::SetOnBattery(bool isOnBattery)
102 {
103 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
104 STATS_RETURN_IF(Connect() != ERR_OK);
105 proxy_->SetOnBattery(isOnBattery);
106 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling SetOnBattery Success!");
107 STATS_HILOGI(STATS_MODULE_INNERKIT, "Exit");
108 }
109
GetAppStatsPercent(const int32_t & uid)110 double BatteryStatsClient::GetAppStatsPercent(const int32_t& uid)
111 {
112 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
113 double appStatsPercent = StatsUtils::DEFAULT_VALUE;
114 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, appStatsPercent);
115 appStatsPercent = proxy_->GetAppStatsPercent(uid);
116 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetAppStatsPercent Success!");
117 return appStatsPercent;
118 }
119
GetPartStatsMah(const BatteryStatsInfo::ConsumptionType & type)120 double BatteryStatsClient::GetPartStatsMah(const BatteryStatsInfo::ConsumptionType& type)
121 {
122 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
123 double partStatsMah = StatsUtils::DEFAULT_VALUE;
124 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, partStatsMah);
125 partStatsMah = proxy_->GetPartStatsMah(type);
126 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetPartStatsMah Success!");
127 return partStatsMah;
128 }
129
GetPartStatsPercent(const BatteryStatsInfo::ConsumptionType & type)130 double BatteryStatsClient::GetPartStatsPercent(const BatteryStatsInfo::ConsumptionType& type)
131 {
132 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
133 double partStatsPercent = StatsUtils::DEFAULT_VALUE;
134 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, partStatsPercent);
135 partStatsPercent = proxy_->GetPartStatsPercent(type);
136 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetPartStatsPercent Success!");
137 return partStatsPercent;
138 }
139
Reset()140 void BatteryStatsClient::Reset()
141 {
142 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
143 STATS_RETURN_IF(Connect() != ERR_OK);
144 proxy_->Reset();
145 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling Reset Success!");
146 STATS_HILOGI(STATS_MODULE_INNERKIT, "Exit");
147 }
148
GetTotalTimeSecond(const StatsUtils::StatsType & statsType,const int32_t & uid)149 uint64_t BatteryStatsClient::GetTotalTimeSecond(const StatsUtils::StatsType& statsType, const int32_t& uid)
150 {
151 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
152 uint64_t time = StatsUtils::DEFAULT_VALUE;
153 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, time);
154 time = proxy_->GetTotalTimeSecond(statsType, uid);
155 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetTotalTimeSecond Success!");
156 return time;
157 }
158
GetTotalDataBytes(const StatsUtils::StatsType & statsType,const int32_t & uid)159 uint64_t BatteryStatsClient::GetTotalDataBytes(const StatsUtils::StatsType& statsType, const int32_t& uid)
160 {
161 STATS_HILOGI(STATS_MODULE_INNERKIT, "Enter");
162 uint64_t count = StatsUtils::DEFAULT_VALUE;
163 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, count);
164 count = proxy_->GetTotalDataBytes(statsType, uid);
165 STATS_HILOGI(STATS_MODULE_INNERKIT, "Calling GetTotalDataBytes Success!");
166 return count;
167 }
168
Dump(const std::vector<std::string> & args)169 std::string BatteryStatsClient::Dump(const std::vector<std::string>& args)
170 {
171 std::string error = "can't connect service";
172 STATS_RETURN_IF_WITH_RET(Connect() != ERR_OK, error);
173 STATS_HILOGI(STATS_MODULE_INNERKIT, "%{public}s called.", __func__);
174 return proxy_->ShellDump(args, args.size());
175 }
176 } // namespace PowerMgr
177 } // namespace OHOS
178