Merge "Backport system default callback to Q"
diff --git a/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java
index 2ac25af..07327be 100644
--- a/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java
+++ b/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java
@@ -16,8 +16,14 @@
package com.android.networkstack.apishim.api29;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
+
import android.content.Context;
+import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Handler;
@@ -30,7 +36,10 @@
* Implementation of {@link ConnectivityManagerShim} for API 29.
*/
public class ConnectivityManagerShimImpl implements ConnectivityManagerShim {
- protected ConnectivityManagerShimImpl(Context context) {}
+ protected final ConnectivityManager mCm;
+ protected ConnectivityManagerShimImpl(Context context) {
+ mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ }
/**
* Get a new instance of {@link ConnectivityManagerShim}.
@@ -52,12 +61,31 @@
/**
* See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback
- * @throws UnsupportedApiLevelException if API is not available in this API level.
*/
@Override
public void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
- @NonNull Handler handler) throws UnsupportedApiLevelException {
- // Not supported for API 29.
- throw new UnsupportedApiLevelException("Not supported in API 29.");
+ @NonNull Handler handler) {
+ // defaultNetworkRequest is not really a "request", just a way of tracking the system
+ // default network. It's guaranteed not to actually bring up any networks because it
+ // should be the same request as the ConnectivityService default request, and thus
+ // shares fate with it. In API <= R, registerSystemDefaultNetworkCallback is not
+ // available, and registerDefaultNetworkCallback will not track the system default when
+ // a VPN applies to the UID of this process.
+ final NetworkRequest defaultNetworkRequest = makeEmptyCapabilitiesRequest()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
+ mCm.requestNetwork(defaultNetworkRequest, networkCallback, handler);
+ }
+
+ @NonNull
+ protected NetworkRequest.Builder makeEmptyCapabilitiesRequest() {
+ // Q does not have clearCapabilities(), so assume the default capabilities are as below
+ return new NetworkRequest.Builder()
+ .removeCapability(NET_CAPABILITY_NOT_RESTRICTED)
+ .removeCapability(NET_CAPABILITY_TRUSTED)
+ .removeCapability(NET_CAPABILITY_NOT_VPN);
}
}
diff --git a/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java b/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java
index 97f1f60..7c1d786 100644
--- a/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java
+++ b/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java
@@ -16,10 +16,10 @@
package com.android.networkstack.apishim.api30;
+import static com.android.modules.utils.build.SdkLevel.isAtLeastR;
+
import android.content.Context;
-import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
-import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import android.os.Handler;
@@ -28,25 +28,24 @@
import androidx.annotation.RequiresApi;
import com.android.networkstack.apishim.common.ConnectivityManagerShim;
-import com.android.networkstack.apishim.common.ShimUtils;
import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
/**
* Implementation of {@link ConnectivityManagerShim} for API 30.
*/
+@RequiresApi(Build.VERSION_CODES.R)
public class ConnectivityManagerShimImpl
extends com.android.networkstack.apishim.api29.ConnectivityManagerShimImpl {
- protected final ConnectivityManager mCm;
protected ConnectivityManagerShimImpl(Context context) {
super(context);
- mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
}
/**
* Get a new instance of {@link ConnectivityManagerShim}.
*/
+ @RequiresApi(Build.VERSION_CODES.Q)
public static ConnectivityManagerShim newInstance(Context context) {
- if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) {
+ if (!isAtLeastR()) {
return com.android.networkstack.apishim.api29.ConnectivityManagerShimImpl
.newInstance(context);
}
@@ -65,27 +64,9 @@
throw new UnsupportedApiLevelException("Not supported in API 30.");
}
- /**
- * See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback
- * @throws UnsupportedApiLevelException if API is not available in this API level.
- */
+ @NonNull
@Override
- @RequiresApi(Build.VERSION_CODES.R)
- public void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
- @NonNull Handler handler) {
- // defaultNetworkRequest is not really a "request", just a way of tracking the system
- // default network. It's guaranteed not to actually bring up any networks because it
- // should be the same request as the ConnectivityService default request, and thus
- // shares fate with it. In API <= R, registerSystemDefaultNetworkCallback is not
- // available, and registerDefaultNetworkCallback will not track the system default when
- // a VPN applies to the UID of this process.
- final NetworkRequest defaultNetworkRequest = new NetworkRequest.Builder()
- .clearCapabilities()
- .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
- .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
- .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
- .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
- .build();
- mCm.requestNetwork(defaultNetworkRequest, networkCallback, handler);
+ protected NetworkRequest.Builder makeEmptyCapabilitiesRequest() {
+ return new NetworkRequest.Builder().clearCapabilities();
}
}
diff --git a/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java b/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java
index 67b3df7..86d785e 100644
--- a/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java
+++ b/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java
@@ -42,8 +42,7 @@
/** See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback */
void registerSystemDefaultNetworkCallback(
- @NonNull NetworkCallback networkCallback, @NonNull Handler handler)
- throws UnsupportedApiLevelException;
+ @NonNull NetworkCallback networkCallback, @NonNull Handler handler);
/** See android.net.ConnectivityManager#registerDefaultNetworkCallbackForUid */
default void registerDefaultNetworkCallbackForUid(