Commit 37a55497 authored by Harvey Yang's avatar Harvey Yang Committed by Chromium LUCI CQ

accelerometer: Refactor AccelerometerProviderMojo

This commit simplifies the logic of AccelerometerProviderMojo by
limiting the usages on the UI thread.

BUG=b:175355860
TEST=unit tests and run on kohaku(hatch)

Change-Id: Ic43439a70b544848dcd3a948f996f81a9032687d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2586172Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Commit-Queue: Cheng-Hao Yang <chenghaoyang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#839061}
parent b4c95a46
......@@ -30,12 +30,10 @@ constexpr base::TimeDelta kDelayReconnect =
} // namespace
AccelerometerProviderMojo::AccelerometerProviderMojo()
: sensor_hal_client_(this),
observers_(
new base::ObserverListThreadSafe<AccelerometerReader::Observer>()),
update_(new AccelerometerUpdate()) {}
: update_(new AccelerometerUpdate()) {}
void AccelerometerProviderMojo::PrepareAndInitialize() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// This function should only be called once.
DCHECK(!task_runner_);
......@@ -49,40 +47,50 @@ void AccelerometerProviderMojo::PrepareAndInitialize() {
void AccelerometerProviderMojo::AddObserver(
AccelerometerReader::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(task_runner_);
// Do not move this into AddObserverOnThread, as the current task runner will
// be used in ObserverListThreadSafe::Notify.
observers_->AddObserver(observer);
observers_.AddObserver(observer);
task_runner_->PostNonNestableTask(
FROM_HERE, base::BindOnce(&AccelerometerProviderMojo::AddObserverOnThread,
base::Unretained(this), observer));
one_time_read_ = true;
if (accelerometer_read_on_)
return;
for (auto& accelerometer : accelerometers_) {
if (!accelerometer.second.samples_observer.get())
continue;
accelerometer.second.samples_observer->SetEnabled(true);
}
}
void AccelerometerProviderMojo::RemoveObserver(
AccelerometerReader::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(task_runner_);
observers_->RemoveObserver(observer);
observers_.RemoveObserver(observer);
}
void AccelerometerProviderMojo::StartListenToTabletModeController() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Shell::Get()->tablet_mode_controller()->AddObserver(this);
}
void AccelerometerProviderMojo::StopListenToTabletModeController() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Shell::Get()->tablet_mode_controller()->RemoveObserver(this);
}
void AccelerometerProviderMojo::SetEmitEvents(bool emit_events) {
task_runner_->PostNonNestableTask(
FROM_HERE,
base::BindOnce(&AccelerometerProviderMojo::SetEmitEventsOnThread, this,
emit_events));
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
emit_events_ = emit_events;
}
void AccelerometerProviderMojo::OnTabletPhysicalStateChanged() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Wait until the existence of the driver is determined.
if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::UNKNOWN) {
pending_on_tablet_physical_state_changed_ = true;
......@@ -514,9 +522,9 @@ void AccelerometerProviderMojo::OnSampleUpdatedCallback(
return;
}
observers_->Notify(FROM_HERE,
&AccelerometerReader::Observer::OnAccelerometerUpdated,
update_);
for (auto& observer : observers_)
observer.OnAccelerometerUpdated(update_);
update_ = new AccelerometerUpdate();
one_time_read_ = false;
......@@ -532,12 +540,8 @@ void AccelerometerProviderMojo::OnSampleUpdatedCallback(
}
}
void AccelerometerProviderMojo::SetEmitEventsOnThread(bool emit_events) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
emit_events_ = emit_events;
}
void AccelerometerProviderMojo::FailedToInitialize() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_NE(initialization_state_, State::SUCCESS);
LOG(ERROR) << "Failed to initialize for accelerometer read.";
......@@ -548,21 +552,4 @@ void AccelerometerProviderMojo::FailedToInitialize() {
sensor_hal_client_.reset();
}
void AccelerometerProviderMojo::AddObserverOnThread(
AccelerometerReader::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
one_time_read_ = true;
if (accelerometer_read_on_)
return;
for (auto& accelerometer : accelerometers_) {
if (!accelerometer.second.samples_observer.get())
continue;
accelerometer.second.samples_observer->SetEnabled(true);
}
}
} // namespace ash
......@@ -17,7 +17,7 @@
#include "ash/ash_export.h"
#include "ash/public/cpp/tablet_mode_observer.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list_threadsafe.h"
#include "base/observer_list.h"
#include "base/optional.h"
#include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h"
......@@ -121,18 +121,15 @@ class ASH_EXPORT AccelerometerProviderMojo
// Called by |observers_|, containing a sample of the accelerometer.
void OnSampleUpdatedCallback(int iio_device_id, std::vector<float> sample);
void SetEmitEventsOnThread(bool emit_events);
// Sets FAILED to |initialization_state_| due to an error.
void FailedToInitialize();
void AddObserverOnThread(AccelerometerReader::Observer* observer);
// The task runner to use for blocking tasks.
scoped_refptr<base::SequencedTaskRunner> task_runner_;
// The Mojo channel connecting to Sensor Hal Dispatcher.
mojo::Receiver<chromeos::sensors::mojom::SensorHalClient> sensor_hal_client_;
mojo::Receiver<chromeos::sensors::mojom::SensorHalClient> sensor_hal_client_{
this};
// The Mojo channel to query and request for devices.
mojo::Remote<chromeos::sensors::mojom::SensorService> sensor_service_remote_;
......@@ -152,7 +149,7 @@ class ASH_EXPORT AccelerometerProviderMojo
// |ec_lid_angle_driver_status_| is set.
bool pending_on_tablet_physical_state_changed_ = false;
// One time read upon |AddObserverOnThread|.
// One time read upon |AddObserver|.
// Some observers need to know ECLidAngleDriverStatus, and it's guaranteed to
// be set before reading samples. When adding an observer, trigger at least
// one sample to notify observers that ECLidAngleDriverStatus has been set.
......@@ -164,8 +161,7 @@ class ASH_EXPORT AccelerometerProviderMojo
bool emit_events_ = true;
// The observers to notify of accelerometer updates.
scoped_refptr<base::ObserverListThreadSafe<AccelerometerReader::Observer>>
observers_;
base::ObserverList<AccelerometerReader::Observer>::Unchecked observers_;
// The last seen accelerometer data.
scoped_refptr<AccelerometerUpdate> update_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment