1 /*
2 * Copyright (C) 2024 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 "ability_manager_ipc_interface_code.h"
17 #include "cJSON.h"
18 #include "extension_manager_client.h"
19 #include "iservice_registry.h"
20 #include "message_parcel.h"
21 #include "system_ability_definition.h"
22 #include "wifi_notification_util.h"
23 #include "wifi_logger.h"
24
25 namespace OHOS {
26 namespace Wifi {
27 DEFINE_WIFILOG_LABEL("WifiNotificationUtil");
28
GetInstance()29 WifiNotificationUtil &WifiNotificationUtil::GetInstance()
30 {
31 static WifiNotificationUtil instance;
32 return instance;
33 }
34
WifiNotificationUtil()35 WifiNotificationUtil::WifiNotificationUtil()
36 {}
37
~WifiNotificationUtil()38 WifiNotificationUtil::~WifiNotificationUtil()
39 {}
40
PublishWifiNotification(WifiNotificationId notificationId,std::string & ssid,WifiNotificationStatus status)41 void WifiNotificationUtil::PublishWifiNotification(WifiNotificationId notificationId, std::string& ssid,
42 WifiNotificationStatus status)
43 {
44 WIFI_LOGI("Publishing wifi notification, id [%{public}d]", static_cast<int>(notificationId));
45 AAFwk::Want want;
46 want.SetElementName("com.ohos.locationdialog", "WifiServiceAbility");
47 want.SetParam("operateType", static_cast<int>(WifiNotificationOpetationType::PUBLISH));
48 want.SetParam("notificationId", static_cast<int>(notificationId));
49 want.SetParam("status", status);
50 want.SetParam("ssid", ssid);
51 auto result = StartAbility(want);
52 switch (notificationId) {
53 case WIFI_PORTAL_NOTIFICATION_ID:
54 isPortalNtfPublished = true;
55 break;
56 case WIFI_5G_CONN_NOTIFICATION_ID:
57 is5gConnNtfPublished = true;
58 break;
59 default: {
60 break;
61 }
62 }
63 WIFI_LOGI("Publishing wifi notification End, result = %{public}d", result);
64 }
65
CancelWifiNotification(WifiNotificationId notificationId)66 void WifiNotificationUtil::CancelWifiNotification(WifiNotificationId notificationId)
67 {
68 WIFI_LOGI("Cancel notification, id [%{public}d]", static_cast<int>(notificationId));
69 switch (notificationId) {
70 case WIFI_PORTAL_NOTIFICATION_ID:
71 if (!isPortalNtfPublished) {
72 WIFI_LOGE("Portal notification is canceled");
73 return;
74 }
75 isPortalNtfPublished = false;
76 break;
77 case WIFI_5G_CONN_NOTIFICATION_ID:
78 if (!is5gConnNtfPublished) {
79 WIFI_LOGE("5g Conn notification is canceled");
80 return;
81 }
82 is5gConnNtfPublished = false;
83 break;
84 default: {
85 break;
86 }
87 }
88 AAFwk::Want want;
89 want.SetElementName("com.ohos.locationdialog", "WifiServiceAbility");
90 want.SetParam("operateType", static_cast<int>(WifiNotificationOpetationType::CANCEL));
91 want.SetParam("notificationId", static_cast<int>(notificationId));
92 auto result = StartAbility(want);
93 WIFI_LOGI("Cancel notification End, result = %{public}d", result);
94 }
95
DisplaySettingWlanPage(std::string bundleName,std::string abilityName,std::string navEntryKey)96 void WifiNotificationUtil::DisplaySettingWlanPage(
97 std::string bundleName, std::string abilityName, std::string navEntryKey)
98 {
99 AAFwk::Want want;
100 AppExecFwk::ElementName element("", bundleName, abilityName);
101 want.SetElement(element);
102 want.SetUri(navEntryKey);
103 auto result = StartAbility(want);
104 WIFI_LOGI("Display setting wlan page end, result = %{public}d", result);
105 }
106
StartAbility(OHOS::AAFwk::Want & want)107 int32_t WifiNotificationUtil::StartAbility(OHOS::AAFwk::Want& want)
108 {
109 sptr<ISystemAbilityManager> systemAbilityManager =
110 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
111 if (systemAbilityManager == nullptr) {
112 WIFI_LOGE("systemAbilityManager is nullptr");
113 return -1;
114 }
115 sptr<IRemoteObject> remote = systemAbilityManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
116 if (remote == nullptr) {
117 WIFI_LOGE("remote is nullptr");
118 return -1;
119 }
120
121 int error;
122 MessageParcel data;
123 MessageParcel reply;
124 MessageOption option;
125
126 if (!data.WriteInterfaceToken(ABILITY_MGR_DESCRIPTOR)) {
127 return -1;
128 }
129 if (!data.WriteParcelable(&want)) {
130 WIFI_LOGE("want write failed.");
131 return -1;
132 }
133
134 if (!data.WriteInt32(DEFAULT_INVAL_VALUE)) {
135 WIFI_LOGE("userId write failed.");
136 return -1;
137 }
138
139 if (!data.WriteInt32(DEFAULT_INVAL_VALUE)) {
140 WIFI_LOGE("requestCode write failed.");
141 return -1;
142 }
143 uint32_t task = static_cast<uint32_t>(AAFwk::AbilityManagerInterfaceCode::START_ABILITY);
144 error = remote->SendRequest(task, data, reply, option);
145 if (error != NO_ERROR) {
146 WIFI_LOGE("Send request error: %{public}d", error);
147 return error;
148 }
149 return reply.ReadInt32();
150 }
151
ShowDialog(WifiDialogType type,std::string comInfo)152 void WifiNotificationUtil::ShowDialog(WifiDialogType type, std::string comInfo)
153 {
154 WIFI_LOGI("ShowDialog, type=%{public}d", static_cast<int32_t>(type));
155 AAFwk::Want want;
156 std::string bundleName = "com.ohos.sceneboard";
157 std::string abilityName = "com.ohos.sceneboard.systemdialog";
158 want.SetElementName(bundleName, abilityName);
159 cJSON *param = cJSON_CreateObject();
160 if (param == nullptr) {
161 WIFI_LOGE("Failed to create cJSON object");
162 return;
163 }
164 cJSON_AddStringToObject(param, "ability.want.params.uiExtensionType", "sysDialog/common");
165 cJSON_AddNumberToObject(param, "wifiDialogType", static_cast<int32_t>(type));
166 switch (type) {
167 case AUTO_IDENTIFY_CONN:
168 case SETTINGS_AUTO_IDENTIFY_CONN:
169 cJSON_AddStringToObject(param, "wifi5gSsid", comInfo.c_str());
170 break;
171 case P2P_WSC_PBC_DIALOG:
172 cJSON_AddStringToObject(param, "p2pDeviceName", comInfo.c_str());
173 break;
174 case CANDIDATE_CONNECT:
175 cJSON_AddStringToObject(param, "targetSsid", comInfo.c_str());
176 break;
177 default:
178 break;
179 }
180 char *cjsonStr = cJSON_PrintUnformatted(param);
181 if (cjsonStr == nullptr) {
182 WIFI_LOGE("Failed to print cJSON object");
183 cJSON_Delete(param);
184 return;
185 }
186 std::string cmdData(cjsonStr);
187 free(cjsonStr);
188 cJSON_Delete(param);
189 sptr<UIExtensionAbilityConnection> connection(
190 new (std::nothrow) UIExtensionAbilityConnection(cmdData, "com.ohos.locationdialog", "WifiUIExtAbility"));
191 if (connection == nullptr) {
192 WIFI_LOGE("connect UIExtensionAbilityConnection fail");
193 return;
194 }
195 std::string identity = IPCSkeleton::ResetCallingIdentity();
196 auto ret =
197 AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, connection, nullptr, -1);
198 WIFI_LOGI("connect service extension ability result = %{public}d", ret);
199 IPCSkeleton::SetCallingIdentity(identity);
200 }
201
ShowSettingsDialog(WifiDialogType type,std::string settings)202 void WifiNotificationUtil::ShowSettingsDialog(WifiDialogType type, std::string settings)
203 {
204 WIFI_LOGI("ShowSettingsDialog, type=%{public}d", static_cast<int32_t>(type));
205 AAFwk::Want want;
206 std::string bundleName = "com.ohos.sceneboard";
207 std::string abilityName = "com.ohos.sceneboard.systemdialog";
208 want.SetElementName(bundleName, abilityName);
209 cJSON *param = cJSON_CreateObject();
210 if (param == nullptr) {
211 WIFI_LOGE("Failed to create cJSON object");
212 return;
213 }
214 cJSON_AddStringToObject(param, "ability.want.params.uiExtensionType", "sysDialog/common");
215 char *cjsonStr = cJSON_PrintUnformatted(param);
216 if (cjsonStr == nullptr) {
217 WIFI_LOGE("Failed to print cJSON object");
218 cJSON_Delete(param);
219 return;
220 }
221 std::string cmdData(cjsonStr);
222 free(cjsonStr);
223 cJSON_Delete(param);
224 if (settings.empty()) {
225 WIFI_LOGI("settings name is null");
226 return;
227 }
228 sptr<UIExtensionAbilityConnection> connection(
229 new (std::nothrow) UIExtensionAbilityConnection(cmdData, settings, "WifiNotAvailableDialog"));
230 if (connection == nullptr) {
231 WIFI_LOGE("connect UIExtensionAbilityConnection fail");
232 return;
233 }
234 std::string identity = IPCSkeleton::ResetCallingIdentity();
235 auto ret =
236 AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, connection, nullptr, -1);
237 WIFI_LOGI("connect service extension ability result = %{public}d", ret);
238 IPCSkeleton::SetCallingIdentity(identity);
239 }
240
OnAbilityConnectDone(const AppExecFwk::ElementName & element,const sptr<IRemoteObject> & remoteObject,int32_t resultCode)241 void UIExtensionAbilityConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &element,
242 const sptr<IRemoteObject> &remoteObject, int32_t resultCode)
243 {
244 WIFI_LOGI("on ability connected");
245 MessageParcel data;
246 MessageParcel reply;
247 MessageOption option;
248 data.WriteInt32(SIGNAL_NUM);
249 data.WriteString16(u"bundleName");
250 data.WriteString16(Str8ToStr16(bundleName_));
251 data.WriteString16(u"abilityName");
252 data.WriteString16(Str8ToStr16(abilityName_));
253 data.WriteString16(u"parameters");
254 data.WriteString16(Str8ToStr16(commandStr_));
255
256 int32_t errCode = remoteObject->SendRequest(IAbilityConnection::ON_ABILITY_CONNECT_DONE, data, reply, option);
257 WIFI_LOGI("AbilityConnectionWrapperProxy::OnAbilityConnectDone result %{public}d", errCode);
258 }
259
OnAbilityDisconnectDone(const AppExecFwk::ElementName & element,int32_t resultCode)260 void UIExtensionAbilityConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int32_t resultCode)
261 {
262 WIFI_LOGI("on ability disconnected");
263 }
264 } // namespace Wifi
265 } // namespace OHOS