@@ -24,6 +24,21 @@ class FailureCodes {
24
24
static int FAILED_TO_BIND_CONFIG = 4 ;
25
25
}
26
26
27
+ class IOTWifiCallback {
28
+ private Callback callback ;
29
+
30
+ public IOTWifiCallback (Callback callback ) {
31
+ this .callback = callback ;
32
+ }
33
+
34
+ public void invoke (Object ... args ) {
35
+ if (callback == null ) return ;
36
+ callback .invoke (args );
37
+ callback = null ;
38
+ }
39
+ }
40
+
41
+
27
42
public class IOTWifiModule extends ReactContextBaseJavaModule {
28
43
private WifiManager wifiManager ;
29
44
private ConnectivityManager connectivityManager ;
@@ -67,13 +82,10 @@ public void run() {
67
82
}).start ();
68
83
}
69
84
70
- private void connectToWifi (String ssid , String passphrase , Boolean isWEP , Boolean bindNetwork , Callback callback ) {
71
- if (Build .VERSION .SDK_INT > 28 ) {
72
- callback .invoke ("Not supported on Android Q" );
73
- return ;
74
- }
85
+ private void connectToWifi (String ssid , String passphrase , Boolean isWEP , Boolean bindNetwork , final Callback callback ) {
86
+ IOTWifiCallback iotWifiCallback = new IOTWifiCallback (callback );
75
87
if (!removeSSID (ssid )) {
76
- callback .invoke (errorFromCode (FailureCodes .SYSTEM_ADDED_CONFIG_EXISTS ));
88
+ iotWifiCallback .invoke (errorFromCode (FailureCodes .SYSTEM_ADDED_CONFIG_EXISTS ));
77
89
return ;
78
90
}
79
91
@@ -85,7 +97,7 @@ private void connectToWifi(String ssid, String passphrase, Boolean isWEP, Boolea
85
97
wifiManager .disconnect ();
86
98
boolean success = wifiManager .enableNetwork (networkId , true );
87
99
if (!success ) {
88
- callback .invoke (errorFromCode (FailureCodes .FAILED_TO_ADD_CONFIG ));
100
+ iotWifiCallback .invoke (errorFromCode (FailureCodes .FAILED_TO_CONNECT ));
89
101
return ;
90
102
}
91
103
success = wifiManager .reconnect ();
@@ -95,21 +107,21 @@ private void connectToWifi(String ssid, String passphrase, Boolean isWEP, Boolea
95
107
}
96
108
boolean connected = pollForValidSSSID (10 , ssid );
97
109
if (!connected ) {
98
- callback .invoke (errorFromCode (FailureCodes .FAILED_TO_CONNECT ));
110
+ iotWifiCallback .invoke (errorFromCode (FailureCodes .FAILED_TO_CONNECT ));
99
111
return ;
100
112
}
101
113
if (!bindNetwork ) {
102
- callback .invoke ();
114
+ iotWifiCallback .invoke ();
103
115
return ;
104
116
}
105
117
try {
106
- bindToNetwork (ssid , callback );
118
+ bindToNetwork (ssid , iotWifiCallback );
107
119
} catch (Exception e ) {
108
120
Log .d ("IoTWifi" , "Failed to bind to Wifi: " + ssid );
109
- callback .invoke ();
121
+ iotWifiCallback .invoke ();
110
122
}
111
123
} else {
112
- callback .invoke (errorFromCode (FailureCodes .FAILED_TO_ADD_CONFIG ));
124
+ iotWifiCallback .invoke (errorFromCode (FailureCodes .FAILED_TO_ADD_CONFIG ));
113
125
}
114
126
}
115
127
@@ -149,7 +161,7 @@ private boolean pollForValidSSSID(int maxSeconds, String expectedSSID) {
149
161
return false ;
150
162
}
151
163
152
- private void bindToNetwork (final String ssid , final Callback callback ) {
164
+ private void bindToNetwork (final String ssid , final IOTWifiCallback callback ) {
153
165
NetworkRequest .Builder builder = new NetworkRequest .Builder ();
154
166
builder .addTransportType (NetworkCapabilities .TRANSPORT_WIFI );
155
167
connectivityManager .requestNetwork (builder .build (), new ConnectivityManager .NetworkCallback () {
@@ -218,7 +230,10 @@ private boolean removeSSID(String ssid) {
218
230
if (existingNetworkId == -1 ) {
219
231
return success ;
220
232
}
221
- success = wifiManager .removeNetwork (existingNetworkId ) && wifiManager .saveConfiguration ();
233
+ success = wifiManager .removeNetwork (existingNetworkId );
234
+ if (success && Build .VERSION .SDK_INT < Build .VERSION_CODES .O ) {
235
+ success = wifiManager .saveConfiguration ();
236
+ }
222
237
//If not our config then success would be false
223
238
return success ;
224
239
}
@@ -253,7 +268,9 @@ private WifiConfiguration getExistingNetworkConfig(String ssid) {
253
268
String comparableSSID = ('"' + ssid + '"' ); // Add quotes because wifiConfig.SSID has them
254
269
if (configList != null ) {
255
270
for (WifiConfiguration wifiConfig : configList ) {
256
- if (wifiConfig .SSID != null && wifiConfig .SSID .equals (comparableSSID )) {
271
+ String savedSSID = wifiConfig .SSID ;
272
+ if (savedSSID == null ) continue ; // In few cases SSID is found to be null, ignore those configs
273
+ if (savedSSID .equals (comparableSSID )) {
257
274
Log .d ("IoTWifi" , "Found Matching Wifi: " + wifiConfig .toString ());
258
275
existingNetworkConfigForSSID = wifiConfig ;
259
276
break ;
0 commit comments