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(