Commit c0b8e067 authored by Jimmy Gong's avatar Jimmy Gong Committed by Commit Bot

Phonehub: Hide UI in lockscreen

- Phonehub will now be hidden in lockscreen, preventing notifications
  and controls from appearing in the lockscreen.
- A followup CL will handle the suspend state of the Chrome OS device.

Bug: 1139415, 1106937
Test: chromeos_components_unittest, ash_unittests
Change-Id: Ie06dc84e22db98032e4f1479f4db5e4df0c1290d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2516248Reviewed-by: default avatarAchuith Bhandarkar <achuith@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Commit-Queue: Jimmy Gong <jimmyxgong@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825030}
parent dc27fccd
...@@ -147,6 +147,8 @@ PhoneHubUiController::GetUiStateFromPhoneHubManager() { ...@@ -147,6 +147,8 @@ PhoneHubUiController::GetUiStateFromPhoneHubManager() {
return UiState::kPhoneConnecting; return UiState::kPhoneConnecting;
case FeatureStatus::kEnabledAndConnected: case FeatureStatus::kEnabledAndConnected:
return UiState::kPhoneConnected; return UiState::kPhoneConnected;
case FeatureStatus::kUnavailableScreenLocked:
return UiState::kHidden;
} }
} }
......
...@@ -144,4 +144,11 @@ TEST_F(PhoneHubUiControllerTest, PhoneConnected) { ...@@ -144,4 +144,11 @@ TEST_F(PhoneHubUiControllerTest, PhoneConnected) {
EXPECT_EQ(kPhoneConnectedView, content_view->GetID()); EXPECT_EQ(kPhoneConnectedView, content_view->GetID());
} }
TEST_F(PhoneHubUiControllerTest, UnavailableScreenLocked) {
GetFeatureStatusProvider()->SetStatus(
FeatureStatus::kUnavailableScreenLocked);
EXPECT_EQ(PhoneHubUiController::UiState::kHidden, controller_.ui_state());
EXPECT_FALSE(controller_.CreateContentView(/*bubble_view=*/nullptr).get());
}
} // namespace ash } // namespace ash
...@@ -95,6 +95,7 @@ static_library("phonehub") { ...@@ -95,6 +95,7 @@ static_library("phonehub") {
"//chromeos/services/secure_channel/public/mojom", "//chromeos/services/secure_channel/public/mojom",
"//components/keyed_service/core", "//components/keyed_service/core",
"//components/prefs", "//components/prefs",
"//components/session_manager/core",
"//device/bluetooth", "//device/bluetooth",
"//net", "//net",
"//ui/gfx", "//ui/gfx",
...@@ -201,6 +202,7 @@ source_set("unit_tests") { ...@@ -201,6 +202,7 @@ source_set("unit_tests") {
"//chromeos/services/network_config/public/cpp:test_support", "//chromeos/services/network_config/public/cpp:test_support",
"//chromeos/services/secure_channel/public/cpp/client:test_support", "//chromeos/services/secure_channel/public/cpp/client:test_support",
"//components/prefs:test_support", "//components/prefs:test_support",
"//components/session_manager/core",
"//device/bluetooth:mocks", "//device/bluetooth:mocks",
"//testing/gtest", "//testing/gtest",
"//ui/gfx", "//ui/gfx",
......
...@@ -7,6 +7,7 @@ include_rules = [ ...@@ -7,6 +7,7 @@ include_rules = [
"+chromeos/services/secure_channel/public/cpp/client", "+chromeos/services/secure_channel/public/cpp/client",
"+components/keyed_service/core/keyed_service.h", "+components/keyed_service/core/keyed_service.h",
"+components/prefs", "+components/prefs",
"+components/session_manager/core",
"+device/bluetooth", "+device/bluetooth",
"+net", "+net",
"+ui/gfx", "+ui/gfx",
......
...@@ -49,6 +49,10 @@ class ConnectionManager { ...@@ -49,6 +49,10 @@ class ConnectionManager {
// the connection. // the connection.
virtual void AttemptConnection() = 0; virtual void AttemptConnection() = 0;
// Cancels an ongoing connection attempt. Is a no-op is there is currently no
// connection attempt.
virtual void Disconnect() = 0;
// Sends a message with the specified |payload|. // Sends a message with the specified |payload|.
virtual void SendMessage(const std::string& payload) = 0; virtual void SendMessage(const std::string& payload) = 0;
......
...@@ -149,7 +149,7 @@ void ConnectionManagerImpl::AttemptConnection() { ...@@ -149,7 +149,7 @@ void ConnectionManagerImpl::AttemptConnection() {
} }
connection_attempt_->SetDelegate(this); connection_attempt_->SetDelegate(this);
PA_LOG(INFO) << "ConnectiongManager status updated to: " << GetStatus(); PA_LOG(INFO) << "ConnectionManager status updated to: " << GetStatus();
NotifyStatusChanged(); NotifyStatusChanged();
timer_->Start(FROM_HERE, kConnectionTimeoutSeconds, timer_->Start(FROM_HERE, kConnectionTimeoutSeconds,
...@@ -157,6 +157,11 @@ void ConnectionManagerImpl::AttemptConnection() { ...@@ -157,6 +157,11 @@ void ConnectionManagerImpl::AttemptConnection() {
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
void ConnectionManagerImpl::Disconnect() {
PA_LOG(INFO) << "ConnectionManager disconnecting connection.";
TearDownConnection();
}
void ConnectionManagerImpl::SendMessage(const std::string& payload) { void ConnectionManagerImpl::SendMessage(const std::string& payload) {
if (!channel_) { if (!channel_) {
PA_LOG(ERROR) << "SendMessage() failed because channel is null."; PA_LOG(ERROR) << "SendMessage() failed because channel is null.";
...@@ -186,12 +191,7 @@ void ConnectionManagerImpl::OnConnection( ...@@ -186,12 +191,7 @@ void ConnectionManagerImpl::OnConnection(
} }
void ConnectionManagerImpl::OnDisconnected() { void ConnectionManagerImpl::OnDisconnected() {
// Stop timer in case we are disconnected before the connection timed out. TearDownConnection();
timer_->Stop();
connection_attempt_.reset();
channel_->RemoveObserver(this);
channel_.reset();
NotifyStatusChanged();
} }
void ConnectionManagerImpl::OnMessageReceived(const std::string& payload) { void ConnectionManagerImpl::OnMessageReceived(const std::string& payload) {
...@@ -206,5 +206,15 @@ void ConnectionManagerImpl::OnConnectionTimeout() { ...@@ -206,5 +206,15 @@ void ConnectionManagerImpl::OnConnectionTimeout() {
NotifyStatusChanged(); NotifyStatusChanged();
} }
void ConnectionManagerImpl::TearDownConnection() {
// Stop timer in case we are disconnected before the connection timed out.
timer_->Stop();
connection_attempt_.reset();
if (channel_)
channel_->RemoveObserver(this);
channel_.reset();
NotifyStatusChanged();
}
} // namespace phonehub } // namespace phonehub
} // namespace chromeos } // namespace chromeos
...@@ -48,6 +48,7 @@ class ConnectionManagerImpl ...@@ -48,6 +48,7 @@ class ConnectionManagerImpl
// ConnectionManager: // ConnectionManager:
ConnectionManager::Status GetStatus() const override; ConnectionManager::Status GetStatus() const override;
void AttemptConnection() override; void AttemptConnection() override;
void Disconnect() override;
void SendMessage(const std::string& payload) override; void SendMessage(const std::string& payload) override;
private: private:
...@@ -91,6 +92,8 @@ class ConnectionManagerImpl ...@@ -91,6 +92,8 @@ class ConnectionManagerImpl
void OnConnectionTimeout(); void OnConnectionTimeout();
void TearDownConnection();
multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_; multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_;
device_sync::DeviceSyncClient* device_sync_client_; device_sync::DeviceSyncClient* device_sync_client_;
......
...@@ -346,5 +346,24 @@ TEST_F(ConnectionManagerImplTest, ConnectionTimeout) { ...@@ -346,5 +346,24 @@ TEST_F(ConnectionManagerImplTest, ConnectionTimeout) {
1); 1);
} }
TEST_F(ConnectionManagerImplTest, DisconnectConnection) {
CreateFakeConnectionAttempt();
connection_manager_->AttemptConnection();
// Status has been updated to connecting, verify that the status observer
// has been called.
EXPECT_EQ(1u, GetNumStatusObserverCalls());
EXPECT_EQ(ConnectionManager::Status::kConnecting, GetStatus());
VerifyTimerSet();
// Disconnect the connection attempt.
connection_manager_->Disconnect();
EXPECT_EQ(2u, GetNumStatusObserverCalls());
EXPECT_EQ(ConnectionManager::Status::kDisconnected, GetStatus());
VerifyTimerStopped();
histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", false,
1);
}
} // namespace phonehub } // namespace phonehub
} // namespace chromeos } // namespace chromeos
...@@ -58,12 +58,10 @@ void ConnectionSchedulerImpl::OnFeatureStatusChanged() { ...@@ -58,12 +58,10 @@ void ConnectionSchedulerImpl::OnFeatureStatusChanged() {
current_feature_status_ = feature_status_provider_->GetStatus(); current_feature_status_ = feature_status_provider_->GetStatus();
switch (current_feature_status_) { switch (current_feature_status_) {
// The following states indicate either the feature state of the devices // The following feature states indicate that there is an interruption with
// changed or if a connection is established between the devices. In the // establishing connection to the host phone or that the feature is blocked
// case where the feature state has been changed, we do not want to // from initiating a connection. Disconnect the existing connection, reset
// schedule a new connection attempt until the devices are available to // backoffs, and return early.
// connect. If a connection is established, we also do not want to schedule
// a new connection. Reset the backoff and return early.
case FeatureStatus::kNotEligibleForFeature: case FeatureStatus::kNotEligibleForFeature:
FALLTHROUGH; FALLTHROUGH;
case FeatureStatus::kEligiblePhoneButNotSetUp: case FeatureStatus::kEligiblePhoneButNotSetUp:
...@@ -74,11 +72,17 @@ void ConnectionSchedulerImpl::OnFeatureStatusChanged() { ...@@ -74,11 +72,17 @@ void ConnectionSchedulerImpl::OnFeatureStatusChanged() {
FALLTHROUGH; FALLTHROUGH;
case FeatureStatus::kUnavailableBluetoothOff: case FeatureStatus::kUnavailableBluetoothOff:
FALLTHROUGH; FALLTHROUGH;
case FeatureStatus::kUnavailableScreenLocked:
DisconnectAndClearBackoffAttempts();
return;
// Connection has been established, clear existing backoffs and return
// early.
case FeatureStatus::kEnabledAndConnected: case FeatureStatus::kEnabledAndConnected:
ClearBackoffAttempts(); ClearBackoffAttempts();
return; return;
// Connection in progress, waiting for the next status update. // Connection is in progress, return and wait for the result.
case FeatureStatus::kEnabledAndConnecting: case FeatureStatus::kEnabledAndConnecting:
return; return;
...@@ -115,6 +119,13 @@ void ConnectionSchedulerImpl::ClearBackoffAttempts() { ...@@ -115,6 +119,13 @@ void ConnectionSchedulerImpl::ClearBackoffAttempts() {
retry_backoff_.Reset(); retry_backoff_.Reset();
} }
void ConnectionSchedulerImpl::DisconnectAndClearBackoffAttempts() {
ClearBackoffAttempts();
// Disconnect existing connection or connection attempt.
connection_manager_->Disconnect();
}
base::TimeDelta base::TimeDelta
ConnectionSchedulerImpl::GetCurrentBackoffDelayTimeForTesting() { ConnectionSchedulerImpl::GetCurrentBackoffDelayTimeForTesting() {
return retry_backoff_.GetTimeUntilRelease(); return retry_backoff_.GetTimeUntilRelease();
......
...@@ -34,7 +34,10 @@ class ConnectionSchedulerImpl : public ConnectionScheduler, ...@@ -34,7 +34,10 @@ class ConnectionSchedulerImpl : public ConnectionScheduler,
// FeatureStatusProvider::Observer: // FeatureStatusProvider::Observer:
void OnFeatureStatusChanged() override; void OnFeatureStatusChanged() override;
// Invalidate all pending backoff attempts. // Invalidate all pending backoff attempts and disconnects the current
// connection attempt.
void DisconnectAndClearBackoffAttempts();
void ClearBackoffAttempts(); void ClearBackoffAttempts();
// Test only functions. // Test only functions.
......
...@@ -143,6 +143,8 @@ TEST_F(ConnectionSchedulerImplTest, BackoffRetryWithUpdatedFeatures) { ...@@ -143,6 +143,8 @@ TEST_F(ConnectionSchedulerImplTest, BackoffRetryWithUpdatedFeatures) {
// connection. // connection.
EXPECT_EQ(0, GetBackoffFailureCount()); EXPECT_EQ(0, GetBackoffFailureCount());
EXPECT_EQ(1u, fake_connection_manager_->num_attempt_connection_calls()); EXPECT_EQ(1u, fake_connection_manager_->num_attempt_connection_calls());
// Expect that connection has been disconnected.
EXPECT_EQ(1u, fake_connection_manager_->num_disconnect_calls());
// Fast forward time and confirm no other retries have been made. // Fast forward time and confirm no other retries have been made.
task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(100)); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(100));
...@@ -167,5 +169,26 @@ TEST_F(ConnectionSchedulerImplTest, BackoffRetryWithUpdatedFeatures) { ...@@ -167,5 +169,26 @@ TEST_F(ConnectionSchedulerImplTest, BackoffRetryWithUpdatedFeatures) {
// failure count. // failure count.
EXPECT_EQ(1, GetBackoffFailureCount()); EXPECT_EQ(1, GetBackoffFailureCount());
} }
TEST_F(ConnectionSchedulerImplTest, ScheduleConnectionAfterUnlock) {
fake_feature_status_provider_->SetStatus(
FeatureStatus::kEnabledButDisconnected);
CreateConnectionScheduler();
// Simulate screen locked and expect no scheduled connections.
fake_feature_status_provider_->SetStatus(
FeatureStatus::kUnavailableScreenLocked);
// Expect no scheduled connections on screen lock.
EXPECT_EQ(0, GetBackoffFailureCount());
EXPECT_EQ(0u, fake_connection_manager_->num_attempt_connection_calls());
EXPECT_EQ(1u, fake_connection_manager_->num_disconnect_calls());
// Simulate screen unlocked and expect a scheduled connection.
fake_feature_status_provider_->SetStatus(
FeatureStatus::kEnabledButDisconnected);
EXPECT_EQ(0, GetBackoffFailureCount());
EXPECT_EQ(1u, fake_connection_manager_->num_attempt_connection_calls());
}
} // namespace phonehub } // namespace phonehub
} // namespace chromeos } // namespace chromeos
\ No newline at end of file
...@@ -30,6 +30,11 @@ void FakeConnectionManager::AttemptConnection() { ...@@ -30,6 +30,11 @@ void FakeConnectionManager::AttemptConnection() {
SetStatus(Status::kConnecting); SetStatus(Status::kConnecting);
} }
void FakeConnectionManager::Disconnect() {
++num_disconnect_calls_;
SetStatus(Status::kDisconnected);
}
void FakeConnectionManager::SendMessage(const std::string& payload) { void FakeConnectionManager::SendMessage(const std::string& payload) {
sent_messages_.push_back(payload); sent_messages_.push_back(payload);
} }
......
...@@ -26,15 +26,19 @@ class FakeConnectionManager : public ConnectionManager { ...@@ -26,15 +26,19 @@ class FakeConnectionManager : public ConnectionManager {
return num_attempt_connection_calls_; return num_attempt_connection_calls_;
} }
size_t num_disconnect_calls() const { return num_disconnect_calls_; }
private: private:
// ConnectionManager: // ConnectionManager:
Status GetStatus() const override; Status GetStatus() const override;
void AttemptConnection() override; void AttemptConnection() override;
void Disconnect() override;
void SendMessage(const std::string& payload) override; void SendMessage(const std::string& payload) override;
Status status_; Status status_;
std::vector<std::string> sent_messages_; std::vector<std::string> sent_messages_;
size_t num_attempt_connection_calls_ = 0; size_t num_attempt_connection_calls_ = 0;
size_t num_disconnect_calls_ = 0;
}; };
} // namespace phonehub } // namespace phonehub
......
...@@ -33,6 +33,9 @@ std::ostream& operator<<(std::ostream& stream, FeatureStatus status) { ...@@ -33,6 +33,9 @@ std::ostream& operator<<(std::ostream& stream, FeatureStatus status) {
case FeatureStatus::kEnabledAndConnected: case FeatureStatus::kEnabledAndConnected:
stream << "[Enabled; connected]"; stream << "[Enabled; connected]";
break; break;
case FeatureStatus::kUnavailableScreenLocked:
stream << "[Unavailable; screen locked]";
break;
} }
return stream; return stream;
......
...@@ -51,8 +51,11 @@ enum class FeatureStatus { ...@@ -51,8 +51,11 @@ enum class FeatureStatus {
// The feature is enabled, and there is an active connection with the phone. // The feature is enabled, and there is an active connection with the phone.
kEnabledAndConnected = 7, kEnabledAndConnected = 7,
// The feature is unavailable during the lockscreen.
kUnavailableScreenLocked = 8,
// Max value needed for metrics. // Max value needed for metrics.
kMaxValue = kEnabledAndConnected kMaxValue = kUnavailableScreenLocked,
}; };
std::ostream& operator<<(std::ostream& stream, FeatureStatus status); std::ostream& operator<<(std::ostream& stream, FeatureStatus status);
......
...@@ -117,13 +117,17 @@ bool IsFeatureDisabledByUser(FeatureState feature_state) { ...@@ -117,13 +117,17 @@ bool IsFeatureDisabledByUser(FeatureState feature_state) {
FeatureStatusProviderImpl::FeatureStatusProviderImpl( FeatureStatusProviderImpl::FeatureStatusProviderImpl(
device_sync::DeviceSyncClient* device_sync_client, device_sync::DeviceSyncClient* device_sync_client,
multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client, multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
ConnectionManager* connection_manager) ConnectionManager* connection_manager,
session_manager::SessionManager* session_manager)
: device_sync_client_(device_sync_client), : device_sync_client_(device_sync_client),
multidevice_setup_client_(multidevice_setup_client), multidevice_setup_client_(multidevice_setup_client),
connection_manager_(connection_manager) { connection_manager_(connection_manager),
session_manager_(session_manager) {
DCHECK(session_manager_);
device_sync_client_->AddObserver(this); device_sync_client_->AddObserver(this);
multidevice_setup_client_->AddObserver(this); multidevice_setup_client_->AddObserver(this);
connection_manager_->AddObserver(this); connection_manager_->AddObserver(this);
session_manager_->AddObserver(this);
device::BluetoothAdapterFactory::Get()->GetAdapter( device::BluetoothAdapterFactory::Get()->GetAdapter(
base::BindOnce(&FeatureStatusProviderImpl::OnBluetoothAdapterReceived, base::BindOnce(&FeatureStatusProviderImpl::OnBluetoothAdapterReceived,
...@@ -138,6 +142,7 @@ FeatureStatusProviderImpl::~FeatureStatusProviderImpl() { ...@@ -138,6 +142,7 @@ FeatureStatusProviderImpl::~FeatureStatusProviderImpl() {
connection_manager_->RemoveObserver(this); connection_manager_->RemoveObserver(this);
if (bluetooth_adapter_) if (bluetooth_adapter_)
bluetooth_adapter_->RemoveObserver(this); bluetooth_adapter_->RemoveObserver(this);
session_manager_->RemoveObserver(this);
} }
FeatureStatus FeatureStatusProviderImpl::GetStatus() const { FeatureStatus FeatureStatusProviderImpl::GetStatus() const {
...@@ -204,6 +209,10 @@ void FeatureStatusProviderImpl::OnConnectionStatusChanged() { ...@@ -204,6 +209,10 @@ void FeatureStatusProviderImpl::OnConnectionStatusChanged() {
UpdateStatus(); UpdateStatus();
} }
void FeatureStatusProviderImpl::OnSessionStateChanged() {
UpdateStatus();
}
void FeatureStatusProviderImpl::UpdateStatus() { void FeatureStatusProviderImpl::UpdateStatus() {
DCHECK(status_.has_value()); DCHECK(status_.has_value());
...@@ -237,6 +246,9 @@ FeatureStatus FeatureStatusProviderImpl::ComputeStatus() { ...@@ -237,6 +246,9 @@ FeatureStatus FeatureStatusProviderImpl::ComputeStatus() {
return FeatureStatus::kNotEligibleForFeature; return FeatureStatus::kNotEligibleForFeature;
} }
if (session_manager_->IsScreenLocked())
return FeatureStatus::kUnavailableScreenLocked;
HostStatus host_status = multidevice_setup_client_->GetHostStatus().first; HostStatus host_status = multidevice_setup_client_->GetHostStatus().first;
if (host_status == HostStatus::kEligibleHostExistsButNoHostSet) if (host_status == HostStatus::kEligibleHostExistsButNoHostSet)
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "chromeos/components/phonehub/feature_status_provider.h" #include "chromeos/components/phonehub/feature_status_provider.h"
#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" #include "chromeos/services/device_sync/public/cpp/device_sync_client.h"
#include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h" #include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
#include "components/session_manager/core/session_manager.h"
#include "components/session_manager/core/session_manager_observer.h"
#include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter.h"
namespace chromeos { namespace chromeos {
...@@ -24,12 +26,14 @@ class FeatureStatusProviderImpl ...@@ -24,12 +26,14 @@ class FeatureStatusProviderImpl
public device_sync::DeviceSyncClient::Observer, public device_sync::DeviceSyncClient::Observer,
public multidevice_setup::MultiDeviceSetupClient::Observer, public multidevice_setup::MultiDeviceSetupClient::Observer,
public device::BluetoothAdapter::Observer, public device::BluetoothAdapter::Observer,
public ConnectionManager::Observer { public ConnectionManager::Observer,
public session_manager::SessionManagerObserver {
public: public:
FeatureStatusProviderImpl( FeatureStatusProviderImpl(
device_sync::DeviceSyncClient* device_sync_client, device_sync::DeviceSyncClient* device_sync_client,
multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client, multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
ConnectionManager* connection_manager); ConnectionManager* connection_manager,
session_manager::SessionManager* session_manager);
~FeatureStatusProviderImpl() override; ~FeatureStatusProviderImpl() override;
private: private:
...@@ -65,11 +69,15 @@ class FeatureStatusProviderImpl ...@@ -65,11 +69,15 @@ class FeatureStatusProviderImpl
// ConnectionManager::Observer: // ConnectionManager::Observer:
void OnConnectionStatusChanged() override; void OnConnectionStatusChanged() override;
// SessionManagerObserver:
void OnSessionStateChanged() override;
void RecordFeatureStatusOnLogin(); void RecordFeatureStatusOnLogin();
device_sync::DeviceSyncClient* device_sync_client_; device_sync::DeviceSyncClient* device_sync_client_;
multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_; multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_;
ConnectionManager* connection_manager_; ConnectionManager* connection_manager_;
session_manager::SessionManager* session_manager_;
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_; scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_;
base::Optional<FeatureStatus> status_; base::Optional<FeatureStatus> status_;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "chromeos/components/phonehub/fake_connection_manager.h" #include "chromeos/components/phonehub/fake_connection_manager.h"
#include "chromeos/services/device_sync/public/cpp/fake_device_sync_client.h" #include "chromeos/services/device_sync/public/cpp/fake_device_sync_client.h"
#include "chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.h" #include "chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.h"
#include "components/session_manager/core/session_manager.h"
#include "device/bluetooth/bluetooth_adapter_factory.h" #include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "device/bluetooth/test/mock_bluetooth_adapter.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
...@@ -102,9 +103,10 @@ class FeatureStatusProviderImplTest : public testing::Test { ...@@ -102,9 +103,10 @@ class FeatureStatusProviderImplTest : public testing::Test {
device::BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter_); device::BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter_);
fake_device_sync_client_.NotifyReady(); fake_device_sync_client_.NotifyReady();
session_manager_ = std::make_unique<session_manager::SessionManager>();
provider_ = std::make_unique<FeatureStatusProviderImpl>( provider_ = std::make_unique<FeatureStatusProviderImpl>(
&fake_device_sync_client_, &fake_multidevice_setup_client_, &fake_device_sync_client_, &fake_multidevice_setup_client_,
&fake_connection_manager_); &fake_connection_manager_, session_manager_.get());
provider_->AddObserver(&fake_observer_); provider_->AddObserver(&fake_observer_);
} }
...@@ -170,6 +172,10 @@ class FeatureStatusProviderImplTest : public testing::Test { ...@@ -170,6 +172,10 @@ class FeatureStatusProviderImplTest : public testing::Test {
size_t GetNumObserverCalls() const { return fake_observer_.num_calls(); } size_t GetNumObserverCalls() const { return fake_observer_.num_calls(); }
session_manager::SessionManager* session_manager() {
return session_manager_.get();
}
private: private:
bool is_adapter_present() { return is_adapter_present_; } bool is_adapter_present() { return is_adapter_present_; }
bool is_adapter_powered() { return is_adapter_powered_; } bool is_adapter_powered() { return is_adapter_powered_; }
...@@ -186,6 +192,7 @@ class FeatureStatusProviderImplTest : public testing::Test { ...@@ -186,6 +192,7 @@ class FeatureStatusProviderImplTest : public testing::Test {
bool is_adapter_powered_ = true; bool is_adapter_powered_ = true;
FakeObserver fake_observer_; FakeObserver fake_observer_;
std::unique_ptr<session_manager::SessionManager> session_manager_;
std::unique_ptr<FeatureStatusProvider> provider_; std::unique_ptr<FeatureStatusProvider> provider_;
}; };
...@@ -370,6 +377,16 @@ TEST_F(FeatureStatusProviderImplTest, TransitionBetweenAllStatuses) { ...@@ -370,6 +377,16 @@ TEST_F(FeatureStatusProviderImplTest, TransitionBetweenAllStatuses) {
SetConnectionStatus(ConnectionManager::Status::kDisconnected); SetConnectionStatus(ConnectionManager::Status::kDisconnected);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus()); EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(8u, GetNumObserverCalls()); EXPECT_EQ(8u, GetNumObserverCalls());
// Simulate lock screen displayed.
session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
EXPECT_EQ(FeatureStatus::kUnavailableScreenLocked, GetStatus());
EXPECT_EQ(9u, GetNumObserverCalls());
// Simulate user unlocks the device.
session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(10u, GetNumObserverCalls());
} }
TEST_F(FeatureStatusProviderImplTest, AttemptingConnection) { TEST_F(FeatureStatusProviderImplTest, AttemptingConnection) {
...@@ -413,5 +430,22 @@ TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionFailed) { ...@@ -413,5 +430,22 @@ TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionFailed) {
EXPECT_EQ(3u, GetNumObserverCalls()); EXPECT_EQ(3u, GetNumObserverCalls());
} }
TEST_F(FeatureStatusProviderImplTest, LockScreenStatusUpdate) {
SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls());
// Simulate lock screen displayed.
session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
EXPECT_EQ(FeatureStatus::kUnavailableScreenLocked, GetStatus());
EXPECT_EQ(2u, GetNumObserverCalls());
// Simulate user unlocks the device.
session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(3u, GetNumObserverCalls());
}
} // namespace phonehub } // namespace phonehub
} // namespace chromeos } // namespace chromeos
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "chromeos/components/phonehub/phone_model.h" #include "chromeos/components/phonehub/phone_model.h"
#include "chromeos/components/phonehub/phone_status_processor.h" #include "chromeos/components/phonehub/phone_status_processor.h"
#include "chromeos/components/phonehub/tether_controller_impl.h" #include "chromeos/components/phonehub/tether_controller_impl.h"
#include "components/session_manager/core/session_manager.h"
namespace chromeos { namespace chromeos {
namespace phonehub { namespace phonehub {
...@@ -41,7 +42,8 @@ PhoneHubManagerImpl::PhoneHubManagerImpl( ...@@ -41,7 +42,8 @@ PhoneHubManagerImpl::PhoneHubManagerImpl(
feature_status_provider_(std::make_unique<FeatureStatusProviderImpl>( feature_status_provider_(std::make_unique<FeatureStatusProviderImpl>(
device_sync_client, device_sync_client,
multidevice_setup_client, multidevice_setup_client,
connection_manager_.get())), connection_manager_.get(),
session_manager::SessionManager::Get())),
message_receiver_( message_receiver_(
std::make_unique<MessageReceiverImpl>(connection_manager_.get())), std::make_unique<MessageReceiverImpl>(connection_manager_.get())),
message_sender_( message_sender_(
......
...@@ -57839,6 +57839,7 @@ Called by update_net_trust_anchors.py.--> ...@@ -57839,6 +57839,7 @@ Called by update_net_trust_anchors.py.-->
<int value="5" label="Unavalable Bluetooth disconnected"/> <int value="5" label="Unavalable Bluetooth disconnected"/>
<int value="6" label="Enabled and connecting"/> <int value="6" label="Enabled and connecting"/>
<int value="7" label="Enabled and connected"/> <int value="7" label="Enabled and connected"/>
<int value="8" label="Unavailable screen locked"/>
</enum> </enum>
<enum name="PhoneHubInterstitialScreenEvent"> <enum name="PhoneHubInterstitialScreenEvent">
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