1 /*
2 * Copyright (c) 2021-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 "net_stats_service.h"
17
18 #include <dlfcn.h>
19 #include <net/if.h>
20 #include <sys/time.h>
21 #include <unistd.h>
22 #include <chrono>
23 #include <format>
24 #include <regex>
25
26 #include <cinttypes>
27
28 #include <initializer_list>
29
30 #include "bpf_stats.h"
31 #include "bpf_path.h"
32 #include "bpf_def.h"
33 #include "broadcast_manager.h"
34 #include "common_event_manager.h"
35 #include "common_event_support.h"
36 #include "ffrt_inner.h"
37 #include "net_bundle.h"
38 #include "net_manager_center.h"
39 #include "net_manager_constants.h"
40 #include "net_mgr_log_wrapper.h"
41 #include "net_stats_constants.h"
42 #include "net_stats_database_defines.h"
43 #include "net_stats_service_common.h"
44 #include "netmanager_base_common_utils.h"
45 #include "netmanager_base_permission.h"
46 #include "netmanager_hitrace.h"
47 #include "netsys_controller.h"
48 #include "system_ability_definition.h"
49 #ifdef SUPPORT_TRAFFIC_STATISTIC
50 #include "cellular_data_client.h"
51 #include "core_service_client.h"
52 #include "net_conn_client.h"
53 #include "cellular_data_types.h"
54 #include "net_info_observer.h"
55 #include "net_stats_utils.h"
56 #include "net_stats_notification.h"
57 #include "net_stats_rdb.h"
58 #endif // SUPPORT_TRAFFIC_STATISTIC
59 #include "iptables_wrapper.h"
60 #ifdef SUPPORT_NETWORK_SHARE
61 #include "networkshare_client.h"
62 #include "networkshare_constants.h"
63 #endif // SUPPORT_NETWORK_SHARE
64
65 namespace OHOS {
66 namespace NetManagerStandard {
67 using namespace NetStatsDatabaseDefines;
68 namespace {
69 constexpr std::initializer_list<NetBearType> BEAR_TYPE_LIST = {
70 NetBearType::BEARER_CELLULAR, NetBearType::BEARER_WIFI, NetBearType::BEARER_BLUETOOTH,
71 NetBearType::BEARER_ETHERNET, NetBearType::BEARER_VPN, NetBearType::BEARER_WIFI_AWARE,
72 };
73 constexpr uint32_t DEFAULT_UPDATE_TRAFFIC_INFO_CYCLE_MS = 30 * 60 * 1000;
74 constexpr uint32_t DAY_SECONDS = 2 * 24 * 60 * 60;
75 constexpr const char* UID = "uid";
76 const std::string LIB_NET_BUNDLE_UTILS_PATH = "libnet_bundle_utils.z.so";
77 constexpr uint64_t DELAY_US = 35 * 1000 * 1000;
78 constexpr const char* COMMON_EVENT_STATUS = "usual.event.RGM_STATUS_CHANGED";
79 constexpr const char* STATUS_FIELD = "rgmStatus";
80 const std::string STATUS_UNLOCKED = "rgm_user_unlocked";
81 } // namespace
82 const bool REGISTER_LOCAL_RESULT =
83 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<NetStatsService>::GetInstance().get());
84
NetStatsService()85 NetStatsService::NetStatsService()
86 : SystemAbility(COMM_NET_STATS_MANAGER_SYS_ABILITY_ID, true), registerToService_(false), state_(STATE_STOPPED)
87 {
88 netStatsCallback_ = std::make_shared<NetStatsCallback>();
89 netStatsCached_ = std::make_unique<NetStatsCached>();
90 #ifdef SUPPORT_TRAFFIC_STATISTIC
91 netconnCallback_ = std::make_unique<NetInfoObserver>().release();
92 trafficObserver_ = std::make_unique<TrafficObserver>().release();
93 #endif // SUPPORT_TRAFFIC_STATISTIC
94 }
95
~NetStatsService()96 NetStatsService::~NetStatsService()
97 {
98 #ifdef SUPPORT_TRAFFIC_STATISTIC
99 StopTrafficOvserver();
100 #endif // SUPPORT_TRAFFIC_STATISTIC
101 }
102
OnStart()103 void NetStatsService::OnStart()
104 {
105 if (state_ == STATE_RUNNING) {
106 NETMGR_LOG_D("the state is already running");
107 return;
108 }
109 if (!Init()) {
110 NETMGR_LOG_E("init failed");
111 return;
112 }
113 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
114 #ifdef SUPPORT_TRAFFIC_STATISTIC
115 AddSystemAbilityListener(COMM_NET_CONN_MANAGER_SYS_ABILITY_ID);
116 AddSystemAbilityListener(COMM_NETSYS_NATIVE_SYS_ABILITY_ID);
117 #endif // SUPPORT_TRAFFIC_STATISTIC
118 state_ = STATE_RUNNING;
119 sptr<NetStatsBaseService> baseService = new (std::nothrow) NetStatsServiceCommon();
120 if (baseService == nullptr) {
121 NETMGR_LOG_E("Net stats base service instance create failed");
122 return;
123 }
124 NetManagerCenter::GetInstance().RegisterStatsService(baseService);
125 }
126
OnStop()127 void NetStatsService::OnStop()
128 {
129 state_ = STATE_STOPPED;
130 registerToService_ = true;
131 }
132
Dump(int32_t fd,const std::vector<std::u16string> & args)133 int32_t NetStatsService::Dump(int32_t fd, const std::vector<std::u16string> &args)
134 {
135 NETMGR_LOG_D("Start Dump, fd: %{public}d", fd);
136 std::string result;
137 GetDumpMessage(result);
138 int32_t ret = dprintf(fd, "%s\n", result.c_str());
139 return ret < 0 ? STATS_DUMP_MESSAGE_FAIL : NETMANAGER_SUCCESS;
140 }
141
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)142 void NetStatsService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
143 {
144 NETMGR_LOG_I("OnAddSystemAbility: systemAbilityId:%{public}d", systemAbilityId);
145 #ifdef SUPPORT_TRAFFIC_STATISTIC
146 if (systemAbilityId == COMM_NET_CONN_MANAGER_SYS_ABILITY_ID) {
147 StartNetObserver();
148 return;
149 } else if (systemAbilityId == COMM_NETSYS_NATIVE_SYS_ABILITY_ID) {
150 StartTrafficOvserver();
151 return;
152 }
153 #endif // SUPPORT_TRAFFIC_STATISTIC
154 if (systemAbilityId == BUNDLE_MGR_SERVICE_SYS_ABILITY_ID) {
155 RefreshUidStatsFlag(DELAY_US);
156 return;
157 }
158 RegisterCommonEvent();
159 }
160
RegisterCommonEvent()161 void NetStatsService::RegisterCommonEvent()
162 {
163 EventFwk::MatchingSkills matchingSkills;
164 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
165 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);
166 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN);
167 #ifdef SUPPORT_TRAFFIC_STATISTIC
168 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED); // 监听卡状态
169 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_CELLULAR_DATA_STATE_CHANGED);
170 #endif // SUPPORT_TRAFFIC_STATISTIC
171 matchingSkills.AddEvent(COMMON_EVENT_STATUS);
172 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
173 subscribeInfo.SetPriority(1);
174 subscriber_ = std::make_shared<NetStatsListener>(subscribeInfo);
175 subscriber_->RegisterStatsCallback(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN,
176 [this](const EventFwk::Want &want) { return UpdateStatsData(); });
177 subscriber_->RegisterStatsCallback(
178 EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED, [this](const EventFwk::Want &want) {
179 uint32_t uid = want.GetIntParam(UID, 0);
180 NETMGR_LOG_D("Net Manager delete uid, uid:[%{public}d]", uid);
181 return CommonEventPackageRemoved(uid);
182 });
183 subscriber_->RegisterStatsCallback(
184 EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED, [this](const EventFwk::Want &want) {
185 uint32_t uid = want.GetIntParam(UID, 0);
186 NETMGR_LOG_D("Net Manager add uid, uid:[%{public}d]", uid);
187 return CommonEventPackageAdded(uid);
188 });
189 subscriber_->RegisterStatsCallback(COMMON_EVENT_STATUS, [this](const EventFwk::Want &want) -> bool {
190 std::string status = want.GetStringParam(STATUS_FIELD);
191 NETMGR_LOG_I("Net Manager status changed, status:[%{public}s]", status.c_str());
192 if (status == STATUS_UNLOCKED) {
193 RefreshUidStatsFlag(0);
194 }
195 return true;
196 });
197 #ifdef SUPPORT_TRAFFIC_STATISTIC
198 subscriber_->RegisterStatsCallback(
199 EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED, [this](const EventFwk::Want &want) {
200 int32_t slotId = want.GetIntParam("slotId", -1);
201 int32_t simStatus = want.GetIntParam("state", -1);
202 return CommonEventSimStateChanged(slotId, simStatus);
203 });
204 subscriber_->RegisterStatsCallback(
205 EventFwk::CommonEventSupport::COMMON_EVENT_CELLULAR_DATA_STATE_CHANGED, [this](const EventFwk::Want &want) {
206 int32_t slotId = want.GetIntParam("slotId", -1);
207 int32_t dataState = want.GetIntParam("dataState", -1);
208 return CommonEventCellularDataStateChanged(slotId, dataState);
209 });
210 #endif // SUPPORT_TRAFFIC_STATISTIC
211 EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber_);
212 }
213
GetDumpMessage(std::string & message)214 void NetStatsService::GetDumpMessage(std::string &message)
215 {
216 message.append("Net Stats Info:\n");
217 uint64_t rxBytes = 0;
218 uint64_t txBytes = 0;
219 uint64_t rxPackets = 0;
220 uint64_t txPackets = 0;
221 NetsysController::GetInstance().GetTotalStats(rxBytes, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES));
222 NetsysController::GetInstance().GetTotalStats(txBytes, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES));
223 NetsysController::GetInstance().GetTotalStats(rxPackets, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_PACKETS));
224 NetsysController::GetInstance().GetTotalStats(txPackets, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_PACKETS));
225
226 message.append("\tRxBytes: " + std::to_string(rxBytes) + "\n");
227 message.append("\tTxBytes: " + std::to_string(txBytes) + "\n");
228 message.append("\tRxPackets: " + std::to_string(rxPackets) + "\n");
229 message.append("\tTxPackets: " + std::to_string(txPackets) + "\n");
230 std::for_each(BEAR_TYPE_LIST.begin(), BEAR_TYPE_LIST.end(), [&message, this](const auto &bearType) {
231 std::list<std::string> ifaceNames;
232 if (NetManagerCenter::GetInstance().GetIfaceNames(bearType, ifaceNames)) {
233 return;
234 }
235 uint64_t rx = 0;
236 uint64_t tx = 0;
237 for (const auto &name : ifaceNames) {
238 GetIfaceRxBytes(rx, name);
239 GetIfaceTxBytes(tx, name);
240 message.append("\t" + name + "-TxBytes: " + std::to_string(tx));
241 message.append("\t" + name + "-RxBytes: " + std::to_string(rx));
242 }
243 });
244 }
245
Init()246 bool NetStatsService::Init()
247 {
248 if (!REGISTER_LOCAL_RESULT) {
249 NETMGR_LOG_E("Register to local sa manager failed");
250 registerToService_ = false;
251 return false;
252 }
253 if (!registerToService_) {
254 if (!Publish(DelayedSingleton<NetStatsService>::GetInstance().get())) {
255 NETMGR_LOG_E("Register to sa manager failed");
256 return false;
257 }
258 registerToService_ = true;
259 }
260 if (nullptr == netStatsCached_) {
261 return false;
262 }
263 netStatsCached_->SetCallbackManager(netStatsCallback_);
264 auto ret = netStatsCached_->StartCached();
265 if (ret != NETMANAGER_SUCCESS) {
266 NETMGR_LOG_E("Start cached failed");
267 return false;
268 }
269 AddSystemAbilityListener(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
270 uint64_t delay = DELAY_US / 2;
271 RefreshUidStatsFlag(delay);
272
273 #ifdef SUPPORT_TRAFFIC_STATISTIC
274 #ifndef UNITTEST_FORBID_FFRT
275 trafficTimer_ = std::make_unique<FfrtTimer>();
276 trafficTimer_->Start(DEFAULT_UPDATE_TRAFFIC_INFO_CYCLE_MS, [this]() { UpdateBpfMap(); });
277 #endif
278 NetStatsRDB netStats;
279 netStats.InitRdbStore();
280 #endif // SUPPORT_TRAFFIC_STATISTIC
281 return true;
282 }
283
RegisterNetStatsCallback(const sptr<INetStatsCallback> & callback)284 int32_t NetStatsService::RegisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
285 {
286 NETMGR_LOG_I("Enter RegisterNetStatsCallback");
287 if (callback == nullptr) {
288 NETMGR_LOG_E("RegisterNetStatsCallback parameter callback is null");
289 return NETMANAGER_ERR_PARAMETER_ERROR;
290 }
291 netStatsCallback_->RegisterNetStatsCallback(callback);
292 return NETMANAGER_SUCCESS;
293 }
294
UnregisterNetStatsCallback(const sptr<INetStatsCallback> & callback)295 int32_t NetStatsService::UnregisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
296 {
297 NETMGR_LOG_I("Enter UnregisterNetStatsCallback");
298 if (callback == nullptr) {
299 NETMGR_LOG_E("UnregisterNetStatsCallback parameter callback is null");
300 return NETMANAGER_ERR_PARAMETER_ERROR;
301 }
302 netStatsCallback_->UnregisterNetStatsCallback(callback);
303 return NETMANAGER_SUCCESS;
304 }
305
GetIfaceRxBytes(uint64_t & stats,const std::string & interfaceName)306 int32_t NetStatsService::GetIfaceRxBytes(uint64_t &stats, const std::string &interfaceName)
307 {
308 return NetsysController::GetInstance().GetIfaceStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
309 interfaceName);
310 }
311
GetIfaceTxBytes(uint64_t & stats,const std::string & interfaceName)312 int32_t NetStatsService::GetIfaceTxBytes(uint64_t &stats, const std::string &interfaceName)
313 {
314 return NetsysController::GetInstance().GetIfaceStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
315 interfaceName);
316 }
317
GetCellularRxBytes(uint64_t & stats)318 int32_t NetStatsService::GetCellularRxBytes(uint64_t &stats)
319 {
320 std::list<std::string> ifaceNames;
321 if (!GetIfaceNamesFromManager(ifaceNames)) {
322 return STATS_ERR_GET_IFACE_NAME_FAILED;
323 }
324
325 for (const auto &name : ifaceNames) {
326 uint64_t totalCellular = 0;
327 auto ret = NetsysController::GetInstance().GetIfaceStats(
328 totalCellular, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES), name);
329 if (ret != NETMANAGER_SUCCESS) {
330 NETMGR_LOG_E("Get iface stats failed result: %{public}d", ret);
331 return ret;
332 }
333 stats += totalCellular;
334 }
335 return NETMANAGER_SUCCESS;
336 }
337
GetCellularTxBytes(uint64_t & stats)338 int32_t NetStatsService::GetCellularTxBytes(uint64_t &stats)
339 {
340 std::list<std::string> ifaceNames;
341 if (!GetIfaceNamesFromManager(ifaceNames)) {
342 return STATS_ERR_GET_IFACE_NAME_FAILED;
343 }
344
345 uint64_t totalCellular = 0;
346 for (const auto &name : ifaceNames) {
347 auto ret = NetsysController::GetInstance().GetIfaceStats(
348 totalCellular, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES), name);
349 if (ret != NETMANAGER_SUCCESS) {
350 NETMGR_LOG_E("Get iface stats failed result: %{public}d", ret);
351 return ret;
352 }
353 stats += totalCellular;
354 }
355 return NETMANAGER_SUCCESS;
356 }
357
GetAllRxBytes(uint64_t & stats)358 int32_t NetStatsService::GetAllRxBytes(uint64_t &stats)
359 {
360 NETMGR_LOG_D("Enter GetAllRxBytes");
361 return NetsysController::GetInstance().GetTotalStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES));
362 }
363
GetAllTxBytes(uint64_t & stats)364 int32_t NetStatsService::GetAllTxBytes(uint64_t &stats)
365 {
366 NETMGR_LOG_D("Enter GetAllTxBytes");
367 return NetsysController::GetInstance().GetTotalStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES));
368 }
369
GetUidRxBytes(uint64_t & stats,uint32_t uid)370 int32_t NetStatsService::GetUidRxBytes(uint64_t &stats, uint32_t uid)
371 {
372 NETMGR_LOG_D("Enter GetUidRxBytes, uid is %{public}d", uid);
373 return NetsysController::GetInstance().GetUidStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
374 uid);
375 }
376
GetUidTxBytes(uint64_t & stats,uint32_t uid)377 int32_t NetStatsService::GetUidTxBytes(uint64_t &stats, uint32_t uid)
378 {
379 NETMGR_LOG_D("Enter GetUidTxBytes,uid is %{public}d", uid);
380 return NetsysController::GetInstance().GetUidStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
381 uid);
382 }
383
GetIfaceStatsDetail(const std::string & iface,uint64_t start,uint64_t end,NetStatsInfo & statsInfo)384 int32_t NetStatsService::GetIfaceStatsDetail(const std::string &iface, uint64_t start, uint64_t end,
385 NetStatsInfo &statsInfo)
386 {
387 // Start of get traffic data by interface name.
388 NETMGR_LOG_D("Enter GetIfaceStatsDetail, iface= %{public}s", iface.c_str());
389 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetIfaceStatsDetail start");
390 if (start > end) {
391 NETMGR_LOG_E("start is after end.");
392 return NETMANAGER_ERR_INVALID_PARAMETER;
393 }
394 std::vector<NetStatsInfo> allInfo;
395 auto history = std::make_unique<NetStatsHistory>();
396 int32_t ret = history->GetHistory(allInfo, iface, start, end);
397
398 if (netStatsCached_ == nullptr) {
399 NETMGR_LOG_E("netStatsCached_ is fail");
400 return NETMANAGER_ERR_LOCAL_PTR_NULL;
401 }
402 netStatsCached_->GetIfaceStatsCached(allInfo);
403 if (ret != NETMANAGER_SUCCESS) {
404 NETMGR_LOG_E("Get traffic stats data failed");
405 return ret;
406 }
407 std::for_each(allInfo.begin(), allInfo.end(), [&statsInfo, &iface, &start, &end](const auto &info) {
408 if (info.iface_ == iface && info.date_ >= start && info.date_ <= end) {
409 statsInfo += info;
410 }
411 });
412 statsInfo.iface_ = iface;
413 statsInfo.date_ = end;
414 // End of get traffic data by interface name.
415 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetIfaceStatsDetail end");
416 return NETMANAGER_SUCCESS;
417 }
418
GetUidStatsDetail(const std::string & iface,uint32_t uid,uint64_t start,uint64_t end,NetStatsInfo & statsInfo)419 int32_t NetStatsService::GetUidStatsDetail(const std::string &iface, uint32_t uid, uint64_t start, uint64_t end,
420 NetStatsInfo &statsInfo)
421 {
422 // Start of get traffic data by usr id.
423 NETMGR_LOG_D("Enter GetIfaceStatsDetail, iface= %{public}s uid= %{public}d", iface.c_str(), uid);
424 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetUidStatsDetail start");
425 if (start > end) {
426 NETMGR_LOG_E("start is after end.");
427 return NETMANAGER_ERR_INVALID_PARAMETER;
428 }
429 std::vector<NetStatsInfo> allInfo;
430 auto history = std::make_unique<NetStatsHistory>();
431 int32_t ret = history->GetHistory(allInfo, iface, uid, start, end);
432 if (netStatsCached_ == nullptr) {
433 NETMGR_LOG_E("netStatsCached_ is fail");
434 return NETMANAGER_ERR_LOCAL_PTR_NULL;
435 }
436 netStatsCached_->GetUidStatsCached(allInfo);
437 if (ret != NETMANAGER_SUCCESS) {
438 NETMGR_LOG_E("Get traffic stats data failed");
439 return ret;
440 }
441 std::for_each(allInfo.begin(), allInfo.end(), [&statsInfo, &iface, &uid, &start, &end](const auto &info) {
442 if (info.iface_ == iface && info.uid_ == uid && info.date_ >= start && info.date_ <= end) {
443 statsInfo += info;
444 }
445 });
446 statsInfo.uid_ = uid;
447 statsInfo.iface_ = iface;
448 statsInfo.date_ = end;
449 // End of get traffic data by usr id.
450 NetmanagerHiTrace::NetmanagerFinishSyncTrace("NetStatsService GetUidStatsDetail end");
451 return NETMANAGER_SUCCESS;
452 }
453
UpdateIfacesStats(const std::string & iface,uint64_t start,uint64_t end,const NetStatsInfo & stats)454 int32_t NetStatsService::UpdateIfacesStats(const std::string &iface, uint64_t start, uint64_t end,
455 const NetStatsInfo &stats)
456 {
457 // Start of update traffic data by date.
458 NETMGR_LOG_I("UpdateIfacesStats ifaces is %{public}s", iface.c_str());
459 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService UpdateIfacesStats start");
460 if (start > end) {
461 NETMGR_LOG_E("start is after end.");
462 return NETMANAGER_ERR_INVALID_PARAMETER;
463 }
464 std::vector<NetStatsInfo> infos;
465 infos.push_back(stats);
466 auto handler = std::make_unique<NetStatsDataHandler>();
467 auto ret = handler->DeleteByDate(IFACE_TABLE, start, end);
468 if (ret != NETMANAGER_SUCCESS) {
469 NETMGR_LOG_E("Update ifaces stats failed");
470 }
471 ret = handler->WriteStatsData(infos, IFACE_TABLE);
472 if (ret != NETMANAGER_SUCCESS) {
473 NETMGR_LOG_E("Update ifaces stats failed");
474 return STATS_ERR_WRITE_DATA_FAIL;
475 }
476 // End of update traffic data by date.
477 NetmanagerHiTrace::NetmanagerFinishSyncTrace("NetStatsService UpdateIfacesStats end");
478 return ret;
479 }
480
UpdateStatsData()481 int32_t NetStatsService::UpdateStatsData()
482 {
483 NETMGR_LOG_I("Enter UpdateStatsData.");
484 if (netStatsCached_ == nullptr) {
485 NETMGR_LOG_E("Cached is nullptr");
486 return NETMANAGER_ERR_LOCAL_PTR_NULL;
487 }
488 netStatsCached_->ForceUpdateStats();
489 NETMGR_LOG_D("End UpdateStatsData.");
490 return NETMANAGER_SUCCESS;
491 }
492
ResetFactory()493 int32_t NetStatsService::ResetFactory()
494 {
495 auto handler = std::make_unique<NetStatsDataHandler>();
496 return handler->ClearData();
497 }
498
GetAllStatsInfo(std::vector<NetStatsInfo> & infos)499 int32_t NetStatsService::GetAllStatsInfo(std::vector<NetStatsInfo> &infos)
500 {
501 NETMGR_LOG_D("Enter GetAllStatsInfo.");
502 if (netStatsCached_ != nullptr) {
503 netStatsCached_->GetUidPushStatsCached(infos);
504 netStatsCached_->GetAllPushStatsCached(infos);
505 } else {
506 NETMGR_LOG_E("Cached is nullptr");
507 }
508 return NetsysController::GetInstance().GetAllStatsInfo(infos);
509 }
510
GetAllSimStatsInfo(std::vector<NetStatsInfo> & infos)511 int32_t NetStatsService::GetAllSimStatsInfo(std::vector<NetStatsInfo> &infos)
512 {
513 NETMGR_LOG_D("Enter GetAllSimStatsInfo.");
514 return NetsysController::GetInstance().GetAllSimStatsInfo(infos);
515 }
516
517 #ifdef SUPPORT_NETWORK_SHARE
IsSharingOn()518 bool NetStatsService::IsSharingOn()
519 {
520 int32_t share = 0;
521 int ret = DelayedSingleton<NetManagerStandard::NetworkShareClient>::GetInstance()->IsSharing(share);
522 if (ret != NETMANAGER_EXT_SUCCESS) {
523 NETMGR_LOG_E("get sharing state res: %{public}d, isSharing: %{public}d", ret, share);
524 return false;
525 }
526 return share == NetManagerStandard::NETWORKSHARE_IS_SHARING;
527 }
528
GetSharingStats(std::vector<NetStatsInfo> & sharingStats,uint32_t endtime)529 void NetStatsService::GetSharingStats(std::vector<NetStatsInfo> &sharingStats, uint32_t endtime)
530 {
531 if (endtime > netStatsCached_->GetWriteDateTime()) {
532 // 跑在非ipc线程防止鉴权失败
533 bool isSharingOn = false;
534 auto task = ffrt::submit_h([&isSharingOn, this]() { isSharingOn = NetStatsService::IsSharingOn(); }, {}, {},
535 ffrt::task_attr().name("isSharingOn"));
536 ffrt::wait({task});
537 if (isSharingOn) {
538 NETMGR_LOG_D("GetSharingStats enter");
539 netStatsCached_->GetIptablesStatsCached(sharingStats);
540 }
541 }
542 }
543 #endif
544
GetTrafficStatsByNetwork(std::unordered_map<uint32_t,NetStatsInfo> & infos,const sptr<NetStatsNetwork> & network)545 int32_t NetStatsService::GetTrafficStatsByNetwork(std::unordered_map<uint32_t, NetStatsInfo> &infos,
546 const sptr<NetStatsNetwork> &network)
547 {
548 NETMGR_LOG_D("Enter GetTrafficStatsByNetwork.");
549 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetTrafficStatsByNetwork start");
550 if (netStatsCached_ == nullptr) {
551 return NETMANAGER_ERR_LOCAL_PTR_NULL;
552 }
553 if (network == nullptr || network->startTime_ > network->endTime_) {
554 NETMGR_LOG_E("param network is invalid");
555 return NETMANAGER_ERR_INVALID_PARAMETER;
556 }
557 std::string ident;
558 if (network->type_ == 0) {
559 ident = std::to_string(network->simId_);
560 }
561 uint32_t start = network->startTime_;
562 uint32_t end = network->endTime_;
563 NETMGR_LOG_D("param: ident=%{public}s, start=%{public}u, end=%{public}u", ident.c_str(), start, end);
564 auto history = std::make_unique<NetStatsHistory>();
565 if (history == nullptr) {
566 NETMGR_LOG_E("history is null");
567 return NETMANAGER_ERR_INTERNAL;
568 }
569 std::vector<NetStatsInfo> allInfo;
570 int32_t ret = history->GetHistoryByIdent(allInfo, ident, start, end);
571 if (ret != NETMANAGER_SUCCESS) {
572 NETMGR_LOG_E("get history by ident failed, err code=%{public}d", ret);
573 return ret;
574 }
575 netStatsCached_->GetKernelStats(allInfo);
576 netStatsCached_->GetUidPushStatsCached(allInfo);
577 netStatsCached_->GetUidStatsCached(allInfo);
578 netStatsCached_->GetUidSimStatsCached(allInfo);
579 #ifdef SUPPORT_NETWORK_SHARE
580 GetSharingStats(allInfo, end);
581 #endif
582 FilterTrafficStatsByNetwork(allInfo, infos, ident, start, end);
583 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetTrafficStatsByNetwork end");
584 return NETMANAGER_SUCCESS;
585 }
586
FilterTrafficStatsByNetwork(std::vector<NetStatsInfo> & allInfo,std::unordered_map<uint32_t,NetStatsInfo> & infos,const std::string ident,uint32_t startTime,uint32_t endTime)587 void NetStatsService::FilterTrafficStatsByNetwork(std::vector<NetStatsInfo> &allInfo,
588 std::unordered_map<uint32_t, NetStatsInfo> &infos,
589 const std::string ident, uint32_t startTime, uint32_t endTime)
590 {
591 std::for_each(allInfo.begin(), allInfo.end(), [&infos, &ident, &startTime, &endTime](NetStatsInfo &info) {
592 if (ident != info.ident_ || startTime > info.date_ || endTime < info.date_) {
593 return;
594 }
595 if (info.flag_ == STATS_DATA_FLAG_UNINSTALLED) {
596 info.uid_ = UNINSTALLED_UID;
597 }
598 auto item = infos.find(info.uid_);
599 if (item == infos.end()) {
600 infos.emplace(info.uid_, info);
601 } else {
602 item->second += info;
603 }
604 });
605 }
606
GetTrafficStatsByUidNetwork(std::vector<NetStatsInfoSequence> & infos,uint32_t uid,const sptr<NetStatsNetwork> & network)607 int32_t NetStatsService::GetTrafficStatsByUidNetwork(std::vector<NetStatsInfoSequence> &infos, uint32_t uid,
608 const sptr<NetStatsNetwork> &network)
609 {
610 NETMGR_LOG_D("Enter GetTrafficStatsByUidNetwork.");
611 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetTrafficStatsByUidNetwork start");
612 if (netStatsCached_ == nullptr) {
613 NETMGR_LOG_E("Cached is nullptr");
614 return NETMANAGER_ERR_LOCAL_PTR_NULL;
615 }
616 if (network == nullptr || network->startTime_ > network->endTime_) {
617 NETMGR_LOG_E("param network is invalid");
618 return NETMANAGER_ERR_INVALID_PARAMETER;
619 }
620 std::string ident;
621 if (network->type_ == 0) {
622 ident = std::to_string(network->simId_);
623 }
624 uint32_t start = network->startTime_;
625 uint32_t end = network->endTime_;
626 NETMGR_LOG_D("GetTrafficStatsByUidNetwork param: "
627 "uid=%{public}u, ident=%{public}s, start=%{public}u, end=%{public}u", uid, ident.c_str(), start, end);
628 auto history = std::make_unique<NetStatsHistory>();
629 if (history == nullptr) {
630 NETMGR_LOG_E("history is null");
631 return NETMANAGER_ERR_INTERNAL;
632 }
633 std::vector<NetStatsInfo> allInfo;
634 int32_t ret = history->GetHistory(allInfo, uid, ident, start, end);
635 if (ret != NETMANAGER_SUCCESS) {
636 NETMGR_LOG_E("get history by uid and ident failed, err code=%{public}d", ret);
637 return ret;
638 }
639 netStatsCached_->GetKernelStats(allInfo);
640 netStatsCached_->GetUidPushStatsCached(allInfo);
641 netStatsCached_->GetUidStatsCached(allInfo);
642 netStatsCached_->GetUidSimStatsCached(allInfo);
643 #ifdef SUPPORT_NETWORK_SHARE
644 if (uid == IPTABLES_UID) {
645 GetSharingStats(allInfo, end);
646 }
647 #endif
648 FilterTrafficStatsByUidNetwork(allInfo, infos, uid, ident, start, end);
649 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetTrafficStatsByUidNetwork end");
650 return NETMANAGER_SUCCESS;
651 }
652
FilterTrafficStatsByUidNetwork(std::vector<NetStatsInfo> & allInfo,std::vector<NetStatsInfoSequence> & infos,const uint32_t uid,const std::string ident,uint32_t startTime,uint32_t endTime)653 void NetStatsService::FilterTrafficStatsByUidNetwork(std::vector<NetStatsInfo> &allInfo,
654 std::vector<NetStatsInfoSequence> &infos, const uint32_t uid,
655 const std::string ident, uint32_t startTime, uint32_t endTime)
656 {
657 std::for_each(allInfo.begin(), allInfo.end(),
658 [this, &infos, &uid, &ident, &startTime, &endTime](const NetStatsInfo &info) {
659 if (uid != info.uid_ || ident != info.ident_ || startTime > info.date_ || endTime < info.date_) {
660 return;
661 }
662 if (info.flag_ == STATS_DATA_FLAG_UNINSTALLED) {
663 return;
664 }
665 MergeTrafficStats(infos, info, endTime);
666 });
667 }
668
SetAppStats(const PushStatsInfo & info)669 int32_t NetStatsService::SetAppStats(const PushStatsInfo &info)
670 {
671 NETMGR_LOG_D("Enter GetTrafficStatsByUidNetwork.");
672 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService SetAppStats start");
673 if (netStatsCached_ == nullptr) {
674 NETMGR_LOG_E("Cached is nullptr");
675 return NETMANAGER_ERR_LOCAL_PTR_NULL;
676 }
677 netStatsCached_->SetAppStats(info);
678 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService SetAppStats end");
679 return NETMANAGER_SUCCESS;
680 }
681
SaveSharingTraffic(const NetStatsInfo & infos)682 int32_t NetStatsService::SaveSharingTraffic(const NetStatsInfo &infos)
683 {
684 NETMGR_LOG_D("Enter SaveSharingTraffic");
685 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService SaveSharingTraffic start");
686 if (netStatsCached_ == nullptr) {
687 NETMGR_LOG_E("Cached is nullptr");
688 return NETMANAGER_ERR_LOCAL_PTR_NULL;
689 }
690 netStatsCached_->SaveSharingTraffic(infos);
691 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService SaveSharingTraffic end");
692 return NETMANAGER_SUCCESS;
693 }
694
GetCookieRxBytes(uint64_t & stats,uint64_t cookie)695 int32_t NetStatsService::GetCookieRxBytes(uint64_t &stats, uint64_t cookie)
696 {
697 return NetsysController::GetInstance().GetCookieStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
698 cookie);
699 }
700
GetCookieTxBytes(uint64_t & stats,uint64_t cookie)701 int32_t NetStatsService::GetCookieTxBytes(uint64_t &stats, uint64_t cookie)
702 {
703 return NetsysController::GetInstance().GetCookieStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
704 cookie);
705 }
706
MergeTrafficStats(std::vector<NetStatsInfoSequence> & statsInfoSequences,const NetStatsInfo & info,uint32_t currentTimestamp)707 void NetStatsService::MergeTrafficStats(std::vector<NetStatsInfoSequence> &statsInfoSequences, const NetStatsInfo &info,
708 uint32_t currentTimestamp)
709 {
710 NetStatsInfoSequence tmp;
711 tmp.startTime_ = info.date_;
712 tmp.endTime_ = info.date_;
713 tmp.info_ = info;
714 uint32_t previousTimestamp = currentTimestamp > DAY_SECONDS ? currentTimestamp - DAY_SECONDS : 0;
715 if (info.date_ > previousTimestamp) {
716 statsInfoSequences.push_back(std::move(tmp));
717 return;
718 }
719 auto findRet = std::find_if(
720 statsInfoSequences.begin(), statsInfoSequences.end(), [&info, previousTimestamp](const auto &item) {
721 return item.endTime_ < previousTimestamp && CommonUtils::IsSameNaturalDay(info.date_, item.endTime_);
722 });
723 if (findRet == statsInfoSequences.end()) {
724 statsInfoSequences.push_back(std::move(tmp));
725 return;
726 }
727 (*findRet).info_ += info;
728 }
729
GetIfaceNamesFromManager(std::list<std::string> & ifaceNames)730 bool NetStatsService::GetIfaceNamesFromManager(std::list<std::string> &ifaceNames)
731 {
732 int32_t ret = NetManagerCenter::GetInstance().GetIfaceNames(BEARER_CELLULAR, ifaceNames);
733 if (ret != NETMANAGER_SUCCESS || ifaceNames.empty()) {
734 NETMGR_LOG_D("Iface list is empty, ret = %{public}d", ret);
735 return false;
736 }
737 ifaceNames.sort();
738 ifaceNames.erase(std::unique(ifaceNames.begin(), ifaceNames.end()), ifaceNames.end());
739 return true;
740 }
741
GetSampleBundleInfosForActiveUser()742 std::unordered_map<uint32_t, SampleBundleInfo> NetStatsService::GetSampleBundleInfosForActiveUser()
743 {
744 void *handler = dlopen(LIB_NET_BUNDLE_UTILS_PATH.c_str(), RTLD_LAZY | RTLD_NODELETE);
745 if (handler == nullptr) {
746 NETMGR_LOG_E("load lib failed, reason : %{public}s", dlerror());
747 return std::unordered_map<uint32_t, SampleBundleInfo>{};
748 }
749 using GetNetBundleClass = INetBundle *(*)();
750 auto getNetBundle = (GetNetBundleClass)dlsym(handler, "GetNetBundle");
751 if (getNetBundle == nullptr) {
752 NETMGR_LOG_E("GetNetBundle failed, reason : %{public}s", dlerror());
753 dlclose(handler);
754 return std::unordered_map<uint32_t, SampleBundleInfo>{};
755 }
756 auto netBundle = getNetBundle();
757 if (netBundle == nullptr) {
758 NETMGR_LOG_E("netBundle is nullptr");
759 dlclose(handler);
760 return std::unordered_map<uint32_t, SampleBundleInfo>{};
761 }
762 std::optional<std::unordered_map<uint32_t, SampleBundleInfo>> result = netBundle->ObtainBundleInfoForActive();
763 dlclose(handler);
764 if (!result.has_value()) {
765 NETMGR_LOG_W("ObtainBundleInfoForActive is nullopt");
766 return std::unordered_map<uint32_t, SampleBundleInfo>{};
767 }
768 return result.value();
769 }
770
GetSampleBundleInfoForUid(uint32_t uid)771 SampleBundleInfo NetStatsService::GetSampleBundleInfoForUid(uint32_t uid)
772 {
773 void *handler = dlopen(LIB_NET_BUNDLE_UTILS_PATH.c_str(), RTLD_LAZY | RTLD_NODELETE);
774 if (handler == nullptr) {
775 NETMGR_LOG_E("load lib failed, reason : %{public}s", dlerror());
776 return SampleBundleInfo{};
777 }
778 using GetNetBundleClass = INetBundle *(*)();
779 auto getNetBundle = (GetNetBundleClass)dlsym(handler, "GetNetBundle");
780 if (getNetBundle == nullptr) {
781 NETMGR_LOG_E("GetNetBundle failed, reason : %{public}s", dlerror());
782 dlclose(handler);
783 return SampleBundleInfo{};
784 }
785 auto netBundle = getNetBundle();
786 if (netBundle == nullptr) {
787 NETMGR_LOG_E("netBundle is nullptr");
788 dlclose(handler);
789 return SampleBundleInfo{};
790 }
791 std::optional<SampleBundleInfo> result = netBundle->ObtainBundleInfoForUid(uid);
792 dlclose(handler);
793 if (!result.has_value()) {
794 NETMGR_LOG_W("ObtainBundleInfoForUid is nullopt");
795 return SampleBundleInfo{};
796 }
797 return result.value();
798 }
799
RefreshUidStatsFlag(uint64_t delay)800 void NetStatsService::RefreshUidStatsFlag(uint64_t delay)
801 {
802 std::function<void()> uidInstallSourceFunc = [this]() {
803 auto tmp = GetSampleBundleInfosForActiveUser();
804 for (auto iter = tmp.begin(); iter != tmp.end(); ++iter) {
805 if (CommonUtils::IsSim(iter->second.bundleName_) ||
806 CommonUtils::IsSim2(iter->second.bundleName_)) {
807 netStatsCached_->SetUidSimSampleBundle(iter->first, iter->second);
808 }
809 }
810 netStatsCached_->ClearUidStatsFlag();
811 netStatsCached_->SetUidStatsFlag(tmp);
812 };
813 ffrt::submit(std::move(uidInstallSourceFunc), {}, {}, ffrt::task_attr().name("RefreshUidStatsFlag").delay(delay));
814 }
815
CommonEventPackageAdded(uint32_t uid)816 bool NetStatsService::CommonEventPackageAdded(uint32_t uid)
817 {
818 SampleBundleInfo sampleBundleInfo = GetSampleBundleInfoForUid(uid);
819 if (CommonUtils::IsSim(sampleBundleInfo.bundleName_) ||
820 CommonUtils::IsSim2(sampleBundleInfo.bundleName_)) {
821 uint64_t delay = 0;
822 if (netStatsCached_->GetUidSimSampleBundlesSize() == 0) {
823 delay = DELAY_US;
824 netStatsCached_->ForceCachedStats();
825 }
826 RefreshUidStatsFlag(delay);
827 } else {
828 std::unordered_map<uint32_t, SampleBundleInfo> tmp{{uid, sampleBundleInfo}};
829 netStatsCached_->SetUidStatsFlag(tmp);
830 }
831 return true;
832 }
833
CommonEventPackageRemoved(uint32_t uid)834 bool NetStatsService::CommonEventPackageRemoved(uint32_t uid)
835 {
836 auto handler = std::make_unique<NetStatsDataHandler>();
837 if (handler == nullptr) {
838 NETMGR_LOG_E("Net Manager package removed, get db handler failed. uid:[%{public}d]", uid);
839 return static_cast<int32_t>(NETMANAGER_ERR_INTERNAL);
840 }
841 auto ret1 = handler->UpdateStatsFlag(uid, STATS_DATA_FLAG_UNINSTALLED);
842 if (ret1 != NETMANAGER_SUCCESS) {
843 NETMGR_LOG_E("Net Manager update stats flag failed, uid:[%{public}d]", uid);
844 }
845 auto ret2 = handler->UpdateSimStatsFlag(uid, STATS_DATA_FLAG_UNINSTALLED);
846 if (ret2 != NETMANAGER_SUCCESS) {
847 NETMGR_LOG_E("Net Manager update sim stats flag failed, uid:[%{public}d]", uid);
848 }
849 auto ffrtHandle = netStatsCached_->ForceArchiveStats(uid);
850 if (netStatsCached_->GetUidSimSampleBundle(uid).has_value()) {
851 ffrt::wait({ffrtHandle});
852 RefreshUidStatsFlag(0);
853 }
854 return ret1 != NETMANAGER_SUCCESS ? ret1 : ret2;
855 }
856
857 #ifdef SUPPORT_TRAFFIC_STATISTIC
CommonEventSimStateChanged(int32_t slotId,int32_t simState)858 bool NetStatsService::CommonEventSimStateChanged(int32_t slotId, int32_t simState)
859 {
860 int32_t simId = Telephony::CoreServiceClient::GetInstance().GetSimId(slotId);
861 NETMGR_LOG_I("CommonEventSimStateChanged simId: %{public}d, slotId:%{public}d, simState:%{public}d",
862 simId, slotId, simState);
863 if (simId < 0) {
864 NETMGR_LOG_E("get simId error");
865 return false;
866 }
867
868 if (simState == static_cast<int32_t>(Telephony::SimState::SIM_STATE_LOADED)) {
869 if (settingsTrafficMap_.find(simId) == settingsTrafficMap_.end()) {
870 ObserverPtr trafficDataObserver = std::make_shared<TrafficDataObserver>(simId);
871 SettingsInfoPtr trafficSettingsInfo = std::make_shared<TrafficSettingsInfo>();
872 trafficDataObserver->ReadTrafficDataSettings(trafficSettingsInfo);
873 settingsTrafficMap_.insert(
874 std::make_pair(simId, std::make_pair(trafficDataObserver, trafficSettingsInfo)));
875 UpdateNetStatsToMapFromDB(simId);
876 NETMGR_LOG_I("settingsTrafficMap_.insert(simId). simId:%{public}d", simId);
877 trafficDataObserver->RegisterTrafficDataSettingObserver();
878 }
879 } else if (simState != static_cast<int32_t>(Telephony::SimState::SIM_STATE_READY)) {
880 // 卡异常,取消监听
881 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
882 // 去注册
883 settingsTrafficMap_[simId].first->UnRegisterTrafficDataSettingObserver();
884 NETMGR_LOG_I("settingsTrafficMap_.erase(simId). simId:%{public}d", simId);
885 settingsTrafficMap_.erase(simId);
886 }
887 }
888 return true;
889 }
890
CommonEventCellularDataStateChanged(int32_t slotId,int32_t dataState)891 bool NetStatsService::CommonEventCellularDataStateChanged(int32_t slotId, int32_t dataState)
892 {
893 NETMGR_LOG_I("CommonEventCellularDataStateChanged slotId:%{public}d, dateState:%{public}d", slotId, dataState);
894 if (!isWifiConnected_) {
895 NETMGR_LOG_I("CommonEventCellularDataStateChanged. but wifi is not connected");
896 return false;
897 }
898 int32_t defaultSlotId = Telephony::CellularDataClient::GetInstance().GetDefaultCellularDataSlotId();
899 if (defaultSlotId < 0 || (defaultSlotId >= 0 && defaultSlotId != slotId)) { // 后续支持拉副卡的话,这里需要修改
900 NETMGR_LOG_E(" defaultSlotId err or not default");
901 return false;
902 }
903
904 int32_t simId = Telephony::CoreServiceClient::GetInstance().GetSimId(slotId);
905 NETMGR_LOG_I("CommonEventCellularDataStateChanged simId: %{public}d, curActiviteSimId_: %{public}d",
906 simId, curActiviteSimId_);
907 if (simId < 0 || simId == curActiviteSimId_ ||
908 dataState != static_cast<int32_t>(Telephony::DataConnectState::DATA_STATE_CONNECTED)) {
909 return false;
910 }
911
912 curActiviteSimId_ = simId;
913 int32_t ret = NetConnClient::GetInstance().GetIfaceNameIdentMaps(NetBearType::BEARER_CELLULAR, ifaceNameIdentMap_);
914 if (ret != NETMANAGER_SUCCESS) {
915 NETMGR_LOG_E("CommonEventCellularDataStateChanged error. ret=%{public}d", ret);
916 }
917 NETMGR_LOG_I("CommonEventCellularDataStateChanged ifaceNameIdentMap size: %{public}d", ifaceNameIdentMap_.Size());
918 ifaceNameIdentMap_.Iterate([this](const std::string &k, const std::string &v) {
919 NETMGR_LOG_E("CommonEventCellularDataStateChanged K:%{public}s, V:%{public}s", k.c_str(), v.c_str());
920 if (v == std::to_string(curActiviteSimId_)) {
921 curIfIndex_ = if_nametoindex(k.c_str());
922 NETMGR_LOG_E("CommonEventCellularDataStateChanged curIfIndex_:%{public}" PRIu64, curIfIndex_);
923 }
924 });
925
926 UpdateCurActiviteSimChanged();
927 return true;
928 }
929
StartNetObserver()930 void NetStatsService::StartNetObserver()
931 {
932 NETMGR_LOG_I("StartNetObserver start");
933 if (netconnCallback_ == nullptr) {
934 netconnCallback_ = std::make_unique<NetInfoObserver>().release();
935 }
936 if (netconnCallback_ == nullptr) {
937 return;
938 }
939 NetManagerStandard::NetSpecifier netSpecifier;
940 NetManagerStandard::NetAllCapabilities netAllCapabilities;
941 netAllCapabilities.netCaps_.insert(NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET);
942 netSpecifier.ident_ = "";
943 netSpecifier.netCapabilities_ = netAllCapabilities;
944 sptr<NetManagerStandard::NetSpecifier> specifier =
945 new (std::nothrow) NetManagerStandard::NetSpecifier(netSpecifier);
946 int32_t ret = NetConnClient::GetInstance().RegisterNetConnCallback(specifier, netconnCallback_, 0);
947 if (ret != 0) {
948 NETMGR_LOG_E("StartNetObserver fail, ret = %{public}d", ret);
949 return;
950 }
951 NETMGR_LOG_I("StartNetObserver end");
952 }
953
StartTrafficOvserver()954 void NetStatsService::StartTrafficOvserver()
955 {
956 NETMGR_LOG_I("StartTrafficOvserver start");
957 if (trafficObserver_ == nullptr) {
958 trafficObserver_ = std::make_unique<TrafficObserver>().release();
959 }
960 if (trafficObserver_ == nullptr) {
961 return;
962 }
963 int32_t ret = NetsysController::GetInstance().RegisterNetsysTrafficCallback(trafficObserver_);
964 if (ret != 0) {
965 NETMGR_LOG_E("StartTrafficOvserver fail, ret = %{public}d", ret);
966 return;
967 }
968 NETMGR_LOG_I("StartTrafficOvserver end");
969 }
970
StopTrafficOvserver()971 void NetStatsService::StopTrafficOvserver()
972 {
973 NETMGR_LOG_I("StopTrafficOvserver start");
974 if (trafficObserver_ == nullptr) {
975 trafficObserver_ = std::make_unique<TrafficObserver>().release();
976 }
977 if (trafficObserver_ == nullptr) {
978 return;
979 }
980 int32_t ret = NetsysController::GetInstance().UnRegisterNetsysTrafficCallback(trafficObserver_);
981 if (ret != 0) {
982 NETMGR_LOG_E("StopTrafficOvserver fail, ret = %{public}d", ret);
983 return;
984 }
985 NETMGR_LOG_I("StopTrafficOvserver end");
986 }
987
988 // 网络信息变化
ProcessNetConnectionPropertiesChange(int32_t simId,uint64_t ifIndex)989 bool NetStatsService::ProcessNetConnectionPropertiesChange(int32_t simId, uint64_t ifIndex)
990 {
991 if (simId == INT32_MAX) {
992 NETMGR_LOG_I("ProcessNetConnectionPropertiesChange. current default net is wifi");
993 isWifiConnected_ = true;
994 return true;
995 }
996
997 isWifiConnected_ = false;
998 if (simId < 0 || simId == curActiviteSimId_) {
999 NETMGR_LOG_I("ProcessNetConnectionPropertiesChange. simId == curActiviteSimId_, no process");
1000 return false;
1001 }
1002
1003 NETMGR_LOG_I("ProcessNetConnectionPropertiesChange. update curActiviteSimId_:%{public}d, curIfIndex_:%{public}lu",
1004 simId, ifIndex);
1005 curActiviteSimId_ = simId;
1006 curIfIndex_ = ifIndex;
1007
1008 UpdateCurActiviteSimChanged();
1009 return true;
1010 }
1011
UpdateCurActiviteSimChanged()1012 void NetStatsService::UpdateCurActiviteSimChanged()
1013 {
1014 if (settingsTrafficMap_.find(curActiviteSimId_) == settingsTrafficMap_.end()) {
1015 NETMGR_LOG_E("UpdateCurActiviteSimChanged settingsTrafficMap_ not find simId: %{public}d", curActiviteSimId_);
1016 std::shared_ptr<TrafficDataObserver> observer = std::make_shared<TrafficDataObserver>(curActiviteSimId_);
1017 // 1. 读simId_数据库
1018 std::shared_ptr<TrafficSettingsInfo> settingsInfo = std::make_shared<TrafficSettingsInfo>();
1019 observer->ReadTrafficDataSettings(settingsInfo);
1020 // 2. 注册监听
1021 observer->RegisterTrafficDataSettingObserver();
1022 settingsTrafficMap_.insert(std::make_pair(curActiviteSimId_, std::make_pair(observer, settingsInfo)));
1023 UpdateNetStatsToMapFromDB(curActiviteSimId_);
1024 NETMGR_LOG_I("ProcessNetConnectionPropertiesChange insert settingsInfo beginDate:%{public}d,\
1025 unLimitedDataEnable:%{public}d, monthlyLimitdNotifyType:%{public}d,\
1026 monthlyLimit:%{public}" PRIu64 ", monthlyMark:%{public}u, dailyMark:%{public}u",
1027 settingsInfo->beginDate, settingsInfo->unLimitedDataEnable, settingsInfo->monthlyLimitdNotifyType,
1028 settingsInfo->monthlyLimit, settingsInfo->monthlyMark, settingsInfo->dailyMark);
1029 }
1030 // 3. 判断是否设置余额,如果设置了 就计算已用流量,更新bpfMap
1031 // (1)表示没有设置余额或打开了无限流量开关,这种情况将余额map都改为最大值,因为不需要弹窗
1032 if (settingsTrafficMap_[curActiviteSimId_].second->monthlyLimit == UINT64_MAX ||
1033 settingsTrafficMap_[curActiviteSimId_].second->unLimitedDataEnable == 1) {
1034 SetTrafficMapMaxValue();
1035 } else { // (2)有设置余额,这种情况需要计算可用余额map、增量map
1036 UpdateBpfMap();
1037 }
1038 }
1039
1040 // 查询某段时间用到的总流量
GetAllUsedTrafficStatsByNetwork(const sptr<NetStatsNetwork> & network,uint64_t & allUsedTraffic)1041 int32_t NetStatsService::GetAllUsedTrafficStatsByNetwork(const sptr<NetStatsNetwork> &network, uint64_t &allUsedTraffic)
1042 {
1043 std::unordered_map<uint32_t, NetStatsInfo> infos;
1044 int32_t ret = GetTrafficStatsByNetwork(infos, network);
1045 if (ret != NETMANAGER_SUCCESS) {
1046 return ret;
1047 }
1048
1049 allUsedTraffic = 0;
1050 NETMGR_LOG_I("NetStatsInfo size: %{public}zu", infos.size());
1051 for (auto it = infos.begin(); it != infos.end(); ++it) {
1052 allUsedTraffic += it->second.rxBytes_;
1053 allUsedTraffic += it->second.txBytes_;
1054 }
1055 return NETMANAGER_SUCCESS;
1056 }
1057
UpdateBpfMap()1058 void NetStatsService::UpdateBpfMap()
1059 {
1060 NETMGR_LOG_I("UpdateBpfMap start");
1061
1062 if (settingsTrafficMap_.find(curActiviteSimId_) == settingsTrafficMap_.end()) {
1063 NETMGR_LOG_E("simId: %{public}d error", curActiviteSimId_);
1064 return;
1065 }
1066
1067 NetsysController::GetInstance().ClearIncreaseTrafficMap();
1068 NetsysController::GetInstance().UpdateIfIndexMap(0, curIfIndex_);
1069
1070 SettingsInfoPtr info = settingsTrafficMap_[curActiviteSimId_].second;
1071 if (info != nullptr) {
1072 NETMGR_LOG_I("settingsInfo-> simId:%{public}d, beginDate:%{public}d, unLimitedDataEnable:%{public}d,\
1073 monthlyLimitdNotifyType:%{public}d, monthlyLimit:%{public}" PRIu64 ", monthlyMark:%{public}u,\
1074 dailyMark:%{public}u",
1075 curActiviteSimId_, info->beginDate, info->unLimitedDataEnable, info->monthlyLimitdNotifyType,
1076 info->monthlyLimit, info->monthlyMark, info->dailyMark);
1077 }
1078
1079 uint64_t monthlyAvailable = UINT64_MAX;
1080 uint64_t monthlyMarkAvailable = UINT64_MAX;
1081 uint64_t dailyMarkAvailable = UINT64_MAX;
1082 bool ret = CalculateTrafficAvailable(curActiviteSimId_, monthlyAvailable, monthlyMarkAvailable, dailyMarkAvailable);
1083 if (!ret) {
1084 NETMGR_LOG_E("CalculateTrafficAvailable error or not set limit or open unlimit");
1085 return;
1086 }
1087
1088 NETMGR_LOG_E("GetTrafficMap before write. monthlyAvailable:%{public}" PRIu64", \
1089 monthlyMarkAvailable:%{public}" PRIu64", dailyMarkAvailable:%{public}" PRIu64,
1090 monthlyAvailable, monthlyMarkAvailable, dailyMarkAvailable);
1091 NetsysController::GetInstance().SetNetStateTrafficMap(NET_STATS_MONTHLY_LIMIT, monthlyAvailable);
1092 NetsysController::GetInstance().SetNetStateTrafficMap(NET_STATS_MONTHLY_MARK, monthlyMarkAvailable);
1093 NetsysController::GetInstance().SetNetStateTrafficMap(NET_STATS_DAILY_MARK, dailyMarkAvailable);
1094
1095 uint64_t monthlyAvailableMap = UINT64_MAX;
1096 uint64_t monthlyMarkAvailableMap = UINT64_MAX;
1097 uint64_t dailyMarkAvailableMap = UINT64_MAX;
1098 NetsysController::GetInstance().GetNetStateTrafficMap(NET_STATS_MONTHLY_LIMIT, monthlyAvailableMap);
1099 NetsysController::GetInstance().GetNetStateTrafficMap(NET_STATS_MONTHLY_MARK, monthlyMarkAvailableMap);
1100 NetsysController::GetInstance().GetNetStateTrafficMap(NET_STATS_DAILY_MARK, dailyMarkAvailableMap);
1101 NETMGR_LOG_E("GetTrafficMap after write. monthlyAvailable:%{public}" PRIu64", \
1102 monthlyMarkAvailable:%{public}" PRIu64", dailyMarkAvailable:%{public}" PRIu64,
1103 monthlyAvailableMap, monthlyMarkAvailableMap, dailyMarkAvailableMap);
1104
1105 if (monthlyAvailable == UINT64_MAX) {
1106 NotifyTrafficAlert(NET_STATS_MONTHLY_LIMIT);
1107 } else if (monthlyMarkAvailable == UINT64_MAX) {
1108 NotifyTrafficAlert(NET_STATS_MONTHLY_MARK);
1109 } else if (dailyMarkAvailable == UINT64_MAX) {
1110 NotifyTrafficAlert(NET_STATS_DAILY_MARK);
1111 }
1112 }
1113
CalculateTrafficAvailable(int32_t simId,uint64_t & monthlyAvailable,uint64_t & monthlyMarkAvailable,uint64_t & dailyMarkAvailable)1114 bool NetStatsService::CalculateTrafficAvailable(int32_t simId, uint64_t &monthlyAvailable,
1115 uint64_t &monthlyMarkAvailable, uint64_t &dailyMarkAvailable)
1116 {
1117 if (settingsTrafficMap_.find(simId) == settingsTrafficMap_.end()) {
1118 NETMGR_LOG_E("settingsTrafficMap not find simId, simId is %{public}d", simId);
1119 return false;
1120 }
1121 sptr<NetStatsNetwork> network = (std::make_unique<NetStatsNetwork>()).release();
1122 network->startTime_ =
1123 NetStatsUtils::GetStartTimestamp(settingsTrafficMap_[simId].second->beginDate);
1124 network->endTime_ = NetStatsUtils::GetNowTimestamp();
1125 NETMGR_LOG_I("endTime: %{public}lu. simId: %{public}d", network->endTime_, simId);
1126 network->type_ = 0;
1127 network->simId_ = simId;
1128 uint64_t allUsedTraffic = 0;
1129 int ret = GetAllUsedTrafficStatsByNetwork(network, allUsedTraffic);
1130 if (ret != NETMANAGER_SUCCESS) {
1131 NETMGR_LOG_E("GetAllUsedTrafficStatsByNetwork err. ret: %{public}d", ret);
1132 return false;
1133 }
1134
1135 NETMGR_LOG_I("GetAllUsedTrafficStatsByNetwork allUsedTraffic: %{public}" PRIu64, allUsedTraffic);
1136 // 限额不是u64且没有打开无限开关
1137 if (settingsTrafficMap_[simId].second->monthlyLimit != UINT64_MAX &&
1138 settingsTrafficMap_[simId].second->unLimitedDataEnable != 1) {
1139 // 设置值大于已用值时,才计算余额
1140 if (settingsTrafficMap_[simId].second->monthlyLimit > allUsedTraffic) {
1141 monthlyAvailable = settingsTrafficMap_[simId].second->monthlyLimit - allUsedTraffic;
1142 }
1143 // (设置值*月限制比例)大于已用值
1144 uint64_t monthTmp = (settingsTrafficMap_[simId].second->monthlyLimit / 100.0) *
1145 settingsTrafficMap_[simId].second->monthlyMark;
1146 if (monthTmp > allUsedTraffic) {
1147 monthlyMarkAvailable = monthTmp - allUsedTraffic;
1148 }
1149 uint64_t todayStartTime = NetStatsUtils::GetTodayStartTimestamp();
1150 network->startTime_ = todayStartTime;
1151 uint64_t allTodayUsedTraffix = 0;
1152 ret = GetAllUsedTrafficStatsByNetwork(network, allTodayUsedTraffix);
1153 if (ret != NETMANAGER_SUCCESS) {
1154 NETMGR_LOG_E("GetAllUsedTrafficStatsByNetwork err. ret: %{public}d", ret);
1155 return false;
1156 }
1157 uint64_t dayTmp = (settingsTrafficMap_[simId].second->monthlyLimit / 100.0) *
1158 settingsTrafficMap_[simId].second->dailyMark;
1159 NETMGR_LOG_E("dayTmp:%{public}" PRIu64 ", allTodayUsedTraffix:%{public}" PRIu64, dayTmp, allTodayUsedTraffix);
1160 if (dayTmp > allTodayUsedTraffix) {
1161 dailyMarkAvailable = dayTmp - allTodayUsedTraffix;
1162 }
1163 return true;
1164 }
1165 return false;
1166 }
1167
SetTrafficMapMaxValue()1168 void NetStatsService::SetTrafficMapMaxValue()
1169 {
1170 NETMGR_LOG_I("SetTrafficMapMaxValue");
1171 NetsysController::GetInstance().SetNetStateTrafficMap(NET_STATS_MONTHLY_LIMIT, UINT64_MAX);
1172 NetsysController::GetInstance().SetNetStateTrafficMap(NET_STATS_MONTHLY_MARK, UINT64_MAX);
1173 NetsysController::GetInstance().SetNetStateTrafficMap(NET_STATS_DAILY_MARK, UINT64_MAX);
1174 }
1175
UpdataSettingsdata(int32_t simId,uint8_t flag,uint64_t value)1176 void NetStatsService::UpdataSettingsdata(int32_t simId, uint8_t flag, uint64_t value)
1177 {
1178 NETMGR_LOG_I("UpdataSettingsdata. simId: %{public}d, flag: %{public}d, value: %{public}lu", simId, flag, value);
1179 if (settingsTrafficMap_.find(simId) == settingsTrafficMap_.end()) {
1180 NETMGR_LOG_E("not found simId: %{public}d.", simId);
1181 return;
1182 }
1183 switch (flag) {
1184 case NET_STATS_NO_LIMIT_ENABLE:
1185 if (value == 0 || value == 1) {
1186 settingsTrafficMap_[simId].second->unLimitedDataEnable = static_cast<int8_t>(value);
1187 }
1188 break;
1189 case NET_STATS_MONTHLY_LIMIT:
1190 settingsTrafficMap_[simId].second->monthlyLimit = value;
1191 settingsTrafficMap_[simId].second->isCanNotifyMonthlyLimit = true;
1192 settingsTrafficMap_[simId].second->isCanNotifyMonthlyMark = true;
1193 settingsTrafficMap_[simId].second->isCanNotifyDailyMark = true;
1194 UpdateTrafficLimitDate(simId);
1195 break;
1196 case NET_STATS_BEGIN_DATE:
1197 if (value >= 1 && value <= 31) { // 31: 每月日期数最大值
1198 settingsTrafficMap_[simId].second->beginDate = static_cast<int32_t>(value);
1199 }
1200 break;
1201 case NET_STATS_NOTIFY_TYPE:
1202 if (value == 0 || value == 1) {
1203 settingsTrafficMap_[simId].second->monthlyLimitdNotifyType = static_cast<int8_t>(value);
1204 }
1205 break;
1206 case NET_STATS_MONTHLY_MARK:
1207 if (value >= 0 || value <= 100) { // 100: 百分比最大值
1208 settingsTrafficMap_[simId].second->monthlyMark = value;
1209 settingsTrafficMap_[simId].second->isCanNotifyMonthlyMark = true;
1210 UpdateTrafficLimitDate(simId);
1211 }
1212 break;
1213 case NET_STATS_DAILY_MARK:
1214 if (value >= 0 || value <= 100) { // 100: 百分比最大值
1215 settingsTrafficMap_[simId].second->dailyMark = value;
1216 }
1217 break;
1218 default:
1219 break;
1220 }
1221
1222 if (simId == curActiviteSimId_) {
1223 UpdateBpfMap();
1224 }
1225 }
1226
TrafficObserver()1227 TrafficObserver::TrafficObserver() {}
~TrafficObserver()1228 TrafficObserver::~TrafficObserver() {}
1229
OnExceedTrafficLimits(int8_t & flag)1230 int32_t TrafficObserver::OnExceedTrafficLimits(int8_t &flag)
1231 {
1232 NETMGR_LOG_I("OnExceedTrafficLimits flag: %{public}d", flag);
1233 if (flag < NET_STATS_MONTHLY_LIMIT || flag > NET_STATS_DAILY_MARK) {
1234 NETMGR_LOG_E("OnExceedTrafficLimits flag error. value: %{public}d", flag);
1235 return -1;
1236 }
1237
1238 // 触发弹窗检测
1239 DelayedSingleton<NetStatsService>::GetInstance()->NotifyTrafficAlert(flag);
1240 return 0;
1241 }
1242
UpdateBeginDate(int32_t simId,int32_t beginDate)1243 void NetStatsService::UpdateBeginDate(int32_t simId, int32_t beginDate)
1244 {
1245 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1246 settingsTrafficMap_[simId].second->beginDate = beginDate;
1247 }
1248 }
1249
UpdateUnLimitedDataEnable(int32_t simId,int8_t unLimitedDataEnable)1250 void NetStatsService::UpdateUnLimitedDataEnable(int32_t simId, int8_t unLimitedDataEnable)
1251 {
1252 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1253 settingsTrafficMap_[simId].second->unLimitedDataEnable = unLimitedDataEnable;
1254 }
1255 }
1256
UpdateMonthlyLimitdNotifyType(int32_t simId,int8_t monthlyLimitdNotifyType)1257 void NetStatsService::UpdateMonthlyLimitdNotifyType(int32_t simId, int8_t monthlyLimitdNotifyType)
1258 {
1259 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1260 settingsTrafficMap_[simId].second->monthlyLimitdNotifyType = monthlyLimitdNotifyType;
1261 }
1262 }
1263
UpdateMonthlyLimit(int32_t simId,uint64_t monthlyLimit)1264 void NetStatsService::UpdateMonthlyLimit(int32_t simId, uint64_t monthlyLimit)
1265 {
1266 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1267 settingsTrafficMap_[simId].second->monthlyLimit = monthlyLimit;
1268 }
1269 }
1270
UpdateMonthlyMark(int32_t simId,uint16_t monthlyMark)1271 void NetStatsService::UpdateMonthlyMark(int32_t simId, uint16_t monthlyMark)
1272 {
1273 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1274 settingsTrafficMap_[simId].second->monthlyMark = monthlyMark;
1275 }
1276 }
1277
UpdateDailyMark(int32_t simId,uint16_t dailyMark)1278 void NetStatsService::UpdateDailyMark(int32_t simId, uint16_t dailyMark)
1279 {
1280 if (settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1281 settingsTrafficMap_[simId].second->dailyMark = dailyMark;
1282 }
1283 }
1284
1285 // 从DB中读simId上次弹窗对应的时间戳
UpdateNetStatsToMapFromDB(int32_t simId)1286 void NetStatsService::UpdateNetStatsToMapFromDB(int32_t simId)
1287 {
1288 /* 获取用Query */
1289 NETMGR_LOG_I("UpdateNetStatsToMapFromDB enter.");
1290 NetStatsRDB netStats;
1291
1292 std::vector<NetStatsData> result = netStats.QueryAll();
1293 for (size_t i = 0; i < result.size(); i++) {
1294 int32_t curSumId = result[i].simId;
1295 if (simId == curSumId && settingsTrafficMap_.find(simId) != settingsTrafficMap_.end()) {
1296 settingsTrafficMap_[curSumId].second->lastMonAlertTime = result[i].monWarningDate;
1297 settingsTrafficMap_[curSumId].second->lastMonNotifyTime = result[i].dayNoticeDate;
1298 settingsTrafficMap_[curSumId].second->lastDayNotifyTime = result[i].monNoticeDate;
1299 settingsTrafficMap_[curSumId].second->isCanNotifyMonthlyLimit =
1300 static_cast<bool>(result[i].monWarningState);
1301 settingsTrafficMap_[curSumId].second->isCanNotifyMonthlyMark = static_cast<bool>(result[i].monNoticeState);
1302 settingsTrafficMap_[curSumId].second->isCanNotifyDailyMark = static_cast<bool>(result[i].dayNoticeState);
1303 }
1304 }
1305 }
1306
NotifyTrafficAlert(uint8_t flag)1307 int32_t NetStatsService::NotifyTrafficAlert(uint8_t flag)
1308 {
1309 if (NetStatsUtils::IsMobileDataEnabled() && GetNotifyStats(flag)) {
1310 DealNotificaiton(flag);
1311 } else {
1312 NETMGR_LOG_I("There is no need to pop up trafficLimit notification.");
1313 }
1314 return NETMANAGER_SUCCESS;
1315 }
1316
1317 // 判断是否满足弹窗条件 flag:表示弹窗类型
GetNotifyStats(uint8_t flag)1318 bool NetStatsService::GetNotifyStats(uint8_t flag)
1319 {
1320 NETMGR_LOG_I("Enter GetNotifyStats.");
1321 if (settingsTrafficMap_.find(curActiviteSimId_) == settingsTrafficMap_.end()) {
1322 NETMGR_LOG_I("GetCurActiviteSimId Key failed : curActiviteSimId_ = %{public}d.", curActiviteSimId_);
1323 return false;
1324 }
1325 if (settingsTrafficMap_[curActiviteSimId_].second->unLimitedDataEnable == 1) {
1326 NETMGR_LOG_I("setting unLimitedData, unLimitedDataEnable:%{public}d",
1327 settingsTrafficMap_[curActiviteSimId_].second->unLimitedDataEnable);
1328 return false;
1329 }
1330
1331 switch (flag) {
1332 case NET_STATS_MONTHLY_LIMIT:
1333 return GetMonAlertStatus();
1334 break;
1335 case NET_STATS_MONTHLY_MARK:
1336 return GetMonNotifyStatus();
1337 break;
1338 case NET_STATS_DAILY_MARK:
1339 return GetDayNotifyStatus();
1340 break;
1341 default:
1342 NETMGR_LOG_I("unknown notification type");
1343 return false;
1344 }
1345 return false;
1346 }
1347
GetMonNotifyStatus()1348 bool NetStatsService::GetMonNotifyStatus()
1349 {
1350 NETMGR_LOG_I("Enter GetMonNotifyStatus.");
1351
1352 if (settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyMonthlyMark) {
1353 settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyMonthlyMark = false;
1354 return true;
1355 }
1356
1357 int32_t currentTime = NetStatsUtils::GetNowTimestamp();
1358 int32_t currentStartTime =
1359 NetStatsUtils::GetStartTimestamp(settingsTrafficMap_[curActiviteSimId_].second->beginDate);
1360 NETMGR_LOG_I("Enter currentTime:%{public}d, currentDayStartTime:%{public}d, lastMonNotifyTime: %{public}d",
1361 currentTime, currentStartTime, settingsTrafficMap_[curActiviteSimId_].second->lastMonNotifyTime);
1362 if (settingsTrafficMap_[curActiviteSimId_].second->lastMonNotifyTime < currentStartTime) {
1363 return true;
1364 }
1365 return false;
1366 }
1367
GetDayNotifyStatus()1368 bool NetStatsService::GetDayNotifyStatus()
1369 {
1370 NETMGR_LOG_I("Enter GetDayNotifyStatus.");
1371 if (settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyDailyMark) {
1372 settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyDailyMark = false;
1373 return true;
1374 }
1375 int32_t currentDayStartTime = NetStatsUtils::GetTodayStartTimestamp();
1376 NETMGR_LOG_I("Enter currentDayStartTime:%{public}d, lastDayNotifyTime: %{public}d",
1377 currentDayStartTime, settingsTrafficMap_[curActiviteSimId_].second->lastDayNotifyTime);
1378 if (settingsTrafficMap_[curActiviteSimId_].second->lastDayNotifyTime < currentDayStartTime) {
1379 return true;
1380 }
1381 return false;
1382 }
1383
GetMonAlertStatus()1384 bool NetStatsService::GetMonAlertStatus()
1385 {
1386 NETMGR_LOG_I("Enter GetMonAlertStatus.");
1387 if (settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyMonthlyLimit) {
1388 NETMGR_LOG_I("isCanNotify true : states changed caused.");
1389 settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyMonthlyLimit = false;
1390 settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyMonthlyMark = false;
1391 settingsTrafficMap_[curActiviteSimId_].second->isCanNotifyDailyMark = false;
1392 return true;
1393 }
1394
1395 int currentTime = NetStatsUtils::GetNowTimestamp();
1396 int currentStartTime = NetStatsUtils::GetStartTimestamp(settingsTrafficMap_[curActiviteSimId_].second->beginDate);
1397 NETMGR_LOG_I("Enter currentTime:%{public}d, currentDayStartTime:%{public}d, lastMonAlertTime: %{public}d",
1398 currentTime, currentStartTime, settingsTrafficMap_[curActiviteSimId_].second->lastMonAlertTime);
1399 if (settingsTrafficMap_[curActiviteSimId_].second->lastMonAlertTime < currentStartTime) {
1400 return true;
1401 }
1402 return false;
1403 }
1404
1405 // 拉起弹窗
DealNotificaiton(uint8_t flag)1406 void NetStatsService::DealNotificaiton(uint8_t flag)
1407 {
1408 NETMGR_LOG_I("Enter DealDayNotification.");
1409 int simNum = NetStatsUtils::IsDaulCardEnabled();
1410 bool isDaulCard = false;
1411 if (simNum == 0) {
1412 return;
1413 } else if (simNum == DUAL_CARD) {
1414 isDaulCard = true;
1415 }
1416
1417 switch (flag) {
1418 case NET_STATS_MONTHLY_LIMIT:
1419 return DealMonAlert(isDaulCard);
1420 break;
1421 case NET_STATS_MONTHLY_MARK:
1422 return DealMonNotification(isDaulCard);
1423 break;
1424 case NET_STATS_DAILY_MARK:
1425 return DealDayNotification(isDaulCard);
1426 break;
1427 default:
1428 NETMGR_LOG_I("unknown notificationdeal type");
1429 }
1430 }
1431
DealDayNotification(bool isDaulCard)1432 void NetStatsService::DealDayNotification(bool isDaulCard)
1433 {
1434 NETMGR_LOG_I("Enter DealDayNotification.");
1435 NetMgrNetStatsLimitNotification::GetInstance().PublishNetStatsLimitNotification(NETMGR_STATS_LIMIT_DAY, isDaulCard);
1436 settingsTrafficMap_[curActiviteSimId_].second->lastDayNotifyTime = NetStatsUtils::GetNowTimestamp();
1437 UpdateTrafficLimitDate(curActiviteSimId_);
1438 NETMGR_LOG_I("update DayNotification time:%{public}d",
1439 settingsTrafficMap_[curActiviteSimId_].second->lastDayNotifyTime);
1440 }
1441
DealMonNotification(bool isDaulCard)1442 void NetStatsService::DealMonNotification(bool isDaulCard)
1443 {
1444 NETMGR_LOG_I("Enter DealMonNotification.");
1445 NetMgrNetStatsLimitNotification::GetInstance().PublishNetStatsLimitNotification(
1446 NETMGR_STATS_LIMIT_MONTH, isDaulCard);
1447 settingsTrafficMap_[curActiviteSimId_].second->lastMonNotifyTime = NetStatsUtils::GetNowTimestamp();
1448 UpdateTrafficLimitDate(curActiviteSimId_);
1449 NETMGR_LOG_I("update MonNotification time:%{public}d",
1450 settingsTrafficMap_[curActiviteSimId_].second->lastMonNotifyTime);
1451 }
1452
DealMonAlert(bool isDaulCard)1453 void NetStatsService::DealMonAlert(bool isDaulCard)
1454 {
1455 NETMGR_LOG_I("Enter DealMonAlert.");
1456 if (dialog_ == nullptr) {
1457 dialog_ = std::make_shared<TrafficLimitDialog>();
1458 }
1459
1460 if (dialog_ == nullptr) {
1461 NETMGR_LOG_E("Get TrafficLimitDialog faied.");
1462 return;
1463 }
1464
1465 if (settingsTrafficMap_.find(curActiviteSimId_) == settingsTrafficMap_.end()) {
1466 NETMGR_LOG_E("map find error");
1467 }
1468 NetMgrNetStatsLimitNotification::GetInstance().PublishNetStatsLimitNotification(
1469 NETMGR_STATS_ALERT_MONTH, isDaulCard);
1470
1471 if (settingsTrafficMap_[curActiviteSimId_].second->monthlyLimitdNotifyType) {
1472 dialog_->PopUpTrafficLimitDialog();
1473 }
1474 settingsTrafficMap_[curActiviteSimId_].second->lastMonAlertTime = NetStatsUtils::GetNowTimestamp();
1475 UpdateTrafficLimitDate(curActiviteSimId_);
1476 NETMGR_LOG_I("update MonAlert time:%{public}d", settingsTrafficMap_[curActiviteSimId_].second->lastMonAlertTime);
1477 }
1478
GetCurActiviteSimId()1479 int32_t NetStatsService::GetCurActiviteSimId()
1480 {
1481 return curActiviteSimId_ ;
1482 }
1483
GetSettingsObserverMap()1484 std::map<int32_t, std::pair<ObserverPtr, SettingsInfoPtr>> NetStatsService::GetSettingsObserverMap()
1485 {
1486 return settingsTrafficMap_;
1487 }
1488
UpdateTrafficLimitDate(int32_t simId)1489 void NetStatsService::UpdateTrafficLimitDate(int32_t simId)
1490 {
1491 NETMGR_LOG_I("UpdateTrafficLimitDate start");
1492 NetStatsRDB netStats;
1493 NetStatsData statsData;
1494 if (settingsTrafficMap_.find(simId) == settingsTrafficMap_.end()) {
1495 NETMGR_LOG_E("UpdateTrafficLimitDate err. Not find simId:%{public}d", simId);
1496 return;
1497 }
1498 auto info = settingsTrafficMap_[simId];
1499 statsData.simId = simId;
1500 statsData.monWarningDate = info.second->lastMonAlertTime;
1501 statsData.dayNoticeDate = info.second->lastMonNotifyTime;
1502 statsData.monNoticeDate = info.second->lastDayNotifyTime;
1503 statsData.monWarningState = info.second->isCanNotifyMonthlyLimit;
1504 statsData.dayNoticeState = info.second->isCanNotifyDailyMark;
1505 statsData.monNoticeState = info.second->isCanNotifyMonthlyMark;
1506
1507 netStats.InsertData(statsData);
1508 }
1509 #endif //SUPPORT_TRAFFIC_STATISTIC
1510 } // namespace NetManagerStandard
1511 } // namespace OHOS
1512