68 lines
3.0 KiB
Kotlin
68 lines
3.0 KiB
Kotlin
package com.wdtt.client
|
|
|
|
import android.app.Application
|
|
import android.content.Context
|
|
import android.util.Log
|
|
import com.wireguard.android.backend.GoBackend
|
|
import com.wireguard.android.backend.Tunnel
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.SupervisorJob
|
|
import kotlinx.coroutines.launch
|
|
|
|
class WdttApplication : Application() {
|
|
@Volatile
|
|
private var backendInstance: GoBackend? = null
|
|
|
|
val backend: GoBackend
|
|
get() = getBackend(this)
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
DeployManager.init(this)
|
|
|
|
// Очищаем фантомный VPN при холодном старте приложения (например, после перезагрузки телефона).
|
|
// Если телефон перезагрузился, система Android пытается сама восстановить VpnService,
|
|
// что приводит к фантомному ключу без интернета. Этот код мгновенно сбрасывает статус в DOWN.
|
|
CoroutineScope(SupervisorJob() + Dispatchers.IO).launch {
|
|
runCatching {
|
|
val backend = getBackend(this@WdttApplication)
|
|
val tunnel = WireGuardHelper.WgTunnel()
|
|
backend.setState(tunnel, Tunnel.State.DOWN, null)
|
|
Log.d("WdttApp", "Успешно очищен фантомный VPN при холодном старте")
|
|
}.onFailure {
|
|
Log.w("WdttApp", "Не удалось очистить фантомный VPN: ${it.message}")
|
|
}
|
|
}
|
|
|
|
// Реактивно обновляем все виджеты на домашнем экране при изменении состояния туннеля
|
|
CoroutineScope(SupervisorJob() + Dispatchers.Main).launch {
|
|
try {
|
|
TunnelManager.running.collect {
|
|
VpnWidgetProvider.updateAllWidgets(this@WdttApplication)
|
|
}
|
|
} catch (e: Exception) {
|
|
Log.e("WdttApp", "Не удалось обновить виджеты: ${e.message}")
|
|
}
|
|
}
|
|
|
|
// Реактивно отслеживаем флаг логирования
|
|
val settingsStore = SettingsStore(this)
|
|
CoroutineScope(SupervisorJob() + Dispatchers.Main).launch {
|
|
try {
|
|
settingsStore.loggingEnabled.collect { enabled ->
|
|
TunnelManager.isLoggingEnabled = enabled
|
|
}
|
|
} catch (e: Exception) {
|
|
Log.e("WdttApp", "Не удалось отслеживать флаг логирования: ${e.message}")
|
|
}
|
|
}
|
|
}
|
|
|
|
fun getBackend(context: Context): GoBackend {
|
|
return backendInstance ?: synchronized(this) {
|
|
backendInstance ?: GoBackend(context.applicationContext).also { backendInstance = it }
|
|
}
|
|
}
|
|
}
|