Commit 93a5fc58 authored by Michael Hansen's avatar Michael Hansen Committed by Chromium LUCI CQ

[Nearby] Observe screen idle state events.

This change lets us observe screen idle state (on/off state) so that
we can invalidate send and receive surfaces in response.

This also collapses PowerClientChromeos into PowerClient since we no
longer need to guard Chrome OS-specific functionality.

Fixed: 1169262
Change-Id: I893df57d113590c0e09a81a381c3a291b74fd00a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2643918Reviewed-by: default avatarRyan Hansberry <hansberry@chromium.org>
Commit-Queue: Michael Hansen <hansenmichael@google.com>
Cr-Commit-Position: refs/heads/master@{#846278}
parent d13d7807
......@@ -4424,8 +4424,6 @@ static_library("browser") {
"nearby_sharing/payload_tracker.h",
"nearby_sharing/power_client.cc",
"nearby_sharing/power_client.h",
"nearby_sharing/power_client_chromeos.cc",
"nearby_sharing/power_client_chromeos.h",
"nearby_sharing/share_target_discovered_callback.h",
"nearby_sharing/share_target_info.cc",
"nearby_sharing/share_target_info.h",
......
......@@ -18,6 +18,7 @@
#include "chrome/browser/nearby_sharing/nearby_connections_manager_impl.h"
#include "chrome/browser/nearby_sharing/nearby_process_manager.h"
#include "chrome/browser/nearby_sharing/nearby_sharing_service_impl.h"
#include "chrome/browser/nearby_sharing/power_client.h"
#include "chrome/browser/notifications/notification_display_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
......@@ -29,9 +30,6 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/nearby_sharing/power_client_chromeos.h"
#else // !BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/nearby_sharing/power_client.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
namespace {
......@@ -101,11 +99,7 @@ KeyedService* NearbySharingServiceFactory::BuildServiceInstanceFor(
return new NearbySharingServiceImpl(
pref_service, notification_display_service, profile,
std::move(nearby_connections_manager), &process_manager,
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::make_unique<PowerClientChromeos>());
#else // !BUILDFLAG(IS_CHROMEOS_ASH)
std::make_unique<PowerClient>());
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}
content::BrowserContext* NearbySharingServiceFactory::GetBrowserContextToUse(
......
......@@ -1054,6 +1054,11 @@ void NearbySharingServiceImpl::SuspendDone() {
InvalidateSurfaceState();
}
void NearbySharingServiceImpl::ScreenStateChanged(bool is_screen_on) {
NS_LOG(VERBOSE) << __func__ << ": " << is_screen_on;
InvalidateSurfaceState();
}
base::ObserverList<TransferUpdateCallback>&
NearbySharingServiceImpl::GetReceiveCallbacksFromState(
ReceiveSurfaceState state) {
......@@ -1377,6 +1382,13 @@ void NearbySharingServiceImpl::InvalidateScanningState() {
return;
}
if (!power_client_->IsScreenOn()) {
StopScanning();
NS_LOG(VERBOSE) << __func__
<< ": Stopping discovery because the screen is off.";
return;
}
if (!process_manager_->IsActiveProfile(profile_)) {
NS_LOG(VERBOSE) << __func__
<< ": Stopping discovery because profile was not active";
......@@ -1447,6 +1459,14 @@ void NearbySharingServiceImpl::InvalidateFastInitiationAdvertising() {
return;
}
if (!power_client_->IsScreenOn()) {
StopFastInitiationAdvertising();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping fast init advertising because the screen is off.";
return;
}
if (!process_manager_->IsActiveProfile(profile_)) {
StopFastInitiationAdvertising();
NS_LOG(VERBOSE)
......@@ -1518,6 +1538,13 @@ void NearbySharingServiceImpl::InvalidateAdvertisingState() {
return;
}
if (!power_client_->IsScreenOn()) {
StopAdvertising();
NS_LOG(VERBOSE) << __func__
<< ": Stopping advertising because the screen is off.";
return;
}
if (!process_manager_->IsActiveProfile(profile_)) {
NS_LOG(VERBOSE) << __func__
<< ": Stopping advertising because profile was not active";
......@@ -1692,6 +1719,7 @@ void NearbySharingServiceImpl::StopAdvertising() {
void NearbySharingServiceImpl::StartScanning() {
DCHECK(profile_);
DCHECK(!power_client_->IsSuspended());
DCHECK(power_client_->IsScreenOn());
DCHECK(settings_.GetEnabled());
DCHECK(!is_screen_locked_);
DCHECK(HasAvailableConnectionMediums());
......
......@@ -160,6 +160,7 @@ class NearbySharingServiceImpl
// PowerClient::Observer:
void SuspendImminent() override;
void SuspendDone() override;
void ScreenStateChanged(bool is_screen_on) override;
base::ObserverList<TransferUpdateCallback>& GetReceiveCallbacksFromState(
ReceiveSurfaceState state);
......
......@@ -187,7 +187,8 @@ class MockShareTargetDiscoveredCallback : public ShareTargetDiscoveredCallback {
class FakePowerClient : public PowerClient {
public:
// Make SetSuspended() public for testing.
// Make setters public for testing.
using PowerClient::SetScreenOn;
using PowerClient::SetSuspended;
};
......@@ -1712,6 +1713,34 @@ TEST_F(NearbySharingServiceImplTest, SuspendDuringAdvertising) {
EXPECT_TRUE(fake_nearby_connections_manager_->IsDiscovering());
}
TEST_F(NearbySharingServiceImplTest,
ScreenOffRegisterReceiveSurfaceNotAdvertising) {
power_client_->SetScreenOn(false);
SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
MockTransferUpdateCallback callback;
NearbySharingService::StatusCodes result = service_->RegisterReceiveSurface(
&callback, NearbySharingService::ReceiveSurfaceState::kForeground);
EXPECT_EQ(result, NearbySharingService::StatusCodes::kOk);
EXPECT_FALSE(fake_nearby_connections_manager_->IsAdvertising());
EXPECT_FALSE(fake_nearby_connections_manager_->is_shutdown());
}
TEST_F(NearbySharingServiceImplTest, SetScreenOffDuringAdvertising) {
SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
MockTransferUpdateCallback transfer_callback;
MockShareTargetDiscoveredCallback discovery_callback;
EXPECT_EQ(
NearbySharingService::StatusCodes::kOk,
service_->RegisterSendSurface(&transfer_callback, &discovery_callback,
SendSurfaceState::kForeground));
EXPECT_TRUE(fake_nearby_connections_manager_->IsDiscovering());
power_client_->SetScreenOn(false);
EXPECT_FALSE(fake_nearby_connections_manager_->IsDiscovering());
power_client_->SetScreenOn(true);
EXPECT_TRUE(fake_nearby_connections_manager_->IsDiscovering());
}
TEST_F(NearbySharingServiceImplTest,
DataUsageChangedRegisterReceiveSurfaceRestartsAdvertising) {
SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
......
......@@ -4,9 +4,15 @@
#include "chrome/browser/nearby_sharing/power_client.h"
PowerClient::PowerClient() = default;
PowerClient::PowerClient() {
if (chromeos::PowerManagerClient::Get())
chromeos::PowerManagerClient::Get()->AddObserver(this);
}
PowerClient::~PowerClient() = default;
PowerClient::~PowerClient() {
if (chromeos::PowerManagerClient::Get())
chromeos::PowerManagerClient::Get()->RemoveObserver(this);
}
void PowerClient::AddObserver(PowerClient::Observer* observer) {
observers_.AddObserver(observer);
......@@ -20,6 +26,10 @@ bool PowerClient::IsSuspended() {
return is_suspended_;
}
bool PowerClient::IsScreenOn() {
return is_screen_on_;
}
void PowerClient::SetSuspended(bool is_suspended) {
is_suspended_ = is_suspended;
for (auto& observer : observers_) {
......@@ -29,3 +39,33 @@ void PowerClient::SetSuspended(bool is_suspended) {
observer.SuspendDone();
}
}
void PowerClient::SetScreenOn(bool is_screen_on) {
is_screen_on_ = is_screen_on;
screen_state_notify_timer_.Stop();
for (auto& observer : observers_) {
observer.ScreenStateChanged(is_screen_on_);
}
}
void PowerClient::SuspendImminent(
power_manager::SuspendImminent::Reason reason) {
SetSuspended(true);
}
void PowerClient::SuspendDone(base::TimeDelta sleep_duration) {
SetSuspended(false);
}
void PowerClient::ScreenIdleStateChanged(
const power_manager::ScreenIdleState& state) {
bool new_state_on = !state.off();
if (is_screen_on_ && !new_state_on) {
screen_state_notify_timer_.Start(
FROM_HERE, base::TimeDelta::FromMinutes(1),
base::BindOnce(&PowerClient::SetScreenOn, base::Unretained(this),
new_state_on));
} else if (!is_screen_on_ && new_state_on) {
SetScreenOn(new_state_on);
}
}
......@@ -8,28 +8,42 @@
#include <memory>
#include "base/observer_list.h"
#include "base/timer/timer.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "chromeos/dbus/power_manager/idle.pb.h"
class PowerClient {
class PowerClient : public chromeos::PowerManagerClient::Observer {
public:
class Observer : public base::CheckedObserver {
public:
virtual void SuspendImminent() {}
virtual void SuspendDone() {}
virtual void ScreenStateChanged(bool is_screen_on) {}
};
PowerClient();
virtual ~PowerClient();
~PowerClient() override;
virtual void AddObserver(Observer* observer);
virtual void RemoveObserver(Observer* observer);
virtual bool IsSuspended();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
bool IsSuspended();
bool IsScreenOn();
protected:
void SetSuspended(bool suspended);
void SetSuspended(bool is_suspended);
void SetScreenOn(bool is_screen_on);
private:
// chromeos::PowerManagerClient::Observer:
void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
void SuspendDone(base::TimeDelta sleep_duration) override;
void ScreenIdleStateChanged(
const power_manager::ScreenIdleState& state) override;
base::ObserverList<Observer> observers_;
base::OneShotTimer screen_state_notify_timer_;
bool is_suspended_ = false;
bool is_screen_on_ = true;
};
#endif // CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/nearby_sharing/power_client_chromeos.h"
PowerClientChromeos::PowerClientChromeos() {
if (chromeos::PowerManagerClient::Get())
chromeos::PowerManagerClient::Get()->AddObserver(this);
}
PowerClientChromeos::~PowerClientChromeos() {
if (chromeos::PowerManagerClient::Get())
chromeos::PowerManagerClient::Get()->RemoveObserver(this);
}
void PowerClientChromeos::SuspendImminent(
power_manager::SuspendImminent::Reason reason) {
SetSuspended(true);
}
void PowerClientChromeos::SuspendDone(base::TimeDelta sleep_duration) {
SetSuspended(false);
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_CHROMEOS_H_
#define CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_CHROMEOS_H_
#include "chrome/browser/nearby_sharing/power_client.h"
#include "chromeos/dbus/power/power_manager_client.h"
class PowerClientChromeos : public PowerClient,
public chromeos::PowerManagerClient::Observer {
public:
PowerClientChromeos();
~PowerClientChromeos() override;
private:
// chromeos::PowerManagerClient::Observer:
void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
void SuspendDone(base::TimeDelta sleep_duration) override;
};
#endif // CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_CHROMEOS_H_
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