diff --git a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java index 54b38bc3bd3..8b070bb7405 100644 --- a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java +++ b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.Network; +import android.net.NetworkCapabilities; import android.os.Build; import android.util.Log; import com.google.common.annotations.VisibleForTesting; @@ -319,6 +320,18 @@ public void onBlockedStatusChanged(Network network, boolean blocked) { delegate.enterIdle(); } } + + @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { + if (isConnected(networkCapabilities)) { + delegate.enterIdle(); + } + } + + private boolean isConnected(NetworkCapabilities networkCapabilities) { + return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); + } } /** Respond to network changes. Only used on API levels < 24. */