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

Commit 5c715054 authored by Rahul Arya's avatar Rahul Arya
Browse files

Add support for NRPAs in advertisement sets

Bug: 268112598
Test: unit
Change-Id: I51550c1b6c76412975e8cdcac9eca1ba3ad53a67
parent acf58f75
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -957,6 +957,7 @@ package android.bluetooth.le {
    field public static final int ADDRESS_TYPE_DEFAULT = -1; // 0xffffffff
    field public static final int ADDRESS_TYPE_PUBLIC = 0; // 0x0
    field public static final int ADDRESS_TYPE_RANDOM = 1; // 0x1
    field public static final int ADDRESS_TYPE_RANDOM_NON_RESOLVABLE = 2; // 0x2
  }

  public static final class AdvertisingSetParameters.Builder {
+2 −1
Original line number Diff line number Diff line
@@ -285,7 +285,8 @@ public final class AdvertiseSettings implements Parcelable {
        @SystemApi
        public @NonNull Builder setOwnAddressType(@AddressTypeStatus int ownAddressType) {
            if (ownAddressType < AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
                    ||  ownAddressType > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM) {
                    || ownAddressType
                            > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM_NON_RESOLVABLE) {
                throw new IllegalArgumentException("unknown address type " + ownAddressType);
            }
            mOwnAddressType = ownAddressType;
+12 −2
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ public final class AdvertisingSetParameters implements Parcelable {
    @IntDef(prefix = "ADDRESS_TYPE_", value = {
        ADDRESS_TYPE_DEFAULT,
        ADDRESS_TYPE_PUBLIC,
        ADDRESS_TYPE_RANDOM
        ADDRESS_TYPE_RANDOM,
        ADDRESS_TYPE_RANDOM_NON_RESOLVABLE,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface AddressTypeStatus {}
@@ -136,6 +137,14 @@ public final class AdvertisingSetParameters implements Parcelable {
    @SystemApi
    public static final int ADDRESS_TYPE_RANDOM = 1;

    /**
     * Generate and advertise on non-resolvable private address.
     *
     * @hide
     */
    @SystemApi
    public static final int ADDRESS_TYPE_RANDOM_NON_RESOLVABLE = 2;

    private final boolean mIsLegacy;
    private final boolean mIsAnonymous;
    private final boolean mIncludeTxPower;
@@ -500,7 +509,8 @@ public final class AdvertisingSetParameters implements Parcelable {
        @SystemApi
        public @NonNull Builder setOwnAddressType(@AddressTypeStatus int ownAddressType) {
            if (ownAddressType < AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
                    ||  ownAddressType > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM) {
                    || ownAddressType
                            > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM_NON_RESOLVABLE) {
                throw new IllegalArgumentException("unknown address type " + ownAddressType);
            }
            mOwnAddressType = ownAddressType;
+8 −3
Original line number Diff line number Diff line
@@ -220,14 +220,19 @@ AddressWithType LeAddressManager::GetCurrentAddress() {
}

AddressWithType LeAddressManager::GetAnotherAddress() {
  ASSERT(
      address_policy_ == AddressPolicy::USE_NON_RESOLVABLE_ADDRESS ||
      address_policy_ == AddressPolicy::USE_RESOLVABLE_ADDRESS);
  ASSERT(RotatingAddress());
  hci::Address address = generate_rpa();
  auto random_address = AddressWithType(address, AddressType::RANDOM_DEVICE_ADDRESS);
  return random_address;
}

AddressWithType LeAddressManager::NewNonResolvableAddress() {
  ASSERT(RotatingAddress());
  hci::Address address = generate_nrpa();
  auto random_address = AddressWithType(address, AddressType::RANDOM_DEVICE_ADDRESS);
  return random_address;
}

void LeAddressManager::pause_registered_clients() {
  for (auto& client : registered_clients_) {
    switch (client.second) {
+5 −3
Original line number Diff line number Diff line
@@ -78,9 +78,11 @@ class LeAddressManager {
  virtual AddressPolicy Register(LeAddressManagerCallback* callback);
  virtual void Unregister(LeAddressManagerCallback* callback);
  virtual bool UnregisterSync(
      LeAddressManagerCallback* callback, std::chrono::milliseconds timeout = kUnregisterSyncTimeoutInMs);
      LeAddressManagerCallback* callback,
      std::chrono::milliseconds timeout = kUnregisterSyncTimeoutInMs);
  AddressWithType GetCurrentAddress();        // What was set in SetRandomAddress()
  AddressWithType GetAnotherAddress();        // A new random address without rotating.
  AddressWithType NewNonResolvableAddress();  // A new non-resolvable address

  uint8_t GetFilterAcceptListSize();
  uint8_t GetResolvingListSize();
Loading