Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1151)

Unified Diff: chrome/browser/device_orientation/provider_impl.cc

Issue 6586001: Move appcache/file_sytem/device_orientation subdirectories of chrome\browser ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: sync Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/device_orientation/provider_impl.cc
===================================================================
--- chrome/browser/device_orientation/provider_impl.cc (revision 75978)
+++ chrome/browser/device_orientation/provider_impl.cc (working copy)
@@ -1,203 +0,0 @@
-// Copyright (c) 2010 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.
-
-#include <cmath>
-#include <set>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/message_loop.h"
-#include "base/task.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "chrome/browser/device_orientation/orientation.h"
-#include "chrome/browser/device_orientation/provider_impl.h"
-
-namespace device_orientation {
-
-ProviderImpl::ProviderImpl(const DataFetcherFactory factories[])
- : creator_loop_(MessageLoop::current()),
- ALLOW_THIS_IN_INITIALIZER_LIST(do_poll_method_factory_(this)) {
- for (const DataFetcherFactory* fp = factories; *fp; ++fp)
- factories_.push_back(*fp);
-}
-
-ProviderImpl::~ProviderImpl() {
-}
-
-void ProviderImpl::AddObserver(Observer* observer) {
- DCHECK(MessageLoop::current() == creator_loop_);
-
- observers_.insert(observer);
- if (observers_.size() == 1)
- Start();
- else
- observer->OnOrientationUpdate(last_notification_);
-}
-
-void ProviderImpl::RemoveObserver(Observer* observer) {
- DCHECK(MessageLoop::current() == creator_loop_);
-
- observers_.erase(observer);
- if (observers_.empty())
- Stop();
-}
-
-void ProviderImpl::Start() {
- DCHECK(MessageLoop::current() == creator_loop_);
- DCHECK(!polling_thread_.get());
-
- polling_thread_.reset(new base::Thread("Device orientation polling thread"));
- if (!polling_thread_->Start()) {
- LOG(ERROR) << "Failed to start device orientation polling thread";
- polling_thread_.reset();
- return;
- }
- ScheduleInitializePollingThread();
-}
-
-void ProviderImpl::Stop() {
- DCHECK(MessageLoop::current() == creator_loop_);
-
- // TODO(hans): Don't join the thread. See crbug.com/72286.
- base::ThreadRestrictions::ScopedAllowIO allow_io;
-
- polling_thread_.reset();
- data_fetcher_.reset();
-}
-
-void ProviderImpl::DoInitializePollingThread(
- std::vector<DataFetcherFactory> factories) {
- DCHECK(MessageLoop::current() == polling_thread_->message_loop());
-
- typedef std::vector<DataFetcherFactory>::const_iterator Iterator;
- for (Iterator i = factories_.begin(), e = factories_.end(); i != e; ++i) {
- DataFetcherFactory factory = *i;
- scoped_ptr<DataFetcher> fetcher(factory());
- Orientation orientation;
-
- if (fetcher.get() && fetcher->GetOrientation(&orientation)) {
- // Pass ownership of fetcher to provider_.
- data_fetcher_.swap(fetcher);
- last_orientation_ = orientation;
-
- // Notify observers.
- ScheduleDoNotify(orientation);
-
- // Start polling.
- ScheduleDoPoll();
- return;
- }
- }
-
- // When no orientation data can be provided.
- ScheduleDoNotify(Orientation::Empty());
-}
-
-void ProviderImpl::ScheduleInitializePollingThread() {
- DCHECK(MessageLoop::current() == creator_loop_);
-
- Task* task = NewRunnableMethod(this,
- &ProviderImpl::DoInitializePollingThread,
- factories_);
- MessageLoop* polling_loop = polling_thread_->message_loop();
- polling_loop->PostTask(FROM_HERE, task);
-}
-
-void ProviderImpl::DoNotify(const Orientation& orientation) {
- DCHECK(MessageLoop::current() == creator_loop_);
-
- last_notification_ = orientation;
-
- typedef std::set<Observer*>::const_iterator Iterator;
- for (Iterator i = observers_.begin(), e = observers_.end(); i != e; ++i)
- (*i)->OnOrientationUpdate(orientation);
-
- if (orientation.IsEmpty()) {
- // Notify observers about failure to provide data exactly once.
- observers_.clear();
- Stop();
- }
-}
-
-void ProviderImpl::ScheduleDoNotify(const Orientation& orientation) {
- DCHECK(MessageLoop::current() == polling_thread_->message_loop());
-
- Task* task = NewRunnableMethod(this, &ProviderImpl::DoNotify, orientation);
- creator_loop_->PostTask(FROM_HERE, task);
-}
-
-void ProviderImpl::DoPoll() {
- DCHECK(MessageLoop::current() == polling_thread_->message_loop());
-
- Orientation orientation;
- if (!data_fetcher_->GetOrientation(&orientation)) {
- LOG(ERROR) << "Failed to poll device orientation data fetcher.";
-
- ScheduleDoNotify(Orientation::Empty());
- return;
- }
-
- if (SignificantlyDifferent(orientation, last_orientation_)) {
- last_orientation_ = orientation;
- ScheduleDoNotify(orientation);
- }
-
- ScheduleDoPoll();
-}
-
-void ProviderImpl::ScheduleDoPoll() {
- DCHECK(MessageLoop::current() == polling_thread_->message_loop());
-
- Task* task = do_poll_method_factory_.NewRunnableMethod(&ProviderImpl::DoPoll);
- MessageLoop* polling_loop = polling_thread_->message_loop();
- polling_loop->PostDelayedTask(FROM_HERE, task, SamplingIntervalMs());
-}
-
-namespace {
-
-bool IsElementSignificantlyDifferent(bool can_provide_element1,
- bool can_provide_element2,
- double element1,
- double element2) {
- const double kThreshold = 0.1;
-
- if (can_provide_element1 != can_provide_element2)
- return true;
- if (can_provide_element1 &&
- std::fabs(element1 - element2) >= kThreshold)
- return true;
- return false;
-}
-} // namespace
-
-// Returns true if two orientations are considered different enough that
-// observers should be notified of the new orientation.
-bool ProviderImpl::SignificantlyDifferent(const Orientation& o1,
- const Orientation& o2) {
- return IsElementSignificantlyDifferent(o1.can_provide_alpha_,
- o2.can_provide_alpha_,
- o1.alpha_,
- o2.alpha_) ||
- IsElementSignificantlyDifferent(o1.can_provide_beta_,
- o2.can_provide_beta_,
- o1.beta_,
- o2.beta_) ||
- IsElementSignificantlyDifferent(o1.can_provide_gamma_,
- o2.can_provide_gamma_,
- o1.gamma_,
- o2.gamma_);
-}
-
-int ProviderImpl::SamplingIntervalMs() const {
- DCHECK(MessageLoop::current() == polling_thread_->message_loop());
- DCHECK(data_fetcher_.get());
-
- // TODO(erg): There used to be unused code here, that called a default
- // implementation on the DataFetcherInterface that was never defined. I'm
- // removing unused methods from headers.
- return kDesiredSamplingIntervalMs;
-}
-
-} // namespace device_orientation
« no previous file with comments | « chrome/browser/device_orientation/provider_impl.h ('k') | chrome/browser/device_orientation/provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698