[ash] Update UserActionDetector to have static duration
Currently UserActionDetector is implemented as a singleton, however it does not have static duration. Instead client code is required to instantiate a single instance and it is made globally accessible for as long as the instance is kept alive. The current implementation has the following issues - Clients must always nullcheck when accessing - Establishing observers is difficult as uncertain lifetimes can result in dangling pointers / UAFs - Existing uses implicitly assume the detector is created at the correct time to successfully establish the PlatformEventSource observation (this could break if ordering changes in the future) - Specific tests must instantiate their own UserActionDetector object, and this may not correctly represent production code This CL updates the class to be a static duration singleton. This addresses many of the existing issues. There is follow up work necessary to establish the PlatformEventSource observation more reliably, perhaps in direct response to the construction of the event source on the main thread. Bug: 299290024 Change-Id: I847086899d93793341d4f12912ac9bd55a4302ce Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5432311 Reviewed-by: James Cook <jamescook@chromium.org> Commit-Queue: Thomas Lukaszewicz <tluk@chromium.org> Reviewed-by: Reilly Grant <reillyg@chromium.org> Reviewed-by: Scott Violet <sky@chromium.org> Cr-Commit-Position: refs/heads/main@{#1284056}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
b1b58815d6
commit
a8d83d8c2f
ash
chrome/browser/ash
app_mode
login
demo_mode
screens
chromevox_hint
policy
remote_commands
crd
uploading
power
extensions/shell/browser
ui
@ -1499,7 +1499,7 @@ void Shell::Init(
|
||||
|
||||
// ui::UserActivityDetector passes events to observers, so let them get
|
||||
// rewritten first.
|
||||
user_activity_detector_ = std::make_unique<ui::UserActivityDetector>();
|
||||
ui::UserActivityDetector::Get()->InitPlatformEventSourceObservation();
|
||||
|
||||
control_v_histogram_recorder_ = std::make_unique<ControlVHistogramRecorder>();
|
||||
AddPreTargetHandler(control_v_histogram_recorder_.get(),
|
||||
@ -1721,7 +1721,7 @@ void Shell::Init(
|
||||
fingerprint.InitWithNewPipeAndPassReceiver());
|
||||
user_activity_notifier_ =
|
||||
std::make_unique<ui::UserActivityPowerManagerNotifier>(
|
||||
user_activity_detector_.get(), std::move(fingerprint));
|
||||
ui::UserActivityDetector::Get(), std::move(fingerprint));
|
||||
video_activity_notifier_ =
|
||||
std::make_unique<VideoActivityNotifier>(video_detector_.get());
|
||||
bluetooth_state_cache_ = std::make_unique<BluetoothStateCache>();
|
||||
|
@ -69,7 +69,6 @@ class KeyboardUIFactory;
|
||||
namespace ui {
|
||||
class ContextFactory;
|
||||
class KeyboardCapability;
|
||||
class UserActivityDetector;
|
||||
class UserActivityPowerManagerNotifier;
|
||||
} // namespace ui
|
||||
|
||||
@ -1135,7 +1134,6 @@ class ASH_EXPORT Shell : public SessionObserver,
|
||||
std::unique_ptr<views::corewm::TooltipController> tooltip_controller_;
|
||||
std::unique_ptr<PowerButtonController> power_button_controller_;
|
||||
std::unique_ptr<LockStateController> lock_state_controller_;
|
||||
std::unique_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
std::unique_ptr<VideoDetector> video_detector_;
|
||||
std::unique_ptr<WindowTreeHostManager> window_tree_host_manager_;
|
||||
std::unique_ptr<PersistentWindowController> persistent_window_controller_;
|
||||
|
@ -45,7 +45,6 @@ class BasePeriodicMetricsServiceTest {
|
||||
TestingBrowserProcess::GetGlobal())),
|
||||
network_handler_test_helper_(
|
||||
std::make_unique<NetworkHandlerTestHelper>()),
|
||||
user_activity_detector_(std::make_unique<ui::UserActivityDetector>()),
|
||||
periodic_metrics_service_(local_state()),
|
||||
histogram_tester_(std::make_unique<base::HistogramTester>()) {}
|
||||
|
||||
@ -92,7 +91,6 @@ class BasePeriodicMetricsServiceTest {
|
||||
sync_preferences::TestingPrefServiceSyncable user_prefs_;
|
||||
std::unique_ptr<ScopedTestingLocalState> local_state_;
|
||||
std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_;
|
||||
std::unique_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
PeriodicMetricsService periodic_metrics_service_;
|
||||
std::unique_ptr<base::HistogramTester> histogram_tester_;
|
||||
};
|
||||
@ -217,8 +215,8 @@ class UserActivityPeriodicMetricsServiceTest
|
||||
|
||||
void SetDeviceIdleTime(base::TimeDelta idle_time,
|
||||
base::TimeTicks from_time = base::TimeTicks::Now()) {
|
||||
user_activity_detector_->set_last_activity_time_for_test(from_time -
|
||||
idle_time);
|
||||
ui::UserActivityDetector::Get()->set_last_activity_time_for_test(from_time -
|
||||
idle_time);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -52,6 +52,7 @@ class DemoModeResourcesRemoverTest : public testing::Test {
|
||||
~DemoModeResourcesRemoverTest() override = default;
|
||||
|
||||
void SetUp() override {
|
||||
activity_detector_ = ui::UserActivityDetector::Get();
|
||||
install_attributes_ = std::make_unique<ScopedStubInstallAttributes>(
|
||||
CreateInstallAttributes());
|
||||
|
||||
@ -152,7 +153,7 @@ class DemoModeResourcesRemoverTest : public testing::Test {
|
||||
// TODO(tbarzic): Add support for injecting a test tick clock to
|
||||
// ui::ActivityDetector so activity_detector_ time gets updated by
|
||||
// test_clock_, too.
|
||||
activity_detector_.set_now_for_test(test_clock_.NowTicks());
|
||||
activity_detector_->set_now_for_test(test_clock_.NowTicks());
|
||||
}
|
||||
|
||||
TestingPrefServiceSimple local_state_;
|
||||
@ -160,7 +161,7 @@ class DemoModeResourcesRemoverTest : public testing::Test {
|
||||
|
||||
std::unique_ptr<DemoModeTestHelper> demo_mode_test_helper_;
|
||||
|
||||
ui::UserActivityDetector activity_detector_;
|
||||
raw_ptr<ui::UserActivityDetector> activity_detector_;
|
||||
// Tick clock that can be used for tests - not used by default, but tests can
|
||||
// inject it into DemoModeResourcesRemover using OverrideTimeForTesting().
|
||||
base::SimpleTestTickClock test_clock_;
|
||||
@ -416,7 +417,7 @@ TEST_F(DemoModeResourcesRemoverTest, RemoveAfterActiveUse) {
|
||||
base::Seconds(9) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -424,7 +425,7 @@ TEST_F(DemoModeResourcesRemoverTest, RemoveAfterActiveUse) {
|
||||
// Advance time so it's longer than removal threshold, but under the idle
|
||||
// threshold (so it's not disregarded as idle time).
|
||||
AdvanceTestTime(base::Seconds(4));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_FALSE(DemoModeResourcesExist());
|
||||
@ -444,12 +445,12 @@ TEST_F(DemoModeResourcesRemoverTest, IgnoreUsageBeforeLogin) {
|
||||
base::Seconds(1) /*update_interval*/,
|
||||
base::Seconds(9) /*idle_threshold*/));
|
||||
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
// Advance time so it's longer than removal threshold, but under the idle
|
||||
// threshold (so it's not disregarded as idle time).
|
||||
AdvanceTestTime(base::Seconds(4));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
|
||||
@ -474,21 +475,21 @@ TEST_F(DemoModeResourcesRemoverTest, RemoveAfterActiveUse_AccumulateActivity) {
|
||||
base::Seconds(9) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// Over update interval, but under removal threshold.
|
||||
AdvanceTestTime(base::Seconds(2));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// This should get accumulated time over removal threshold.
|
||||
AdvanceTestTime(base::Seconds(2));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_FALSE(DemoModeResourcesExist());
|
||||
@ -509,7 +510,7 @@ TEST_F(DemoModeResourcesRemoverTest, DoNotAccumulateIdleTimeUsage) {
|
||||
base::Seconds(4) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -517,16 +518,16 @@ TEST_F(DemoModeResourcesRemoverTest, DoNotAccumulateIdleTimeUsage) {
|
||||
// Advance to the time just under removal threshold in small increments
|
||||
// (within the idle threshold)
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// Simulate longer idle period.
|
||||
AdvanceTestTime(base::Seconds(10));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
// The resources should be still be here, as usage amount should not have been
|
||||
// incremented.
|
||||
@ -536,7 +537,7 @@ TEST_F(DemoModeResourcesRemoverTest, DoNotAccumulateIdleTimeUsage) {
|
||||
// Advance time little bit more, so it's over the removal threshold (and over
|
||||
// the update interval).
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_FALSE(DemoModeResourcesExist());
|
||||
@ -557,7 +558,7 @@ TEST_F(DemoModeResourcesRemoverTest, ReportUsageBeforeIdlePeriod) {
|
||||
base::Seconds(5) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -566,16 +567,16 @@ TEST_F(DemoModeResourcesRemoverTest, ReportUsageBeforeIdlePeriod) {
|
||||
// (within the idle threshold), that are under the update interval combined.
|
||||
// This will leave unrecorded usage before the idle period.
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// Simulate longer idle period.
|
||||
AdvanceTestTime(base::Seconds(10));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
// The resources should be still be here, as usage amount should not have been
|
||||
// incremented.
|
||||
@ -584,9 +585,9 @@ TEST_F(DemoModeResourcesRemoverTest, ReportUsageBeforeIdlePeriod) {
|
||||
|
||||
// Advance time cummulatively over the update period.
|
||||
AdvanceTestTime(base::Seconds(4));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
// When combined the accumulated active usage was above the removal threshold.
|
||||
task_environment_.RunUntilIdle();
|
||||
@ -608,7 +609,7 @@ TEST_F(DemoModeResourcesRemoverTest, RemovalThresholdReachedBeforeIdlePeriod) {
|
||||
base::Seconds(7) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -616,9 +617,9 @@ TEST_F(DemoModeResourcesRemoverTest, RemovalThresholdReachedBeforeIdlePeriod) {
|
||||
// Advance to the time just under removal threshold in small increments, but
|
||||
// with total over the update interval.
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -626,14 +627,14 @@ TEST_F(DemoModeResourcesRemoverTest, RemovalThresholdReachedBeforeIdlePeriod) {
|
||||
// Advance time so total is over the remova threshold, but in increment under
|
||||
// the update interval.
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// Simulate longer idle period.
|
||||
AdvanceTestTime(base::Seconds(10));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
// Activity after the idle period ended should have flushed previous pending
|
||||
// usage, and the resources should have been removed.
|
||||
@ -659,19 +660,19 @@ TEST_F(DemoModeResourcesRemoverTest, UpdateInterval) {
|
||||
|
||||
// Test that local state is not updated on each detected user activity.
|
||||
AdvanceTestTime(base::Milliseconds(300));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
EXPECT_EQ(0, local_state_.GetInteger(kAccumulatedUsagePref));
|
||||
|
||||
AdvanceTestTime(base::Milliseconds(300));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
EXPECT_EQ(0, local_state_.GetInteger(kAccumulatedUsagePref));
|
||||
|
||||
AdvanceTestTime(base::Milliseconds(300));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
EXPECT_EQ(0, local_state_.GetInteger(kAccumulatedUsagePref));
|
||||
|
||||
AdvanceTestTime(base::Milliseconds(300));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
EXPECT_EQ(1, local_state_.GetInteger(kAccumulatedUsagePref));
|
||||
}
|
||||
TEST_F(DemoModeResourcesRemoverTest,
|
||||
@ -690,14 +691,14 @@ TEST_F(DemoModeResourcesRemoverTest,
|
||||
base::Seconds(9) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// Over update interval, but under removal threshold.
|
||||
AdvanceTestTime(base::Seconds(2));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -714,7 +715,7 @@ TEST_F(DemoModeResourcesRemoverTest,
|
||||
|
||||
// This should get accumulated time over removal threshold.
|
||||
AdvanceTestTime(base::Seconds(2));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_FALSE(DemoModeResourcesExist());
|
||||
@ -736,14 +737,14 @@ TEST_F(DemoModeResourcesRemoverTest,
|
||||
base::Seconds(9) /*idle_threshold*/));
|
||||
|
||||
AddAndLogInUser(TestUserType::kRegular, remover.get());
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
|
||||
// Over update interval, but under removal threshold.
|
||||
AdvanceTestTime(base::Seconds(3));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
task_environment_.RunUntilIdle();
|
||||
EXPECT_TRUE(DemoModeResourcesExist());
|
||||
@ -751,7 +752,7 @@ TEST_F(DemoModeResourcesRemoverTest,
|
||||
// This is under update interval, but should get accumulated time over
|
||||
// removal threshold.
|
||||
AdvanceTestTime(base::Seconds(1));
|
||||
activity_detector_.HandleExternalUserActivity();
|
||||
activity_detector_->HandleExternalUserActivity();
|
||||
|
||||
remover.reset();
|
||||
|
||||
|
@ -46,7 +46,6 @@ class ChromeVoxHintDetectorTest : public testing::Test {
|
||||
std::unique_ptr<ChromeVoxHintDetector> detector_;
|
||||
std::unique_ptr<base::SingleThreadTaskRunner::CurrentDefaultHandle>
|
||||
runner_handle_;
|
||||
ui::UserActivityDetector user_activity_detector_;
|
||||
};
|
||||
|
||||
ChromeVoxHintDetectorTest::ChromeVoxHintDetectorTest() {
|
||||
@ -70,7 +69,7 @@ void ChromeVoxHintDetectorTest::StartDetection() {
|
||||
}
|
||||
|
||||
void ChromeVoxHintDetectorTest::SimulateUserActivity() {
|
||||
user_activity_detector_.HandleExternalUserActivity();
|
||||
ui::UserActivityDetector::Get()->HandleExternalUserActivity();
|
||||
}
|
||||
|
||||
// Tests that the ChromeVox hint is given after idling for the proper duration.
|
||||
|
@ -108,7 +108,7 @@ class DeviceCommandFetchCrdAvailabilityInfoJobTest
|
||||
|
||||
ASSERT_TRUE(profile_manager_.SetUp());
|
||||
|
||||
user_activity_detector_ = std::make_unique<ui::UserActivityDetector>();
|
||||
user_activity_detector_ = ui::UserActivityDetector::Get();
|
||||
arc_kiosk_app_manager_ = std::make_unique<ash::ArcKioskAppManager>();
|
||||
web_kiosk_app_manager_ = std::make_unique<ash::WebKioskAppManager>();
|
||||
kiosk_chrome_app_manager_ = std::make_unique<ash::KioskChromeAppManager>();
|
||||
@ -118,7 +118,6 @@ class DeviceCommandFetchCrdAvailabilityInfoJobTest
|
||||
kiosk_chrome_app_manager_.reset();
|
||||
web_kiosk_app_manager_.reset();
|
||||
arc_kiosk_app_manager_.reset();
|
||||
user_activity_detector_.reset();
|
||||
DeviceSettingsTestBase::TearDown();
|
||||
}
|
||||
|
||||
@ -181,7 +180,7 @@ class DeviceCommandFetchCrdAvailabilityInfoJobTest
|
||||
std::unique_ptr<ash::KioskChromeAppManager> kiosk_chrome_app_manager_;
|
||||
|
||||
// Automatically installed as a singleton upon creation.
|
||||
std::unique_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
raw_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
|
||||
test::ScopedFakeCrosNetworkConfig fake_cros_network_config_;
|
||||
|
||||
|
@ -220,7 +220,7 @@ class DeviceCommandStartCrdSessionJobTest : public ash::DeviceSettingsTestBase {
|
||||
|
||||
ASSERT_TRUE(profile_manager_.SetUp());
|
||||
|
||||
user_activity_detector_ = std::make_unique<ui::UserActivityDetector>();
|
||||
user_activity_detector_ = ui::UserActivityDetector::Get();
|
||||
arc_kiosk_app_manager_ = std::make_unique<ash::ArcKioskAppManager>();
|
||||
web_kiosk_app_manager_ = std::make_unique<ash::WebKioskAppManager>();
|
||||
kiosk_chrome_app_manager_ = std::make_unique<ash::KioskChromeAppManager>();
|
||||
@ -339,8 +339,7 @@ class DeviceCommandStartCrdSessionJobTest : public ash::DeviceSettingsTestBase {
|
||||
// when the job is created.
|
||||
std::string robot_account_id_ = "robot@account.com";
|
||||
|
||||
// Automatically installed as a singleton upon creation.
|
||||
std::unique_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
raw_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
|
||||
FakeStartCrdSessionJobDelegate delegate_;
|
||||
|
||||
|
@ -177,7 +177,6 @@ class StatusUploaderTest : public testing::Test {
|
||||
ash::ScopedTestingCrosSettings scoped_testing_cros_settings_;
|
||||
std::unique_ptr<MockDeviceStatusCollector> collector_;
|
||||
raw_ptr<MockDeviceStatusCollector, DanglingUntriaged> collector_ptr_;
|
||||
ui::UserActivityDetector detector_;
|
||||
MockCloudPolicyClient client_;
|
||||
TestingPrefServiceSimple prefs_;
|
||||
// This property is required to instantiate the session manager, a singleton
|
||||
|
@ -208,7 +208,7 @@ class ModellerImplTest : public testing::Test {
|
||||
double curve_error) {
|
||||
modeller_ = ModellerImpl::CreateForTesting(
|
||||
profile_.get(), als_reader_.get(), &fake_brightness_monitor_,
|
||||
&fake_model_config_loader_, &user_activity_detector_,
|
||||
&fake_model_config_loader_, ui::UserActivityDetector::Get(),
|
||||
std::make_unique<FakeTrainer>(is_trainer_configured,
|
||||
is_personal_curve_valid, return_new_curve,
|
||||
curve_error),
|
||||
@ -274,8 +274,6 @@ class ModellerImplTest : public testing::Test {
|
||||
content::BrowserTaskEnvironment task_environment_;
|
||||
base::HistogramTester histogram_tester_;
|
||||
|
||||
ui::UserActivityDetector user_activity_detector_;
|
||||
|
||||
base::ScopedTempDir temp_dir_;
|
||||
std::unique_ptr<TestingProfile> profile_;
|
||||
|
||||
|
@ -109,7 +109,7 @@ class AdaptiveScreenBrightnessManagerTest
|
||||
task_environment()->GetMainThreadTaskRunner());
|
||||
screen_brightness_manager_ =
|
||||
std::make_unique<AdaptiveScreenBrightnessManager>(
|
||||
std::move(logger), &user_activity_detector_,
|
||||
std::move(logger), ui::UserActivityDetector::Get(),
|
||||
chromeos::FakePowerManagerClient::Get(), nullptr, nullptr,
|
||||
observer.InitWithNewPipeAndPassReceiver(),
|
||||
std::move(periodic_timer));
|
||||
@ -240,7 +240,6 @@ class AdaptiveScreenBrightnessManagerTest
|
||||
private:
|
||||
FakeChromeUserManager fake_user_manager_;
|
||||
|
||||
ui::UserActivityDetector user_activity_detector_;
|
||||
std::unique_ptr<AdaptiveScreenBrightnessManager> screen_brightness_manager_;
|
||||
raw_ptr<TestingAdaptiveScreenBrightnessUkmLogger, DanglingUntriaged>
|
||||
ukm_logger_;
|
||||
|
@ -71,7 +71,7 @@ class IdleEventNotifierTest : public testing::Test {
|
||||
chromeos::PowerManagerClient::InitializeFake();
|
||||
mojo::PendingRemote<viz::mojom::VideoDetectorObserver> observer;
|
||||
idle_event_notifier_ = std::make_unique<IdleEventNotifier>(
|
||||
chromeos::PowerManagerClient::Get(), &user_activity_detector_,
|
||||
chromeos::PowerManagerClient::Get(), ui::UserActivityDetector::Get(),
|
||||
observer.InitWithNewPipeAndPassReceiver());
|
||||
ac_power_.set_external_power(
|
||||
power_manager::PowerSupplyProperties_ExternalPower_AC);
|
||||
@ -90,7 +90,6 @@ class IdleEventNotifierTest : public testing::Test {
|
||||
std::unique_ptr<IdleEventNotifier> idle_event_notifier_;
|
||||
power_manager::PowerSupplyProperties ac_power_;
|
||||
power_manager::PowerSupplyProperties disconnected_power_;
|
||||
ui::UserActivityDetector user_activity_detector_;
|
||||
};
|
||||
|
||||
// After initialization, |external_power_| is not set up.
|
||||
|
@ -125,7 +125,7 @@ class UserActivityManagerTest : public ChromeRenderViewHostTestHarness {
|
||||
chromeos::PowerManagerClient::InitializeFake();
|
||||
mojo::PendingRemote<viz::mojom::VideoDetectorObserver> observer;
|
||||
activity_logger_ = std::make_unique<UserActivityManager>(
|
||||
&delegate_, &user_activity_detector_,
|
||||
&delegate_, ui::UserActivityDetector::Get(),
|
||||
chromeos::PowerManagerClient::Get(), &session_manager_,
|
||||
observer.InitWithNewPipeAndPassReceiver(), &fake_user_manager_);
|
||||
|
||||
@ -279,7 +279,6 @@ class UserActivityManagerTest : public ChromeRenderViewHostTestHarness {
|
||||
const GURL url4_ = GURL("https://example4.com/");
|
||||
|
||||
private:
|
||||
ui::UserActivityDetector user_activity_detector_;
|
||||
std::unique_ptr<IdleEventNotifier> idle_event_notifier_;
|
||||
session_manager::SessionManager session_manager_;
|
||||
std::unique_ptr<UserActivityManager> activity_logger_;
|
||||
|
@ -58,8 +58,9 @@ class SmartChargingManagerTest : public ChromeRenderViewHostTestHarness {
|
||||
periodic_timer->SetTaskRunner(
|
||||
task_environment()->GetMainThreadTaskRunner());
|
||||
smart_charging_manager_ = std::make_unique<SmartChargingManager>(
|
||||
&user_activity_detector_, observer.InitWithNewPipeAndPassReceiver(),
|
||||
&session_manager_, std::move(periodic_timer));
|
||||
ui::UserActivityDetector::Get(),
|
||||
observer.InitWithNewPipeAndPassReceiver(), &session_manager_,
|
||||
std::move(periodic_timer));
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
@ -185,7 +186,6 @@ class SmartChargingManagerTest : public ChromeRenderViewHostTestHarness {
|
||||
0);
|
||||
|
||||
private:
|
||||
ui::UserActivityDetector user_activity_detector_;
|
||||
session_manager::SessionManager session_manager_;
|
||||
std::unique_ptr<SmartChargingManager> smart_charging_manager_;
|
||||
};
|
||||
|
@ -345,10 +345,11 @@ void ShellDesktopControllerAura::InitWindowManager() {
|
||||
cursor_manager_->SetCursor(ui::mojom::CursorType::kPointer);
|
||||
|
||||
#if BUILDFLAG(IS_CHROMEOS_ASH)
|
||||
user_activity_detector_ = std::make_unique<ui::UserActivityDetector>();
|
||||
auto* user_activity_detector = ui::UserActivityDetector::Get();
|
||||
user_activity_detector->InitPlatformEventSourceObservation();
|
||||
user_activity_notifier_ =
|
||||
std::make_unique<ui::UserActivityPowerManagerNotifier>(
|
||||
user_activity_detector_.get(), /*fingerprint=*/mojo::NullRemote());
|
||||
user_activity_detector, /*fingerprint=*/mojo::NullRemote());
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -359,7 +360,6 @@ void ShellDesktopControllerAura::TearDownWindowManager() {
|
||||
|
||||
#if BUILDFLAG(IS_CHROMEOS_ASH)
|
||||
user_activity_notifier_.reset();
|
||||
user_activity_detector_.reset();
|
||||
#endif
|
||||
cursor_manager_.reset();
|
||||
focus_controller_.reset();
|
||||
|
@ -44,7 +44,6 @@ class Size;
|
||||
namespace ui {
|
||||
class InputMethod;
|
||||
#if BUILDFLAG(IS_CHROMEOS_ASH)
|
||||
class UserActivityDetector;
|
||||
class UserActivityPowerManagerNotifier;
|
||||
#endif
|
||||
} // namespace ui
|
||||
@ -170,7 +169,6 @@ class ShellDesktopControllerAura
|
||||
std::unique_ptr<wm::CursorManager> cursor_manager_;
|
||||
|
||||
#if BUILDFLAG(IS_CHROMEOS_ASH)
|
||||
std::unique_ptr<ui::UserActivityDetector> user_activity_detector_;
|
||||
std::unique_ptr<ui::UserActivityPowerManagerNotifier> user_activity_notifier_;
|
||||
#endif
|
||||
|
||||
|
@ -17,8 +17,6 @@ namespace ui {
|
||||
|
||||
namespace {
|
||||
|
||||
UserActivityDetector* g_instance = nullptr;
|
||||
|
||||
// Returns a string describing |event|.
|
||||
std::string GetEventDebugString(const ui::Event* event) {
|
||||
std::string details = base::StringPrintf(
|
||||
@ -48,27 +46,17 @@ const int UserActivityDetector::kNotifyIntervalMs = 200;
|
||||
// and we'll ignore legitimate activity.
|
||||
const int UserActivityDetector::kDisplayPowerChangeIgnoreMouseMs = 1000;
|
||||
|
||||
UserActivityDetector::UserActivityDetector() {
|
||||
CHECK(!g_instance);
|
||||
g_instance = this;
|
||||
|
||||
PlatformEventSource* platform_event_source =
|
||||
PlatformEventSource::GetInstance();
|
||||
if (platform_event_source)
|
||||
platform_event_source->AddPlatformEventObserver(this);
|
||||
}
|
||||
|
||||
UserActivityDetector::~UserActivityDetector() {
|
||||
PlatformEventSource* platform_event_source =
|
||||
PlatformEventSource::GetInstance();
|
||||
if (platform_event_source)
|
||||
platform_event_source->RemovePlatformEventObserver(this);
|
||||
g_instance = nullptr;
|
||||
}
|
||||
|
||||
// static
|
||||
UserActivityDetector* UserActivityDetector::Get() {
|
||||
return g_instance;
|
||||
static base::NoDestructor<UserActivityDetector> user_activity_detector;
|
||||
return user_activity_detector.get();
|
||||
}
|
||||
|
||||
void UserActivityDetector::InitPlatformEventSourceObservation() {
|
||||
PlatformEventSource* platform_event_source =
|
||||
PlatformEventSource::GetInstance();
|
||||
CHECK(platform_event_source);
|
||||
platform_event_source->AddPlatformEventObserver(this);
|
||||
}
|
||||
|
||||
bool UserActivityDetector::HasObserver(
|
||||
@ -99,6 +87,17 @@ void UserActivityDetector::DidProcessEvent(
|
||||
ProcessReceivedEvent(event.get());
|
||||
}
|
||||
|
||||
void UserActivityDetector::PlatformEventSourceDestroying() {
|
||||
PlatformEventSource* platform_event_source =
|
||||
PlatformEventSource::GetInstance();
|
||||
CHECK(platform_event_source);
|
||||
platform_event_source->RemovePlatformEventObserver(this);
|
||||
}
|
||||
|
||||
UserActivityDetector::UserActivityDetector() = default;
|
||||
|
||||
UserActivityDetector::~UserActivityDetector() = default;
|
||||
|
||||
base::TimeTicks UserActivityDetector::GetCurrentTime() const {
|
||||
return !now_for_test_.is_null() ? now_for_test_ : base::TimeTicks::Now();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#define UI_BASE_USER_ACTIVITY_USER_ACTIVITY_DETECTOR_H_
|
||||
|
||||
#include "base/component_export.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/observer_list.h"
|
||||
#include "base/time/time.h"
|
||||
#include "ui/events/event.h"
|
||||
@ -26,16 +27,17 @@ class COMPONENT_EXPORT(UI_BASE) UserActivityDetector
|
||||
// is received that displays' power states are being changed.
|
||||
static const int kDisplayPowerChangeIgnoreMouseMs;
|
||||
|
||||
UserActivityDetector();
|
||||
|
||||
UserActivityDetector(const UserActivityDetector&) = delete;
|
||||
UserActivityDetector& operator=(const UserActivityDetector&) = delete;
|
||||
|
||||
~UserActivityDetector() override;
|
||||
|
||||
// Returns the UserActivityDetector instance if one was created.
|
||||
// Returns the UserActivityDetector instance.
|
||||
static UserActivityDetector* Get();
|
||||
|
||||
// Sets up the observation over the PlatformEventSource. Must be called after
|
||||
// the PlatformEventSource has been created for the main thread shared with
|
||||
// the detector.
|
||||
void InitPlatformEventSourceObservation();
|
||||
|
||||
base::TimeTicks last_activity_time() const { return last_activity_time_; }
|
||||
std::string last_activity_name() const { return last_activity_name_; }
|
||||
|
||||
@ -58,10 +60,15 @@ class COMPONENT_EXPORT(UI_BASE) UserActivityDetector
|
||||
// PlatformEventObserver:
|
||||
void WillProcessEvent(const PlatformEvent& platform_event) override {}
|
||||
void DidProcessEvent(const PlatformEvent& platform_event) override;
|
||||
void PlatformEventSourceDestroying() override;
|
||||
|
||||
private:
|
||||
friend class base::NoDestructor<UserActivityDetector>;
|
||||
friend class UserActivityDetectorTest;
|
||||
|
||||
UserActivityDetector();
|
||||
~UserActivityDetector() override;
|
||||
|
||||
// Returns |now_for_test_| if set or base::TimeTicks::Now() otherwise.
|
||||
base::TimeTicks GetCurrentTime() const;
|
||||
|
||||
|
@ -55,9 +55,9 @@ class TestPlatformEventSource : public PlatformEventSource {
|
||||
class UserActivityDetectorTest : public testing::Test {
|
||||
public:
|
||||
UserActivityDetectorTest()
|
||||
: platform_event_source_(new TestPlatformEventSource),
|
||||
detector_(new UserActivityDetector),
|
||||
observer_(new TestUserActivityObserver) {
|
||||
: platform_event_source_(std::make_unique<TestPlatformEventSource>()),
|
||||
detector_(ui::UserActivityDetector::Get()),
|
||||
observer_(std::make_unique<TestUserActivityObserver>()) {
|
||||
detector_->AddObserver(observer_.get());
|
||||
now_ = base::TimeTicks::Now();
|
||||
detector_->set_now_for_test(now_);
|
||||
@ -82,7 +82,7 @@ class UserActivityDetectorTest : public testing::Test {
|
||||
}
|
||||
|
||||
std::unique_ptr<TestPlatformEventSource> platform_event_source_;
|
||||
std::unique_ptr<UserActivityDetector> detector_;
|
||||
raw_ptr<UserActivityDetector> detector_;
|
||||
std::unique_ptr<TestUserActivityObserver> observer_;
|
||||
|
||||
base::TimeTicks now_;
|
||||
|
@ -20,6 +20,10 @@ class EVENTS_EXPORT PlatformEventObserver {
|
||||
// This is called after the event has been dispatched to the dispatcher(s).
|
||||
virtual void DidProcessEvent(const PlatformEvent& event) = 0;
|
||||
|
||||
// Called shortly before the PlatformEventSource the observer belongs to is
|
||||
// destroyed.
|
||||
virtual void PlatformEventSourceDestroying() {}
|
||||
|
||||
protected:
|
||||
virtual ~PlatformEventObserver() {}
|
||||
};
|
||||
|
@ -33,6 +33,9 @@ PlatformEventSource::PlatformEventSource()
|
||||
|
||||
PlatformEventSource::~PlatformEventSource() {
|
||||
CHECK_EQ(this, event_source);
|
||||
for (PlatformEventObserver& observer : observers_) {
|
||||
observer.PlatformEventSourceDestroying();
|
||||
}
|
||||
}
|
||||
|
||||
PlatformEventSource* PlatformEventSource::GetInstance() {
|
||||
|
Reference in New Issue
Block a user