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 }