diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index dad0f9413..d11729ac4 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -89,6 +89,16 @@
+
+
+
+
+
+
{
+ val mode = intent.getStringExtra("mode")
+ if (mode != null) {
+ GlobalState.handleChangeMode(mode)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt b/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt
index f47ff5790..ca3ffc862 100644
--- a/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt
+++ b/android/app/src/main/kotlin/com/follow/clash/GlobalState.kt
@@ -89,6 +89,10 @@ object GlobalState {
}
}
+ fun handleChangeMode(modeKey: String) {
+ getCurrentAppPlugin()?.changeMode(modeKey)
+ }
+
fun handleTryDestroy() {
if (flutterEngine == null) {
destroyServiceEngine()
diff --git a/android/app/src/main/kotlin/com/follow/clash/plugins/AppPlugin.kt b/android/app/src/main/kotlin/com/follow/clash/plugins/AppPlugin.kt
index 757c193dc..93da7c39f 100644
--- a/android/app/src/main/kotlin/com/follow/clash/plugins/AppPlugin.kt
+++ b/android/app/src/main/kotlin/com/follow/clash/plugins/AppPlugin.kt
@@ -427,6 +427,10 @@ class AppPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAware
return false
}
+ fun changeMode(modeKey: String) {
+ channel.invokeMethod("changeMode", modeKey)
+ }
+
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activityRef = WeakReference(binding.activity)
binding.addActivityResultListener(::onActivityResult)
diff --git a/lib/enum/enum.dart b/lib/enum/enum.dart
index f2751f098..2cc4057ec 100644
--- a/lib/enum/enum.dart
+++ b/lib/enum/enum.dart
@@ -87,7 +87,20 @@ extension UsedProxyExtension on UsedProxy {
String get value => UsedProxyExtension.valueList[index];
}
-enum Mode { rule, global, direct }
+enum Mode {
+ rule,
+ global,
+ direct;
+
+ static Mode fromString(String mode) {
+ return switch (mode) {
+ "rule" => Mode.rule,
+ "global" => Mode.global,
+ "direct" => Mode.direct,
+ String() => throw UnimplementedError(),
+ };
+ }
+}
enum ViewMode { mobile, laptop, desktop }
diff --git a/lib/plugins/app.dart b/lib/plugins/app.dart
index 19d0edbfe..79349ed5e 100644
--- a/lib/plugins/app.dart
+++ b/lib/plugins/app.dart
@@ -4,7 +4,10 @@ import 'dart:io';
import 'dart:isolate';
import 'package:fl_clash/common/app_localizations.dart';
+import 'package:fl_clash/common/print.dart';
+import 'package:fl_clash/enum/enum.dart';
import 'package:fl_clash/models/models.dart';
+import 'package:fl_clash/state.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
@@ -28,6 +31,14 @@ class App {
} catch (_) {
return "";
}
+ case "changeMode":
+ if (call.arguments is String) {
+ commonPrint.log("change mode to ${call.arguments}");
+ globalState.appController
+ .changeMode(Mode.fromString(call.arguments as String));
+ await globalState.appController.savePreferences();
+ }
+ break;
default:
throw MissingPluginException();
}