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

Phonehub: Add additional eligibility checks to host phone

Previously only checked if the host phone is a PhoneHub host but
did not verify whether if it was a BetterTogether host and has a
valid Bluetooth address. This CL adds those checks.

Bug: 1106937
Fixed: 1147290
Test: chromeos_components_unittest
Change-Id: I8c2e7a596655a3a9904268873c8514f1332ae234
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2538694
Commit-Queue: Jimmy Gong <jimmyxgong@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827927}
parent 35e32dc1
...@@ -29,9 +29,21 @@ using multidevice_setup::mojom::Feature; ...@@ -29,9 +29,21 @@ using multidevice_setup::mojom::Feature;
using multidevice_setup::mojom::FeatureState; using multidevice_setup::mojom::FeatureState;
using multidevice_setup::mojom::HostStatus; using multidevice_setup::mojom::HostStatus;
bool DoesDeviceSupportPhoneHubHost(const RemoteDeviceRef& device) { bool IsEligiblePhoneHubHost(const RemoteDeviceRef& device) {
return device.GetSoftwareFeatureState(SoftwareFeature::kPhoneHubHost) != // Device must be capable of being a multi-device host.
SoftwareFeatureState::kNotSupported; if (device.GetSoftwareFeatureState(SoftwareFeature::kBetterTogetherHost) ==
SoftwareFeatureState::kNotSupported) {
return false;
}
if (device.GetSoftwareFeatureState(SoftwareFeature::kPhoneHubHost) ==
SoftwareFeatureState::kNotSupported) {
return false;
}
// Device must have a synced Bluetooth public address, which is used to
// bootstrap Phone Hub connections.
return !device.bluetooth_public_address().empty();
} }
bool IsEligibleForFeature( bool IsEligibleForFeature(
...@@ -71,27 +83,12 @@ bool IsEligibleForFeature( ...@@ -71,27 +83,12 @@ bool IsEligibleForFeature(
// If there is a host device available, check if the device is eligible for // If there is a host device available, check if the device is eligible for
// Phonehub. // Phonehub.
if (host_status.second.has_value()) if (host_status.second.has_value())
return DoesDeviceSupportPhoneHubHost(*(host_status.second)); return IsEligiblePhoneHubHost(*(host_status.second));
// Otherwise, check if there is any available remote device that is // Otherwise, check if there is any available remote device that is
// eligible for Phonehub. // eligible for Phonehub.
for (const RemoteDeviceRef& device : remote_devices) { for (const RemoteDeviceRef& device : remote_devices) {
// Device must be capable of being a multi-device host. if (IsEligiblePhoneHubHost(device))
if (device.GetSoftwareFeatureState(SoftwareFeature::kBetterTogetherHost) ==
SoftwareFeatureState::kNotSupported) {
continue;
}
// Device must be capable of being a Phone Hub host.
if (!DoesDeviceSupportPhoneHubHost(device)) {
continue;
}
// Device must have a synced Bluetooth public address, which is used to
// bootstrap Phone Hub connections.
if (device.bluetooth_public_address().empty())
continue;
return true; return true;
} }
......
...@@ -143,11 +143,13 @@ class FeatureStatusProviderImplTest : public testing::Test { ...@@ -143,11 +143,13 @@ class FeatureStatusProviderImplTest : public testing::Test {
void SetMultiDeviceState(HostStatus host_status, void SetMultiDeviceState(HostStatus host_status,
FeatureState feature_state, FeatureState feature_state,
bool supports_phone_hub) { bool supports_better_together_host,
bool supports_phone_hub,
bool has_bluetooth_address) {
fake_multidevice_setup_client_.SetHostStatusWithDevice(std::make_pair( fake_multidevice_setup_client_.SetHostStatusWithDevice(std::make_pair(
host_status, CreatePhoneDevice(/*supports_better_together_host=*/true, host_status,
supports_phone_hub, CreatePhoneDevice(supports_better_together_host, supports_phone_hub,
/*has_bluetooth_address=*/true))); has_bluetooth_address)));
fake_multidevice_setup_client_.SetFeatureState(Feature::kPhoneHub, fake_multidevice_setup_client_.SetFeatureState(Feature::kPhoneHub,
feature_state); feature_state);
} }
...@@ -327,14 +329,18 @@ TEST_F(FeatureStatusProviderImplTest, EligiblePhoneButNotSetUp) { ...@@ -327,14 +329,18 @@ TEST_F(FeatureStatusProviderImplTest, EligiblePhoneButNotSetUp) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet, SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kEligiblePhoneButNotSetUp, GetStatus()); EXPECT_EQ(FeatureStatus::kEligiblePhoneButNotSetUp, GetStatus());
} }
TEST_F(FeatureStatusProviderImplTest, NoEligiblePhones) { TEST_F(FeatureStatusProviderImplTest, NoEligiblePhones) {
SetMultiDeviceState(HostStatus::kNoEligibleHosts, SetMultiDeviceState(HostStatus::kNoEligibleHosts,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus()); EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus());
} }
...@@ -351,7 +357,23 @@ TEST_F(FeatureStatusProviderImplTest, MultiPhoneEligibility) { ...@@ -351,7 +357,23 @@ TEST_F(FeatureStatusProviderImplTest, MultiPhoneEligibility) {
/*has_bluetooth_address=*/true)}); /*has_bluetooth_address=*/true)});
SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet, SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/false); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/false,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus());
SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet,
FeatureState::kUnavailableNoVerifiedHost,
/*supports_better_together_host=*/false,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus());
SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet,
FeatureState::kUnavailableNoVerifiedHost,
/*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/false);
EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus()); EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus());
// Simulate no host device connected and expect to detect one eligible host. // Simulate no host device connected and expect to detect one eligible host.
...@@ -366,17 +388,23 @@ TEST_F(FeatureStatusProviderImplTest, PhoneSelectedAndPendingSetup) { ...@@ -366,17 +388,23 @@ TEST_F(FeatureStatusProviderImplTest, PhoneSelectedAndPendingSetup) {
SetMultiDeviceState( SetMultiDeviceState(
HostStatus::kHostSetLocallyButWaitingForBackendConfirmation, HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus()); EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus());
SetMultiDeviceState(HostStatus::kHostSetButNotYetVerified, SetMultiDeviceState(HostStatus::kHostSetButNotYetVerified,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus()); EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus());
SetMultiDeviceState(HostStatus::kHostVerified, SetMultiDeviceState(HostStatus::kHostVerified,
FeatureState::kNotSupportedByPhone, FeatureState::kNotSupportedByPhone,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus()); EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus());
} }
...@@ -384,24 +412,32 @@ TEST_F(FeatureStatusProviderImplTest, Disabled) { ...@@ -384,24 +412,32 @@ TEST_F(FeatureStatusProviderImplTest, Disabled) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kDisabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kDisabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kDisabled, GetStatus()); EXPECT_EQ(FeatureStatus::kDisabled, GetStatus());
SetMultiDeviceState(HostStatus::kHostVerified, SetMultiDeviceState(HostStatus::kHostVerified,
FeatureState::kUnavailableSuiteDisabled, FeatureState::kUnavailableSuiteDisabled,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kDisabled, GetStatus()); EXPECT_EQ(FeatureStatus::kDisabled, GetStatus());
SetMultiDeviceState(HostStatus::kHostVerified, SetMultiDeviceState(HostStatus::kHostVerified,
FeatureState::kUnavailableTopLevelFeatureDisabled, FeatureState::kUnavailableTopLevelFeatureDisabled,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kDisabled, GetStatus()); EXPECT_EQ(FeatureStatus::kDisabled, GetStatus());
} }
TEST_F(FeatureStatusProviderImplTest, UnavailableBluetoothOff) { TEST_F(FeatureStatusProviderImplTest, UnavailableBluetoothOff) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
SetAdapterPoweredState(false); SetAdapterPoweredState(false);
SetAdapterPresentState(false); SetAdapterPresentState(false);
...@@ -421,30 +457,40 @@ TEST_F(FeatureStatusProviderImplTest, TransitionBetweenAllStatuses) { ...@@ -421,30 +457,40 @@ TEST_F(FeatureStatusProviderImplTest, TransitionBetweenAllStatuses) {
SetMultiDeviceState(HostStatus::kNoEligibleHosts, SetMultiDeviceState(HostStatus::kNoEligibleHosts,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus()); EXPECT_EQ(FeatureStatus::kNotEligibleForFeature, GetStatus());
SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet, SetMultiDeviceState(HostStatus::kEligibleHostExistsButNoHostSet,
FeatureState::kUnavailableNoVerifiedHost, FeatureState::kUnavailableNoVerifiedHost,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
EXPECT_EQ(FeatureStatus::kEligiblePhoneButNotSetUp, GetStatus()); EXPECT_EQ(FeatureStatus::kEligiblePhoneButNotSetUp, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls()); EXPECT_EQ(1u, GetNumObserverCalls());
SetMultiDeviceState(HostStatus::kHostSetButNotYetVerified, SetMultiDeviceState(HostStatus::kHostSetButNotYetVerified,
FeatureState::kNotSupportedByPhone, FeatureState::kNotSupportedByPhone,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus()); EXPECT_EQ(FeatureStatus::kPhoneSelectedAndPendingSetup, GetStatus());
EXPECT_EQ(2u, GetNumObserverCalls()); EXPECT_EQ(2u, GetNumObserverCalls());
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kDisabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kDisabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kDisabled, GetStatus()); EXPECT_EQ(FeatureStatus::kDisabled, GetStatus());
EXPECT_EQ(3u, GetNumObserverCalls()); EXPECT_EQ(3u, GetNumObserverCalls());
SetAdapterPoweredState(false); SetAdapterPoweredState(false);
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kUnavailableBluetoothOff, GetStatus()); EXPECT_EQ(FeatureStatus::kUnavailableBluetoothOff, GetStatus());
EXPECT_EQ(4u, GetNumObserverCalls()); EXPECT_EQ(4u, GetNumObserverCalls());
...@@ -478,7 +524,9 @@ TEST_F(FeatureStatusProviderImplTest, TransitionBetweenAllStatuses) { ...@@ -478,7 +524,9 @@ TEST_F(FeatureStatusProviderImplTest, TransitionBetweenAllStatuses) {
TEST_F(FeatureStatusProviderImplTest, AttemptingConnection) { TEST_F(FeatureStatusProviderImplTest, AttemptingConnection) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus()); EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls()); EXPECT_EQ(1u, GetNumObserverCalls());
...@@ -490,7 +538,9 @@ TEST_F(FeatureStatusProviderImplTest, AttemptingConnection) { ...@@ -490,7 +538,9 @@ TEST_F(FeatureStatusProviderImplTest, AttemptingConnection) {
TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionSuccessful) { TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionSuccessful) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus()); EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls()); EXPECT_EQ(1u, GetNumObserverCalls());
...@@ -506,7 +556,9 @@ TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionSuccessful) { ...@@ -506,7 +556,9 @@ TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionSuccessful) {
TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionFailed) { TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionFailed) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus()); EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls()); EXPECT_EQ(1u, GetNumObserverCalls());
...@@ -522,7 +574,9 @@ TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionFailed) { ...@@ -522,7 +574,9 @@ TEST_F(FeatureStatusProviderImplTest, AttemptedConnectionFailed) {
TEST_F(FeatureStatusProviderImplTest, LockScreenStatusUpdate) { TEST_F(FeatureStatusProviderImplTest, LockScreenStatusUpdate) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus()); EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls()); EXPECT_EQ(1u, GetNumObserverCalls());
...@@ -540,7 +594,9 @@ TEST_F(FeatureStatusProviderImplTest, LockScreenStatusUpdate) { ...@@ -540,7 +594,9 @@ TEST_F(FeatureStatusProviderImplTest, LockScreenStatusUpdate) {
TEST_F(FeatureStatusProviderImplTest, HandlePowerSuspend) { TEST_F(FeatureStatusProviderImplTest, HandlePowerSuspend) {
SetEligibleSyncedDevices(); SetEligibleSyncedDevices();
SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser, SetMultiDeviceState(HostStatus::kHostVerified, FeatureState::kEnabledByUser,
/*supports_phone_hub=*/true); /*supports_better_together_host=*/true,
/*supports_phone_hub=*/true,
/*has_bluetooth_address=*/true);
EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus()); EXPECT_EQ(FeatureStatus::kEnabledButDisconnected, GetStatus());
EXPECT_EQ(1u, GetNumObserverCalls()); EXPECT_EQ(1u, GetNumObserverCalls());
......
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