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(); }