Commit 00bad31e authored by Jeffrey Young's avatar Jeffrey Young Committed by Chromium LUCI CQ

ambient: resume when suspend is done

This corrects two issues with suspend:
* Ambient mode does not restart when waking up from suspend
* Flash of old Ambient mode photo displays when opening lid from suspend

Block Ambient mode from restarting after |SuspendImminent| until
|SuspendDone| is received. Upon |SuspendDone|, also restart Ambient mode
lock screen timeout if appropriate.

Start Ambient mode, close lid while active. Reopen lid, wait 7 seconds,
Ambient mode starts again over lock screen.

BUG=b:177325727
BUG=b:177692036
TEST=ash_unittest --gtest_filter="AmbientControllerTest.*Suspend"

Cq-Include-Trybots: luci.chrome.try:linux-chromeos-chrome
Change-Id: I8d52af80ab7dd49538998d0e8831ee3c10d2919a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2625727
Commit-Queue: Jeffrey Young <cowmoo@chromium.org>
Reviewed-by: default avatarTao Wu <wutao@chromium.org>
Reviewed-by: default avatarXiaohui Chen <xiaohuic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#845384}
parent 9e6d35cf
...@@ -270,7 +270,7 @@ void AmbientController::OnAutoShowTimeOut() { ...@@ -270,7 +270,7 @@ void AmbientController::OnAutoShowTimeOut() {
DCHECK(IsUiHidden(ambient_ui_model_.ui_visibility())); DCHECK(IsUiHidden(ambient_ui_model_.ui_visibility()));
// Show ambient screen after time out. // Show ambient screen after time out.
ambient_ui_model_.SetUiVisibility(AmbientUiVisibility::kShown); ShowUi();
} }
void AmbientController::OnLockStateChanged(bool locked) { void AmbientController::OnLockStateChanged(bool locked) {
...@@ -403,6 +403,15 @@ void AmbientController::SuspendImminent( ...@@ -403,6 +403,15 @@ void AmbientController::SuspendImminent(
// closing finished. // closing finished.
CloseAllWidgets(/*immediately=*/true); CloseAllWidgets(/*immediately=*/true);
CloseUi(); CloseUi();
is_suspend_imminent_ = true;
}
void AmbientController::SuspendDone(base::TimeDelta sleep_duration) {
is_suspend_imminent_ = false;
// |DismissUI| will restart the lock screen timer if lock screen is active and
// if Ambient mode is enabled, so call it when resuming from suspend to
// restart Ambient mode if applicable.
DismissUI();
} }
void AmbientController::OnAuthScanDone( void AmbientController::OnAuthScanDone(
...@@ -441,6 +450,11 @@ void AmbientController::ShowUi() { ...@@ -441,6 +450,11 @@ void AmbientController::ShowUi() {
return; return;
} }
if (is_suspend_imminent_) {
VLOG(1) << "Do not show UI when suspend imminent";
return;
}
ambient_ui_model_.SetUiVisibility(AmbientUiVisibility::kShown); ambient_ui_model_.SetUiVisibility(AmbientUiVisibility::kShown);
} }
...@@ -452,6 +466,11 @@ void AmbientController::ShowHiddenUi() { ...@@ -452,6 +466,11 @@ void AmbientController::ShowHiddenUi() {
return; return;
} }
if (is_suspend_imminent_) {
VLOG(1) << "Do not start hidden UI when suspend imminent";
return;
}
ambient_ui_model_.SetUiVisibility(AmbientUiVisibility::kHidden); ambient_ui_model_.SetUiVisibility(AmbientUiVisibility::kHidden);
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h" #include "base/scoped_observation.h"
#include "base/time/time.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/dbus/power/power_manager_client.h"
#include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_change_registrar.h"
...@@ -77,6 +78,7 @@ class ASH_EXPORT AmbientController ...@@ -77,6 +78,7 @@ class ASH_EXPORT AmbientController
void ScreenIdleStateChanged( void ScreenIdleStateChanged(
const power_manager::ScreenIdleState& idle_state) override; const power_manager::ScreenIdleState& idle_state) override;
void SuspendImminent(power_manager::SuspendImminent::Reason reason) override; void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
void SuspendDone(base::TimeDelta sleep_duration) override;
// fingerprint::mojom::FingerprintObserver: // fingerprint::mojom::FingerprintObserver:
void OnAuthScanDone( void OnAuthScanDone(
...@@ -215,6 +217,11 @@ class ASH_EXPORT AmbientController ...@@ -215,6 +217,11 @@ class ASH_EXPORT AmbientController
mojo::Receiver<device::mojom::FingerprintObserver> mojo::Receiver<device::mojom::FingerprintObserver>
fingerprint_observer_receiver_{this}; fingerprint_observer_receiver_{this};
// Set when |SuspendImminent| is called and cleared when |SuspendDone| is
// called. Used to prevent Ambient mode from reactivating while device is
// going to suspend.
bool is_suspend_imminent_ = false;
base::WeakPtrFactory<AmbientController> weak_ptr_factory_{this}; base::WeakPtrFactory<AmbientController> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(AmbientController); DISALLOW_COPY_AND_ASSIGN(AmbientController);
}; };
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power/fake_power_manager_client.h"
#include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/dbus/power/power_manager_client.h"
#include "chromeos/dbus/power_manager/power_supply_properties.pb.h" #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
#include "chromeos/dbus/power_manager/suspend.pb.h"
#include "ui/events/event.h" #include "ui/events/event.h"
#include "ui/events/keycodes/keyboard_codes_posix.h" #include "ui/events/keycodes/keyboard_codes_posix.h"
#include "ui/events/pointer_details.h" #include "ui/events/pointer_details.h"
...@@ -802,10 +803,32 @@ TEST_F(AmbientControllerTest, ClosesAmbientBeforeSuspend) { ...@@ -802,10 +803,32 @@ TEST_F(AmbientControllerTest, ClosesAmbientBeforeSuspend) {
EXPECT_FALSE(ambient_controller()->IsShown()); EXPECT_FALSE(ambient_controller()->IsShown());
FastForwardToLockScreenTimeout(); FastForwardToLockScreenTimeout();
// Ambient mode should not resume after suspend. // Ambient mode should not resume until SuspendDone is received.
EXPECT_FALSE(ambient_controller()->IsShown()); EXPECT_FALSE(ambient_controller()->IsShown());
} }
TEST_F(AmbientControllerTest, RestartsAmbientAfterSuspend) {
LockScreen();
FastForwardToLockScreenTimeout();
EXPECT_TRUE(ambient_controller()->IsShown());
SimulateSystemSuspendAndWait(
power_manager::SuspendImminent::Reason::SuspendImminent_Reason_IDLE);
EXPECT_FALSE(ambient_controller()->IsShown());
// This call should be blocked by prior |SuspendImminent| until |SuspendDone|.
ambient_controller()->ShowUi();
EXPECT_FALSE(ambient_controller()->IsShown());
SimulateSystemResumeAndWait();
FastForwardToLockScreenTimeout();
EXPECT_TRUE(ambient_controller()->IsShown());
}
TEST_F(AmbientControllerTest, ObservesPrefsWhenAmbientEnabled) { TEST_F(AmbientControllerTest, ObservesPrefsWhenAmbientEnabled) {
SetAmbientModeEnabled(false); SetAmbientModeEnabled(false);
......
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