blob: e4253412e42b772c7b6ef7ff5bc6cfa2dc20ab80 [file] [log] [blame]
// Copyright (c) 2012 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.
// This file implements a fake location provider and the factory functions for
// various ways of creating it.
// TODO(lethalantidote): Convert location_arbitrator_impl to use actual mock
// instead of FakeLocationProvider.
#include "device/geolocation/fake_location_provider.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/compiler_specific.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_task_runner_handle.h"
namespace device {
FakeLocationProvider::FakeLocationProvider()
: provider_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
FakeLocationProvider::~FakeLocationProvider() = default;
void FakeLocationProvider::HandlePositionChanged(
const mojom::Geoposition& position) {
if (provider_task_runner_->BelongsToCurrentThread()) {
// The location arbitrator unit tests rely on this method running
// synchronously.
position_ = position;
if (!callback_.is_null())
callback_.Run(this, position_);
} else {
provider_task_runner_->PostTask(
FROM_HERE, base::Bind(&FakeLocationProvider::HandlePositionChanged,
base::Unretained(this), position));
}
}
void FakeLocationProvider::SetUpdateCallback(
const LocationProviderUpdateCallback& callback) {
callback_ = callback;
}
void FakeLocationProvider::StartProvider(bool high_accuracy) {
state_ = high_accuracy ? HIGH_ACCURACY : LOW_ACCURACY;
}
void FakeLocationProvider::StopProvider() {
state_ = STOPPED;
}
const mojom::Geoposition& FakeLocationProvider::GetPosition() {
return position_;
}
void FakeLocationProvider::OnPermissionGranted() {
is_permission_granted_ = true;
}
} // namespace device