blob: 9809bcebd2657a81f1c7024af845b593c4f6bf3e [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/user_education/polling_idle_observer.h"
#include <memory>
#include "base/check.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "components/user_education/common/feature_promo_idle_observer.h"
#include "components/user_education/common/feature_promo_idle_policy.h"
#include "components/user_education/common/feature_promo_session_manager.h"
#include "components/user_education/common/user_education_features.h"
#include "ui/base/idle/idle.h"
#include "ui/base/idle/idle_polling_service.h"
// Function called by `UserEducationServiceFactory` to create an idle observer.
std::unique_ptr<user_education::FeaturePromoIdleObserver>
CreatePollingIdleObserver() {
user_education::FeaturePromoIdlePolicy::SetIdleTimeResolution(
ui::IdlePollingService::kPollInterval);
return std::make_unique<PollingIdleObserver>();
}
PollingIdleObserver::PollingIdleObserver() = default;
PollingIdleObserver::~PollingIdleObserver() = default;
PollingIdleObserver::IdleState PollingIdleObserver::GetCurrentState() const {
const base::Time last_known_active_time =
GetCurrentTime() - base::Seconds(ui::CalculateIdleTime());
const bool application_is_active =
IsChromeActive() && !ui::CheckIdleStateIsLocked();
return IdleState{last_known_active_time, application_is_active};
}
void PollingIdleObserver::StartObserving() {
service_observer_.Observe(ui::IdlePollingService::GetInstance());
}
void PollingIdleObserver::OnIdleStateChange(
const ui::IdlePollingService::State& state) {
const base::Time active_time = GetCurrentTime() - state.idle_time;
const bool application_active = !state.locked && IsChromeActive();
NotifyIdleStateChanged(IdleState{active_time, application_active});
}
bool PollingIdleObserver::IsChromeActive() const {
const auto* const browser = BrowserList::GetInstance()->GetLastActive();
return browser && browser->window()->IsActive();
}