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

Commit 27b284ff authored by Yuyang Huang's avatar Yuyang Huang Committed by Gerrit Code Review
Browse files

Merge changes from topic "asha_advertisement"

* changes:
  add implementation for getAdvertisementServiceData
  add getAdvertisementServiceData as system api
parents b49a00f9 725f5e43
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ public final class AbstractionLayer {
    static final int BT_PROPERTY_DYNAMIC_AUDIO_BUFFER = 0x10;
    static final int BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER = 0x11;
    static final int BT_PROPERTY_WL_MEDIA_PLAYERS_LIST = 0x14;
    static final int BT_PROPERTY_REMOTE_ASHA_CAPABILITY = 0X15;
    static final int BT_PROPERTY_REMOTE_ASHA_TRUNCATED_HISYNCID = 0X16;

    public static final int BT_DEVICE_TYPE_BREDR = 0x01;
    public static final int BT_DEVICE_TYPE_BLE = 0x02;
+28 −0
Original line number Diff line number Diff line
@@ -4917,6 +4917,34 @@ public class AdapterService extends Service {
        return deviceProp.getConnectionHandle(transport);
    }

    /**
     * Get ASHA Capability
     *
     * @param device discovered bluetooth device
     * @return ASHA capability
     */
    public int getAshaCapability(BluetoothDevice device) {
        DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device);
        if (deviceProp == null) {
            return BluetoothDevice.ERROR;
        }
        return deviceProp.getAshaCapability();
    }

    /**
     * Get ASHA truncated HiSyncId
     *
     * @param device discovered bluetooth device
     * @return ASHA truncated HiSyncId
     */
    public int getAshaTruncatedHiSyncId(BluetoothDevice device) {
        DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device);
        if (deviceProp == null) {
            return BluetoothDevice.ERROR;
        }
        return deviceProp.getAshaTruncatedHiSyncId();
    }

    /**
     * Checks whether the device was recently associated with the comapnion app that called
     * {@link BluetoothDevice#createBond}. This allows these devices to skip the pairing dialog if
+38 −0
Original line number Diff line number Diff line
@@ -316,6 +316,8 @@ final class RemoteDevices {
        private boolean mIsBondingInitiatedLocally;
        private int mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
        private boolean mIsCoordinatedSetMember;
        private int mAshaCapability;
        private int mAshaTruncatedHiSyncId;
        @VisibleForTesting int mBondState;
        @VisibleForTesting int mDeviceType;
        @VisibleForTesting ParcelUuid[] mUuids;
@@ -634,6 +636,36 @@ final class RemoteDevices {
            }
        }

        /**
         * @return the mAshaCapability
         */
        int getAshaCapability() {
            synchronized (mObject) {
                return mAshaCapability;
            }
        }

        void setAshaCapability(int ashaCapability) {
            synchronized (mObject) {
                this.mAshaCapability = ashaCapability;
            }
        }

        /**
         * @return the mAshaTruncatedHiSyncId
         */
        int getAshaTruncatedHiSyncId() {
            synchronized (mObject) {
                return mAshaTruncatedHiSyncId;
            }
        }

        void setAshaTruncatedHiSyncId(int ashaTruncatedHiSyncId) {
            synchronized (mObject) {
                this.mAshaTruncatedHiSyncId = ashaTruncatedHiSyncId;
            }
        }

        public void setHfAudioPolicyForRemoteAg(BluetoothAudioPolicy policies) {
            mAudioPolicy = policies;
        }
@@ -880,6 +912,12 @@ final class RemoteDevices {
                        case AbstractionLayer.BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER:
                            deviceProperties.setIsCoordinatedSetMember(val[0] != 0);
                            break;
                        case AbstractionLayer.BT_PROPERTY_REMOTE_ASHA_CAPABILITY:
                            deviceProperties.setAshaCapability(val[0]);
                            break;
                        case AbstractionLayer.BT_PROPERTY_REMOTE_ASHA_TRUNCATED_HISYNCID:
                            deviceProperties.setAshaTruncatedHiSyncId(val[0]);
                            break;
                    }
                }
            }
+51 −0
Original line number Diff line number Diff line
@@ -18,9 +18,13 @@ package com.android.bluetooth.hearingaid;

import static android.Manifest.permission.BLUETOOTH_CONNECT;

import static com.android.bluetooth.Utils.callerIsSystemOrActiveOrManagedUser;
import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission;

import android.annotation.RequiresPermission;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothHearingAid.AdvertisementServiceData;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetoothHearingAid;
@@ -580,6 +584,30 @@ public class HearingAidService extends ProfileService {
        return mDeviceCapabilitiesMap.getOrDefault(device, -1);
    }

    @RequiresPermission(
            allOf = {
                android.Manifest.permission.BLUETOOTH_SCAN,
                android.Manifest.permission.BLUETOOTH_PRIVILEGED,
            })
    private AdvertisementServiceData getAdvertisementServiceData(
            BluetoothDevice device, AttributionSource attributionSource) {
        AdapterService service = mAdapterService;
        if (service == null
                || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getAdvertisementServiceData")
                || !Utils.checkScanPermissionForDataDelivery(service, attributionSource, TAG)) {
            return null;
        }
        enforceBluetoothPrivilegedPermission(service);

        int capability = service.getAshaCapability(device);
        int id = service.getAshaTruncatedHiSyncId(device);
        if (capability < 0) {
            Log.i(TAG, "device does not have AdvertisementServiceData");
            return null;
        }
        return new AdvertisementServiceData(capability, id);
    }

    /**
     * Set the active device.
     * @param device the new active device
@@ -1150,6 +1178,29 @@ public class HearingAidService extends ProfileService {
                receiver.propagateException(e);
            }
        }

        @RequiresPermission(
                allOf = {
                    android.Manifest.permission.BLUETOOTH_SCAN,
                    android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                })
        @Override
        public void getAdvertisementServiceData(
                BluetoothDevice device,
                AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                if (!Utils.checkServiceAvailable(mService, TAG)
                        || !Utils.checkCallerIsSystemOrActiveOrManagedUser(mService, TAG)
                        || !Utils.checkScanPermissionForDataDelivery(mService, source, TAG)) {
                    receiver.send(null);
                    return;
                }
                receiver.send(mService.getAdvertisementServiceData(device, source));
            } catch (RuntimeException e) {
                receiver.propagateException(e);
            }
        }
    }

    @Override
+11 −0
Original line number Diff line number Diff line
@@ -379,6 +379,7 @@ package android.bluetooth {
  }

  public final class BluetoothHearingAid implements android.bluetooth.BluetoothProfile {
    method @Nullable @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public android.bluetooth.BluetoothHearingAid.AdvertisementServiceData getAdvertisementServiceData(@NonNull android.bluetooth.BluetoothDevice);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public int getDeviceMode(@NonNull android.bluetooth.BluetoothDevice);
    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public int getDeviceSide(@NonNull android.bluetooth.BluetoothDevice);
@@ -395,6 +396,16 @@ package android.bluetooth {
    field public static final int SIDE_UNKNOWN = -1; // 0xffffffff
  }

  public static final class BluetoothHearingAid.AdvertisementServiceData implements android.os.Parcelable {
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getDeviceMode();
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getDeviceSide();
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getTruncatedHiSyncId();
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean isCsipSupported();
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean isInPairWith(@Nullable android.bluetooth.BluetoothHearingAid.AdvertisementServiceData);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHearingAid.AdvertisementServiceData> CREATOR;
  }

  public final class BluetoothHidDevice implements android.bluetooth.BluetoothProfile {
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
  }
Loading