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 "extension_manager_client.h"
18 #include "iservice_registry.h"
19 #include "message_parcel.h"
20 #include "system_ability_definition.h"
21 #include "wifi_notification_util.h"
22 #include "wifi_logger.h"
23
24 namespace OHOS {
25 namespace Wifi {
26 DEFINE_WIFILOG_LABEL("WifiNotificationUtil");
27
GetInstance()28 WifiNotificationUtil &WifiNotificationUtil::GetInstance()
29 {
30 static WifiNotificationUtil instance;
31 return instance;
32 }
33
WifiNotificationUtil()34 WifiNotificationUtil::WifiNotificationUtil()
35 {}
36
~WifiNotificationUtil()37 WifiNotificationUtil::~WifiNotificationUtil()
38 {}
39
PublishWifiNotification(WifiNotificationId notificationId,std::string & ssid,WifiNotificationStatus status)40 void WifiNotificationUtil::PublishWifiNotification(WifiNotificationId notificationId, std::string& ssid,
41 WifiNotificationStatus status)
42 {
43 WIFI_LOGI("Publishing wifi notification, id [%{public}d]", static_cast<int>(notificationId));
44 AAFwk::Want want;
45 want.SetElementName("com.ohos.locationdialog", "WifiServiceAbility");
46 want.SetParam("operateType", static_cast<int>(WifiNotificationOpetationType::PUBLISH));
47 want.SetParam("notificationId", static_cast<int>(notificationId));
48 want.SetParam("status", status);
49 want.SetParam("ssid", ssid);
50 auto result = StartAbility(want);
51 isNtfPublished = true;
52 WIFI_LOGI("Publishing wifi notification End, result = %{public}d", result);
53 }
54
CancelWifiNotification(WifiNotificationId notificationId)55 void WifiNotificationUtil::CancelWifiNotification(WifiNotificationId notificationId)
56 {
57 WIFI_LOGI("Cancel notification, id [%{public}d]", static_cast<int>(notificationId));
58 if (!isNtfPublished) {
59 return;
60 }
61 AAFwk::Want want;
62 want.SetElementName("com.ohos.locationdialog", "WifiServiceAbility");
63 want.SetParam("operateType", static_cast<int>(WifiNotificationOpetationType::CANCEL));
64 want.SetParam("notificationId", static_cast<int>(notificationId));
65 auto result = StartAbility(want);
66 isNtfPublished = false;
67 WIFI_LOGI("Cancel notification End, result = %{public}d", result);
68 }
69
StartAbility(OHOS::AAFwk::Want & want)70 int32_t WifiNotificationUtil::StartAbility(OHOS::AAFwk::Want& want)
71 {
72 sptr<ISystemAbilityManager> systemAbilityManager =
73 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
74 if (systemAbilityManager == nullptr) {
75 WIFI_LOGE("systemAbilityManager is nullptr");
76 return -1;
77 }
78 sptr<IRemoteObject> remote = systemAbilityManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
79 if (remote == nullptr) {
80 WIFI_LOGE("remote is nullptr");
81 return -1;
82 }
83
84 int error;
85 MessageParcel data;
86 MessageParcel reply;
87 MessageOption option;
88
89 if (!data.WriteInterfaceToken(ABILITY_MGR_DESCRIPTOR)) {
90 return -1;
91 }
92 if (!data.WriteParcelable(&want)) {
93 WIFI_LOGE("want write failed.");
94 return -1;
95 }
96
97 if (!data.WriteInt32(DEFAULT_INVAL_VALUE)) {
98 WIFI_LOGE("userId write failed.");
99 return -1;
100 }
101
102 if (!data.WriteInt32(DEFAULT_INVAL_VALUE)) {
103 WIFI_LOGE("requestCode write failed.");
104 return -1;
105 }
106 uint32_t task = static_cast<uint32_t>(AAFwk::AbilityManagerInterfaceCode::START_ABILITY);
107 error = remote->SendRequest(task, data, reply, option);
108 if (error != NO_ERROR) {
109 WIFI_LOGE("Send request error: %{public}d", error);
110 return error;
111 }
112 return reply.ReadInt32();
113 }
114
ShowDialog(WifiDialogType type)115 void WifiNotificationUtil::ShowDialog(WifiDialogType type)
116 {
117 WIFI_LOGI("ShowDialog, type=%{public}d", static_cast<int32_t>(type));
118 AAFwk::Want want;
119 std::string bundleName = "com.ohos.sceneboard";
120 std::string abilityName = "com.ohos.sceneboard.systemdialog";
121 want.SetElementName(bundleName, abilityName);
122 nlohmann::json param;
123 param["ability.want.params.uiExtensionType"] = "sysDialog/common";
124 param["wifiDialogType"] = static_cast<int32_t>(type);
125 std::string cmdData = param.dump();
126 sptr<UIExtensionAbilityConnection> connection(
127 new (std::nothrow) UIExtensionAbilityConnection(cmdData, "com.ohos.locationdialog", "WifiUIExtAbility"));
128 if (connection == nullptr) {
129 WIFI_LOGE("connect UIExtensionAbilityConnection fail");
130 return;
131 }
132 std::string identity = IPCSkeleton::ResetCallingIdentity();
133 auto ret =
134 AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, connection, nullptr, -1);
135 WIFI_LOGI("connect service extension ability result = %{public}d", ret);
136 IPCSkeleton::SetCallingIdentity(identity);
137 }
138
ShowSettingsDialog(WifiDialogType type,std::string settings)139 void WifiNotificationUtil::ShowSettingsDialog(WifiDialogType type, std::string settings)
140 {
141 WIFI_LOGI("ShowSettingsDialog, type=%{public}d", static_cast<int32_t>(type));
142 AAFwk::Want want;
143 std::string bundleName = "com.ohos.sceneboard";
144 std::string abilityName = "com.ohos.sceneboard.systemdialog";
145 want.SetElementName(bundleName, abilityName);
146 nlohmann::json param;
147 param["ability.want.params.uiExtensionType"] = "sysDialog/common";
148 std::string cmdData = param.dump();
149 if (settings.empty()) {
150 WIFI_LOGI("settings name is null");
151 return;
152 }
153 sptr<UIExtensionAbilityConnection> connection(
154 new (std::nothrow) UIExtensionAbilityConnection(cmdData, settings, "WifiNotAvailableDialog"));
155 if (connection == nullptr) {
156 WIFI_LOGE("connect UIExtensionAbilityConnection fail");
157 return;
158 }
159 std::string identity = IPCSkeleton::ResetCallingIdentity();
160 auto ret =
161 AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, connection, nullptr, -1);
162 WIFI_LOGI("connect service extension ability result = %{public}d", ret);
163 IPCSkeleton::SetCallingIdentity(identity);
164 }
165
OnAbilityConnectDone(const AppExecFwk::ElementName & element,const sptr<IRemoteObject> & remoteObject,int32_t resultCode)166 void UIExtensionAbilityConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &element,
167 const sptr<IRemoteObject> &remoteObject, int32_t resultCode)
168 {
169 WIFI_LOGI("on ability connected");
170 MessageParcel data;
171 MessageParcel reply;
172 MessageOption option;
173 data.WriteInt32(SIGNAL_NUM);
174 data.WriteString16(u"bundleName");
175 data.WriteString16(Str8ToStr16(bundleName_));
176 data.WriteString16(u"abilityName");
177 data.WriteString16(Str8ToStr16(abilityName_));
178 data.WriteString16(u"parameters");
179 data.WriteString16(Str8ToStr16(commandStr_));
180
181 int32_t errCode = remoteObject->SendRequest(IAbilityConnection::ON_ABILITY_CONNECT_DONE, data, reply, option);
182 WIFI_LOGI("AbilityConnectionWrapperProxy::OnAbilityConnectDone result %{public}d", errCode);
183 }
184
OnAbilityDisconnectDone(const AppExecFwk::ElementName & element,int32_t resultCode)185 void UIExtensionAbilityConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int32_t resultCode)
186 {
187 WIFI_LOGI("on ability disconnected");
188 }
189 }
190 }