@capgo/capacitor-wifi 8.0.5 → 8.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -44,7 +44,7 @@ import java.util.List;
|
|
|
44
44
|
)
|
|
45
45
|
public class CapacitorWifiPlugin extends Plugin {
|
|
46
46
|
|
|
47
|
-
private final String pluginVersion = "8.0.
|
|
47
|
+
private final String pluginVersion = "8.0.6";
|
|
48
48
|
|
|
49
49
|
private WifiManager wifiManager;
|
|
50
50
|
private ConnectivityManager connectivityManager;
|
|
@@ -6,7 +6,7 @@ import CoreLocation
|
|
|
6
6
|
|
|
7
7
|
@objc(CapacitorWifiPlugin)
|
|
8
8
|
public class CapacitorWifiPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
9
|
-
private let pluginVersion: String = "8.0.
|
|
9
|
+
private let pluginVersion: String = "8.0.6"
|
|
10
10
|
public let identifier = "CapacitorWifiPlugin"
|
|
11
11
|
public let jsName = "CapacitorWifi"
|
|
12
12
|
public let pluginMethods: [CAPPluginMethod] = [
|
package/package.json
CHANGED
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
package app.capgo.capacitorwifi;
|
|
2
|
-
|
|
3
|
-
import android.Manifest;
|
|
4
|
-
import android.content.BroadcastReceiver;
|
|
5
|
-
import android.content.Context;
|
|
6
|
-
import android.content.Intent;
|
|
7
|
-
import android.content.IntentFilter;
|
|
8
|
-
import android.net.ConnectivityManager;
|
|
9
|
-
import android.net.Network;
|
|
10
|
-
import android.net.NetworkCapabilities;
|
|
11
|
-
import android.net.NetworkRequest;
|
|
12
|
-
import android.net.NetworkSpecifier;
|
|
13
|
-
import android.net.wifi.ScanResult;
|
|
14
|
-
import android.net.wifi.WifiConfiguration;
|
|
15
|
-
import android.net.wifi.WifiManager;
|
|
16
|
-
import android.net.wifi.WifiNetworkSpecifier;
|
|
17
|
-
import android.os.Build;
|
|
18
|
-
import android.provider.Settings;
|
|
19
|
-
import androidx.annotation.NonNull;
|
|
20
|
-
import androidx.annotation.RequiresApi;
|
|
21
|
-
import com.getcapacitor.JSArray;
|
|
22
|
-
import com.getcapacitor.JSObject;
|
|
23
|
-
import com.getcapacitor.PermissionState;
|
|
24
|
-
import com.getcapacitor.Plugin;
|
|
25
|
-
import com.getcapacitor.PluginCall;
|
|
26
|
-
import com.getcapacitor.PluginMethod;
|
|
27
|
-
import com.getcapacitor.annotation.CapacitorPlugin;
|
|
28
|
-
import com.getcapacitor.annotation.Permission;
|
|
29
|
-
import com.getcapacitor.annotation.PermissionCallback;
|
|
30
|
-
import java.net.InetAddress;
|
|
31
|
-
import java.net.NetworkInterface;
|
|
32
|
-
import java.util.Enumeration;
|
|
33
|
-
import java.util.List;
|
|
34
|
-
|
|
35
|
-
@CapacitorPlugin(
|
|
36
|
-
name = "CapacitorWifi",
|
|
37
|
-
permissions = {
|
|
38
|
-
@Permission(
|
|
39
|
-
alias = "location",
|
|
40
|
-
strings = {
|
|
41
|
-
Manifest.permission.ACCESS_FINE_LOCATION,
|
|
42
|
-
Manifest.permission.ACCESS_COARSE_LOCATION,
|
|
43
|
-
Manifest.permission.ACCESS_WIFI_STATE,
|
|
44
|
-
Manifest.permission.CHANGE_WIFI_STATE
|
|
45
|
-
}
|
|
46
|
-
)
|
|
47
|
-
}
|
|
48
|
-
)
|
|
49
|
-
public class CapacitorWifiPlugin extends Plugin {
|
|
50
|
-
|
|
51
|
-
private final String pluginVersion = "7.0.0";
|
|
52
|
-
private WifiManager wifiManager;
|
|
53
|
-
private ConnectivityManager connectivityManager;
|
|
54
|
-
private BroadcastReceiver scanResultsReceiver;
|
|
55
|
-
private ConnectivityManager.NetworkCallback networkCallback;
|
|
56
|
-
|
|
57
|
-
@Override
|
|
58
|
-
public void load() {
|
|
59
|
-
wifiManager = (WifiManager) getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
|
|
60
|
-
connectivityManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
|
61
|
-
|
|
62
|
-
// Set up scan results receiver
|
|
63
|
-
scanResultsReceiver = new BroadcastReceiver() {
|
|
64
|
-
@Override
|
|
65
|
-
public void onReceive(Context context, Intent intent) {
|
|
66
|
-
notifyListeners("networksScanned", new JSObject());
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
@PluginMethod
|
|
72
|
-
public void addNetwork(PluginCall call) {
|
|
73
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
74
|
-
// Android 10+ - use system dialog
|
|
75
|
-
addNetworkModern(call);
|
|
76
|
-
} else {
|
|
77
|
-
// Pre-Android 10 - programmatic approach
|
|
78
|
-
addNetworkLegacy(call);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
@RequiresApi(api = Build.VERSION_CODES.Q)
|
|
83
|
-
private void addNetworkModern(PluginCall call) {
|
|
84
|
-
String ssid = call.getString("ssid");
|
|
85
|
-
if (ssid == null) {
|
|
86
|
-
call.reject("SSID is required");
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Open WiFi settings with SSID
|
|
91
|
-
Intent intent = new Intent(Settings.ACTION_WIFI_ADD_NETWORKS);
|
|
92
|
-
intent.putExtra(Settings.EXTRA_WIFI_NETWORK_LIST, new String[] { ssid });
|
|
93
|
-
getActivity().startActivity(intent);
|
|
94
|
-
call.resolve();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
private void addNetworkLegacy(PluginCall call) {
|
|
98
|
-
String ssid = call.getString("ssid");
|
|
99
|
-
String password = call.getString("password");
|
|
100
|
-
Boolean isHidden = call.getBoolean("isHiddenSsid", false);
|
|
101
|
-
|
|
102
|
-
if (ssid == null) {
|
|
103
|
-
call.reject("SSID is required");
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (getPermissionState("location") != PermissionState.GRANTED) {
|
|
108
|
-
requestPermissionForAlias("location", call, "addNetworkCallback");
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
WifiConfiguration config = new WifiConfiguration();
|
|
113
|
-
config.SSID = "\"" + ssid + "\"";
|
|
114
|
-
config.hiddenSSID = isHidden;
|
|
115
|
-
|
|
116
|
-
if (password != null && !password.isEmpty()) {
|
|
117
|
-
config.preSharedKey = "\"" + password + "\"";
|
|
118
|
-
} else {
|
|
119
|
-
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
int netId = wifiManager.addNetwork(config);
|
|
123
|
-
if (netId == -1) {
|
|
124
|
-
call.reject("Failed to add network");
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
boolean enabled = wifiManager.enableNetwork(netId, true);
|
|
129
|
-
if (!enabled) {
|
|
130
|
-
call.reject("Failed to enable network");
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
call.resolve();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
@PermissionCallback
|
|
138
|
-
private void addNetworkCallback(PluginCall call) {
|
|
139
|
-
if (getPermissionState("location") == PermissionState.GRANTED) {
|
|
140
|
-
addNetworkLegacy(call);
|
|
141
|
-
} else {
|
|
142
|
-
call.reject("Location permission is required");
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
@PluginMethod
|
|
147
|
-
public void connect(PluginCall call) {
|
|
148
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
149
|
-
connectModern(call);
|
|
150
|
-
} else {
|
|
151
|
-
connectLegacy(call);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
@RequiresApi(api = Build.VERSION_CODES.Q)
|
|
156
|
-
private void connectModern(PluginCall call) {
|
|
157
|
-
String ssid = call.getString("ssid");
|
|
158
|
-
String password = call.getString("password");
|
|
159
|
-
|
|
160
|
-
if (ssid == null) {
|
|
161
|
-
call.reject("SSID is required");
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
WifiNetworkSpecifier.Builder specifierBuilder = new WifiNetworkSpecifier.Builder().setSsid(ssid);
|
|
166
|
-
|
|
167
|
-
if (password != null && !password.isEmpty()) {
|
|
168
|
-
specifierBuilder.setWpa2Passphrase(password);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
NetworkSpecifier specifier = specifierBuilder.build();
|
|
172
|
-
|
|
173
|
-
NetworkRequest request = new NetworkRequest.Builder()
|
|
174
|
-
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
|
175
|
-
.setNetworkSpecifier(specifier)
|
|
176
|
-
.build();
|
|
177
|
-
|
|
178
|
-
networkCallback = new ConnectivityManager.NetworkCallback() {
|
|
179
|
-
@Override
|
|
180
|
-
public void onAvailable(@NonNull Network network) {
|
|
181
|
-
super.onAvailable(network);
|
|
182
|
-
call.resolve();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
@Override
|
|
186
|
-
public void onUnavailable() {
|
|
187
|
-
super.onUnavailable();
|
|
188
|
-
call.reject("Network unavailable");
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
connectivityManager.requestNetwork(request, networkCallback);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
private void connectLegacy(PluginCall call) {
|
|
196
|
-
addNetworkLegacy(call);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
@PluginMethod
|
|
200
|
-
public void disconnect(PluginCall call) {
|
|
201
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
202
|
-
if (networkCallback != null) {
|
|
203
|
-
connectivityManager.unregisterNetworkCallback(networkCallback);
|
|
204
|
-
networkCallback = null;
|
|
205
|
-
}
|
|
206
|
-
} else {
|
|
207
|
-
wifiManager.disconnect();
|
|
208
|
-
}
|
|
209
|
-
call.resolve();
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
@PluginMethod
|
|
213
|
-
public void getAvailableNetworks(PluginCall call) {
|
|
214
|
-
if (getPermissionState("location") != PermissionState.GRANTED) {
|
|
215
|
-
requestPermissionForAlias("location", call, "getAvailableNetworksCallback");
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
getAvailableNetworksWithPermission(call);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
@PermissionCallback
|
|
223
|
-
private void getAvailableNetworksCallback(PluginCall call) {
|
|
224
|
-
if (getPermissionState("location") == PermissionState.GRANTED) {
|
|
225
|
-
getAvailableNetworksWithPermission(call);
|
|
226
|
-
} else {
|
|
227
|
-
call.reject("Location permission is required");
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
private void getAvailableNetworksWithPermission(PluginCall call) {
|
|
232
|
-
List<ScanResult> results = wifiManager.getScanResults();
|
|
233
|
-
JSArray networks = new JSArray();
|
|
234
|
-
|
|
235
|
-
for (ScanResult result : results) {
|
|
236
|
-
JSObject network = new JSObject();
|
|
237
|
-
network.put("ssid", result.SSID);
|
|
238
|
-
network.put("rssi", result.level);
|
|
239
|
-
|
|
240
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
241
|
-
JSArray securityTypes = new JSArray();
|
|
242
|
-
// Add security types based on capabilities
|
|
243
|
-
String capabilities = result.capabilities;
|
|
244
|
-
if (capabilities.contains("WPA3")) {
|
|
245
|
-
securityTypes.put(4); // SAE
|
|
246
|
-
} else if (capabilities.contains("WPA2")) {
|
|
247
|
-
securityTypes.put(2); // WPA2_PSK
|
|
248
|
-
} else if (capabilities.contains("WPA")) {
|
|
249
|
-
securityTypes.put(2); // WPA2_PSK
|
|
250
|
-
} else if (capabilities.contains("WEP")) {
|
|
251
|
-
securityTypes.put(1); // WEP
|
|
252
|
-
} else {
|
|
253
|
-
securityTypes.put(0); // OPEN
|
|
254
|
-
}
|
|
255
|
-
network.put("securityTypes", securityTypes);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
networks.put(network);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
JSObject result = new JSObject();
|
|
262
|
-
result.put("networks", networks);
|
|
263
|
-
call.resolve(result);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
@PluginMethod
|
|
267
|
-
public void getIpAddress(PluginCall call) {
|
|
268
|
-
try {
|
|
269
|
-
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
|
|
270
|
-
NetworkInterface intf = en.nextElement();
|
|
271
|
-
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
|
|
272
|
-
InetAddress inetAddress = enumIpAddr.nextElement();
|
|
273
|
-
if (!inetAddress.isLoopbackAddress() && inetAddress.getAddress().length == 4) {
|
|
274
|
-
String ip = inetAddress.getHostAddress();
|
|
275
|
-
JSObject result = new JSObject();
|
|
276
|
-
result.put("ipAddress", ip);
|
|
277
|
-
call.resolve(result);
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
call.reject("No IP address found");
|
|
283
|
-
} catch (Exception e) {
|
|
284
|
-
call.reject("Failed to get IP address", e);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
@PluginMethod
|
|
289
|
-
public void getRssi(PluginCall call) {
|
|
290
|
-
if (getPermissionState("location") != PermissionState.GRANTED) {
|
|
291
|
-
requestPermissionForAlias("location", call, "getRssiCallback");
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
getRssiWithPermission(call);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
@PermissionCallback
|
|
299
|
-
private void getRssiCallback(PluginCall call) {
|
|
300
|
-
if (getPermissionState("location") == PermissionState.GRANTED) {
|
|
301
|
-
getRssiWithPermission(call);
|
|
302
|
-
} else {
|
|
303
|
-
call.reject("Location permission is required");
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
private void getRssiWithPermission(PluginCall call) {
|
|
308
|
-
android.net.wifi.WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
|
309
|
-
int rssi = wifiInfo.getRssi();
|
|
310
|
-
|
|
311
|
-
JSObject result = new JSObject();
|
|
312
|
-
result.put("rssi", rssi);
|
|
313
|
-
call.resolve(result);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
@PluginMethod
|
|
317
|
-
public void getSsid(PluginCall call) {
|
|
318
|
-
if (getPermissionState("location") != PermissionState.GRANTED) {
|
|
319
|
-
requestPermissionForAlias("location", call, "getSsidCallback");
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
getSsidWithPermission(call);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
@PermissionCallback
|
|
327
|
-
private void getSsidCallback(PluginCall call) {
|
|
328
|
-
if (getPermissionState("location") == PermissionState.GRANTED) {
|
|
329
|
-
getSsidWithPermission(call);
|
|
330
|
-
} else {
|
|
331
|
-
call.reject("Location permission is required");
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
private void getSsidWithPermission(PluginCall call) {
|
|
336
|
-
android.net.wifi.WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
|
337
|
-
String ssid = wifiInfo.getSSID();
|
|
338
|
-
|
|
339
|
-
// Remove quotes if present
|
|
340
|
-
if (ssid.startsWith("\"") && ssid.endsWith("\"")) {
|
|
341
|
-
ssid = ssid.substring(1, ssid.length() - 1);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
JSObject result = new JSObject();
|
|
345
|
-
result.put("ssid", ssid);
|
|
346
|
-
call.resolve(result);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
@PluginMethod
|
|
350
|
-
public void isEnabled(PluginCall call) {
|
|
351
|
-
boolean enabled = wifiManager.isWifiEnabled();
|
|
352
|
-
|
|
353
|
-
JSObject result = new JSObject();
|
|
354
|
-
result.put("enabled", enabled);
|
|
355
|
-
call.resolve(result);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
@PluginMethod
|
|
359
|
-
public void startScan(PluginCall call) {
|
|
360
|
-
if (getPermissionState("location") != PermissionState.GRANTED) {
|
|
361
|
-
requestPermissionForAlias("location", call, "startScanCallback");
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
startScanWithPermission(call);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
@PermissionCallback
|
|
369
|
-
private void startScanCallback(PluginCall call) {
|
|
370
|
-
if (getPermissionState("location") == PermissionState.GRANTED) {
|
|
371
|
-
startScanWithPermission(call);
|
|
372
|
-
} else {
|
|
373
|
-
call.reject("Location permission is required");
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
private void startScanWithPermission(PluginCall call) {
|
|
378
|
-
// Register receiver
|
|
379
|
-
getContext().registerReceiver(scanResultsReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
|
|
380
|
-
|
|
381
|
-
boolean success = wifiManager.startScan();
|
|
382
|
-
if (success) {
|
|
383
|
-
call.resolve();
|
|
384
|
-
} else {
|
|
385
|
-
call.reject("Failed to start scan");
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
@PluginMethod
|
|
390
|
-
public void checkPermissions(PluginCall call) {
|
|
391
|
-
JSObject result = new JSObject();
|
|
392
|
-
result.put("location", getPermissionState("location").toString().toLowerCase());
|
|
393
|
-
call.resolve(result);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
@PluginMethod
|
|
397
|
-
public void requestPermissions(PluginCall call) {
|
|
398
|
-
if (getPermissionState("location") == PermissionState.GRANTED) {
|
|
399
|
-
JSObject result = new JSObject();
|
|
400
|
-
result.put("location", "granted");
|
|
401
|
-
call.resolve(result);
|
|
402
|
-
} else {
|
|
403
|
-
requestPermissionForAlias("location", call, "permissionsCallback");
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
@PermissionCallback
|
|
408
|
-
private void permissionsCallback(PluginCall call) {
|
|
409
|
-
JSObject result = new JSObject();
|
|
410
|
-
result.put("location", getPermissionState("location").toString().toLowerCase());
|
|
411
|
-
call.resolve(result);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
@PluginMethod
|
|
415
|
-
public void getPluginVersion(final PluginCall call) {
|
|
416
|
-
try {
|
|
417
|
-
final JSObject result = new JSObject();
|
|
418
|
-
result.put("version", this.pluginVersion);
|
|
419
|
-
call.resolve(result);
|
|
420
|
-
} catch (final Exception e) {
|
|
421
|
-
call.reject("Could not get plugin version", e);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
@Override
|
|
426
|
-
protected void handleOnDestroy() {
|
|
427
|
-
try {
|
|
428
|
-
if (scanResultsReceiver != null) {
|
|
429
|
-
getContext().unregisterReceiver(scanResultsReceiver);
|
|
430
|
-
}
|
|
431
|
-
if (networkCallback != null) {
|
|
432
|
-
connectivityManager.unregisterNetworkCallback(networkCallback);
|
|
433
|
-
}
|
|
434
|
-
} catch (Exception e) {
|
|
435
|
-
// Receiver might not be registered
|
|
436
|
-
}
|
|
437
|
-
super.handleOnDestroy();
|
|
438
|
-
}
|
|
439
|
-
}
|