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

Commit 10fd57e6 authored by Rahul Sabnis's avatar Rahul Sabnis Committed by android-build-merger
Browse files

Merge "Resolve BluetoothDevice hidden API usages by Settings"

am: ce656f77

Change-Id: I6c9af91fa6338246a872318038dad699c5c3fe04
parents 92197f83 ce656f77
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1343,15 +1343,24 @@ package android.bluetooth {
  public final class BluetoothDevice implements android.os.Parcelable {
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean cancelBondProcess();
    method public boolean cancelPairing();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getBatteryLevel();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getMessageAccessPermission();
    method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public byte[] getMetadata(int);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getPhonebookAccessPermission();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getSimAccessPermission();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isBondingInitiatedLocally();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isEncrypted();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isInSilenceMode();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean removeBond();
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean setAlias(@NonNull String);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMessageAccessPermission(int);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMetadata(int, @NonNull byte[]);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setPhonebookAccessPermission(int);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPin(@Nullable String);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSilenceMode(boolean);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSimAccessPermission(int);
    field public static final int ACCESS_ALLOWED = 1; // 0x1
    field public static final int ACCESS_REJECTED = 2; // 0x2
    field public static final int ACCESS_UNKNOWN = 0; // 0x0
+70 −57
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.bluetooth;

import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -33,8 +34,12 @@ import android.os.Process;
import android.os.RemoteException;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.UUID;

/**
@@ -771,6 +776,13 @@ public final class BluetoothDevice implements Parcelable {
    @UnsupportedAppUsage
    public static final String EXTRA_SDP_SEARCH_STATUS =
            "android.bluetooth.device.extra.SDP_SEARCH_STATUS";

    /** @hide */
    @IntDef(prefix = "ACCESS_", value = {ACCESS_UNKNOWN,
            ACCESS_ALLOWED, ACCESS_REJECTED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AccessPermission{}

    /**
     * For {@link #getPhonebookAccessPermission}, {@link #setPhonebookAccessPermission},
     * {@link #getMessageAccessPermission} and {@link #setMessageAccessPermission}.
@@ -1096,15 +1108,14 @@ public final class BluetoothDevice implements Parcelable {

    /**
     * Get the most recent identified battery level of this Bluetooth device
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
     *
     * @return Battery level in percents from 0 to 100, or {@link #BATTERY_LEVEL_UNKNOWN} if
     * Bluetooth is disabled, or device is disconnected, or does not have any battery reporting
     * service, or return value is invalid
     * @hide
     */
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH)
    @UnsupportedAppUsage
    public int getBatteryLevel() {
        final IBluetooth service = sService;
        if (service == null) {
@@ -1187,8 +1198,15 @@ public final class BluetoothDevice implements Parcelable {
        return false;
    }

    /** @hide */
    @UnsupportedAppUsage
    /**
     * Gets whether bonding was initiated locally
     *
     * @return true if bonding is initiated locally, false otherwise
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH)
    public boolean isBondingInitiatedLocally() {
        final IBluetooth service = sService;
        if (service == null) {
@@ -1480,16 +1498,21 @@ public final class BluetoothDevice implements Parcelable {
        return false;
    }

    /** @hide */
    @UnsupportedAppUsage
    public boolean setPasskey(int passkey) {
        //TODO(BT)
        /*
        try {
            return sService.setPasskey(this, true, 4, passkey);
        } catch (RemoteException e) {Log.e(TAG, "", e);}*/
    /**
     * Set the pin during pairing when the pairing method is {@link #PAIRING_VARIANT_PIN}
     *
     * @return true pin has been set false for error
     * @hide
     */
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
    public boolean setPin(@Nullable String pin) {
        byte[] pinBytes = convertPinToBytes(pin);
        if (pinBytes == null) {
            return false;
        }
        return setPin(pinBytes);
    }

    /**
     * Confirm passkey for {@link #PAIRING_VARIANT_PASSKEY_CONFIRMATION} pairing.
@@ -1511,22 +1534,18 @@ public final class BluetoothDevice implements Parcelable {
        return false;
    }

    /** @hide */
    public boolean setRemoteOutOfBandData() {
        // TODO(BT)
        /*
        try {
          return sService.setRemoteOutOfBandData(this);
      } catch (RemoteException e) {Log.e(TAG, "", e);}*/
        return false;
    }

    /** @hide */
    @UnsupportedAppUsage
    public boolean cancelPairingUserInput() {
    /**
     * Cancels pairing to this device
     *
     * @return true if pairing cancelled successfully, false otherwise
     *
     * @hide
     */
    @SystemApi
    public boolean cancelPairing() {
        final IBluetooth service = sService;
        if (service == null) {
            Log.e(TAG, "BT not enabled. Cannot create pairing user input");
            Log.e(TAG, "BT not enabled. Cannot cancel pairing");
            return false;
        }
        try {
@@ -1537,17 +1556,6 @@ public final class BluetoothDevice implements Parcelable {
        return false;
    }

    /** @hide */
    @UnsupportedAppUsage
    public boolean isBluetoothDock() {
        // TODO(BT)
        /*
        try {
            return sService.isBluetoothDock(this);
        } catch (RemoteException e) {Log.e(TAG, "", e);}*/
        return false;
    }

    boolean isBluetoothEnabled() {
        boolean ret = false;
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
@@ -1558,13 +1566,14 @@ public final class BluetoothDevice implements Parcelable {
    }

    /**
     * Requires {@link android.Manifest.permission#BLUETOOTH}.
     * Gets whether the phonebook access is allowed for this bluetooth device
     *
     * @return Whether the phonebook access is allowed to this device. Can be {@link
     * #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or {@link #ACCESS_REJECTED}.
     * @hide
     */
    @UnsupportedAppUsage
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH)
    public int getPhonebookAccessPermission() {
        final IBluetooth service = sService;
        if (service == null) {
@@ -1667,14 +1676,14 @@ public final class BluetoothDevice implements Parcelable {
    }

    /**
     * Requires {@link android.Manifest.permission#BLUETOOTH}.
     * Gets whether message access is allowed to this bluetooth device
     *
     * @return Whether the message access is allowed to this device. Can be {@link #ACCESS_UNKNOWN},
     * {@link #ACCESS_ALLOWED} or {@link #ACCESS_REJECTED}.
     * @return Whether the message access is allowed to this device.
     * @hide
     */
    @UnsupportedAppUsage
    public int getMessageAccessPermission() {
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH)
    public @AccessPermission int getMessageAccessPermission() {
        final IBluetooth service = sService;
        if (service == null) {
            return ACCESS_UNKNOWN;
@@ -1689,15 +1698,18 @@ public final class BluetoothDevice implements Parcelable {

    /**
     * Sets whether the message access is allowed to this device.
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
     *
     * @param value Can be {@link #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or {@link
     * #ACCESS_REJECTED}.
     * @param value is the value we are setting the message access permission to
     * @return Whether the value has been successfully set.
     * @hide
     */
    @UnsupportedAppUsage
    public boolean setMessageAccessPermission(int value) {
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
    public boolean setMessageAccessPermission(@AccessPermission int value) {
        // Validates param value is one of the accepted constants
        if (value != ACCESS_ALLOWED && value != ACCESS_REJECTED && value != ACCESS_UNKNOWN) {
            throw new IllegalArgumentException(value + "is not a valid AccessPermission value");
        }
        final IBluetooth service = sService;
        if (service == null) {
            return false;
@@ -1711,13 +1723,14 @@ public final class BluetoothDevice implements Parcelable {
    }

    /**
     * Requires {@link android.Manifest.permission#BLUETOOTH}.
     * Gets whether sim access is allowed for this bluetooth device
     *
     * @return Whether the Sim access is allowed to this device. Can be {@link #ACCESS_UNKNOWN},
     * {@link #ACCESS_ALLOWED} or {@link #ACCESS_REJECTED}.
     * @return Whether the Sim access is allowed to this device.
     * @hide
     */
    public int getSimAccessPermission() {
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH)
    public @AccessPermission int getSimAccessPermission() {
        final IBluetooth service = sService;
        if (service == null) {
            return ACCESS_UNKNOWN;
@@ -1732,14 +1745,14 @@ public final class BluetoothDevice implements Parcelable {

    /**
     * Sets whether the Sim access is allowed to this device.
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
     *
     * @param value Can be {@link #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or {@link
     * #ACCESS_REJECTED}.
     * @return Whether the value has been successfully set.
     * @hide
     */
    @UnsupportedAppUsage
    @SystemApi
    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
    public boolean setSimAccessPermission(int value) {
        final IBluetooth service = sService;
        if (service == null) {
@@ -1970,7 +1983,7 @@ public final class BluetoothDevice implements Parcelable {
     * @return the pin code as a UTF-8 byte array, or null if it is an invalid Bluetooth pin.
     * @hide
     */
    @UnsupportedAppUsage
    @VisibleForTesting
    public static byte[] convertPinToBytes(String pin) {
        if (pin == null) {
            return null;
+0 −2
Original line number Diff line number Diff line
@@ -176,14 +176,12 @@ public class BluetoothTestUtils extends Assert {
                        mDevice.setPin(mPin);
                        break;
                    case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
                        mDevice.setPasskey(mPasskey);
                        break;
                    case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
                    case BluetoothDevice.PAIRING_VARIANT_CONSENT:
                        mDevice.setPairingConfirmation(true);
                        break;
                    case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
                        mDevice.setRemoteOutOfBandData();
                        break;
                }
            } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) {
+2 −6
Original line number Diff line number Diff line
@@ -643,14 +643,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>

        refresh();

        if (bondState == BluetoothDevice.BOND_BONDED) {
            if (mDevice.isBluetoothDock()) {
                onBondingDockConnect();
            } else if (mDevice.isBondingInitiatedLocally()) {
        if (bondState == BluetoothDevice.BOND_BONDED && mDevice.isBondingInitiatedLocally()) {
            connect(false);
        }
    }
    }

    public BluetoothClass getBtClass() {
        return mDevice.getBluetoothClass();
+10 −41
Original line number Diff line number Diff line
@@ -62,9 +62,6 @@ public class AudioDeviceInventory {

    private @NonNull AudioDeviceBroker mDeviceBroker;

    // cache of the address of the last dock the device was connected to
    private String mDockAddress;

    // Monitoring of audio routes.  Protected by mAudioRoutes.
    final AudioRoutesInfo mCurAudioRoutes = new AudioRoutesInfo();
    final RemoteCallbackList<IAudioRoutesObserver> mRoutesObservers =
@@ -168,7 +165,7 @@ public class AudioDeviceInventory {
        int a2dpVolume = btInfo.getVolume();
        if (AudioService.DEBUG_DEVICES) {
            Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice + " state="
                    + state + " is dock=" + btDevice.isBluetoothDock() + " vol=" + a2dpVolume);
                    + state + " vol=" + a2dpVolume);
        }
        String address = btDevice.getAddress();
        if (!BluetoothAdapter.checkBluetoothAddress(address)) {
@@ -195,34 +192,10 @@ public class AudioDeviceInventory {
                    if (a2dpCodec != di.mDeviceCodecFormat) {
                        mDeviceBroker.postBluetoothA2dpDeviceConfigChange(btDevice);
                    }
                } else {
                    if (btDevice.isBluetoothDock()) {
                        if (state == BluetoothProfile.STATE_DISCONNECTED) {
                            // introduction of a delay for transient disconnections of docks when
                            // power is rapidly turned off/on, this message will be canceled if
                            // we reconnect the dock under a preset delay
                            makeA2dpDeviceUnavailableLater(address,
                                    AudioDeviceBroker.BTA2DP_DOCK_TIMEOUT_MS);
                            // the next time isConnected is evaluated, it will be false for the dock
                        }
                } else {
                    makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat);
                }
            }
            } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
                if (btDevice.isBluetoothDock()) {
                    // this could be a reconnection after a transient disconnection
                    mDeviceBroker.cancelA2dpDockTimeout();
                    mDockAddress = address;
                } else {
                    // this could be a connection of another A2DP device before the timeout of
                    // a dock: cancel the dock timeout, and make the dock unavailable now
                    if (mDeviceBroker.hasScheduledA2dpDockTimeout() && mDockAddress != null) {
                        mDeviceBroker.cancelA2dpDockTimeout();
                        makeA2dpDeviceUnavailableNow(mDockAddress,
                                AudioSystem.AUDIO_FORMAT_DEFAULT);
                    }
                }
            if (a2dpVolume != -1) {
                mDeviceBroker.postSetVolumeIndexOnDevice(AudioSystem.STREAM_MUSIC,
                        // convert index to internal representation in VolumeStreamState
@@ -233,7 +206,6 @@ public class AudioDeviceInventory {
                    "onSetA2dpSinkConnectionState", a2dpCodec);
        }
    }
    }

    /*package*/ void onSetA2dpSourceConnectionState(
            @NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo, int state) {
@@ -672,9 +644,6 @@ public class AudioDeviceInventory {
                DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address));
        // Remove A2DP routes as well
        setCurrentAudioRouteNameIfPossible(null);
        if (mDockAddress == address) {
            mDockAddress = null;
        }
    }

    @GuardedBy("mConnectedDevices")