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