2024-04-30 23:38:49 +08:00
|
|
|
package com.follow.clash
|
|
|
|
|
|
|
|
|
|
import androidx.lifecycle.MutableLiveData
|
2024-06-12 19:28:58 +08:00
|
|
|
import com.follow.clash.plugins.AppPlugin
|
2024-04-30 23:38:49 +08:00
|
|
|
import com.follow.clash.plugins.TilePlugin
|
2024-10-27 16:59:23 +08:00
|
|
|
import com.follow.clash.plugins.VpnPlugin
|
2024-07-13 16:36:08 +08:00
|
|
|
import io.flutter.FlutterInjector
|
2024-04-30 23:38:49 +08:00
|
|
|
import io.flutter.embedding.engine.FlutterEngine
|
2024-07-13 16:36:08 +08:00
|
|
|
import io.flutter.embedding.engine.dart.DartExecutor
|
2024-07-13 16:36:08 +08:00
|
|
|
import java.util.concurrent.locks.ReentrantLock
|
|
|
|
|
import kotlin.concurrent.withLock
|
2024-04-30 23:38:49 +08:00
|
|
|
|
|
|
|
|
enum class RunState {
|
|
|
|
|
START,
|
|
|
|
|
PENDING,
|
|
|
|
|
STOP
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-13 16:36:08 +08:00
|
|
|
|
2024-07-13 16:36:08 +08:00
|
|
|
object GlobalState {
|
2024-08-15 16:18:00 +08:00
|
|
|
val runLock = ReentrantLock()
|
2024-07-13 16:36:08 +08:00
|
|
|
|
2024-07-13 16:36:08 +08:00
|
|
|
val runState: MutableLiveData<RunState> = MutableLiveData<RunState>(RunState.STOP)
|
|
|
|
|
var flutterEngine: FlutterEngine? = null
|
|
|
|
|
private var serviceEngine: FlutterEngine? = null
|
2024-06-12 19:28:58 +08:00
|
|
|
|
2024-07-13 16:36:08 +08:00
|
|
|
fun getCurrentAppPlugin(): AppPlugin? {
|
|
|
|
|
val currentEngine = if (flutterEngine != null) flutterEngine else serviceEngine
|
|
|
|
|
return currentEngine?.plugins?.get(AppPlugin::class.java) as AppPlugin?
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-13 19:08:17 +08:00
|
|
|
suspend fun getText(text: String): String {
|
2024-10-27 16:59:23 +08:00
|
|
|
return getCurrentAppPlugin()?.getText(text) ?: ""
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-18 10:27:53 +08:00
|
|
|
fun getCurrentTilePlugin(): TilePlugin? {
|
2024-07-13 16:36:08 +08:00
|
|
|
val currentEngine = if (flutterEngine != null) flutterEngine else serviceEngine
|
|
|
|
|
return currentEngine?.plugins?.get(TilePlugin::class.java) as TilePlugin?
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-15 16:18:00 +08:00
|
|
|
fun getCurrentVPNPlugin(): VpnPlugin? {
|
2024-09-08 21:21:21 +08:00
|
|
|
return serviceEngine?.plugins?.get(VpnPlugin::class.java) as VpnPlugin?
|
2024-08-15 16:18:00 +08:00
|
|
|
}
|
|
|
|
|
|
2025-01-13 19:08:17 +08:00
|
|
|
fun handleToggle() {
|
|
|
|
|
val starting = handleStart()
|
2024-12-06 22:35:28 +08:00
|
|
|
if (!starting) {
|
|
|
|
|
handleStop()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-13 19:08:17 +08:00
|
|
|
fun handleStart(): Boolean {
|
2024-10-27 16:59:23 +08:00
|
|
|
if (runState.value == RunState.STOP) {
|
|
|
|
|
runState.value = RunState.PENDING
|
2024-12-06 22:35:28 +08:00
|
|
|
runLock.lock()
|
2024-10-27 16:59:23 +08:00
|
|
|
val tilePlugin = getCurrentTilePlugin()
|
|
|
|
|
if (tilePlugin != null) {
|
|
|
|
|
tilePlugin.handleStart()
|
|
|
|
|
} else {
|
2025-01-13 19:08:17 +08:00
|
|
|
initServiceEngine()
|
2024-10-27 16:59:23 +08:00
|
|
|
}
|
2024-12-06 22:35:28 +08:00
|
|
|
return true
|
2024-10-27 16:59:23 +08:00
|
|
|
}
|
2024-12-06 22:35:28 +08:00
|
|
|
return false
|
2024-10-27 16:59:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun handleStop() {
|
|
|
|
|
if (runState.value == RunState.START) {
|
|
|
|
|
runState.value = RunState.PENDING
|
2024-12-06 22:35:28 +08:00
|
|
|
runLock.lock()
|
2024-10-27 16:59:23 +08:00
|
|
|
getCurrentTilePlugin()?.handleStop()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-13 19:08:17 +08:00
|
|
|
fun handleTryDestroy() {
|
|
|
|
|
if (flutterEngine == null) {
|
|
|
|
|
destroyServiceEngine()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-13 16:36:08 +08:00
|
|
|
fun destroyServiceEngine() {
|
2024-12-06 22:35:28 +08:00
|
|
|
runLock.withLock {
|
|
|
|
|
serviceEngine?.destroy()
|
|
|
|
|
serviceEngine = null
|
|
|
|
|
}
|
2024-07-13 16:36:08 +08:00
|
|
|
}
|
|
|
|
|
|
2025-01-13 19:08:17 +08:00
|
|
|
fun initServiceEngine() {
|
2024-07-13 16:36:08 +08:00
|
|
|
if (serviceEngine != null) return
|
2024-12-06 22:35:28 +08:00
|
|
|
destroyServiceEngine()
|
|
|
|
|
runLock.withLock {
|
2025-01-13 19:08:17 +08:00
|
|
|
serviceEngine = FlutterEngine(FlClashApplication.getAppContext())
|
|
|
|
|
serviceEngine?.plugins?.add(VpnPlugin)
|
2024-07-13 16:36:08 +08:00
|
|
|
serviceEngine?.plugins?.add(AppPlugin())
|
|
|
|
|
serviceEngine?.plugins?.add(TilePlugin())
|
|
|
|
|
val vpnService = DartExecutor.DartEntrypoint(
|
|
|
|
|
FlutterInjector.instance().flutterLoader().findAppBundlePath(),
|
2025-01-13 19:08:17 +08:00
|
|
|
"_service"
|
2024-07-13 16:36:08 +08:00
|
|
|
)
|
|
|
|
|
serviceEngine?.dartExecutor?.executeDartEntrypoint(
|
|
|
|
|
vpnService,
|
2025-01-13 19:08:17 +08:00
|
|
|
if (flutterEngine == null) listOf("quick") else null
|
2024-07-13 16:36:08 +08:00
|
|
|
)
|
|
|
|
|
}
|
2024-04-30 23:38:49 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|