• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 <atomic>
17 #include <fstream>
18 #include <memory>
19 #include <set>
20 #include <string_ex.h>
21 #include <string>
22 
23 #include <ability_manager_client.h>
24 #include <message_parcel.h>
25 
26 #include "net_stats_rdb.h"
27 #include "net_stats_trafficLimit_dialog.h"
28 #include "net_stats_service.h"
29 #include "net_stats_utils.h"
30 #include "cellular_data_client.h"
31 #include "core_service_client.h"
32 #include "cJSON.h"
33 #include "net_mgr_log_wrapper.h"
34 
35 using namespace OHOS::AAFwk;
36 
37 namespace OHOS {
38 namespace NetManagerStandard {
39 constexpr int32_t INVALID_USERID = -1;
40 constexpr int32_t MESSAGE_PARCEL_KEY_SIZE = 6;
41 
TrafficLimitDialog()42 TrafficLimitDialog::TrafficLimitDialog() {}
43 
~TrafficLimitDialog()44 TrafficLimitDialog::~TrafficLimitDialog()
45 {
46     if (isDialogOpen_) {
47         (void)UnShowTrafficLimitDialog();
48     }
49 }
50 
PopUpTrafficLimitDialog()51 bool TrafficLimitDialog::PopUpTrafficLimitDialog()
52 {
53     isDialogOpen_ = true;
54     return ShowTrafficLimitDialog();
55 }
56 
DismissTrafficLimitDialog()57 bool TrafficLimitDialog::DismissTrafficLimitDialog()
58 {
59     if (!isDialogOpen_) {
60         return false;
61     }
62     NETMGR_LOG_I("Dismiss TrafficLimit Dialog");
63     return UnShowTrafficLimitDialog();
64 }
65 
OnAbilityConnectDone(const AppExecFwk::ElementName & element,const sptr<IRemoteObject> & remoteObject,int32_t resultCode)66 void TrafficLimitDialog::TrafficLimitAbilityConn::OnAbilityConnectDone(const AppExecFwk::ElementName &element,
67     const sptr<IRemoteObject> &remoteObject, int32_t resultCode)
68 {
69     NETMGR_LOG_I("TrafficLimitDialog::OnAbilityConnectDone");
70     int32_t curSimId = DelayedSingleton<NetStatsService>::GetInstance()->GetCurActiviteSimId();
71     int32_t slotId = Telephony::CoreServiceClient::GetInstance().GetSlotId(curSimId);
72 
73     MessageParcel data;
74     MessageParcel reply;
75     MessageOption option;
76 
77     std::string parameters =
78         "{\"ability.want.params.uiExtensionType\":\"sysDialog/common\",\"sysDialogZOrder\":1, \"slotId\":";
79     std::string paramStr = parameters + std::to_string(slotId) + "}";
80 
81     data.WriteInt32(MESSAGE_PARCEL_KEY_SIZE);
82     data.WriteString16(u"bundleName");
83     data.WriteString16(u"com.xxxxxx.hmos.communicationsetting");
84     data.WriteString16(u"abilityName");
85     data.WriteString16(u"DisableMobileDataDialogAbility");
86 
87     data.WriteString16(u"parameters");
88     data.WriteString16(Str8ToStr16(paramStr));
89 
90     NETMGR_LOG_I("OnAbilityConnectDone : curSimId = %{public}d", curSimId);
91     NETMGR_LOG_I("OnAbilityConnectDone : tmpParameters = %{public}s", paramStr.c_str());
92 
93     const uint32_t cmdCode = 1;
94     int32_t ret = remoteObject->SendRequest(cmdCode, data, reply, option);
95     if (ret != ERR_OK) {
96         NETMGR_LOG_I("TrafficLimit Dialog failed: ret=%{public}u", ret);
97         return;
98     }
99     remoteObject_ = remoteObject;
100     return;
101 }
102 
OnAbilityDisconnectDone(const AppExecFwk::ElementName & element,int resultCode)103 void TrafficLimitDialog::TrafficLimitAbilityConn::OnAbilityDisconnectDone(
104     const AppExecFwk::ElementName& element, int resultCode)
105 {
106     NETMGR_LOG_E("TrafficLimitAbilityConn::OnAbilityDisconnectDone");
107     remoteObject_ = nullptr;
108     return;
109 }
110 
CloseDialog()111 void TrafficLimitDialog::TrafficLimitAbilityConn::CloseDialog()
112 {
113     if (remoteObject_ == nullptr) {
114         NETMGR_LOG_I("CloseDialog: disconnected");
115         return;
116     }
117 
118     MessageParcel data;
119     MessageParcel reply;
120     MessageOption option;
121     const uint32_t cmdCode = 3;  // 3:表示关闭弹窗
122     int32_t ret = remoteObject_->SendRequest(cmdCode, data, reply, option);
123     int32_t replyCode = -1;
124     bool success = false;
125     if (ret == ERR_OK) {
126         success = reply.ReadInt32(replyCode);
127     }
128     NETMGR_LOG_I("CloseDialog: ret=%{public}d, %{public}d, %{public}d", ret, success, replyCode);
129 }
130 
ShowTrafficLimitDialog()131 bool TrafficLimitDialog::ShowTrafficLimitDialog()
132 {
133     NETMGR_LOG_I("Show TrafficLimit Dialog");
134     std::lock_guard<std::mutex> guard(opMutex_);
135     if (trafficlimitAbilityConn_ == nullptr) {
136         trafficlimitAbilityConn_ = new (std::nothrow) TrafficLimitAbilityConn();
137     }
138     if (trafficlimitAbilityConn_ == nullptr) {
139         NETMGR_LOG_I("TrafficLimitAbilityConn create failed");
140         return false;
141     }
142     auto abilityManager = OHOS::AAFwk::AbilityManagerClient::GetInstance();
143     if (abilityManager == nullptr) {
144         NETMGR_LOG_I("AbilityManagerClient is nullptr");
145         return false;
146     }
147 
148     int32_t curSimId = DelayedSingleton<NetStatsService>::GetInstance()->GetCurActiviteSimId();
149     auto settingsObserverMap_ = DelayedSingleton<NetStatsService>::GetInstance()->GetSettingsObserverMap();
150     if (settingsObserverMap_.find(curSimId) == settingsObserverMap_.end()) {
151         return false;
152     }
153 
154     NETMGR_LOG_I("Set CellularData false");
155     DelayedRefSingleton<Telephony::CellularDataClient>::GetInstance().EnableCellularData(false);
156 
157     Want want;
158     NETMGR_LOG_I("SetElementName");
159     want.SetElementName("com.ohos.sceneboard", "com.ohos.sceneboard.systemdialog");
160     NETMGR_LOG_I("ConnectAbility start");
161     auto ret = abilityManager->ConnectAbility(want, trafficlimitAbilityConn_, INVALID_USERID);
162     if (ret != ERR_OK) {
163         NETMGR_LOG_I("ConnectServiceExtensionAbility systemui failed");
164         trafficlimitAbilityConn_ = nullptr;
165         return false;
166     }
167 
168     return true;
169 }
170 
UnShowTrafficLimitDialog()171 bool TrafficLimitDialog::UnShowTrafficLimitDialog()
172 {
173     std::lock_guard<std::mutex> guard(opMutex_);
174     if (trafficlimitAbilityConn_ == nullptr) {
175         return true;
176     }
177 
178     auto abmc = OHOS::AAFwk::AbilityManagerClient::GetInstance();
179     if (abmc == nullptr) {
180         NETMGR_LOG_I("GetInstance failed");
181         return false;
182     }
183     NETMGR_LOG_I("Unshow TrafficLimit Dialog");
184     trafficlimitAbilityConn_->CloseDialog();
185 
186     auto ret = abmc->DisconnectAbility(trafficlimitAbilityConn_);
187     if (ret != 0) {
188         NETMGR_LOG_I("DisconnectAbility failed %{public}d", ret);
189         return false;
190     }
191     NETMGR_LOG_I("Unshow TrafficLimit Dialog success");
192     return true;
193 }
194 } // namespace NetManagerStandard
195 } // namespace OHOS
196