Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07c67b40 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN
Browse files

Backport system default callback to Q

To allow tests using the shim to pass on Q, backport the shim to Q in
addition to R. In particular,
ConnectivityManagerTest#testGetMultipathPreference uses
registerSystemDefaultNetworkCallback to verify whether the default
network was set to metered/non-metered successfully.

Bug: 182961265
Test: atest ConnectivityManagerTest#testGetMultipathPreference
Change-Id: I58cd0be7dd01f03625639393042436d2b47d99c0
parent c6eb439f
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -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 @@ import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
 * 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 @@ public class ConnectivityManagerShimImpl implements ConnectivityManagerShim {

    /**
     * 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);
    }
}
+8 −27
Original line number Diff line number Diff line
@@ -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.NonNull;
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 @@ public class ConnectivityManagerShimImpl
        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();
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -42,8 +42,7 @@ public interface ConnectivityManagerShim {

    /** 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(