diff --git a/app/src/main/java/com/github/kr328/clash/MainActivity.kt b/app/src/main/java/com/github/kr328/clash/MainActivity.kt index c4237906b2..936d11ec14 100644 --- a/app/src/main/java/com/github/kr328/clash/MainActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/MainActivity.kt @@ -23,8 +23,16 @@ import kotlinx.coroutines.selects.select import kotlinx.coroutines.withContext import java.util.concurrent.TimeUnit import com.github.kr328.clash.design.R +import com.github.kr328.clash.core.model.TunnelState +import com.github.kr328.clash.core.Clash class MainActivity : BaseActivity() { + private val modeMap = mapOf( + MainDesign.Request.ToggleDirectMode to TunnelState.Mode.Direct, + MainDesign.Request.ToggleGlobalMode to TunnelState.Mode.Global, + MainDesign.Request.ToggleRuleMode to TunnelState.Mode.Rule + ) + override suspend fun main() { val design = MainDesign(this) @@ -53,6 +61,16 @@ class MainActivity : BaseActivity() { else design.startClash() } + in modeMap.keys -> { + design.showModeSwitchTips() + withClash { + val o = queryOverride(Clash.OverrideSlot.Session) + + o.mode = modeMap[it]!! + + patchOverride(Clash.OverrideSlot.Session, o) + } + } MainDesign.Request.OpenProxy -> startActivity(ProxyActivity::class.intent) MainDesign.Request.OpenProfiles -> @@ -72,6 +90,8 @@ class MainActivity : BaseActivity() { startActivity(HelpActivity::class.intent) MainDesign.Request.OpenAbout -> design.showAbout(queryAppVersionName()) + + else -> {} } } if (clashRunning) { diff --git a/design/src/main/java/com/github/kr328/clash/design/MainDesign.kt b/design/src/main/java/com/github/kr328/clash/design/MainDesign.kt index f418e488d9..c14da24234 100644 --- a/design/src/main/java/com/github/kr328/clash/design/MainDesign.kt +++ b/design/src/main/java/com/github/kr328/clash/design/MainDesign.kt @@ -2,6 +2,7 @@ package com.github.kr328.clash.design import android.content.Context import android.view.View +import android.widget.Toast import androidx.appcompat.app.AlertDialog import com.github.kr328.clash.core.model.TunnelState import com.github.kr328.clash.core.util.trafficTotal @@ -16,6 +17,9 @@ import kotlinx.coroutines.withContext class MainDesign(context: Context) : Design(context) { enum class Request { ToggleStatus, + ToggleDirectMode, + ToggleGlobalMode, + ToggleRuleMode, OpenProxy, OpenProfiles, OpenProviders, @@ -57,6 +61,16 @@ class MainDesign(context: Context) : Design(context) { TunnelState.Mode.Rule -> context.getString(R.string.rule_mode) else -> context.getString(R.string.rule_mode) } + val viewId = when (mode) { + TunnelState.Mode.Direct -> R.id.btnDirect + TunnelState.Mode.Global -> R.id.btnGlobal + TunnelState.Mode.Rule -> R.id.btnRule + else -> View.NO_ID + } + // 避免重复设置导致死循环 + if (binding.toggleGroup.checkedButtonId != viewId) { + binding.toggleGroup.check(viewId) + } } } @@ -78,11 +92,27 @@ class MainDesign(context: Context) : Design(context) { } } + suspend fun showModeSwitchTips() { + withContext(Dispatchers.Main) { + Toast.makeText(context, R.string.mode_switch_tips, Toast.LENGTH_LONG).show() + } + } + init { binding.self = this binding.colorClashStarted = context.resolveThemedColor(com.google.android.material.R.attr.colorPrimary) binding.colorClashStopped = context.resolveThemedColor(R.attr.colorClashStopped) + binding.toggleGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> + if (isChecked) { + when (checkedId) { + R.id.btnDirect -> requests.trySend(Request.ToggleDirectMode) + R.id.btnGlobal -> requests.trySend(Request.ToggleGlobalMode) + R.id.btnRule -> requests.trySend(Request.ToggleRuleMode) + } + } + } + } fun request(request: Request) { diff --git a/design/src/main/res/layout/design_main.xml b/design/src/main/res/layout/design_main.xml index 1d02d7b403..54e43f8dd5 100644 --- a/design/src/main/res/layout/design_main.xml +++ b/design/src/main/res/layout/design_main.xml @@ -98,6 +98,42 @@ app:subtext="@{mode}" app:text="@string/proxy" /> + + + + + + + + + +