// Copyright (c) 2011 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 CONTENT_BROWSER_DEVICE_ORIENTATION_PROVIDER_IMPL_H_ #define CONTENT_BROWSER_DEVICE_ORIENTATION_PROVIDER_IMPL_H_ #include #include #include "base/memory/scoped_ptr.h" #include "base/task.h" #include "content/browser/device_orientation/data_fetcher.h" #include "content/browser/device_orientation/orientation.h" #include "content/browser/device_orientation/provider.h" class MessageLoop; namespace base { class Thread; } namespace device_orientation { class ProviderImpl : public Provider { public: typedef DataFetcher* (*DataFetcherFactory)(); // Create a ProviderImpl that uses the NULL-terminated factories array to find // a DataFetcher that can provide orientation data. ProviderImpl(const DataFetcherFactory factories[]); // From Provider. virtual void AddObserver(Observer* observer); virtual void RemoveObserver(Observer* observer); private: virtual ~ProviderImpl(); // Starts or Stops the provider. Called from creator_loop_. void Start(); void Stop(); // Method for finding a suitable DataFetcher and starting the polling. // Runs on the polling_thread_. void DoInitializePollingThread( const std::vector& factories); void ScheduleInitializePollingThread(); // Method for polling a DataFetcher. Runs on the polling_thread_. void DoPoll(); void ScheduleDoPoll(); // Method for notifying observers of an orientation update. // Runs on the creator_thread_. void DoNotify(const Orientation& orientation); void ScheduleDoNotify(const Orientation& orientation); static bool SignificantlyDifferent(const Orientation& orientation1, const Orientation& orientation2); enum { kDesiredSamplingIntervalMs = 100 }; int SamplingIntervalMs() const; // The Message Loop on which this object was created. // Typically the I/O loop, but may be something else during testing. MessageLoop* creator_loop_; // Members below are only to be used from the creator_loop_. std::vector factories_; std::set observers_; Orientation last_notification_; // When polling_thread_ is running, members below are only to be used // from that thread. scoped_ptr data_fetcher_; Orientation last_orientation_; ScopedRunnableMethodFactory do_poll_method_factory_; // Polling is done on this background thread. scoped_ptr polling_thread_; }; } // namespace device_orientation #endif // CONTENT_BROWSER_DEVICE_ORIENTATION_PROVIDER_IMPL_H_