Skip to content

Commit e0fa625

Browse files
Merge pull request #50 from mysteriumnetwork/refactor/init-tunnel
Init Android tunnel + Permissions request
2 parents 77d87c7 + 41a1347 commit e0fa625

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

android/src/main/kotlin/network/mysterium/wireguard_dart/WireguardDartPlugin.kt

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class WireguardDartPlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
4444
private var activity: Activity? = null
4545
private var config: com.wireguard.config.Config? = null
4646
private var tunnel: WireguardTunnel? = null
47+
private var tunnelName: String? = null
48+
private var permissionsResultCallback: Result? = null
4749
private var status: ConnectionStatus = ConnectionStatus.disconnected
4850
set(value) {
4951
field = value
@@ -59,6 +61,16 @@ class WireguardDartPlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
5961
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
6062
if (requestCode == PERMISSIONS_REQUEST_CODE) {
6163
havePermission = resultCode == Activity.RESULT_OK
64+
if (havePermission) {
65+
permissionsResultCallback?.success(null)
66+
} else {
67+
permissionsResultCallback?.error(
68+
"err_setup_tunnel",
69+
"Permissions are not given",
70+
null
71+
)
72+
73+
}
6274
}
6375
return havePermission
6476
}
@@ -128,13 +140,14 @@ class WireguardDartPlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
128140
"nativeInit" -> result.success("")
129141
"generateKeyPair" -> generateKeyPair(result)
130142
"setupTunnel" -> setupTunnel(
131-
call.argument<String>("bundleId").toString(),
132143
call.argument<String>("tunnelName").toString(),
133144
result
134145
)
146+
135147
"checkTunnelConfiguration" -> {
136-
checkTunnelConfiguration(result)
148+
checkTunnelConfiguration(call.argument<String>("tunnelName").toString(), result)
137149
}
150+
138151
"connect" -> connect(call.argument<String>("cfg").toString(), result)
139152
"disconnect" -> disconnect(result)
140153
"status" -> status(result)
@@ -143,9 +156,12 @@ class WireguardDartPlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
143156
}
144157
}
145158

146-
private fun checkTunnelConfiguration(result: MethodChannel.Result) {
159+
private fun checkTunnelConfiguration(tunnelName: String, result: Result) {
147160
val intent = GoBackend.VpnService.prepare(this.activity)
148161
havePermission = intent == null
162+
if (havePermission) {
163+
initTunnel(tunnelName)
164+
}
149165
return result.success(havePermission)
150166
}
151167

@@ -159,21 +175,27 @@ class WireguardDartPlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
159175
)
160176
}
161177

162-
private fun setupTunnel(bundleId: String, tunnelName: String, result: Result) {
178+
private fun setupTunnel(tunnelName: String, result: Result) {
163179
scope.launch(Dispatchers.IO) {
164180
if (Tunnel.isNameInvalid(tunnelName)) {
165181
flutterError(result, "Tunnel name is invalid")
166182
return@launch
167183
}
184+
permissionsResultCallback = result
168185
checkPermission()
169-
tunnel = WireguardTunnel(tunnelName) { state ->
170-
status = ConnectionStatus.fromTunnelState(state)
171-
}
172-
status = ConnectionStatus.fromTunnelState(backend?.getState(tunnel!!))
173-
result.success(null)
186+
initTunnel(tunnelName)
174187
}
175188
}
176189

190+
private fun initTunnel(tunnelName: String) {
191+
this.tunnelName = tunnelName
192+
tunnel = WireguardTunnel(tunnelName) { state ->
193+
status = ConnectionStatus.fromTunnelState(state)
194+
}
195+
status = ConnectionStatus.fromTunnelState(backend?.getState(tunnel!!))
196+
}
197+
198+
177199
private fun connect(cfg: String, result: Result) {
178200
val tun = tunnel ?: run {
179201
result.error("err_setup_tunnel", "Tunnel is not initialized", null)
@@ -188,7 +210,7 @@ class WireguardDartPlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
188210
}
189211
val inputStream = ByteArrayInputStream(cfg.toByteArray())
190212
config = com.wireguard.config.Config.parse(inputStream)
191-
futureBackend.await().setState(tun, Tunnel.State.UP, config);
213+
futureBackend.await().setState(tun, Tunnel.State.UP, config)
192214
flutterSuccess(result, "")
193215
} catch (e: Throwable) {
194216
Log.e(TAG, "Connect - Can't connect to tunnel: $e", e)

0 commit comments

Comments
 (0)