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

Commit b616c887 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by Gerrit Code Review
Browse files

Merge "Backport system default callback to Q"

parents 3bf99079 07c67b40
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(