Skip to content

Commit

Permalink
Fix handling of network transitions in RequirementsWatcher
Browse files Browse the repository at this point in the history
Issue: #6733
PiperOrigin-RevId: 286621715
  • Loading branch information
ojw28 committed Dec 20, 2019
1 parent f50ed8f commit 24a1926
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 30 deletions.
4 changes: 4 additions & 0 deletions RELEASENOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
developers to handle data that's neither UTF-8 nor ISO-8859-1
([#6753](https://github.com/google/ExoPlayer/issues/6753)).
* Add playlist API ([#6161](https://github.com/google/ExoPlayer/issues/6161)).
* 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) ###

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,10 @@ private boolean isDeviceIdle(Context context) {
}

private static boolean isInternetConnectivityValidated(ConnectivityManager connectivityManager) {
if (Util.SDK_INT < 23) {
// TODO Check internet connectivity using http://clients3.google.com/generate_204 on API
// levels prior to 23.
// It's possible to query NetworkCapabilities from API level 23, but RequirementsWatcher only
// fires an event to update its Requirements when NetworkCapabilities change from API level 24.
// Since Requirements wont be updated, we assume connectivity is validated on API level 23.
if (Util.SDK_INT < 24) {
return true;
}
Network activeNetwork = connectivityManager.getActiveNetwork();
Expand All @@ -174,10 +175,8 @@ private static boolean isInternetConnectivityValidated(ConnectivityManager conne
}
NetworkCapabilities networkCapabilities =
connectivityManager.getNetworkCapabilities(activeNetwork);
boolean validated =
networkCapabilities == null
|| !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
return !validated;
return networkCapabilities != null
&& networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
Expand Down Expand Up @@ -62,7 +61,7 @@ void onRequirementsStateChanged(
@Nullable private DeviceStatusChangeReceiver receiver;

@Requirements.RequirementFlags private int notMetRequirements;
@Nullable private CapabilityValidatedCallback networkCallback;
@Nullable private NetworkCallback networkCallback;

/**
* @param context Any context.
Expand All @@ -88,8 +87,8 @@ public int start() {

IntentFilter filter = new IntentFilter();
if (requirements.isNetworkRequired()) {
if (Util.SDK_INT >= 23) {
registerNetworkCallbackV23();
if (Util.SDK_INT >= 24) {
registerNetworkCallbackV24();
} else {
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
}
Expand All @@ -115,8 +114,8 @@ public int start() {
public void stop() {
context.unregisterReceiver(Assertions.checkNotNull(receiver));
receiver = null;
if (networkCallback != null) {
unregisterNetworkCallback();
if (Util.SDK_INT >= 24 && networkCallback != null) {
unregisterNetworkCallbackV24();
}
}

Expand All @@ -125,26 +124,21 @@ public Requirements getRequirements() {
return requirements;
}

@TargetApi(23)
private void registerNetworkCallbackV23() {
@TargetApi(24)
private void registerNetworkCallbackV24() {
ConnectivityManager connectivityManager =
Assertions.checkNotNull(
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkRequest request =
new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
.build();
networkCallback = new CapabilityValidatedCallback();
connectivityManager.registerNetworkCallback(request, networkCallback);
networkCallback = new NetworkCallback();
connectivityManager.registerDefaultNetworkCallback(networkCallback);
}

private void unregisterNetworkCallback() {
if (Util.SDK_INT >= 21) {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.unregisterNetworkCallback(Assertions.checkNotNull(networkCallback));
networkCallback = null;
}
@TargetApi(24)
private void unregisterNetworkCallbackV24() {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.unregisterNetworkCallback(Assertions.checkNotNull(networkCallback));
networkCallback = null;
}

private void checkRequirements() {
Expand All @@ -165,8 +159,11 @@ public void onReceive(Context context, Intent intent) {
}
}

@RequiresApi(api = 21)
private final class CapabilityValidatedCallback extends ConnectivityManager.NetworkCallback {
@RequiresApi(24)
private final class NetworkCallback extends ConnectivityManager.NetworkCallback {
boolean receivedCapabilitiesChange;
boolean networkValidated;

@Override
public void onAvailable(Network network) {
onNetworkCallback();
Expand All @@ -177,6 +174,17 @@ public void onLost(Network network) {
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() {
handler.post(
() -> {
Expand Down

0 comments on commit 24a1926

Please sign in to comment.