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