Skip to content

Commit 8b139ce

Browse files
committed
Cleanup messy code
Still not working, but is more maintainable
1 parent 4bf6e5d commit 8b139ce

22 files changed

Lines changed: 319 additions & 270 deletions

File tree

android/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
group = "click.vpnclient.engine.flutter.vpnclient_engine_flutter"
1+
group = "click.vpnclient.engine.flutter"
22
version = "1.0-SNAPSHOT"
33

44
buildscript {
@@ -27,7 +27,7 @@ apply plugin: "com.android.library"
2727
apply plugin: "kotlin-android"
2828

2929
android {
30-
namespace = "click.vpnclient.engine.flutter.vpnclient_engine_flutter"
30+
namespace = "click.vpnclient.engine.flutter"
3131

3232
compileSdk = 35
3333

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="click.vpnclient.engine.flutter.vpnclient_engine_flutter">
2+
package="click.vpnclient.engine.flutter">
33
</manifest>

android/src/main/kotlin/click/vpnclient/engine/VpnclientEngineFlutterPlugin.kt renamed to android/src/main/kotlin/click/vpnclient/engine/VpnClientEngineFlutterPlugin.dart

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,33 @@ import 'package:vpnclient_engine_flutter/vpnclient_engine_flutter.dart';
66
import 'package:flutter/services.dart';
77
import 'package:flutter_v2ray/flutter_v2ray.dart';
88

9-
109
class AndroidVpnclientEngineFlutter extends VpnclientEngineFlutterPlatform {
11-
static const MethodChannel _channel = MethodChannel('vpnclient_engine_flutter');
10+
static const MethodChannel _channel = MethodChannel(
11+
'vpnclient_engine_flutter',
12+
);
1213
final FlutterV2ray _flutterV2ray = FlutterV2ray(
13-
onStatusChanged: (status) {
14-
switch (status) {
15-
case V2RayStatus.connected:
16-
_connectionStatusSubject.add(ConnectionStatus.connected);
17-
break;
18-
case V2RayStatus.connecting:
19-
_connectionStatusSubject.add(ConnectionStatus.connecting);
20-
break;
21-
case V2RayStatus.disconnected:
22-
_connectionStatusSubject.add(ConnectionStatus.disconnected);
23-
break;
24-
case V2RayStatus.error:
25-
_connectionStatusSubject.add(ConnectionStatus.error);
26-
break;
27-
}
28-
});
14+
onStatusChanged: (status) {
15+
switch (status) {
16+
case V2RayStatus.connected:
17+
_connectionStatusSubject.add(ConnectionStatus.connected);
18+
break;
19+
case V2RayStatus.connecting:
20+
_connectionStatusSubject.add(ConnectionStatus.connecting);
21+
break;
22+
case V2RayStatus.disconnected:
23+
_connectionStatusSubject.add(ConnectionStatus.disconnected);
24+
break;
25+
case V2RayStatus.error:
26+
_connectionStatusSubject.add(ConnectionStatus.error);
27+
break;
28+
}
29+
},
30+
);
2931

30-
static final _connectionStatusSubject = StreamController<ConnectionStatus>.broadcast();
31-
static final _statusStream = _connectionStatusSubject.stream.asBroadcastStream();
32+
static final _connectionStatusSubject =
33+
StreamController<ConnectionStatus>.broadcast();
34+
static final _statusStream =
35+
_connectionStatusSubject.stream.asBroadcastStream();
3236

3337
static void registerWith() {
3438
VpnclientEngineFlutterPlatform.instance = AndroidVpnclientEngineFlutter();
@@ -43,11 +47,14 @@ class AndroidVpnclientEngineFlutter extends VpnclientEngineFlutterPlatform {
4347
} else if (url.startsWith('wg://')) {
4448
_connectionStatusSubject.add(ConnectionStatus.connecting);
4549
await _startWireguard(url);
46-
} else if (url.startsWith('ovpn://')){
50+
} else if (url.startsWith('ovpn://')) {
4751
_connectionStatusSubject.add(ConnectionStatus.connecting);
4852
await _startOpenvpn(url);
49-
}else {
50-
VPNclientEngine.emitError(ErrorCode.unknownError, 'Invalid URL protocol');
53+
} else {
54+
VPNclientEngine.emitError(
55+
ErrorCode.unknownError,
56+
'Invalid URL protocol',
57+
);
5158
_connectionStatusSubject.add(ConnectionStatus.error);
5259
}
5360
} catch (e) {
@@ -71,7 +78,8 @@ class AndroidVpnclientEngineFlutter extends VpnclientEngineFlutterPlatform {
7178
_connectionStatusSubject.add(ConnectionStatus.error);
7279
}
7380
}
74-
Future<void> _startWireguard(String url) async {
81+
82+
Future<void> _startWireguard(String url) async {
7583
final parser = FlutterV2ray.parseFromURL(url);
7684
if (await _flutterV2ray.requestPermission()) {
7785
await _flutterV2ray.startV2Ray(
@@ -86,16 +94,20 @@ class AndroidVpnclientEngineFlutter extends VpnclientEngineFlutterPlatform {
8694
_connectionStatusSubject.add(ConnectionStatus.error);
8795
}
8896
}
89-
Future<void> _startOpenvpn(String url) async {
90-
VPNclientEngine.emitError(ErrorCode.unknownError, 'OpenVPN not implemented yet');
91-
_connectionStatusSubject.add(ConnectionStatus.error);
92-
}
97+
98+
Future<void> _startOpenvpn(String url) async {
99+
VPNclientEngine.emitError(
100+
ErrorCode.unknownError,
101+
'OpenVPN not implemented yet',
102+
);
103+
_connectionStatusSubject.add(ConnectionStatus.error);
104+
}
93105

94106
@override
95107
Future<void> disconnect() async {
96108
try {
97109
_connectionStatusSubject.add(ConnectionStatus.disconnected);
98-
if(await _flutterV2ray.isRunning()){
110+
if (await _flutterV2ray.isRunning()) {
99111
await _flutterV2ray.stopV2Ray();
100112
}
101113
} catch (e) {
@@ -109,6 +121,6 @@ class AndroidVpnclientEngineFlutter extends VpnclientEngineFlutterPlatform {
109121
return await _flutterV2ray.requestPermission();
110122
} catch (e) {
111123
return false;
112-
}
124+
}
113125
}
114-
}
126+
}

android/src/main/kotlin/click/vpnclient/engine/flutter/vpnclient_engine_flutter/VpnclientEngineFlutterPlugin.kt renamed to android/src/main/kotlin/click/vpnclient/engine/flutter/VpnClientEngineFlutterPlugin.kt

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
1-
package click.vpnclient.engine.flutter.vpnclient_engine_flutter
1+
package click.vpnclient.engine.flutter
22

33
import android.content.Context
4+
import android.util.Log
5+
import go.Seq
46
import io.flutter.embedding.engine.plugins.FlutterPlugin
57
import io.flutter.plugin.common.MethodCall
68
import io.flutter.plugin.common.MethodChannel
79
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
810
import io.flutter.plugin.common.MethodChannel.Result
9-
import go.Seq
10-
import android.util.Log
11-
12-
13-
14-
15-
16-
1711

1812
/**
1913
* VpnclientEngineFlutterPlugin
2014
* This class handles the communication between Flutter and native Android code
2115
* for managing VPN connections.
2216
*/
23-
class VpnclientEngineFlutterPlugin : FlutterPlugin, MethodCallHandler {
24-
/// The MethodChannel that will handle the communication between Flutter and native Android
17+
class VpnclientEngineFlutterPlugin :
18+
FlutterPlugin,
19+
MethodCallHandler {
20+
// / The MethodChannel that will handle the communication between Flutter and native Android
2521
private lateinit var channel: MethodChannel
2622
private lateinit var context: Context
27-
private val TAG = "VpnclientEngineFlutterPlugin"
2823

2924
private var singboxCore: SingBoxCore? = null
3025

@@ -34,7 +29,10 @@ class VpnclientEngineFlutterPlugin : FlutterPlugin, MethodCallHandler {
3429
context = flutterPluginBinding.applicationContext
3530
}
3631

37-
override fun onMethodCall(call: MethodCall, result: Result) {
32+
override fun onMethodCall(
33+
call: MethodCall,
34+
result: Result,
35+
) {
3836
when (call.method) {
3937
"startVPN" -> startVPN(call, result)
4038
"stopVPN" -> stopVPN(call, result)
@@ -52,7 +50,7 @@ class VpnclientEngineFlutterPlugin : FlutterPlugin, MethodCallHandler {
5250
try {
5351
singboxCore = SingBoxCore(config)
5452
} catch (e: Exception) {
55-
Log.e(TAG, "Failed to initialize sing-box", e)
53+
Log.e(packageName, "Failed to initialize sing-box", e)
5654
}
5755
}
5856

@@ -61,14 +59,17 @@ class VpnclientEngineFlutterPlugin : FlutterPlugin, MethodCallHandler {
6159
* @param call MethodCall containing the configuration.
6260
* @param result Result to send the success or error back to Flutter.
6361
*/
64-
private fun startVPN(call: MethodCall, result: Result) {
62+
private fun startVPN(
63+
call: MethodCall,
64+
result: Result,
65+
) {
6566
val config = call.argument<String>("config") ?: return result.error("NO_CONFIG", "Missing config", null)
6667
try {
6768
initSingbox(config)
6869
singboxCore?.start()
6970
result.success(true)
7071
} catch (e: Exception) {
71-
Log.e(TAG, "Failed to start sing-box", e)
72+
Log.e(packageName, "Failed to start sing-box", e)
7273
result.error("START_ERROR", "Failed to start sing-box", e.message)
7374
}
7475
}
@@ -77,30 +78,37 @@ class VpnclientEngineFlutterPlugin : FlutterPlugin, MethodCallHandler {
7778
* Stop the VPN connection.
7879
* @param result Result to send the success back to Flutter.
7980
*/
80-
private fun stopVPN(call: MethodCall, result: Result) {
81+
private fun stopVPN(
82+
call: MethodCall,
83+
result: Result,
84+
) {
8185
try {
8286
singboxCore?.stop()
8387
singboxCore = null // Release sing-box instance after stopping
8488
result.success(true)
8589
} catch (e: Exception) {
86-
Log.e(TAG, "Failed to stop sing-box", e)
90+
Log.e(packageName, "Failed to stop sing-box", e)
8791
result.error("STOP_ERROR", "Failed to stop sing-box", e.message)
8892
}
8993
}
9094

91-
private fun getStatus(call: MethodCall, result: Result) {
95+
private fun getStatus(
96+
call: MethodCall,
97+
result: Result,
98+
) {
9299
try {
93100
val status = singboxCore?.getStatus() ?: "stopped"
94101
result.success(status)
95102
} catch (e: Exception) {
96-
Log.e(TAG, "Failed to get sing-box status", e)
103+
Log.e(packageName, "Failed to get sing-box status", e)
97104
result.error(
98105
"STATUS_ERROR",
99106
"Failed to get sing-box status",
100-
e.message
107+
e.message,
101108
)
102109
}
103110
}
111+
104112
private fun getPlatformVersion(result: Result) {
105113
result.success("Android ${android.os.Build.VERSION.RELEASE}")
106114
}
@@ -110,19 +118,17 @@ class VpnclientEngineFlutterPlugin : FlutterPlugin, MethodCallHandler {
110118
}
111119
}
112120

113-
114-
115-
class SingBoxCore(config: String) {
116-
private val TAG = "SingBoxCore"
117-
121+
class SingBoxCore(
122+
config: String,
123+
) {
118124
init {
119125
try {
120126
// Initialize the Go runtime
121127
Seq.setContext(null)
122128
// Load the sing-box configuration from the provided string
123129
Singbox.setConfig(config)
124130
} catch (e: Exception) {
125-
Log.e(TAG, "Error initializing SingBox: ${e.message}")
131+
Log.e(packageName, "Error initializing SingBox: ${e.message}")
126132
throw e
127133
}
128134
}
@@ -139,7 +145,7 @@ class SingBoxCore(config: String) {
139145
throw Exception("Error starting SingBox: $err")
140146
}
141147
} catch (e: Exception) {
142-
Log.e(TAG, "Error starting SingBox: ${e.message}")
148+
Log.e(packageName, "Error starting SingBox: ${e.message}")
143149
throw e
144150
}
145151
}
@@ -153,12 +159,10 @@ class SingBoxCore(config: String) {
153159
// Stop the SingBox core
154160
Singbox.stop()
155161
} catch (e: Exception) {
156-
Log.e(TAG, "Error stopping SingBox: ${e.message}")
162+
Log.e(packageName, "Error stopping SingBox: ${e.message}")
157163
throw e
158164
}
159165
}
160166

161-
fun getStatus(): String {
162-
return Singbox.getStatus()
163-
}
167+
fun getStatus(): String = Singbox.getStatus()
164168
}

android/src/test/kotlin/click/vpnclient/engine/flutter/vpnclient_engine_flutter/VpnclientEngineFlutterPluginTest.kt renamed to android/src/test/kotlin/click/vpnclient/engine/flutter/VpnclientEngineFlutterPluginTest.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package click.vpnclient.engine.flutter.vpnclient_engine_flutter
1+
package click.vpnclient.engine.flutter
22

33
import io.flutter.plugin.common.MethodCall
44
import io.flutter.plugin.common.MethodChannel
5-
import kotlin.test.Test
65
import org.mockito.Mockito
6+
import kotlin.test.Test
77

88
/*
99
* This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation.
@@ -14,14 +14,14 @@ import org.mockito.Mockito
1414
*/
1515

1616
internal class VpnclientEngineFlutterPluginTest {
17-
@Test
18-
fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
19-
val plugin = VpnclientEngineFlutterPlugin()
17+
@Test
18+
fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
19+
val plugin = VpnclientEngineFlutterPlugin()
2020

21-
val call = MethodCall("getPlatformVersion", null)
22-
val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java)
23-
plugin.onMethodCall(call, mockResult)
21+
val call = MethodCall("getPlatformVersion", null)
22+
val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java)
23+
plugin.onMethodCall(call, mockResult)
2424

25-
Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE)
26-
}
25+
Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE)
26+
}
2727
}

example/android/app/build.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ plugins {
66
}
77

88
android {
9-
namespace = "click.vpnclient.engine.flutter.vpnclient_engine_flutter_example"
9+
namespace = "click.vpnclient.engine.flutter.example"
1010
compileSdk = flutter.compileSdkVersion
11-
ndkVersion = flutter.ndkVersion
1211

1312
compileOptions {
1413
sourceCompatibility = JavaVersion.VERSION_11
@@ -21,7 +20,7 @@ android {
2120

2221
defaultConfig {
2322
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
24-
applicationId = "click.vpnclient.engine.flutter.vpnclient_engine_flutter_example"
23+
applicationId = "click.vpnclient.engine.flutter.example"
2524
// You can update the following values to match your application needs.
2625
// For more information, see: https://flutter.dev/to/review-gradle-config.
2726
minSdk = flutter.minSdkVersion

example/android/app/src/main/kotlin/click/vpnclient/engine/flutter/vpnclient_engine_flutter_example/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package click.vpnclient.engine.flutter.vpnclient_engine_flutter_example
1+
package click.vpnclient.engine.flutter.example
22

33
import io.flutter.embedding.android.FlutterActivity
44

example/integration_test/plugin_integration_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
// For more information about Flutter integration tests, please see
77
// https://flutter.dev/to/integration-testing
88

9-
109
import 'package:flutter_test/flutter_test.dart';
1110
import 'package:integration_test/integration_test.dart';
1211

0 commit comments

Comments
 (0)