| // Copyright 2014 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 COMPONENTS_PROXIMITY_AUTH_BLUETOOTH_CONNECTION_FINDER_H | 
 | #define COMPONENTS_PROXIMITY_AUTH_BLUETOOTH_CONNECTION_FINDER_H | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/callback.h" | 
 | #include "base/macros.h" | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/memory/weak_ptr.h" | 
 | #include "base/time/time.h" | 
 | #include "components/cryptauth/connection.h" | 
 | #include "components/cryptauth/connection_finder.h" | 
 | #include "components/cryptauth/connection_observer.h" | 
 | #include "components/cryptauth/remote_device.h" | 
 | #include "components/proximity_auth/bluetooth_util.h" | 
 | #include "device/bluetooth/bluetooth_adapter.h" | 
 | #include "device/bluetooth/bluetooth_uuid.h" | 
 |  | 
 | namespace proximity_auth { | 
 |  | 
 | // This cryptauth::ConnectionFinder implementation tries to find a Bluetooth | 
 | // connection to | 
 | // the remote device by polling at a fixed interval. | 
 | class BluetoothConnectionFinder : public cryptauth::ConnectionFinder, | 
 |                                   public cryptauth::ConnectionObserver, | 
 |                                   public device::BluetoothAdapter::Observer { | 
 |  public: | 
 |   BluetoothConnectionFinder(const cryptauth::RemoteDevice& remote_device, | 
 |                             const device::BluetoothUUID& uuid, | 
 |                             const base::TimeDelta& polling_interval); | 
 |   ~BluetoothConnectionFinder() override; | 
 |  | 
 |   // cryptauth::ConnectionFinder: | 
 |   void Find(const cryptauth::ConnectionFinder::ConnectionCallback& | 
 |                 connection_callback) override; | 
 |  | 
 |  protected: | 
 |   // Exposed for mocking out the connection in tests. | 
 |   virtual std::unique_ptr<cryptauth::Connection> CreateConnection(); | 
 |  | 
 |   // Calls bluetooth_util::SeekDeviceByAddress. Exposed for testing, as this | 
 |   // utility function is platform dependent. | 
 |   virtual void SeekDeviceByAddress( | 
 |       const std::string& bluetooth_address, | 
 |       const base::Closure& callback, | 
 |       const bluetooth_util::ErrorCallback& error_callback); | 
 |  | 
 |   // BluetoothAdapter::Observer: | 
 |   void AdapterPresentChanged(device::BluetoothAdapter* adapter, | 
 |                              bool present) override; | 
 |   void AdapterPoweredChanged(device::BluetoothAdapter* adapter, | 
 |                              bool powered) override; | 
 |  | 
 |  private: | 
 |   // Returns true iff the Bluetooth adapter is ready to make connections. | 
 |   bool IsReadyToPoll(); | 
 |  | 
 |   // Attempts to connect to the |remote_device_| if the system is ready for | 
 |   // another iteration of polling. | 
 |   void PollIfReady(); | 
 |  | 
 |   // Posts a delayed task to call |PollIfReady|. |OnDelayedPoll()| will be | 
 |   // called when the task fires. | 
 |   void PostDelayedPoll(); | 
 |   void OnDelayedPoll(); | 
 |  | 
 |   // Callbacks for bluetooth_util::SeekDeviceByAddress(). | 
 |   void OnSeekedDeviceByAddress(); | 
 |   void OnSeekedDeviceByAddressError(const std::string& error_message); | 
 |  | 
 |   // Unregisters |this| instance as an observer from all objects that it might | 
 |   // have registered with. | 
 |   void UnregisterAsObserver(); | 
 |  | 
 |   // Callback to be called when the Bluetooth adapter is initialized. | 
 |   void OnAdapterInitialized(scoped_refptr<device::BluetoothAdapter> adapter); | 
 |  | 
 |   // ConnectionObserver: | 
 |   void OnConnectionStatusChanged( | 
 |       cryptauth::Connection* connection, | 
 |       cryptauth::Connection::Status old_status, | 
 |       cryptauth::Connection::Status new_status) override; | 
 |  | 
 |   // Used to invoke |connection_callback_| asynchronously, decoupling the | 
 |   // callback invocation from the ConnectionObserver callstack. | 
 |   void InvokeCallbackAsync(); | 
 |  | 
 |   // The remote device to connect to. | 
 |   const cryptauth::RemoteDevice remote_device_; | 
 |  | 
 |   // The UUID of the service on the remote device. | 
 |   const device::BluetoothUUID uuid_; | 
 |  | 
 |   // The time to wait between polling attempts. | 
 |   const base::TimeDelta polling_interval_; | 
 |  | 
 |   // Records the time at which the finder began searching for connections. | 
 |   base::TimeTicks start_time_; | 
 |  | 
 |   // The callback that should be called upon a successful connection. | 
 |   cryptauth::ConnectionFinder::ConnectionCallback connection_callback_; | 
 |  | 
 |   // The Bluetooth adapter over which the Bluetooth connection will be made. | 
 |   scoped_refptr<device::BluetoothAdapter> adapter_; | 
 |  | 
 |   // The Bluetooth connection that will be opened. | 
 |   std::unique_ptr<cryptauth::Connection> connection_; | 
 |  | 
 |   // Whether there is currently a polling task scheduled. | 
 |   bool has_delayed_poll_scheduled_; | 
 |  | 
 |   // Used to schedule everything else. | 
 |   base::WeakPtrFactory<BluetoothConnectionFinder> weak_ptr_factory_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(BluetoothConnectionFinder); | 
 | }; | 
 |  | 
 | // TODO(isherman): Make sure to wire up the controller to listen for screen lock | 
 | // state change events, and create or destroy the connection finder as | 
 | // appropriate. | 
 |  | 
 | }  // namespace proximity_auth | 
 |  | 
 | #endif  // COMPONENTS_PROXIMITY_AUTH_BLUETOOTH_CONNECTION_FINDER_H |