// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_ANDROID_H_ #define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_ANDROID_H_ #include #include "base/android/jni_android.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "device/bluetooth/bluetooth_adapter.h" using base::android::ScopedJavaLocalRef; namespace device { // BluetoothAdapterAndroid, along with the Java class // org.chromium.device.bluetooth.BluetoothAdapter, implement BluetoothAdapter. // // The GATT Profile over Low Energy is supported, but not Classic Bluetooth at // this time. LE GATT support has been initially built out to support Web // Bluetooth, which does not need other Bluetooth features. There is no // technical reason they can not be supported should a need arrise. // // BluetoothAdapterAndroid is reference counted, and owns the lifetime of the // Java class BluetoothAdapter via j_adapter_. The adapter also owns a tree of // additional C++ objects (Devices, Services, Characteristics, Descriptors), // with each C++ object owning its associated Java class. class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterAndroid final : public BluetoothAdapter { public: // Create a BluetoothAdapterAndroid instance. // // |java_bluetooth_adapter_wrapper| is optional. If it is NULL the adapter // will return false for |IsPresent()| and not be functional. // // The BluetoothAdapterAndroid instance will indirectly hold a Java reference // to |bluetooth_adapter_wrapper|. static base::WeakPtr Create( const base::android::JavaRef& bluetooth_adapter_wrapper); // Java Type: bluetoothAdapterWrapper // BluetoothAdapter: std::string GetAddress() const override; std::string GetName() const override; void SetName(const std::string& name, const base::Closure& callback, const ErrorCallback& error_callback) override; bool IsInitialized() const override; bool IsPresent() const override; bool IsPowered() const override; bool IsDiscoverable() const override; void SetDiscoverable(bool discoverable, const base::Closure& callback, const ErrorCallback& error_callback) override; bool IsDiscovering() const override; UUIDList GetUUIDs() const override; void CreateRfcommService( const BluetoothUUID& uuid, const ServiceOptions& options, const CreateServiceCallback& callback, const CreateServiceErrorCallback& error_callback) override; void CreateL2capService( const BluetoothUUID& uuid, const ServiceOptions& options, const CreateServiceCallback& callback, const CreateServiceErrorCallback& error_callback) override; void RegisterAdvertisement( std::unique_ptr advertisement_data, const CreateAdvertisementCallback& callback, const AdvertisementErrorCallback& error_callback) override; BluetoothLocalGattService* GetGattService( const std::string& identifier) const override; // Called when adapter state changes. void OnAdapterStateChanged(JNIEnv* env, const base::android::JavaParamRef& caller, const bool powered); // Handles a scan error event by invalidating all discovery sessions. void OnScanFailed(JNIEnv* env, const base::android::JavaParamRef& caller); // Creates or updates device with advertised UUID information when a device is // discovered during a scan. void CreateOrUpdateDeviceOnScan( JNIEnv* env, const base::android::JavaParamRef& caller, const base::android::JavaParamRef& address, const base::android::JavaParamRef& bluetooth_device_wrapper, // Java Type: bluetoothDeviceWrapper int32_t rssi, const base::android::JavaParamRef& advertised_uuids, // Java Type: String[] int32_t tx_power, const base::android::JavaParamRef& service_data_keys, // Java Type: String[] const base::android::JavaParamRef& service_data_values, // Java Type: byte[] const base::android::JavaParamRef& manufacturer_data_keys, // Java Type: int[] const base::android::JavaParamRef& manufacturer_data_values // Java Type: byte[] ); protected: BluetoothAdapterAndroid(); ~BluetoothAdapterAndroid() override; // BluetoothAdapter: bool SetPoweredImpl(bool powered) override; void AddDiscoverySession( BluetoothDiscoveryFilter* discovery_filter, const base::Closure& callback, const DiscoverySessionErrorCallback& error_callback) override; void RemoveDiscoverySession( BluetoothDiscoveryFilter* discovery_filter, const base::Closure& callback, const DiscoverySessionErrorCallback& error_callback) override; void SetDiscoveryFilter( std::unique_ptr discovery_filter, const base::Closure& callback, const DiscoverySessionErrorCallback& error_callback) override; void RemovePairingDelegateInternal( BluetoothDevice::PairingDelegate* pairing_delegate) override; void PurgeTimedOutDevices(); // Java object org.chromium.device.bluetooth.ChromeBluetoothAdapter. base::android::ScopedJavaGlobalRef j_adapter_; private: size_t num_discovery_sessions_ = 0; // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed. base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterAndroid); }; } // namespace device #endif // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_ANDROID_H_