[BLE Refactor] Move /cal/ble.h , base_types.h to /platform/implementation/ble_v2.h

PiperOrigin-RevId: 430133309
diff --git a/cpp/cal/api/BUILD b/cpp/cal/api/BUILD
deleted file mode 100644
index 864f4e0..0000000
--- a/cpp/cal/api/BUILD
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-licenses(["notice"])
-
-cc_library(
-    name = "ble",
-    hdrs = [
-        "ble.h",
-    ],
-    visibility = [
-        "//googlemac/iPhone/Shared/Nearby/Connections:__subpackages__",
-        "//connections:__subpackages__",
-        "//third_party/nearby/cpp/cal:__subpackages__",
-    ],
-    deps = [
-        "//cpp/cal/base:types",
-        "//internal/platform:base",
-        "@com_google_absl//absl/strings",
-        "@com_google_absl//absl/time",
-        "@com_google_absl//absl/types:optional",
-    ],
-)
diff --git a/cpp/cal/api/ble.h b/cpp/cal/api/ble.h
deleted file mode 100644
index 9a5ccc7..0000000
--- a/cpp/cal/api/ble.h
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef CAL_API_BLE_H_
-#define CAL_API_BLE_H_
-
-#include <map>
-#include <memory>
-#include <set>
-
-#include "absl/strings/string_view.h"
-#include "absl/time/time.h"
-#include "absl/types/optional.h"
-#include "third_party/nearby/cpp/cal/base/ble_types.h"
-
-namespace nearby {
-namespace cal {
-namespace api {
-
-// TODO(b/213835576): Refactor BlePeripheral. The one in BluetoothAdapter should
-// be considered, too.
-class BlePeripheral {
- public:
-  virtual ~BlePeripheral() {}
-  virtual std::string GetName() const = 0;
-  virtual std::string GetAddress() const = 0;
-  virtual location::nearby::ByteArray GetAdvertisementBytes() const = 0;
-};
-
-struct ScanResult {
-  std::unique_ptr<BlePeripheral> peripheral;
-  int rssi;
-  int tx_power;
-  absl::Time timestamp;
-};
-
-// https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic
-//
-// Representation of a GATT characteristic.
-class GattCharacteristic {
- public:
-  virtual ~GattCharacteristic() = default;
-
-  enum class Permission {
-    kUnknown = 0,
-    kRead = 1,
-    kWrite = 2,
-    kLast,
-  };
-
-  enum class Property {
-    kUnknown = 0,
-    kRead = 1,
-    kWrite = 2,
-    kIndicate = 3,
-    kLast,
-  };
-
-  virtual std::string GetUuid() const = 0;
-
-  // Returns the UUID of the containing GATT service.
-  virtual std::string GetServiceUuid() const = 0;
-};
-
-class ClientGattConnection {
- public:
-  virtual ~ClientGattConnection() {}
-  virtual BlePeripheral& GetPeripheral() = 0;
-  virtual bool DiscoverServices() = 0;
-  virtual absl::optional<GattCharacteristic*> GetCharacteristic(
-      absl::string_view service_uuid,
-      absl::string_view characteristic_uuid) = 0;
-  virtual absl::optional<location::nearby::ByteArray> ReadCharacteristic(
-      const GattCharacteristic& characteristic) = 0;
-  virtual bool WriteCharacteristic(
-      const GattCharacteristic& characteristic,
-      const location::nearby::ByteArray& value) = 0;
-  virtual void Disconnect() = 0;
-  virtual bool SetCharacteristicNotification(
-      const GattCharacteristic& characteristic, bool enable) = 0;
-};
-
-class ServerGattConnection {
- public:
-  virtual ~ServerGattConnection() {}
-  virtual bool SendCharacteristic(const GattCharacteristic& characteristic,
-                                  const location::nearby::ByteArray& value) = 0;
-};
-
-class ClientGattConnectionLifeCycleCallback {
- public:
-  virtual ~ClientGattConnectionLifeCycleCallback() {}
-  virtual void OnDisconnected(ClientGattConnection* connection) = 0;
-  virtual void onConnectionStateChange(ClientGattConnection* connection) = 0;
-  virtual void onCharacteristicRead(ClientGattConnection* connection) = 0;
-};
-
-// Callback for asynchronous events on the server side of a GATT connection.
-struct ServerGattConnectionCallback {
-  // Called when a remote peripheral connected to us and subscribed to one of
-  // our characteristics.
-  std::function<void(const ServerGattConnection& connection,
-                     const GattCharacteristic& characteristic)>
-      characteristic_subscription_cb;
-
-  // Called when a remote peripheral unsubscribed from one of our
-  // characteristics.
-  std::function<void(ServerGattConnection& connection,
-                     const GattCharacteristic& characteristic)>
-      characteristic_unsubscription_cb;
-};
-
-// https://developer.android.com/reference/android/bluetooth/BluetoothGattServer
-//
-// Representation of a BLE GATT server.
-class GattServer {
- public:
-  virtual ~GattServer() = default;
-
-  // Creates a characteristic and adds it to the GATT server under the given
-  // characteristic and service UUIDs. Returns no value upon error.
-  //
-  // Characteristics of the same service UUID should be put under one
-  // service rather than many services with the same UUID.
-  //
-  // If the INDICATE property is included, the characteristic should include the
-  // official Bluetooth Client Characteristic Configuration descriptor with UUID
-  // 0x2902 and a WRITE permission. This allows remote clients to write to this
-  // descriptor and subscribe for characteristic changes. For more information
-  // about this descriptor, please go to:
-  // https://www.bluetooth.com/specifications/Gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.Gatt.client_characteristic_configuration.xml
-  virtual std::unique_ptr<GattCharacteristic> CreateCharacteristic(
-      absl::string_view service_uuid, absl::string_view characteristic_uuid,
-      const std::vector<GattCharacteristic::Permission>& permissions,
-      const std::vector<GattCharacteristic::Property>& properties) = 0;
-
-  // https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setValue(byte[])
-  //
-  // Locally updates the value of a characteristic and returns whether or not it
-  // was successful.
-  // TODO(b/213835576): Refactor GattCharacteristic as a POD struct type.
-  virtual bool UpdateCharacteristic(
-      const GattCharacteristic& characteristic,
-      const location::nearby::ByteArray& value) = 0;
-
-  // Stops a GATT server.
-  virtual void Stop() = 0;
-};
-
-class BleSocket {
- public:
-  virtual ~BleSocket() {}
-  virtual api::BlePeripheral& GetRemotePeripheral() = 0;
-  virtual location::nearby::Exception Write(
-      const location::nearby::ByteArray& message) = 0;
-  virtual location::nearby::Exception Close() = 0;
-  virtual location::nearby::InputStream& GetInputStream() = 0;
-  virtual location::nearby::OutputStream& GetOutputStream() = 0;
-};
-
-class BleSocketLifeCycleCallback {
- public:
-  virtual ~BleSocketLifeCycleCallback() {}
-  virtual void OnMessageReceived(
-      BleSocket* socket, const location::nearby::ByteArray& message) = 0;
-  virtual void OnDisconnected(BleSocket* socket) = 0;
-};
-
-class ServerBleSocketLifeCycleCallback : public BleSocketLifeCycleCallback {
- public:
-  ~ServerBleSocketLifeCycleCallback() override {}
-  virtual void OnSocketEstablished(BleSocket& socket) = 0;
-};
-
-// The main BLE medium used inside of Nearby. This serves as the entry point for
-// all BLE and GATT related operations.
-class BleMedium {
- public:
-  using Mtu = uint32_t;
-
-  virtual ~BleMedium() = default;
-
-  // https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html#startAdvertising(android.bluetooth.le.AdvertiseSettings,%20android.bluetooth.le.AdvertiseData,%20android.bluetooth.le.AdvertiseData,%20android.bluetooth.le.AdvertiseCallback)
-  //
-  // Starts BLE advertising and returns whether or not it was successful.
-  //
-  // Power mode should be interpreted in the following way:
-  //   LOW:
-  //     - TX power = medium
-  //   HIGH:
-  //     - TX power = high
-  virtual bool StartAdvertising(const BleAdvertisementData& advertising_data,
-                                const BleAdvertisementData& scan_response_data,
-                                PowerMode power_mode) = 0;
-
-  // https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html#stopAdvertising(android.bluetooth.le.AdvertiseCallback)
-  //
-  // Stops advertising.
-  virtual bool StopAdvertising() = 0;
-
-  class ScanCallback {
-   public:
-    virtual ~ScanCallback() {}
-    virtual void OnAdvertisementFound(
-        const ScanResult& scan_result,
-        const BleAdvertisementData& advertisement_data) = 0;
-  };
-  virtual bool StartScanning(const std::set<std::string>& service_uuids,
-                             PowerMode power_mode,
-                             const ScanCallback& scan_callback) = 0;
-  virtual void StopScanning() = 0;
-
-  // https://developer.android.com/reference/android/bluetooth/BluetoothManager#openGattServer(android.content.Context,%20android.bluetooth.BluetoothGattServerCallback)
-  //
-  // Starts a GATT server. Returns a nullptr upon error.
-  virtual std::unique_ptr<GattServer> StartGattServer(
-      ServerGattConnectionCallback callback) = 0;
-
-  virtual bool StartListeningForIncomingBleSockets(
-      const ServerBleSocketLifeCycleCallback& callback) = 0;
-  virtual void StopListeningForIncomingBleSockets() = 0;
-  virtual std::unique_ptr<ClientGattConnection> ConnectToGattServer(
-      BlePeripheral* peripheral, Mtu mtu, PowerMode power_mode,
-      const ClientGattConnectionLifeCycleCallback& callback) = 0;
-  virtual std::unique_ptr<BleSocket> EstablishBleSocket(
-      BlePeripheral* peripheral,
-      const BleSocketLifeCycleCallback& callback) = 0;
-};
-
-}  // namespace api
-}  // namespace cal
-}  // namespace nearby
-
-#endif  // CAL_API_BLE_H_
diff --git a/cpp/cal/base/BUILD b/cpp/cal/base/BUILD
deleted file mode 100644
index c4e27db..0000000
--- a/cpp/cal/base/BUILD
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-licenses(["notice"])
-
-cc_library(
-    name = "types",
-    hdrs = [
-        "ble_types.h",
-    ],
-    visibility = [
-        "//googlemac/iPhone/Shared/Nearby/Connections:__subpackages__",
-        "//third_party/nearby/cpp:__subpackages__",
-    ],
-    deps = [
-        "//internal/platform:base",
-        "@com_google_absl//absl/container:flat_hash_map",
-        "@com_google_absl//absl/container:flat_hash_set",
-    ],
-)
diff --git a/cpp/cal/base/ble_types.h b/cpp/cal/base/ble_types.h
deleted file mode 100644
index fedab33..0000000
--- a/cpp/cal/base/ble_types.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef CAL_BASE_TYPES_H_
-#define CAL_BASE_TYPES_H_
-
-// TODO(hais) relocate base def class accordingly.
-#include "absl/container/flat_hash_map.h"
-#include "absl/container/flat_hash_set.h"
-#include "internal/platform/byte_array.h"
-#include "internal/platform/exception.h"
-#include "internal/platform/input_stream.h"
-#include "internal/platform/listeners.h"
-#include "internal/platform/output_stream.h"
-
-namespace nearby {
-namespace cal {
-
-enum class AdvertiseMode {
-  kUnknown = 0,
-  kLowPower = 1,
-  kBalanced = 2,
-  kLowLatency = 3,
-};
-
-// Coarse representation of power settings throughout all BLE operations.
-enum class PowerMode {
-  kUnknown = 0,
-  kUltraLow = 1,
-  kLow = 2,
-  kMedium = 3,
-  kHigh = 4,
-};
-
-struct AdvertiseSettings {
-  AdvertiseMode advertise_mode;
-  PowerMode power_mode;
-  int timeout;
-  bool is_connectable;
-};
-
-// https://developer.android.com/reference/android/bluetooth/le/AdvertiseData
-//
-// Bundle of data found in a BLE advertisement.
-//
-// All service UUIDs will conform to the 16-bit Bluetooth base UUID,
-// 0000xxxx-0000-1000-8000-00805F9B34FB. This makes it possible to store two
-// byte service UUIDs in the advertisement.
-struct BleAdvertisementData {
-  using TxPowerLevel = std::int8_t;
-
-  static constexpr TxPowerLevel kUnspecifiedTxPowerLevel =
-      std::numeric_limits<TxPowerLevel>::min();
-
-  bool is_connectable;
-
-  // If tx_power_level is not set to kUnspecifiedTxPowerLevel, platform
-  // implementer needs to set the TxPowerLevel.
-  TxPowerLevel tx_power_level;
-
-  // If the set is not empty, the platform implementer needs to add the
-  // service_uuids in the advertisement data.
-  absl::flat_hash_set<std::string> service_uuids;
-
-  // Maps service UUIDs to their service data.
-  //
-  // Note if platform can't advertise data from Data type (0x16)
-  // (reaonly in iOS), then (iOS) should advertise data via LocalName data type
-  // (0x08).
-  // It means the iOS should take the first index of service_data as the data
-  // for LocalName type.
-  absl::flat_hash_map<std::string, location::nearby::ByteArray> service_data;
-};
-
-enum class ScanMode {
-  kUnknown = 0,
-  kLowPower,
-  kBalanced,
-  kLowLatency,
-  // kOpportunistic not supported
-};
-
-struct ScanSettings {
-  ScanMode scan_mode;
-  // Do we need reportDelay, phy, legacy?
-};
-
-}  // namespace cal
-}  // namespace nearby
-
-#endif  // CAL_BASE_TYPES_H_
diff --git a/cpp/cal/public/BUILD b/cpp/cal/public/BUILD
deleted file mode 100644
index b4e3bad..0000000
--- a/cpp/cal/public/BUILD
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-licenses(["notice"])
-
-cc_library(
-    name = "ble",
-    srcs = [
-        "ble.cc",
-    ],
-    hdrs = [
-        "ble.h",
-    ],
-    visibility = [
-        "//third_party/nearby:__subpackages__",
-    ],
-    deps = [
-        "//third_party/nearby/cpp/cal/api:ble",
-        "//cpp/cal/base:types",
-    ],
-)
diff --git a/cpp/cal/public/ble.cc b/cpp/cal/public/ble.cc
deleted file mode 100644
index 99149ff..0000000
--- a/cpp/cal/public/ble.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "third_party/nearby/cpp/cal/public/ble.h"
-
-#include <memory>
-
-#include "third_party/nearby/cpp/cal/api/ble.h"
-#include "third_party/nearby/cpp/cal/base/ble_types.h"
-
-namespace nearby {
-namespace cal {
-
-using ::location::nearby::ByteArray;
-using ::location::nearby::Exception;
-using ::location::nearby::InputStream;
-using ::location::nearby::OutputStream;
-
-InputStream& BleSocket::GetInputStream() { return impl_->GetInputStream(); }
-OutputStream& BleSocket::GetOutputStream() { return impl_->GetOutputStream(); }
-Exception BleSocket::Close() { return impl_->Close(); }
-api::BlePeripheral& BleSocket::GetRemotePeripheral() {
-  return impl_->GetRemotePeripheral();
-}
-bool BleSocket::IsValid() const { return false; }
-api::BleSocket& BleSocket::GetImpl() { return *impl_; }
-
-BlePeripheral::BlePeripheral(api::BlePeripheral* peripheral) {
-  impl_ = peripheral;
-}
-std::string BlePeripheral::GetName() const { return impl_->GetName(); }
-std::string BlePeripheral::GetAddress() const { return impl_->GetAddress(); }
-ByteArray BlePeripheral::GetAdvertisementBytes(
-    absl::string_view service_id) const {
-  return impl_->GetAdvertisementBytes();
-}
-api::BlePeripheral& BlePeripheral::GetImpl() { return *impl_; }
-bool BlePeripheral::IsValid() const { return impl_ != nullptr; }
-
-BleMedium::BleMedium(std::unique_ptr<api::BleMedium> impl) {
-  impl_ = std::move(impl);
-}
-
-bool BleMedium::StartAdvertising(const BleAdvertisementData& advertising_data,
-                                 const BleAdvertisementData& scan_response_data,
-                                 PowerMode power_mode) {
-  return impl_->StartAdvertising(advertising_data, scan_response_data,
-                                 power_mode);
-}
-
-bool BleMedium::StopAdvertising() {
-  // TODO(hais): real impl b/196132654.
-  return impl_->StopAdvertising();
-}
-
-bool BleMedium::StartScanning(
-    const std::string& service_id, const ScanSettings& settings,
-    const std::string& fast_advertisement_service_uuid,
-    DiscoveredPeripheralCallback callback) {
-  // TODO(hais): real impl b/196132654.
-  return false;
-}
-bool BleMedium::StopScanning(const std::string& service_id) {
-  // TODO(hais): real impl b/196132654.
-  return false;
-}
-
-bool BleMedium::StartAcceptingConnections(const std::string& service_id,
-                                          AcceptedConnectionCallback callback) {
-  // TODO(hais): real impl b/196132654.
-  return false;
-}
-
-bool cal::BleMedium::StopAcceptingConnections(const std::string& service_id) {
-  // TODO(hais): real impl b/196132654.
-  return false;
-}
-std::unique_ptr<api::ClientGattConnection> cal::BleMedium::ConnectGatt(
-    nearby::cal::api::BlePeripheral& peripheral,
-    const api::GattCharacteristic& characteristic,
-    const api::ClientGattConnectionLifeCycleCallback& callback) {
-  // TODO(hais): real impl b/196132654.
-  return impl_->ConnectToGattServer(&peripheral, -1, PowerMode::kUnknown,
-                                    callback);
-}
-void cal::BleMedium::DisconnectGatt(
-    api::BlePeripheral& peripheral,
-    const api::GattCharacteristic& characteristic) {
-  // TODO(hais): real impl b/196132654.
-}
-bool cal::BleMedium::IsValid() const { return impl_ != nullptr; }
-cal::api::BleMedium& cal::BleMedium::GetImpl() { return *impl_; }
-
-}  // namespace cal
-}  // namespace nearby
diff --git a/cpp/cal/public/ble.h b/cpp/cal/public/ble.h
deleted file mode 100644
index 2aed770..0000000
--- a/cpp/cal/public/ble.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef CAL_PUBLIC_BLE_H_
-#define CAL_PUBLIC_BLE_H_
-
-#include <memory>
-
-#include "third_party/nearby/cpp/cal/api/ble.h"
-#include "third_party/nearby/cpp/cal/base/ble_types.h"
-
-namespace nearby {
-namespace cal {
-
-class BlePeripheral final {
-  explicit BlePeripheral(api::BlePeripheral* peripheral);
-  std::string GetName() const;
-  std::string GetAddress() const;
-  location::nearby::ByteArray GetAdvertisementBytes(
-      absl::string_view service_id) const;
-  api::BlePeripheral& GetImpl();
-  bool IsValid() const;
-
- private:
-  api::BlePeripheral* impl_;
-};
-
-class BleSocket final {
-  location::nearby::InputStream& GetInputStream();
-  location::nearby::OutputStream& GetOutputStream();
-  location::nearby::Exception Close();
-  api::BlePeripheral& GetRemotePeripheral();
-  bool IsValid() const;
-  api::BleSocket& GetImpl();
-
- private:
-  std::shared_ptr<api::BleSocket> impl_;
-};
-
-class BleMedium final {
- public:
-  struct DiscoveredPeripheralCallback {
-    std::function<void(const api::ScanResult& scan_result,
-                       const std::string& service_id,
-                       const location::nearby::ByteArray& advertisement_bytes)>
-        peripheral_discovered_cb;
-    std::function<void(BlePeripheral& peripheral,
-                       const std::string& service_id)>
-        peripheral_lost_cb;
-  };
-
-  struct AcceptedConnectionCallback {
-    std::function<void(BleSocket& socket, const std::string& service_id)>
-        accepted_cb =
-            location::nearby::DefaultCallback<BleSocket&, const std::string&>();
-  };
-
-  struct AcceptedConnectionInfo {
-    BleSocket socket;
-  };
-
-  explicit BleMedium(std::unique_ptr<api::BleMedium> impl);
-
-  bool StartAdvertising(const BleAdvertisementData& advertising_data,
-                        const BleAdvertisementData& scan_response_data,
-                        PowerMode power_mode);
-  bool StopAdvertising();
-
-  bool StartScanning(const std::string& service_id,
-                     const ScanSettings& settings,
-                     const std::string& fast_advertisement_service_uuid,
-                     DiscoveredPeripheralCallback callback);
-  bool StopScanning(const std::string& service_id);
-  bool StartAcceptingConnections(const std::string& service_id,
-                                 AcceptedConnectionCallback callback);
-  bool StopAcceptingConnections(const std::string& service_id);
-  std::unique_ptr<api::ClientGattConnection> ConnectGatt(
-      api::BlePeripheral& peripheral,
-      const api::GattCharacteristic& characteristic,
-      const api::ClientGattConnectionLifeCycleCallback& callback);
-  void DisconnectGatt(api::BlePeripheral& peripheral,
-                      const api::GattCharacteristic& characteristic);
-  bool IsValid() const;
-  api::BleMedium& GetImpl();
-
- private:
-  std::unique_ptr<api::BleMedium> impl_;
-};
-
-}  // namespace cal
-}  // namespace nearby
-
-#endif  // CAL_PUBLIC_BLE_H_
diff --git a/cpp/cal/public/ble_test.cc b/cpp/cal/public/ble_test.cc
deleted file mode 100644
index 48581fc..0000000
--- a/cpp/cal/public/ble_test.cc
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "third_party/nearby/cpp/cal/api/ble.h"
-
-#include <memory>
-
-#include "gmock/gmock.h"
-#include "protobuf-matchers/protocol-buffer-matchers.h"
-#include "gtest/gtest.h"
-#include "third_party/nearby/cpp/cal/base/ble_types.h"
-#include "third_party/nearby/cpp/cal/public/ble.h"
-
-namespace nearby {
-namespace cal {
-namespace {
-
-class MockBlePeripheral : public api::BlePeripheral {
-  MOCK_METHOD(std::string, GetName, (), (const override));
-  MOCK_METHOD(std::string, GetAddress, (), (const override));
-  MOCK_METHOD(ByteArray, GetAdvertisementBytes, (), (const override));
-};
-
-class MockGattCharacteristic : public api::GattCharacteristic {
-  MOCK_METHOD(std::string, GetServiceUuid, (), (override));
-};
-
-class MockClientGattConnection : public api::ClientGattConnection {
- public:
-  MOCK_METHOD(api::BlePeripheral&, GetPeripheral, (), (override));
-  MOCK_METHOD(bool, DiscoverServices, (), (override));
-  MOCK_METHOD(absl::optional<api::GattCharacteristic*>, GetCharacteristic,
-              (absl::string_view service_uuid,
-               absl::string_view characteristic_uuid),
-              (override));
-  MOCK_METHOD(absl::optional<ByteArray>, ReadCharacteristic,
-              (const api::GattCharacteristic& characteristic), (override));
-  MOCK_METHOD(bool, WriteCharacteristic,
-              (const api::GattCharacteristic& characteristic,
-               const ByteArray& value),
-              (override));
-  MOCK_METHOD(void, Disconnect, (), (override));
-  MOCK_METHOD(bool, SetCharacteristicNotification,
-              (const api::GattCharacteristic& characteristic, bool enable),
-              (override));
-};
-
-class MockServerGattConnection : public api::ServerGattConnection {
- public:
-  MOCK_METHOD(bool, SendCharacteristic,
-              (const api::GattCharacteristic& characteristic,
-               const ByteArray& value),
-              (override));
-};
-
-class MockClientGattConnectionLifeCycleCallback
-    : public api::ClientGattConnectionLifeCycleCallback {
- public:
-  MOCK_METHOD(void, OnDisconnected, (api::ClientGattConnection * connection),
-              (override));
-  MOCK_METHOD(void, onConnectionStateChange,
-              (api::ClientGattConnection * connection), (override));
-  MOCK_METHOD(void, onCharacteristicRead,
-              (api::ClientGattConnection * connection), (override));
-};
-
-class MockServerGattConnectionLifeCycleCallback
-    : public api::ServerGattConnectionLifeCycleCallback {
- public:
-  MOCK_METHOD(void, OnCharacteristicSubscription,
-              (api::ServerGattConnection * connection,
-               const api::GattCharacteristic& characteristic),
-              (override));
-  MOCK_METHOD(void, OnCharacteristicUnsubscription,
-              (api::ServerGattConnection * connection,
-               const api::GattCharacteristic& characteristic),
-              (override));
-};
-
-class MockGattServer : public api::GattServer {
- public:
-  MOCK_METHOD(std::unique_ptr<api::GattCharacteristic>, CreateCharacteristic,
-              (absl::string_view service_uuid,
-               absl::string_view characteristic_uuid,
-               const std::set<api::GattCharacteristic::Permission>& permissions,
-               const std::set<api::GattCharacteristic::Property>& properties),
-              (override));
-  MOCK_METHOD(bool, UpdateCharacteristic,
-              (const api::GattCharacteristic& characteristic,
-               const ByteArray& value),
-              (override));
-  MOCK_METHOD(void, Stop, (), (override));
-};
-
-class MockBleSocket : public api::BleSocket {
- public:
-  MOCK_METHOD(api::BlePeripheral&, GetRemotePeripheral, (), (override));
-  MOCK_METHOD(Exception, Write, (const ByteArray& message), (override));
-  MOCK_METHOD(Exception, Close, (), (override));
-};
-
-class MockBleSocketLifeCycleCallback : public api::BleSocketLifeCycleCallback {
- public:
-  MOCK_METHOD(void, OnMessageReceived,
-              (api::BleSocket * socket, const ByteArray& message), (override));
-  MOCK_METHOD(void, OnDisconnected, (api::BleSocket * socket), (override));
-};
-
-class MockServerBleSocketLifeCycleCallback
-    : public api::ServerBleSocketLifeCycleCallback {
- public:
-  MOCK_METHOD(void, OnSocketEstablished, (api::BleSocket * socket), (override));
-};
-
-class MockBleMedium : public api::BleMedium {
- public:
-  MOCK_METHOD(bool, StartAdvertising,
-              (const BleAdvertisementData& advertisement_data), (override));
-  MOCK_METHOD(void, StopAdvertising, (const std::string& service_id),
-              (override));
-  class MockScanCallback : public api::BleMedium::ScanCallback {
-   public:
-    MOCK_METHOD(void, OnAdvertisementFound,
-                (const api::ScanResult& scan_result,
-                 const BleAdvertisementData& advertisement_data),
-                (override));
-  };
-  MOCK_METHOD(bool, StartScanning,
-              (const std::set<std::string>& service_uuids, PowerMode power_mode,
-               const ScanCallback& scan_callback),
-              (override));
-  MOCK_METHOD(void, StopScanning, (), (override));
-  MOCK_METHOD(std::unique_ptr<api::GattServer>, StartGattServer,
-              (const api::ServerGattConnectionLifeCycleCallback& callback),
-              (override));
-  MOCK_METHOD(bool, StartListeningForIncomingBleSockets,
-              (const api::ServerBleSocketLifeCycleCallback& callback),
-              (override));
-  MOCK_METHOD(void, StopListeningForIncomingBleSockets, (), (override));
-  MOCK_METHOD(std::unique_ptr<api::ClientGattConnection>, ConnectToGattServer,
-              (api::BlePeripheral * peripheral, Mtu mtu, PowerMode power_mode,
-               const api::ClientGattConnectionLifeCycleCallback& callback),
-              (override));
-  MOCK_METHOD(std::unique_ptr<api::BleSocket>, EstablishBleSocket,
-              (api::BlePeripheral * peripheral,
-               const api::BleSocketLifeCycleCallback& callback),
-              (override));
-};
-
-class BleTest : public ::testing::Test {
- public:
-  ::nearby::cal::BleMedium ble_medium_{std::make_unique<MockBleMedium>()};
-  const std::string kServiceId = "BleTest";
-  const AdvertiseSettings kAdvertiseSettings = AdvertiseSettings{};
-  const ByteArray kAdvertisementBytes = ByteArray{"BleTestBytes"};
-  const std::string kServiceUuid = "0x2fec";
-  const BleAdvertisementData kBleAdvertisementData = {
-      kAdvertiseSettings, {{kServiceUuid, kAdvertisementBytes}}};
-};
-
-TEST_F(BleTest, ConstructorWorks) { EXPECT_TRUE(ble_medium_.IsValid()); }
-
-TEST_F(BleTest, StartAdvertising) {
-  MockBleMedium* mock_ble_medium =
-      static_cast<MockBleMedium*>(&ble_medium_.GetImpl());
-  EXPECT_CALL(*mock_ble_medium, StartAdvertising).Times(1);
-  ble_medium_.StartAdvertising(kServiceId, kAdvertiseSettings,
-                               kAdvertisementBytes, kServiceId);
-}
-
-}  // namespace
-}  // namespace cal
-}  // namespace nearby
diff --git a/internal/platform/implementation/BUILD b/internal/platform/implementation/BUILD
index d8b2481..75b9ad6 100644
--- a/internal/platform/implementation/BUILD
+++ b/internal/platform/implementation/BUILD
@@ -69,6 +69,8 @@
         "//connections/implementation/proto:offline_wire_formats_cc_proto",
         "//internal/platform:base",
         "//internal/platform:cancellation_flag",
+        "@com_google_absl//absl/container:flat_hash_map",
+        "@com_google_absl//absl/container:flat_hash_set",
         "@com_google_absl//absl/strings",
         "@com_google_absl//absl/types:optional",
     ],
diff --git a/internal/platform/implementation/ble_v2.h b/internal/platform/implementation/ble_v2.h
index 8a20d0b..16cf981 100644
--- a/internal/platform/implementation/ble_v2.h
+++ b/internal/platform/implementation/ble_v2.h
@@ -22,16 +22,30 @@
 #include <set>
 #include <string>
 
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/flat_hash_set.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "internal/platform/byte_array.h"
 #include "internal/platform/exception.h"
+#include "internal/platform/input_stream.h"
+#include "internal/platform/listeners.h"
+#include "internal/platform/output_stream.h"
 
 namespace location {
 namespace nearby {
 namespace api {
 namespace ble_v2 {
 
+// Coarse representation of power settings throughout all BLE operations.
+enum class PowerMode {
+  kUnknown = 0,
+  kUltraLow = 1,
+  kLow = 2,
+  kMedium = 3,
+  kHigh = 4,
+};
+
 // https://developer.android.com/reference/android/bluetooth/le/AdvertiseData
 //
 // Bundle of data found in a BLE advertisement.
@@ -40,30 +54,37 @@
 // 0000xxxx-0000-1000-8000-00805F9B34FB. This makes it possible to store two
 // byte service UUIDs in the advertisement.
 struct BleAdvertisementData {
-  using TxPowerLevel = int8_t;
+  using TxPowerLevel = std::int8_t;
 
-  static const TxPowerLevel kUnspecifiedTxPowerLevel =
+  static constexpr TxPowerLevel kUnspecifiedTxPowerLevel =
       std::numeric_limits<TxPowerLevel>::min();
 
   bool is_connectable;
-  // When set to kUnspecifiedTxPowerLevel, TX power should not be included in
-  // the advertisement data.
+
+  // If tx_power_level is not set to kUnspecifiedTxPowerLevel, platform
+  // implementer needs to set the TxPowerLevel.
   TxPowerLevel tx_power_level;
-  // When set to an empty string, local name should not be included in the
-  // advertisement data.
-  std::string local_name;
-  // When set to an empty vector, the set of 16-bit service class UUIDs should
-  // not be included in the advertisement data.
-  std::set<std::string> service_uuids;
+
+  // If the set is not empty, the platform implementer needs to add the
+  // service_uuids in the advertisement data.
+  absl::flat_hash_set<std::string> service_uuids;
+
   // Maps service UUIDs to their service data.
-  std::map<std::string, ByteArray> service_data;
+  //
+  // Note if platform can't advertise data from Data type (0x16)
+  // (reaonly in iOS), then (iOS) should advertise data via LocalName data
+  // type (0x08). It means the iOS should take the first index of service_data
+  // as the data for LocalName type.
+  absl::flat_hash_map<std::string, location::nearby::ByteArray> service_data;
 };
 
-// Opaque wrapper over a BLE peripheral. Must be able to uniquely identify a
-// peripheral so that we can connect to its GATT server.
+// TODO(b/213835576): Refactor BlePeripheral. The one in BluetoothAdapter
+// should be considered, too. Opaque wrapper over a BLE peripheral. Must be
+// able to uniquely identify a peripheral so that we can connect to its GATT
+// server.
 class BlePeripheral {
  public:
-  virtual ~BlePeripheral() {}
+  virtual ~BlePeripheral() = default;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothDevice#getAddress()
   //
@@ -75,11 +96,7 @@
 // https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic
 //
 // Representation of a GATT characteristic.
-class GattCharacteristic {
- public:
-  virtual ~GattCharacteristic() {}
-
-  // Possible permissions of a GATT characteristic.
+struct GattCharacteristic {
   enum class Permission {
     kUnknown = 0,
     kRead = 1,
@@ -87,7 +104,6 @@
     kLast,
   };
 
-  // Possible properties of a GATT characteristic.
   enum class Property {
     kUnknown = 0,
     kRead = 1,
@@ -96,11 +112,17 @@
     kLast,
   };
 
-  // Returns the UUID of this characteristic.
-  virtual std::string GetUuid() = 0;
+  std::string uuid;
+  std::string servie_uuid;
 
-  // Returns the UUID of the containing GATT service.
-  virtual std::string GetServiceUuid() = 0;
+  // Hashable
+  template <typename H>
+  friend H AbslHashValue(H h, const GattCharacteristic& s) {
+    return H::combine(std::move(h), s.uuid, s.servie_uuid);
+  }
+  bool operator==(const GattCharacteristic& rhs) const {
+    return this->uuid == rhs.uuid && this->servie_uuid == rhs.servie_uuid;
+  }
 };
 
 // https://developer.android.com/reference/android/bluetooth/BluetoothGatt
@@ -108,11 +130,9 @@
 // Representation of a client GATT connection to a remote GATT server.
 class ClientGattConnection {
  public:
-  virtual ~ClientGattConnection() {}
+  virtual ~ClientGattConnection() = default;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#getDevice()
-  //
-  // Retrieves the BLE peripheral that this connection is tied to.
   virtual BlePeripheral& GetPeripheral() = 0;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#discoverServices()
@@ -139,8 +159,6 @@
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#readCharacteristic(android.bluetooth.BluetoothGattCharacteristic)
   // https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#getValue()
-  //
-  // Reads a GATT characteristic. No value is returned upon error.
   virtual absl::optional<ByteArray> ReadCharacteristic(
       const GattCharacteristic& characteristic) = 0;
 
@@ -153,8 +171,6 @@
                                    const ByteArray& value) = 0;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#disconnect()
-  //
-  // Disconnects a GATT connection.
   virtual void Disconnect() = 0;
 };
 
@@ -163,13 +179,14 @@
 // Representation of a server GATT connection to a remote GATT client.
 class ServerGattConnection {
  public:
-  virtual ~ServerGattConnection() {}
+  virtual ~ServerGattConnection() = default;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setValue(byte[])
   // https://developer.android.com/reference/android/bluetooth/BluetoothGattServer.html#notifyCharacteristicChanged(android.bluetooth.BluetoothDevice,%20android.bluetooth.BluetoothGattCharacteristic,%20boolean)
   //
   // Sends a notification (via indication) to the client that a characteristic
-  // has changed with the given value. Returns whether or not it was successful.
+  // has changed with the given value. Returns whether or not it was
+  // successful.
   //
   // The value sent does not have to reflect the locally stored characteristic
   // value. To update the local value, call GattServer::UpdateCharacteristic.
@@ -178,30 +195,26 @@
 };
 
 // Callback for asynchronous events on the client side of a GATT connection.
-class ClientGattConnectionLifeCycleCallback {
+struct ClientGattConnectionCallback {
  public:
-  virtual ~ClientGattConnectionLifeCycleCallback() {}
-
   // Called when the client is disconnected from the GATT server.
-  virtual void OnDisconnected(ClientGattConnection* connection) = 0;
+  std::function<void(ClientGattConnection& connection)> disconnected_cb =
+      DefaultCallback<ClientGattConnection&>();
 };
 
 // Callback for asynchronous events on the server side of a GATT connection.
-class ServerGattConnectionLifeCycleCallback {
- public:
-  virtual ~ServerGattConnectionLifeCycleCallback() {}
-
+struct ServerGattConnectionCallback {
   // Called when a remote peripheral connected to us and subscribed to one of
   // our characteristics.
-  virtual void OnCharacteristicSubscription(
-      ServerGattConnection* connection,
-      const GattCharacteristic& characteristic) = 0;
+  std::function<void(ServerGattConnection& connection,
+                     const GattCharacteristic& characteristic)>
+      characteristic_subscription_cb;
 
   // Called when a remote peripheral unsubscribed from one of our
   // characteristics.
-  virtual void OnCharacteristicUnsubscription(
-      ServerGattConnection* connection,
-      const GattCharacteristic& characteristic) = 0;
+  std::function<void(ServerGattConnection& connection,
+                     const GattCharacteristic& characteristic)>
+      characteristic_unsubscription_cb;
 };
 
 // https://developer.android.com/reference/android/bluetooth/BluetoothGattServer
@@ -209,7 +222,7 @@
 // Representation of a BLE GATT server.
 class GattServer {
  public:
-  virtual ~GattServer() {}
+  virtual ~GattServer() = default;
 
   // Creates a characteristic and adds it to the GATT server under the given
   // characteristic and service UUIDs. Returns no value upon error.
@@ -217,31 +230,29 @@
   // Characteristics of the same service UUID should be put under one
   // service rather than many services with the same UUID.
   //
-  // If the INDICATE property is included, the characteristic should include the
-  // official Bluetooth Client Characteristic Configuration descriptor with UUID
-  // 0x2902 and a WRITE permission. This allows remote clients to write to this
-  // descriptor and subscribe for characteristic changes. For more information
-  // about this descriptor, please go to:
+  // If the INDICATE property is included, the characteristic should include
+  // the official Bluetooth Client Characteristic Configuration descriptor
+  // with UUID 0x2902 and a WRITE permission. This allows remote clients to
+  // write to this descriptor and subscribe for characteristic changes. For
+  // more information about this descriptor, please go to:
   // https://www.bluetooth.com/specifications/Gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.Gatt.client_characteristic_configuration.xml
   virtual absl::optional<GattCharacteristic> CreateCharacteristic(
       absl::string_view service_uuid, absl::string_view characteristic_uuid,
-      const std::set<GattCharacteristic::Permission>& permissions,
-      const std::set<GattCharacteristic::Property>& properties) = 0;
+      const std::vector<GattCharacteristic::Permission>& permissions,
+      const std::vector<GattCharacteristic::Property>& properties) = 0;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setValue(byte[])
   //
-  // Locally updates the value of a characteristic and returns whether or not it
-  // was successful.
-  // Takes ownership of (and is responsible for destroying) the passed-in
-  // 'value'.
-  virtual bool UpdateCharacteristic(const GattCharacteristic& characteristic,
-                                    const ByteArray& value) = 0;
+  // Locally updates the value of a characteristic and returns whether or not
+  // it was successful.
+  virtual bool UpdateCharacteristic(
+      const GattCharacteristic& characteristic,
+      const location::nearby::ByteArray& value) = 0;
 
   // Stops a GATT server.
   virtual void Stop() = 0;
 };
 
-// A BLE socket representation.
 class BleSocket {
  public:
   virtual ~BleSocket() {}
@@ -256,12 +267,14 @@
   // Closes the socket and blocks until finished. Returns Exception::kIo upon
   // error, and Exception::kSuccess otherwise.
   virtual Exception Close() = 0;
+  virtual InputStream& GetInputStream() = 0;
+  virtual OutputStream& GetOutputStream() = 0;
 };
 
 // Callback for asynchronous events on a BleSocket object.
 class BleSocketLifeCycleCallback {
  public:
-  virtual ~BleSocketLifeCycleCallback() {}
+  virtual ~BleSocketLifeCycleCallback() = default;
 
   // Called when a message arrives on a socket.
   virtual void OnMessageReceived(BleSocket* socket,
@@ -280,21 +293,13 @@
   virtual void OnSocketEstablished(BleSocket* socket) = 0;
 };
 
-// The main BLE medium used inside of Nearby. This serves as the entry point for
-// all BLE and GATT related operations.
+// The main BLE medium used inside of Nearby. This serves as the entry point
+// for all BLE and GATT related operations.
 class BleMedium {
  public:
   using Mtu = uint32_t;
 
-  virtual ~BleMedium() {}
-
-  // Coarse representation of power settings throughout all BLE operations.
-  enum class PowerMode {
-    kUnknown = 0,
-    kLow = 1,
-    kHigh = 2,
-    kLast,
-  };
+  virtual ~BleMedium() = default;
 
   // https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html#startAdvertising(android.bluetooth.le.AdvertiseSettings,%20android.bluetooth.le.AdvertiseData,%20android.bluetooth.le.AdvertiseData,%20android.bluetooth.le.AdvertiseCallback)
   //
@@ -302,42 +307,33 @@
   //
   // Power mode should be interpreted in the following way:
   //   LOW:
-  //     - Advertising interval = ~1000ms
-  //     - TX power = low
+  //     - TX power = medium
   //   HIGH:
-  //     - Advertising interval = ~100ms
   //     - TX power = high
-  virtual bool StartAdvertising(const BleAdvertisementData& advertisement_data,
-                                const BleAdvertisementData& scan_response,
+  virtual bool StartAdvertising(const BleAdvertisementData& advertising_data,
+                                const BleAdvertisementData& scan_response_data,
                                 PowerMode power_mode) = 0;
 
   // https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html#stopAdvertising(android.bluetooth.le.AdvertiseCallback)
   //
   // Stops advertising.
-  virtual void StopAdvertising() = 0;
+  virtual bool StopAdvertising() = 0;
 
   // https://developer.android.com/reference/android/bluetooth/le/ScanCallback
   //
   // Callback for BLE scan results.
-  class ScanCallback {
-   public:
-    virtual ~ScanCallback() {}
-
-    // https://developer.android.com/reference/android/bluetooth/le/ScanCallback.html#onScanResult(int,%20android.bluetooth.le.ScanResult)
-    //
-    // Called when a BLE advertisement is discovered.
-    //
-    // The passed in advertisement_data is the merged combination of both
-    // advertisement data and scan response.
-    //
-    // Every discovery of an advertisement should be reported, even if the
-    // advertisement was discovered before.
-    //
-    // Ownership of the BleAdvertisementData transfers to the caller at this
-    // point.
-    virtual void OnAdvertisementFound(
-        BlePeripheral* peripheral,
-        const BleAdvertisementData& advertisement_data) = 0;
+  //
+  // The passed in advertisement_data is the merged combination of both
+  // advertisement data and scan response.
+  //
+  // Every discovery of an advertisement should be reported, even if the
+  // advertisement was discovered before.
+  //
+  // Ownership of the BleAdvertisementData transfers to the caller at this
+  // point.
+  struct ScanCallback {
+    std::function<void(const BleAdvertisementData& advertisement_data)>
+        advertisement_found_cb = DefaultCallback<const BleAdvertisementData&>();
   };
 
   // https://developer.android.com/reference/android/bluetooth/le/BluetoothLeScanner.html#startScan(java.util.List%3Candroid.bluetooth.le.ScanFilter%3E,%20android.bluetooth.le.ScanSettings,%20android.bluetooth.le.ScanCallback)
@@ -351,20 +347,19 @@
   //   HIGH:
   //     - Scan window = ~4096ms
   //     - Scan interval = ~4096ms
-  virtual bool StartScanning(const std::set<std::string>& service_uuids,
-                             PowerMode power_mode,
-                             const ScanCallback& scan_callback) = 0;
+  virtual bool StartScanning(const std::vector<std::string>& service_uuids,
+                             PowerMode power_mode, ScanCallback callback) = 0;
 
   // https://developer.android.com/reference/android/bluetooth/le/BluetoothLeScanner.html#stopScan(android.bluetooth.le.ScanCallback)
   //
   // Stops scanning.
-  virtual void StopScanning() = 0;
+  virtual bool StopScanning() = 0;
 
   // https://developer.android.com/reference/android/bluetooth/BluetoothManager#openGattServer(android.content.Context,%20android.bluetooth.BluetoothGattServerCallback)
   //
   // Starts a GATT server. Returns a nullptr upon error.
   virtual std::unique_ptr<GattServer> StartGattServer(
-      const ServerGattConnectionLifeCycleCallback& callback) = 0;
+      ServerGattConnectionCallback callback) = 0;
 
   // Starts listening for incoming BLE sockets and returns false upon error.
   virtual bool StartListeningForIncomingBleSockets(
@@ -380,16 +375,17 @@
   // Connects to a GATT server and negotiates the specified connection
   // parameters. Returns nullptr upon error.
   //
-  // Both connection interval and MTU can be negotiated on a best-effort basis.
+  // Both connection interval and MTU can be negotiated on a best-effort
+  // basis.
   //
   // Power mode should be interpreted in the following way:
-  //   LOW:
-  //     - Connection interval = ~11.25ms - 15ms
   //   HIGH:
+  //     - Connection interval = ~11.25ms - 15ms
+  //   LOW:
   //     - Connection interval = ~100ms - 125ms
   virtual std::unique_ptr<ClientGattConnection> ConnectToGattServer(
-      BlePeripheral* peripheral, Mtu mtu, PowerMode power_mode,
-      const ClientGattConnectionLifeCycleCallback& callback) = 0;
+      BlePeripheral& peripheral, Mtu mtu, PowerMode power_mode,
+      ClientGattConnectionCallback callback) = 0;
 
   // Establishes a BLE socket to the specified remote peripheral. Returns
   // nullptr on error.