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

Commit b120a722 authored by Rahul Arya's avatar Rahul Arya
Browse files

[Pandora] Set Scan Mode

Let clients set the classic connectability/discoverability of the DUT.
Needed for GAP

Test: GAP pts
Bug: 248814583

Change-Id: I62b56ec2aae4a1628fa2de9f6d48aa116a299ce1
parent 00611b22
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ service Host {
  rpc RunInquiry(RunInquiryRequest) returns (stream RunInquiryResponse);
  // Run LE discovery (scanning) and return each device found
  rpc RunDiscovery(RunDiscoveryRequest) returns (stream RunDiscoveryResponse);
  // Set BREDR connectability mode
  rpc SetConnectabilityMode(SetConnectabilityModeRequest) returns (SetConnectabilityModeResponse);
  // Set BREDR discoverable mode
  rpc SetDiscoverabilityMode(SetDiscoverabilityModeRequest) returns (SetDiscoverabilityModeResponse);
}

// Response of the `ReadLocalAddress` method.
@@ -183,3 +187,30 @@ message Device {
  string name = 1;
  bytes address = 2;
}

// 5.3 Vol 3C 4.1 Discoverability Modes
enum DiscoverabilityMode {
  DISCOVERABILITY_UNSPECIFIED = 0;
  DISCOVERABILITY_NONE = 1;
  DISCOVERABILITY_LIMITED = 2;
  DISCOVERABILITY_GENERAL = 3;
}

// 5.3 Vol 3C 4.2 Connectability Modes
enum ConnectabilityMode {
  CONNECTABILITY_UNSPECIFIED = 0;
  CONNECTABILITY_NOT_CONNECTABLE = 1;
  CONECTABILITY_CONNECTABLE = 2;
}

message SetConnectabilityModeRequest {
  ConnectabilityMode connectability = 1;
}

message SetConnectabilityModeResponse {}

message SetDiscoverabilityModeRequest {
  DiscoverabilityMode discoverability = 1;
}

message SetDiscoverabilityModeResponse {}
+74 −2
Original line number Diff line number Diff line
@@ -74,6 +74,9 @@ class Host(private val context: Context, private val server: Server) : HostImplB
  private val bluetoothManager = context.getSystemService(BluetoothManager::class.java)!!
  private val bluetoothAdapter = bluetoothManager.adapter

  private var connectability = ConnectabilityMode.CONNECTABILITY_UNSPECIFIED
  private var discoverability = DiscoverabilityMode.DISCOVERABILITY_UNSPECIFIED

  init {
    scope = CoroutineScope(Dispatchers.Default)

@@ -354,8 +357,7 @@ class Host(private val context: Context, private val server: Server) : HostImplB
    grpcUnary<GetLEConnectionResponse>(scope, responseObserver) {
      val address = request.address.decodeAsMacAddressToString()
      Log.i(TAG, "getLEConnection: $address")
      val device =
        bluetoothAdapter.getRemoteLeDevice(address, BluetoothDevice.ADDRESS_TYPE_PUBLIC)
      val device = bluetoothAdapter.getRemoteLeDevice(address, BluetoothDevice.ADDRESS_TYPE_PUBLIC)
      if (device.isConnected) {
        GetLEConnectionResponse.newBuilder()
          .setConnection(newConnection(device, Transport.TRANSPORT_LE))
@@ -444,6 +446,76 @@ class Host(private val context: Context, private val server: Server) : HostImplB
    }
  }

  override fun setConnectabilityMode(
    request: SetConnectabilityModeRequest,
    responseObserver: StreamObserver<SetConnectabilityModeResponse>
  ) {
    grpcUnary(scope, responseObserver) {
      Log.d(TAG, "setConnectabilityMode")
      connectability = request.connectability!!

      val scanMode =
        when (connectability) {
          ConnectabilityMode.CONNECTABILITY_UNSPECIFIED,
          ConnectabilityMode.UNRECOGNIZED -> null
          ConnectabilityMode.CONNECTABILITY_NOT_CONNECTABLE -> {
            BluetoothAdapter.SCAN_MODE_NONE
          }
          ConnectabilityMode.CONECTABILITY_CONNECTABLE -> {
            if (
              discoverability == DiscoverabilityMode.DISCOVERABILITY_LIMITED ||
                discoverability == DiscoverabilityMode.DISCOVERABILITY_GENERAL
            ) {
              BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE
            } else {
              BluetoothAdapter.SCAN_MODE_CONNECTABLE
            }
          }
        }

      if (scanMode != null) {
        bluetoothAdapter.setScanMode(scanMode)
      }
      SetConnectabilityModeResponse.getDefaultInstance()
    }
  }

  override fun setDiscoverabilityMode(
    request: SetDiscoverabilityModeRequest,
    responseObserver: StreamObserver<SetDiscoverabilityModeResponse>
  ) {
    Log.d(TAG, "setDiscoverabilityMode")
    grpcUnary(scope, responseObserver) {
      discoverability = request.discoverability!!

      val scanMode =
        when (discoverability) {
          DiscoverabilityMode.DISCOVERABILITY_UNSPECIFIED,
          DiscoverabilityMode.UNRECOGNIZED -> null
          DiscoverabilityMode.DISCOVERABILITY_NONE ->
            if (connectability == ConnectabilityMode.CONECTABILITY_CONNECTABLE) {
              BluetoothAdapter.SCAN_MODE_CONNECTABLE
            } else {
              BluetoothAdapter.SCAN_MODE_NONE
            }
          DiscoverabilityMode.DISCOVERABILITY_LIMITED,
          DiscoverabilityMode.DISCOVERABILITY_GENERAL ->
            BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE
        }

      if (scanMode != null) {
        bluetoothAdapter.setScanMode(scanMode)
      }

      if (request.discoverability == DiscoverabilityMode.DISCOVERABILITY_LIMITED) {
        bluetoothAdapter.setDiscoverableTimeout(
          Duration.ofSeconds(120)
        ) // limited discoverability needs a timeout, 120s is Android default
      }
      SetDiscoverabilityModeResponse.getDefaultInstance()
    }
  }

  override fun runDiscovery(
    request: RunDiscoveryRequest,
    responseObserver: StreamObserver<RunDiscoveryResponse>