From 8df69f635b4a41970e57851a9f4f927317cf757c Mon Sep 17 00:00:00 2001 From: Jaehwa Noh Date: Sun, 12 Apr 2026 21:57:51 +0900 Subject: [PATCH 1/3] Add validate check and defaultNetwork callback Change-Id: If87952d8b3e1148935839b30bfa17d3665f94ec5 --- .../util/ConnectivityManagerNetworkMonitor.kt | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt index dc075f2995..2ef776dbe9 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt @@ -23,6 +23,7 @@ import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import android.net.NetworkRequest.Builder +import android.os.Build import androidx.core.content.getSystemService import androidx.tracing.trace import com.google.samples.apps.nowinandroid.core.common.network.Dispatcher @@ -58,21 +59,43 @@ internal class ConnectivityManagerNetworkMonitor @Inject constructor( private val networks = mutableSetOf() override fun onAvailable(network: Network) { - networks += network + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + networks += network + } channel.trySend(true) } override fun onLost(network: Network) { - networks -= network - channel.trySend(networks.isNotEmpty()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + channel.trySend(false) + } else { + networks -= network + channel.trySend(networks.isEmpty()) + } + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities, + ) { + super.onCapabilitiesChanged(network, networkCapabilities) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val isNetworkConnected = networkCapabilities.isNetworkConnected() + channel.trySend(isNetworkConnected) + } } } trace("NetworkMonitor.registerNetworkCallback") { - val request = Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build() - connectivityManager.registerNetworkCallback(request, callback) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + connectivityManager.registerDefaultNetworkCallback(callback) + } else { + val request = Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build() + connectivityManager.registerNetworkCallback(request, callback) + } } /** @@ -90,6 +113,15 @@ internal class ConnectivityManagerNetworkMonitor @Inject constructor( private fun ConnectivityManager.isCurrentlyConnected(): Boolean { val networkCapabilities = getNetworkCapabilities(activeNetwork) ?: return false - return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + return networkCapabilities.isNetworkConnected() + } + + /** + * Check [NetworkCapabilities.NET_CAPABILITY_INTERNET] + * and [NetworkCapabilities.NET_CAPABILITY_VALIDATED] + */ + private fun NetworkCapabilities.isNetworkConnected(): Boolean = with(this) { + hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && + hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } } From 26b03173e0d0fe1381104c889d18fe47dfd4946c Mon Sep 17 00:00:00 2001 From: Jaehwa Noh Date: Sun, 12 Apr 2026 22:07:34 +0900 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../core/data/util/ConnectivityManagerNetworkMonitor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt index 2ef776dbe9..3acea4e230 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt @@ -70,7 +70,7 @@ internal class ConnectivityManagerNetworkMonitor @Inject constructor( channel.trySend(false) } else { networks -= network - channel.trySend(networks.isEmpty()) + channel.trySend(networks.isNotEmpty()) } } From e4c25287f755aafc0b5dfa8e425d6747606b0d37 Mon Sep 17 00:00:00 2001 From: Jaehwa Noh Date: Sun, 12 Apr 2026 22:11:45 +0900 Subject: [PATCH 3/3] Remove with Change-Id: Ide55f58c292d293eb8bd33696bff4afcf7a5a3a9 --- .../core/data/util/ConnectivityManagerNetworkMonitor.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt index 2ef776dbe9..732960d645 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt @@ -120,8 +120,7 @@ internal class ConnectivityManagerNetworkMonitor @Inject constructor( * Check [NetworkCapabilities.NET_CAPABILITY_INTERNET] * and [NetworkCapabilities.NET_CAPABILITY_VALIDATED] */ - private fun NetworkCapabilities.isNetworkConnected(): Boolean = with(this) { + private fun NetworkCapabilities.isNetworkConnected(): Boolean = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) - } }