From 3477193bbbafeadec6f1f2389fba2da4bfdc3fca Mon Sep 17 00:00:00 2001 From: StageGuard Date: Sat, 19 Oct 2024 20:35:50 +0800 Subject: [PATCH] observe state of metered network. --- .../data/models/preference/AnitorrentConfig.kt | 2 +- .../platform/MeteredNetworkDetector.android.kt | 4 ++-- .../kotlin/platform/MeteredNetworkDetector.kt | 2 +- .../platform/MeteredNetworkDetector.desktop.kt | 17 +++++++++++------ .../platform/MeteredNetworkDetector.ios.kt | 15 +++++++++++++++ .../settings/tabs/media/TorrentEngineGroup.kt | 2 +- 6 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 app/shared/app-platform/src/iosMain/kotlin/platform/MeteredNetworkDetector.ios.kt diff --git a/app/shared/app-data/src/commonMain/kotlin/data/models/preference/AnitorrentConfig.kt b/app/shared/app-data/src/commonMain/kotlin/data/models/preference/AnitorrentConfig.kt index 29ce9381cf..2938d3985c 100644 --- a/app/shared/app-data/src/commonMain/kotlin/data/models/preference/AnitorrentConfig.kt +++ b/app/shared/app-data/src/commonMain/kotlin/data/models/preference/AnitorrentConfig.kt @@ -24,7 +24,7 @@ data class AnitorrentConfig( * * Android 移动流量 * * Windows 计费 Wi-Fi */ - val limitUploadOnMeteredNetwork: Boolean = false, + val limitUploadOnMeteredNetwork: Boolean = true, @Transient private val _placeholder: Int = 0, ) { companion object { diff --git a/app/shared/app-platform/src/androidMain/kotlin/platform/MeteredNetworkDetector.android.kt b/app/shared/app-platform/src/androidMain/kotlin/platform/MeteredNetworkDetector.android.kt index 55e09c665a..063194656c 100644 --- a/app/shared/app-platform/src/androidMain/kotlin/platform/MeteredNetworkDetector.android.kt +++ b/app/shared/app-platform/src/androidMain/kotlin/platform/MeteredNetworkDetector.android.kt @@ -15,7 +15,7 @@ import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow @SuppressLint("MissingPermission") @@ -23,7 +23,7 @@ private class AndroidMeteredNetworkDetector( private val context: Context ) : MeteredNetworkDetector { - private val flow = MutableSharedFlow(extraBufferCapacity = 1) + private val flow = MutableStateFlow(false) override val isMeteredNetworkFlow: Flow = flow private val connectivityManager by lazy { diff --git a/app/shared/app-platform/src/commonMain/kotlin/platform/MeteredNetworkDetector.kt b/app/shared/app-platform/src/commonMain/kotlin/platform/MeteredNetworkDetector.kt index a0bf6e1fe9..e996c19d4b 100644 --- a/app/shared/app-platform/src/commonMain/kotlin/platform/MeteredNetworkDetector.kt +++ b/app/shared/app-platform/src/commonMain/kotlin/platform/MeteredNetworkDetector.kt @@ -22,7 +22,7 @@ interface MeteredNetworkDetector { /** * Dispose listeners or callbacks which may be created at initializing detector. */ - fun dispose() { } + fun dispose() } diff --git a/app/shared/app-platform/src/desktopMain/kotlin/platform/MeteredNetworkDetector.desktop.kt b/app/shared/app-platform/src/desktopMain/kotlin/platform/MeteredNetworkDetector.desktop.kt index ccd517315d..0e3eba2982 100644 --- a/app/shared/app-platform/src/desktopMain/kotlin/platform/MeteredNetworkDetector.desktop.kt +++ b/app/shared/app-platform/src/desktopMain/kotlin/platform/MeteredNetworkDetector.desktop.kt @@ -33,13 +33,13 @@ private class WindowsMeteredNetworkDetector : MeteredNetworkDetector { private val flow = flow { while (true) { emit(getIsMetered()) - kotlinx.coroutines.delay(3000) + kotlinx.coroutines.delay(60000) } } override val isMeteredNetworkFlow: Flow = flow private fun getIsMetered(): Boolean { - var networkConnectionCost: INetworkConnectionCost? = null + var networkCostManager: INetworkCostManager? = null try { val coInitializeHResult = Ole32.INSTANCE.CoInitializeEx(null, Ole32.COINIT_MULTITHREADED) @@ -55,10 +55,10 @@ private class WindowsMeteredNetworkDetector : MeteredNetworkDetector { ) COMUtils.checkRC(coCreateInstanceHResult) - networkConnectionCost = INetworkConnectionCost(pNetworkCostManager) + networkCostManager = INetworkCostManager(pNetworkCostManager) val pCost = IntByReference() - val getCostResult = networkConnectionCost.GetCost(pCost) + val getCostResult = networkCostManager.GetCost(pCost) COMUtils.checkRC(getCostResult) return (pCost.value and NLM_CONNECTION_COST_FIXED) != 0 @@ -66,12 +66,16 @@ private class WindowsMeteredNetworkDetector : MeteredNetworkDetector { logger.warn(ex) { "Failed to get network status." } return false } finally { - networkConnectionCost?.Release() + networkCostManager?.Release() Ole32.INSTANCE.CoUninitialize() } } + + override fun dispose() { + + } - private class INetworkConnectionCost(pointer: PointerByReference) : Unknown(pointer.value) { + private class INetworkCostManager(pointer: PointerByReference) : Unknown(pointer.value) { @Suppress("FunctionName") fun GetCost(cost: IntByReference): HRESULT { return _invokeNativeObject(3, arrayOf(pointer, cost, null), HRESULT::class.java) as HRESULT @@ -99,6 +103,7 @@ actual fun createMeteredNetworkDetector(context: Context): MeteredNetworkDetecto is Platform.Windows -> WindowsMeteredNetworkDetector() else -> object : MeteredNetworkDetector { override val isMeteredNetworkFlow: Flow = flowOf(false) + override fun dispose() { } } } } diff --git a/app/shared/app-platform/src/iosMain/kotlin/platform/MeteredNetworkDetector.ios.kt b/app/shared/app-platform/src/iosMain/kotlin/platform/MeteredNetworkDetector.ios.kt new file mode 100644 index 0000000000..639688f27a --- /dev/null +++ b/app/shared/app-platform/src/iosMain/kotlin/platform/MeteredNetworkDetector.ios.kt @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2024 OpenAni and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license, which can be found at the following link. + * + * https://github.com/open-ani/ani/blob/main/LICENSE + */ + +actual fun createMeteredNetworkDetector(context: Context): MeteredNetworkDetector { + return object : MeteredNetworkDetector { + override val isMeteredNetworkFlow: Flow = flowOf(false) + override fun dispose() { } + } +} diff --git a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/TorrentEngineGroup.kt b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/TorrentEngineGroup.kt index 8ca8939a67..a4c0a3d735 100644 --- a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/TorrentEngineGroup.kt +++ b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/TorrentEngineGroup.kt @@ -91,7 +91,7 @@ internal fun SettingsScope.TorrentEngineGroup( checked = torrentSettings.limitUploadOnMeteredNetwork, onCheckedChange = { torrentSettingsState.update(torrentSettings.copy(limitUploadOnMeteredNetwork = it)) }, title = { Text("计费网络限制上传") }, - description = { Text("在 Android 移动流量或 Windows 计费网络环境下限制 BT 上传为 1 KB/s") } + description = { Text("在计费网络环境下限制上传速度为 1 KB/s") } ) } val navigator by rememberUpdatedState(LocalNavigator.current)