Chromium Code Reviews| Index: chrome/browser/chromeos/night_light/night_light_client.cc |
| diff --git a/chrome/browser/chromeos/night_light/night_light_client.cc b/chrome/browser/chromeos/night_light/night_light_client.cc |
| index 0b8941ba207973398bb177a215c7ea42d0f3b938..1bee4f6fc1c4bd242cdfa757728e97d29745aa34 100644 |
| --- a/chrome/browser/chromeos/night_light/night_light_client.cc |
| +++ b/chrome/browser/chromeos/night_light/night_light_client.cc |
| @@ -4,7 +4,11 @@ |
| #include "chrome/browser/chromeos/night_light/night_light_client.h" |
| +#include <algorithm> |
| + |
| #include "ash/public/interfaces/constants.mojom.h" |
| +#include "base/time/clock.h" |
| +#include "base/time/tick_clock.h" |
| #include "content/public/common/service_manager_connection.h" |
| #include "services/service_manager/public/cpp/connector.h" |
| @@ -26,12 +30,20 @@ constexpr base::TimeDelta kNextRequestDelayAfterSuccess = |
| } // namespace |
| NightLightClient::NightLightClient( |
| - net::URLRequestContextGetter* url_context_getter) |
| + net::URLRequestContextGetter* url_context_getter, |
| + base::TickClock* tick_clock, |
| + base::Clock* clock) |
| : provider_( |
| url_context_getter, |
| chromeos::SimpleGeolocationProvider::DefaultGeolocationProviderURL()), |
| binding_(this), |
| - backoff_delay_(kMinimumDelayAfterFailure) {} |
| + backoff_delay_(kMinimumDelayAfterFailure), |
| + timer_(tick_clock), |
| + clock_(clock) {} |
| + |
| +NightLightClient::NightLightClient( |
| + net::URLRequestContextGetter* url_context_getter) |
| + : NightLightClient(url_context_getter, nullptr, nullptr) {} |
| NightLightClient::~NightLightClient() {} |
| @@ -51,15 +63,32 @@ void NightLightClient::OnScheduleTypeChanged( |
| ash::mojom::NightLightController::ScheduleType new_type) { |
| if (new_type == |
| ash::mojom::NightLightController::ScheduleType::kSunsetToSunrise) { |
| - // Schedule an immediate request. |
| using_geoposition_ = true; |
| - ScheduleNextRequest(base::TimeDelta::FromSeconds(0)); |
| + // No need to request a new position if we already have a valid one from a |
| + // request less than kNextRequestDelayAfterSuccess ago. |
| + base::Time now = GetNow(); |
| + if ((now - last_successful_geo_request_time_) < |
| + kNextRequestDelayAfterSuccess) { |
| + // Use the current valid position to update NightLightController. |
| + SendCurrentGeoposition(); |
| + } |
| + |
| + // Next request is either immediate or kNextRequestDelayAfterSuccess later |
| + // than the last success time, whichever is greater. |
| + ScheduleNextRequest(std::max(base::TimeDelta::FromSeconds(0), |
| + last_successful_geo_request_time_ + |
| + kNextRequestDelayAfterSuccess - now)); |
|
stevenjb
2017/07/01 00:02:35
nit: With the extra complexity here, invert the if
afakhry
2017/07/01 00:26:14
Done.
|
| } else { |
| using_geoposition_ = false; |
| timer_.Stop(); |
| } |
| } |
| +// static |
| +base::TimeDelta NightLightClient::GetNextRequestDelayAfterSuccessForTesting() { |
| + return kNextRequestDelayAfterSuccess; |
| +} |
| + |
| void NightLightClient::SetNightLightControllerPtrForTesting( |
| ash::mojom::NightLightControllerPtr controller) { |
| night_light_controller_ = std::move(controller); |
| @@ -90,9 +119,11 @@ void NightLightClient::OnGeoposition(const chromeos::Geoposition& position, |
| return; |
| } |
| - night_light_controller_->SetCurrentGeoposition( |
| - ash::mojom::SimpleGeoposition::New(position.latitude, |
| - position.longitude)); |
| + last_successful_geo_request_time_ = GetNow(); |
| + |
| + latitude_ = position.latitude; |
| + longitude_ = position.longitude; |
| + SendCurrentGeoposition(); |
| // On success, reset the backoff delay to its minimum value, and schedule |
| // another request. |
| @@ -100,6 +131,15 @@ void NightLightClient::OnGeoposition(const chromeos::Geoposition& position, |
| ScheduleNextRequest(kNextRequestDelayAfterSuccess); |
| } |
| +base::Time NightLightClient::GetNow() const { |
| + return clock_ ? clock_->Now() : base::Time::Now(); |
| +} |
| + |
| +void NightLightClient::SendCurrentGeoposition() { |
| + night_light_controller_->SetCurrentGeoposition( |
| + ash::mojom::SimpleGeoposition::New(latitude_, longitude_)); |
| +} |
| + |
| void NightLightClient::ScheduleNextRequest(base::TimeDelta delay) { |
| timer_.Start(FROM_HERE, delay, this, &NightLightClient::RequestGeoposition); |
| } |