From a0484fef8075f25534b5867f81212e12bff74a85 Mon Sep 17 00:00:00 2001 From: Anay Wadhera Date: Tue, 16 Jul 2024 12:13:41 -0700 Subject: [PATCH] Add SetVisibility to NearbySharingService PiperOrigin-RevId: 652933591 --- sharing/nearby_sharing_service.h | 7 ++++ sharing/nearby_sharing_service_impl.cc | 30 ++++++++++++++ sharing/nearby_sharing_service_impl.h | 3 ++ sharing/nearby_sharing_service_impl_test.cc | 46 +++++++++++++++++++++ 4 files changed, 86 insertions(+) diff --git a/sharing/nearby_sharing_service.h b/sharing/nearby_sharing_service.h index ef9d9089..699245f0 100644 --- a/sharing/nearby_sharing_service.h +++ b/sharing/nearby_sharing_service.h @@ -20,6 +20,7 @@ #include #include +#include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" #include "internal/network/url.h" #include "sharing/advertisement.h" @@ -261,6 +262,12 @@ class NearbySharingService { virtual void JoinWifiNetwork(absl::string_view ssid, absl::string_view password) = 0; + // Checks to make sure visibility setting is valid and updates the service's + // visibility if so. + virtual void SetVisibility( + proto::DeviceVisibility visibility, absl::Duration expiration, + absl::AnyInvocable callback) = 0; + virtual std::string Dump() const = 0; virtual void UpdateFilePathsInProgress(bool update_file_paths) = 0; diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index 653d71e7..4337038e 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -1033,6 +1033,36 @@ void NearbySharingServiceImpl::JoinWifiNetwork(absl::string_view ssid, }); } +void NearbySharingServiceImpl::SetVisibility( + proto::DeviceVisibility visibility, absl::Duration expiration, + absl::AnyInvocable callback) { + RunOnNearbySharingServiceThread( + "api_set_visibility", + [this, visibility, expiration, callback = std::move(callback)]() mutable { + NL_LOG(INFO) << __func__ << ": SetVisibility is called"; + if (settings_->GetVisibility() == visibility) { + std::move(callback)(StatusCodes::kOk); + return; + } + if (account_manager_.GetCurrentAccount() == std::nullopt) { + switch (visibility) { + case proto::DeviceVisibility::DEVICE_VISIBILITY_EVERYONE: + case proto::DeviceVisibility::DEVICE_VISIBILITY_HIDDEN: + break; + default: + NL_LOG(WARNING) + << __func__ + << ": SetVisibility failed for visibility: " << visibility + << ". No account."; + std::move(callback)(StatusCodes::kInvalidArgument); + return; + } + } + settings_->SetVisibility(visibility, expiration); + std::move(callback)(StatusCodes::kOk); + }); +} + NearbyShareSettings* NearbySharingServiceImpl::GetSettings() { return settings_.get(); } diff --git a/sharing/nearby_sharing_service_impl.h b/sharing/nearby_sharing_service_impl.h index fedd09fb..47f705b9 100644 --- a/sharing/nearby_sharing_service_impl.h +++ b/sharing/nearby_sharing_service_impl.h @@ -178,6 +178,9 @@ class NearbySharingServiceImpl void CopyText(absl::string_view text) override; void JoinWifiNetwork(absl::string_view ssid, absl::string_view password) override; + void SetVisibility( + proto::DeviceVisibility visibility, absl::Duration expiration, + absl::AnyInvocable callback) override; NearbyShareSettings* GetSettings() override; nearby::sharing::api::SharingRpcNotifier* GetRpcNotifier() override; NearbyShareLocalDeviceDataManager* GetLocalDeviceDataManager() override; diff --git a/sharing/nearby_sharing_service_impl_test.cc b/sharing/nearby_sharing_service_impl_test.cc index 48068ff9..eab9e1f7 100644 --- a/sharing/nearby_sharing_service_impl_test.cc +++ b/sharing/nearby_sharing_service_impl_test.cc @@ -2228,6 +2228,52 @@ TEST_F(NearbySharingServiceImplTest, EXPECT_FALSE(fake_nearby_connections_manager_->is_shutdown()); } +TEST_F(NearbySharingServiceImplTest, ValidateLoginStateWhenSettingVisibility) { + absl::Notification set_visibility_notification; + NearbySharingService::StatusCodes set_visibility_status; + SetConnectionType(ConnectionType::kWifi); + FlushTesting(); + service_->SetVisibility( + DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS, absl::ZeroDuration(), + [&set_visibility_notification, + &set_visibility_status](NearbySharingService::StatusCodes status) { + set_visibility_status = status; + set_visibility_notification.Notify(); + }); + // We should not have been able to set all contacts visibility because we are + // not logged in. + ASSERT_TRUE( + set_visibility_notification.WaitForNotificationWithTimeout(kWaitTimeout)); + EXPECT_EQ(set_visibility_status, + NearbySharingService::StatusCodes::kInvalidArgument); + // Create account. + AccountManager::Account account; + account.id = kTestAccountId; + // Log in. + absl::Notification login_notification; + account_manager().SetAccount(account); + service_->GetAccountManager()->Login( + [&](AccountManager::Account account) { + EXPECT_EQ(account.id, kTestAccountId); + login_notification.Notify(); + }, + [](absl::Status status) {}); + ASSERT_TRUE(login_notification.WaitForNotificationWithTimeout(kWaitTimeout)); + // We are now logged in, so we should be able to set all contacts visibility. + absl::Notification set_visibility_notification2; + NearbySharingService::StatusCodes set_visibility_status2; + service_->SetVisibility( + DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS, absl::ZeroDuration(), + [&set_visibility_notification2, + &set_visibility_status2](NearbySharingService::StatusCodes status) { + set_visibility_status2 = status; + set_visibility_notification2.Notify(); + }); + ASSERT_TRUE(set_visibility_notification2.WaitForNotificationWithTimeout( + kWaitTimeout)); + EXPECT_EQ(set_visibility_status2, NearbySharingService::StatusCodes::kOk); +} + TEST_F(NearbySharingServiceImplTest, BackgroundReceiveSurfaceVisibilityToAllContactsStartsAdvertising) { SetConnectionType(ConnectionType::kWifi);