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

Commit c6449d01 authored by Yuyang Huang's avatar Yuyang Huang
Browse files

add getAdvertisementServiceData as system api

This targets to expose ASHA service data to settingLib

Test: manual
Tag: #feature
Bug: 265027285
Change-Id: I44850f17ff9248173d9782b2d54037fec13b766c
parent 2c8e59c3
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