From 2cfbb1a11356a0255288453b051c4a23631e637a Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 11 Sep 2026 14:01:31 +0200 Subject: [PATCH 1/2] add debounce for onCapabilitiesChanged Signed-off-by: alperozturk96 --- .../client/network/ConnectivityServiceImpl.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt index 0f59b20edf84..e3505fa09dd8 100644 --- a/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt +++ b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt @@ -25,6 +25,7 @@ import java.net.ConnectException import java.net.SocketTimeoutException import java.net.UnknownHostException import javax.net.ssl.SSLException +import kotlin.time.Duration.Companion.seconds @Suppress("TooGenericExceptionCaught", "ReturnCount") class ConnectivityServiceImpl( @@ -38,6 +39,9 @@ class ConnectivityServiceImpl( companion object { private const val TAG = "ConnectivityServiceImpl" private const val CONNECTIVITY_CHECK_ROUTE = "/index.php/204" + + private var lastCapabilityCheckMs = 0L + private val CAPABILITY_CHANGE_DEBOUNCE = 15.seconds } // region private values @@ -60,8 +64,12 @@ class ConnectivityServiceImpl( } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { - Log_OC.d(TAG, "capability changed") - updateConnectivity() + val now = System.currentTimeMillis() + if (now - lastCapabilityCheckMs >= CAPABILITY_CHANGE_DEBOUNCE.inWholeMilliseconds) { + Log_OC.d(TAG, "resolving network capabilities to compare") + lastCapabilityCheckMs = now + updateConnectivity() + } } } // endregion @@ -148,9 +156,7 @@ class ConnectivityServiceImpl( fun updateConnectivity() { val currentKey = key val previous = currentConnectivity - val capabilities = resolveNetworkCapabilities() - val newConnectivity = if (capabilities == null) { Log_OC.w(TAG, "no network capabilities found, connectivity is disconnected") Connectivity.DISCONNECTED @@ -169,6 +175,7 @@ class ConnectivityServiceImpl( } if (previous != newConnectivity) { + Log_OC.d(TAG, "network capability changed - notifying listeners") currentConnectivity = newConnectivity walledCheckCache.putConnectivityValue(currentKey, newConnectivity) @@ -178,6 +185,7 @@ class ConnectivityServiceImpl( ) if (isStructural) { + Log_OC.d(TAG, "network structurally capability changed - clearing walled cache as well") walledCheckCache.clear(currentKey) } notifyListeners() From 7bd5b75cd97dadbeb6aee2bf95582a0bdc756ebc Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 11 Sep 2026 14:54:59 +0200 Subject: [PATCH 2/2] add debounce for onCapabilitiesChanged Signed-off-by: alperozturk96 --- .../client/network/ConnectivityServiceImpl.kt | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt index e3505fa09dd8..bd9ea8c79fae 100644 --- a/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt +++ b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt @@ -11,6 +11,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.os.Build +import android.os.SystemClock import com.nextcloud.client.account.UserAccountManager import com.nextcloud.operations.GetMethod import com.owncloud.android.lib.common.utils.Log_OC @@ -40,7 +41,6 @@ class ConnectivityServiceImpl( private const val TAG = "ConnectivityServiceImpl" private const val CONNECTIVITY_CHECK_ROUTE = "/index.php/204" - private var lastCapabilityCheckMs = 0L private val CAPABILITY_CHANGE_DEBOUNCE = 15.seconds } @@ -50,6 +50,7 @@ class ConnectivityServiceImpl( private var notifyJob: Job? = null private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private val listeners = mutableSetOf() + private var lastCapabilityCheckMs: Long? = null @Volatile private var currentConnectivity: Connectivity = Connectivity.DISCONNECTED @@ -64,12 +65,12 @@ class ConnectivityServiceImpl( } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { - val now = System.currentTimeMillis() - if (now - lastCapabilityCheckMs >= CAPABILITY_CHANGE_DEBOUNCE.inWholeMilliseconds) { - Log_OC.d(TAG, "resolving network capabilities to compare") - lastCapabilityCheckMs = now - updateConnectivity() + if (!shouldHandleCapabilityChange()) { + return } + + Log_OC.d(TAG, "resolving network capabilities to compare") + updateConnectivity() } } // endregion @@ -203,6 +204,17 @@ class ConnectivityServiceImpl( // endregion // region private methods + private fun shouldHandleCapabilityChange(): Boolean { + val now = SystemClock.elapsedRealtime() + val last = lastCapabilityCheckMs + if (last != null && now - last < CAPABILITY_CHANGE_DEBOUNCE.inWholeMilliseconds) { + return false + } + + lastCapabilityCheckMs = now + return true + } + private fun notifyListeners() { if (listeners.isEmpty()) { return