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

Commit df5413b5 authored by Mark Chien's avatar Mark Chien Committed by Gerrit Code Review
Browse files

Merge "Add BluetoothPanShim for new bluetooth tethering API"

parents d2e4ea9d 52e30e6e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ java_library {
        "NetworkStackApi30Shims",
        "NetworkStackApi31Shims",
        "framework-connectivity",
        "framework-tethering",
    ],
    sdk_version: "module_current",
    visibility: ["//visibility:private"],
+55 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.networkstack.apishim.api30;

import android.bluetooth.BluetoothPan;
import android.os.Build;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;

import com.android.networkstack.apishim.common.BluetoothPanShim;
import com.android.networkstack.apishim.common.UnsupportedApiLevelException;

import java.util.concurrent.Executor;

/**
 * Implementation of {@link BluetoothPanShimImpl} for API 30.
 */
@RequiresApi(Build.VERSION_CODES.R)
public class BluetoothPanShimImpl implements BluetoothPanShim {
    protected final BluetoothPan mPan;
    protected BluetoothPanShimImpl(BluetoothPan pan) {
        mPan = pan;
    }

    /**
     * Get a new instance of {@link BluetoothPanShimImpl}.
     */
    @RequiresApi(Build.VERSION_CODES.R)
    public static BluetoothPanShim newInstance(final BluetoothPan pan) {
        return new BluetoothPanShimImpl(pan);
    }

    @Override
    public TetheredInterfaceRequestShim requestTetheredInterface(@NonNull final Executor executor,
            @NonNull final TetheredInterfaceCallbackShim callback)
            throws UnsupportedApiLevelException {
        throw new UnsupportedApiLevelException(
                "requestTetheredInterface does not exist before API 32");
    }
}
+33 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.networkstack.apishim.api31;

import android.bluetooth.BluetoothPan;
import android.os.Build;

import androidx.annotation.RequiresApi;

/**
 * Implementation of {@link com.android.networkstack.apishim.common.BluetoothPanShim}.
 */
@RequiresApi(Build.VERSION_CODES.S)
public class BluetoothPanShimImpl extends
        com.android.networkstack.apishim.api30.BluetoothPanShimImpl {
    protected BluetoothPanShimImpl(BluetoothPan pan) {
        super(pan);
    }
}
+80 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.networkstack.apishim;

import static com.android.modules.utils.build.SdkLevel.isAtLeastT;

import android.bluetooth.BluetoothPan;
import android.net.TetheringManager.TetheredInterfaceCallback;
import android.net.TetheringManager.TetheredInterfaceRequest;
import android.os.Build;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;

import com.android.networkstack.apishim.common.BluetoothPanShim;
import com.android.networkstack.apishim.common.UnsupportedApiLevelException;

import java.util.concurrent.Executor;

/**
 * Implementation of {@link BluetoothPanShimImpl} for API 33.
 */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class BluetoothPanShimImpl extends
        com.android.networkstack.apishim.api31.BluetoothPanShimImpl {
    protected BluetoothPanShimImpl(BluetoothPan pan) {
        super(pan);
    }

    /**
     * Get a new instance of {@link BluetoothPanShimImpl}.
     */
    @RequiresApi(Build.VERSION_CODES.R)
    public static BluetoothPanShim newInstance(final BluetoothPan pan) {
        if (!isAtLeastT()) {
            return com.android.networkstack.apishim.api31.BluetoothPanShimImpl
                    .newInstance(pan);
        }
        return new BluetoothPanShimImpl(pan);
    }

    @Override
    public TetheredInterfaceRequestShim requestTetheredInterface(@NonNull final Executor executor,
            @NonNull final TetheredInterfaceCallbackShim callback)
            throws UnsupportedApiLevelException {
        TetheredInterfaceRequest request = mPan.requestTetheredInterface(executor,
                new TetheredInterfaceCallback() {
                    public void onAvailable(@NonNull String iface) {
                        callback.onAvailable(iface);
                    }

                    public void onUnavailable() {
                        callback.onUnavailable();
                    }
                });

        if (request == null) return null;

        return new TetheredInterfaceRequestShim() {
            @Override
            public void release() {
                request.release();
            }
        };
    }
}
+52 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.networkstack.apishim.common;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.concurrent.Executor;

/**
 * Interface for accessing API methods in {@link android.bluetooth.BluetoothPan} by different SDK
 * level.
 */
public interface BluetoothPanShim {
    /** Use to deal with the TetheringManager#TetheredInterfaceRequest by different sdk version. */
    public interface TetheredInterfaceRequestShim {
        /** Release the request to tear down tethered interface */
        default void release() {}
    }

    /** Use to deal with the TetheringManager#TetheredInterfaceCallback by different sdk version. */
    public interface TetheredInterfaceCallbackShim {
        /** Called when the tethered interface is available. */
        default void onAvailable(@NonNull String iface) {}

        /** Called when the tethered interface is now unavailable. */
        default void onUnavailable() {}
    }

    /**
     * Use to deal with the BluetoothPan#setBluetoothTethering and
     * BluetoothPan#requestTetheredInterface by different sdk version. This can return null if the
     * service is not available.
     */
    @Nullable
    TetheredInterfaceRequestShim requestTetheredInterface(@NonNull Executor executor,
            @NonNull TetheredInterfaceCallbackShim callback) throws UnsupportedApiLevelException;
}