// 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 scoped_refptr Create( const base::android::JavaRef& bluetooth_adapter_wrapper); // Java Type: bluetoothAdapterWrapper // BluetoothAdapter: void Initialize(base::OnceClosure callback) override; 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 const base::android::JavaParamRef& local_name, 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[] int32_t advertisement_flags); protected: BluetoothAdapterAndroid(); ~BluetoothAdapterAndroid() override; // BluetoothAdapter: base::WeakPtr GetWeakPtr() override; bool SetPoweredImpl(bool powered) override; void StartScanWithFilter( std::unique_ptr discovery_filter, DiscoverySessionResultCallback callback) override; void UpdateFilter(std::unique_ptr discovery_filter, DiscoverySessionResultCallback callback) override; void StopScan(DiscoverySessionResultCallback callback) override; void RemovePairingDelegateInternal( BluetoothDevice::PairingDelegate* pairing_delegate) override; void PurgeTimedOutDevices(); // Utility function used to create a Java object that represents the filter. base::android::ScopedJavaLocalRef CreateAndroidFilter( const BluetoothDiscoveryFilter* discovery_filter); // Java object org.chromium.device.bluetooth.ChromeBluetoothAdapter. base::android::ScopedJavaGlobalRef j_adapter_; private: FRIEND_TEST_ALL_PREFIXES(BluetoothAdapterAndroidTest, ScanFilterTest); // 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_{this}; DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterAndroid); }; } // namespace device #endif // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_ANDROID_H_