Commit 3bce2138 by olly Committed by Oliver Woodman

Fix handling of network transitions in RequirementsWatcher

Issue: #6733
PiperOrigin-RevId: 286621715
parent 355b3afa
...@@ -8,6 +8,10 @@ ...@@ -8,6 +8,10 @@
Also change `IcyInfo.rawMetadata` from `String` to `byte[]` to allow Also change `IcyInfo.rawMetadata` from `String` to `byte[]` to allow
developers to handle data that's neither UTF-8 nor ISO-8859-1 developers to handle data that's neither UTF-8 nor ISO-8859-1
([#6753](https://github.com/google/ExoPlayer/issues/6753)). ([#6753](https://github.com/google/ExoPlayer/issues/6753)).
* Fix handling of network transitions in `RequirementsWatcher`
([#6733](https://github.com/google/ExoPlayer/issues/6733)). Incorrect handling
could previously cause downloads to be paused when they should have been able
to proceed.
### 2.11.1 (2019-12-20) ### ### 2.11.1 (2019-12-20) ###
......
...@@ -163,9 +163,10 @@ public final class Requirements implements Parcelable { ...@@ -163,9 +163,10 @@ public final class Requirements implements Parcelable {
} }
private static boolean isInternetConnectivityValidated(ConnectivityManager connectivityManager) { private static boolean isInternetConnectivityValidated(ConnectivityManager connectivityManager) {
if (Util.SDK_INT < 23) { // It's possible to query NetworkCapabilities from API level 23, but RequirementsWatcher only
// TODO Check internet connectivity using http://clients3.google.com/generate_204 on API // fires an event to update its Requirements when NetworkCapabilities change from API level 24.
// levels prior to 23. // Since Requirements wont be updated, we assume connectivity is validated on API level 23.
if (Util.SDK_INT < 24) {
return true; return true;
} }
Network activeNetwork = connectivityManager.getActiveNetwork(); Network activeNetwork = connectivityManager.getActiveNetwork();
...@@ -174,10 +175,8 @@ public final class Requirements implements Parcelable { ...@@ -174,10 +175,8 @@ public final class Requirements implements Parcelable {
} }
NetworkCapabilities networkCapabilities = NetworkCapabilities networkCapabilities =
connectivityManager.getNetworkCapabilities(activeNetwork); connectivityManager.getNetworkCapabilities(activeNetwork);
boolean validated = return networkCapabilities != null
networkCapabilities == null && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
|| !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
return !validated;
} }
@Override @Override
......
...@@ -23,7 +23,6 @@ import android.content.IntentFilter; ...@@ -23,7 +23,6 @@ import android.content.IntentFilter;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
...@@ -62,7 +61,7 @@ public final class RequirementsWatcher { ...@@ -62,7 +61,7 @@ public final class RequirementsWatcher {
@Nullable private DeviceStatusChangeReceiver receiver; @Nullable private DeviceStatusChangeReceiver receiver;
@Requirements.RequirementFlags private int notMetRequirements; @Requirements.RequirementFlags private int notMetRequirements;
@Nullable private CapabilityValidatedCallback networkCallback; @Nullable private NetworkCallback networkCallback;
/** /**
* @param context Any context. * @param context Any context.
...@@ -88,8 +87,8 @@ public final class RequirementsWatcher { ...@@ -88,8 +87,8 @@ public final class RequirementsWatcher {
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
if (requirements.isNetworkRequired()) { if (requirements.isNetworkRequired()) {
if (Util.SDK_INT >= 23) { if (Util.SDK_INT >= 24) {
registerNetworkCallbackV23(); registerNetworkCallbackV24();
} else { } else {
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
} }
...@@ -115,8 +114,8 @@ public final class RequirementsWatcher { ...@@ -115,8 +114,8 @@ public final class RequirementsWatcher {
public void stop() { public void stop() {
context.unregisterReceiver(Assertions.checkNotNull(receiver)); context.unregisterReceiver(Assertions.checkNotNull(receiver));
receiver = null; receiver = null;
if (networkCallback != null) { if (Util.SDK_INT >= 24 && networkCallback != null) {
unregisterNetworkCallback(); unregisterNetworkCallbackV24();
} }
} }
...@@ -125,26 +124,21 @@ public final class RequirementsWatcher { ...@@ -125,26 +124,21 @@ public final class RequirementsWatcher {
return requirements; return requirements;
} }
@TargetApi(23) @TargetApi(24)
private void registerNetworkCallbackV23() { private void registerNetworkCallbackV24() {
ConnectivityManager connectivityManager = ConnectivityManager connectivityManager =
Assertions.checkNotNull( Assertions.checkNotNull(
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkRequest request = networkCallback = new NetworkCallback();
new NetworkRequest.Builder() connectivityManager.registerDefaultNetworkCallback(networkCallback);
.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
.build();
networkCallback = new CapabilityValidatedCallback();
connectivityManager.registerNetworkCallback(request, networkCallback);
} }
private void unregisterNetworkCallback() { @TargetApi(24)
if (Util.SDK_INT >= 21) { private void unregisterNetworkCallbackV24() {
ConnectivityManager connectivityManager = ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.unregisterNetworkCallback(Assertions.checkNotNull(networkCallback)); connectivityManager.unregisterNetworkCallback(Assertions.checkNotNull(networkCallback));
networkCallback = null; networkCallback = null;
}
} }
private void checkRequirements() { private void checkRequirements() {
...@@ -165,8 +159,11 @@ public final class RequirementsWatcher { ...@@ -165,8 +159,11 @@ public final class RequirementsWatcher {
} }
} }
@RequiresApi(api = 21) @RequiresApi(24)
private final class CapabilityValidatedCallback extends ConnectivityManager.NetworkCallback { private final class NetworkCallback extends ConnectivityManager.NetworkCallback {
boolean receivedCapabilitiesChange;
boolean networkValidated;
@Override @Override
public void onAvailable(Network network) { public void onAvailable(Network network) {
onNetworkCallback(); onNetworkCallback();
...@@ -177,6 +174,17 @@ public final class RequirementsWatcher { ...@@ -177,6 +174,17 @@ public final class RequirementsWatcher {
onNetworkCallback(); onNetworkCallback();
} }
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
boolean networkValidated =
networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
if (!receivedCapabilitiesChange || this.networkValidated != networkValidated) {
receivedCapabilitiesChange = true;
this.networkValidated = networkValidated;
onNetworkCallback();
}
}
private void onNetworkCallback() { private void onNetworkCallback() {
handler.post( handler.post(
() -> { () -> {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment