From 8054c423a4e85262b1d885173047d85e644303d8 Mon Sep 17 00:00:00 2001 From: Curt Clemens Date: Mon, 19 Dec 2022 21:58:48 +0000 Subject: [PATCH] [QuickStart] Add QuickStartConnectivityService and related plumbing Add a new KeyedService for Quick Start which is used to fetch a NearbyConnectionsManager. Quick Start will use this to advertise and create a NearbyConnection to communicate with the phone. The service is added to //chrome/browser/ash/nearby in order to avoid a dependency cycle that would result if :oobe_quick_start depended on NearbyConnectionsManagerImpl directly. In the future, after we finish refactoring //chrome/browser/nearby_sharing to extract out the Nearby-Share-agnostic code into a reusable component, we should then be able to move the service into the oobe_quick_start directory and get rid of the dependency injection. The next CL in this relation chain will perform Nearby Connections advertising, and the unit tests for that functionality will provide additional coverage for this code. TEST=Manually test for regressions in Quick Start and Nearby Share. Bug: b/234655072 Change-Id: I304fa4bb479d6ed07b641d010139c9372ffe728f Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4006775 Reviewed-by: Ryan Hansberry Reviewed-by: Renato Silva Reviewed-by: Michael Hansen Commit-Queue: Michael Hansen Cr-Commit-Position: refs/heads/main@{#1085134} --- chrome/browser/ash/BUILD.gn | 5 ++ .../ash/login/oobe_quick_start/BUILD.gn | 1 + .../oobe_quick_start/connectivity/BUILD.gn | 2 + ...target_device_connection_broker_factory.cc | 16 ++--- .../target_device_connection_broker_factory.h | 8 ++- .../target_device_connection_broker_impl.cc | 7 ++- .../target_device_connection_broker_impl.h | 8 ++- ..._device_connection_broker_impl_unittest.cc | 5 +- .../target_device_bootstrap_controller.cc | 9 ++- .../target_device_bootstrap_controller.h | 5 +- ...et_device_bootstrap_controller_unittest.cc | 5 +- .../ash/login/ui/login_display_host_common.cc | 12 +++- .../nearby/nearby_dependencies_provider.cc | 1 - .../nearby_dependencies_provider_factory.cc | 13 +++++ .../nearby_dependencies_provider_factory.h | 2 + .../nearby/nearby_process_manager_factory.cc | 20 +++++-- .../quick_start_connectivity_service.cc | 39 +++++++++++++ .../nearby/quick_start_connectivity_service.h | 40 +++++++++++++ ...uick_start_connectivity_service_factory.cc | 58 +++++++++++++++++++ ...quick_start_connectivity_service_factory.h | 43 ++++++++++++++ .../fake_nearby_connections_manager.cc | 5 ++ .../fake_nearby_connections_manager.h | 3 + .../nearby_connections_manager_impl.cc | 5 ++ .../nearby_connections_manager_impl.h | 3 + .../nearby_sharing_service_impl.cc | 9 ++- .../public/cpp/nearby_connections_manager.h | 2 + .../nearby/public/cpp/nearby_client_uuids.cc | 4 +- 27 files changed, 301 insertions(+), 29 deletions(-) create mode 100644 chrome/browser/ash/nearby/quick_start_connectivity_service.cc create mode 100644 chrome/browser/ash/nearby/quick_start_connectivity_service.h create mode 100644 chrome/browser/ash/nearby/quick_start_connectivity_service_factory.cc create mode 100644 chrome/browser/ash/nearby/quick_start_connectivity_service_factory.h diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index b0ea8455e7d97..12072a15168e3 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn @@ -1985,6 +1985,10 @@ source_set("ash") { "nearby/nearby_process_manager_factory.h", "nearby/nearby_process_manager_impl.cc", "nearby/nearby_process_manager_impl.h", + "nearby/quick_start_connectivity_service.cc", + "nearby/quick_start_connectivity_service.h", + "nearby/quick_start_connectivity_service_factory.cc", + "nearby/quick_start_connectivity_service_factory.h", "net/bluetooth_pref_state_observer.cc", "net/bluetooth_pref_state_observer.h", "net/client_cert_filter.cc", @@ -3696,6 +3700,7 @@ source_set("ash") { "//chrome/browser/metrics/structured", "//chrome/browser/nearby_sharing/common", "//chrome/browser/nearby_sharing/logging", + "//chrome/browser/nearby_sharing/public/cpp", "//chrome/browser/policy:onc", "//chrome/browser/profiles", "//chrome/browser/resources:component_extension_resources", diff --git a/chrome/browser/ash/login/oobe_quick_start/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/BUILD.gn index 946e41cc5c8b8..c6b42bd351eba 100644 --- a/chrome/browser/ash/login/oobe_quick_start/BUILD.gn +++ b/chrome/browser/ash/login/oobe_quick_start/BUILD.gn @@ -43,6 +43,7 @@ source_set("unit_tests") { "logging:unit_tests", "//base", "//base/test:test_support", + "//chrome/test:test_support", "//chromeos/ash/components/attestation:test_support", "//chromeos/ash/components/dbus/constants:constants", "//components/account_id:account_id", diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn index 2805ab4e1149d..bfca2fd0f87c5 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn @@ -11,6 +11,8 @@ source_set("connectivity") { ":decoder", "//base", "//chrome/browser/nearby_sharing/public/cpp", + "//chrome/browser/nearby_sharing/public/cpp", + "//chromeos/ash/services/nearby/public/cpp", "//components/cbor", "//crypto", "//device/bluetooth", diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.cc index 1aa4c4510405e..7f6c636fd4f96 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/random_session_id.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.h" @@ -11,18 +12,17 @@ namespace ash::quick_start { // static std::unique_ptr -TargetDeviceConnectionBrokerFactory::Create() { - return Create(RandomSessionId()); -} +TargetDeviceConnectionBrokerFactory::Create( + base::WeakPtr nearby_connections_manager, + absl::optional session_id) { + RandomSessionId id = session_id ? *session_id : RandomSessionId(); -// static -std::unique_ptr -TargetDeviceConnectionBrokerFactory::Create(RandomSessionId session_id) { if (test_factory_) { - return test_factory_->CreateInstance(session_id); + return test_factory_->CreateInstance(id); } - return std::make_unique(session_id); + return std::make_unique( + id, nearby_connections_manager); } // static diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h index 5c85ac72613c7..937823fd4ee93 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h @@ -8,6 +8,9 @@ #include #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +class NearbyConnectionsManager; namespace ash::quick_start { @@ -17,11 +20,10 @@ class RandomSessionId; // Calling code should use the static Create() method. class TargetDeviceConnectionBrokerFactory { public: - static std::unique_ptr Create(); - // A RandomSessionId may be provided in order to resume a connection. static std::unique_ptr Create( - RandomSessionId session_id); + base::WeakPtr nearby_connections_manager, + absl::optional session_id); static void SetFactoryForTesting( TargetDeviceConnectionBrokerFactory* test_factory); diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc index 29ac2bcd50e1f..0cf0e22b80ab0 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc @@ -100,8 +100,10 @@ TargetDeviceConnectionBrokerImpl::BluetoothAdapterFactoryWrapper* bluetooth_adapter_factory_wrapper_for_testing_ = nullptr; TargetDeviceConnectionBrokerImpl::TargetDeviceConnectionBrokerImpl( - RandomSessionId session_id) - : random_session_id_(session_id) { + RandomSessionId session_id, + base::WeakPtr nearby_connections_manager) + : random_session_id_(session_id), + nearby_connections_manager_(nearby_connections_manager) { GetBluetoothAdapter(); } @@ -181,6 +183,7 @@ void TargetDeviceConnectionBrokerImpl::StartAdvertising( base::SplitOnceCallback(std::move(on_start_advertising_callback)); fast_pair_advertiser_->StartAdvertising( + // TODO(b/234655072): on success, start Nearby Connections advertising. base::BindOnce(std::move(success_callback), /*success=*/true), base::BindOnce( &TargetDeviceConnectionBrokerImpl::OnStartFastPairAdvertisingError, diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.h index a984d3e5c21ef..9d9364fcc6b04 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.h +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.h @@ -8,6 +8,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/random_session_id.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" +#include "chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h" #include "device/bluetooth/bluetooth_adapter_factory.h" namespace ash::quick_start { @@ -40,7 +41,8 @@ class TargetDeviceConnectionBrokerImpl : public TargetDeviceConnectionBroker { bluetooth_adapter_factory_wrapper_for_testing_; }; - explicit TargetDeviceConnectionBrokerImpl(RandomSessionId session_id); + TargetDeviceConnectionBrokerImpl(RandomSessionId session_id, + base::WeakPtr); TargetDeviceConnectionBrokerImpl(TargetDeviceConnectionBrokerImpl&) = delete; TargetDeviceConnectionBrokerImpl& operator=( TargetDeviceConnectionBrokerImpl&) = delete; @@ -53,6 +55,8 @@ class TargetDeviceConnectionBrokerImpl : public TargetDeviceConnectionBroker { void StopAdvertising(base::OnceClosure on_stop_advertising_callback) override; private: + // Used to access the |random_session_id_| in tests, and to allow testing + // |GenerateEndpointInfo()| directly. friend class TargetDeviceConnectionBrokerImplTest; void GetBluetoothAdapter(); @@ -70,6 +74,8 @@ class TargetDeviceConnectionBrokerImpl : public TargetDeviceConnectionBroker { std::unique_ptr fast_pair_advertiser_; RandomSessionId random_session_id_; + base::WeakPtr nearby_connections_manager_; + base::WeakPtrFactory weak_ptr_factory_{ this}; }; diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc index 4adf074d5071d..91a351b40210d 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc @@ -12,6 +12,7 @@ #include "chrome/browser/ash/login/oobe_quick_start/connectivity/fast_pair_advertiser.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/random_session_id.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h" +#include "chrome/browser/nearby_sharing/fake_nearby_connections_manager.h" #include "chromeos/constants/devicetype.h" #include "device/bluetooth/bluetooth_adapter_factory.h" #include "device/bluetooth/test/mock_bluetooth_adapter.h" @@ -218,7 +219,8 @@ class TargetDeviceConnectionBrokerImplTest : public testing::Test { void CreateConnectionBroker() { RandomSessionId session_id(kRandomSessionId); connection_broker_ = - TargetDeviceConnectionBrokerFactory::Create(session_id); + ash::quick_start::TargetDeviceConnectionBrokerFactory::Create( + fake_nearby_connections_manager_.GetWeakPtr(), session_id); } void FinishFetchingBluetoothAdapter() { @@ -268,6 +270,7 @@ class TargetDeviceConnectionBrokerImplTest : public testing::Test { bool start_advertising_callback_success_ = false; bool stop_advertising_callback_called_ = false; scoped_refptr> mock_bluetooth_adapter_; + FakeNearbyConnectionsManager fake_nearby_connections_manager_; std::unique_ptr connection_broker_; std::unique_ptr fast_pair_advertiser_factory_; DeferredBluetoothAdapterFactoryWrapper bluetooth_adapter_factory_wrapper_; diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc index 3f542e7dd18a3..7aa75fa745c25 100644 --- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc +++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc @@ -12,6 +12,7 @@ #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h" #include "components/qr_code_generator/qr_code_generator.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" namespace ash::quick_start { @@ -33,9 +34,11 @@ TargetDeviceBootstrapController::QRCodePixelData GenerateQRCode( } // namespace -TargetDeviceBootstrapController::TargetDeviceBootstrapController() { - connection_broker_ = TargetDeviceConnectionBrokerFactory::Create(); -} +TargetDeviceBootstrapController::TargetDeviceBootstrapController( + base::WeakPtr nearby_connections_manager) + : connection_broker_(TargetDeviceConnectionBrokerFactory::Create( + nearby_connections_manager, + /*session_id=*/absl::nullopt)) {} TargetDeviceBootstrapController::~TargetDeviceBootstrapController() = default; diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h index 2fdd34d4cb249..7e7903a01dca7 100644 --- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h +++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h @@ -13,6 +13,8 @@ #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "third_party/abseil-cpp/absl/types/variant.h" +class NearbyConnectionsManager; + namespace ash::quick_start { class AuthenticatedConnection; @@ -21,7 +23,8 @@ class IncomingConnection; class TargetDeviceBootstrapController : public TargetDeviceConnectionBroker::ConnectionLifecycleListener { public: - TargetDeviceBootstrapController(); + explicit TargetDeviceBootstrapController( + base::WeakPtr nearby_connections_manager); TargetDeviceBootstrapController(TargetDeviceBootstrapController&) = delete; TargetDeviceBootstrapController& operator=(TargetDeviceBootstrapController&) = delete; diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc index d181fa18caf79..93fd8ca58ff89 100644 --- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc +++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc @@ -7,6 +7,7 @@ #include "base/test/bind.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/fake_target_device_connection_broker.h" +#include "chrome/browser/nearby_sharing/fake_nearby_connections_manager.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" @@ -57,7 +58,8 @@ class TargetDeviceBootstrapControllerTest : public testing::Test { TargetDeviceConnectionBrokerFactory::SetFactoryForTesting( &connection_broker_factory_); - bootstrap_controller_ = std::make_unique(); + bootstrap_controller_ = std::make_unique( + fake_nearby_connections_manager_.GetWeakPtr()); fake_observer_ = std::make_unique(); bootstrap_controller_->AddObserver(fake_observer_.get()); } @@ -69,6 +71,7 @@ class TargetDeviceBootstrapControllerTest : public testing::Test { protected: FakeTargetDeviceConnectionBroker::Factory connection_broker_factory_; + FakeNearbyConnectionsManager fake_nearby_connections_manager_; std::unique_ptr fake_observer_; std::unique_ptr bootstrap_controller_; }; diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc index 8edaf62036ea7..45917d32dd2f7 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.cc +++ b/chrome/browser/ash/login/ui/login_display_host_common.cc @@ -31,6 +31,7 @@ #include "chrome/browser/ash/login/ui/login_feedback.h" #include "chrome/browser/ash/login/ui/signin_ui.h" #include "chrome/browser/ash/login/wizard_controller.h" +#include "chrome/browser/ash/nearby/quick_start_connectivity_service_factory.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/profiles/signin_profile_handler.h" @@ -687,8 +688,17 @@ base::WeakPtr LoginDisplayHostCommon::GetQuickStartBootstrapController() { DCHECK(features::IsOobeQuickStartEnabled()); if (!bootstrap_controller_) { + Profile* profile = ProfileManager::GetActiveUserProfile(); + DCHECK(profile); + + quick_start::QuickStartConnectivityService* service = + quick_start::QuickStartConnectivityServiceFactory::GetForProfile( + profile); + DCHECK(service); + bootstrap_controller_ = - std::make_unique(); + std::make_unique( + service->GetNearbyConnectionsManager()); } return bootstrap_controller_->GetAsWeakPtrForClient(); } diff --git a/chrome/browser/ash/nearby/nearby_dependencies_provider.cc b/chrome/browser/ash/nearby/nearby_dependencies_provider.cc index 3ded5d44fd392..ebd89f4b58857 100644 --- a/chrome/browser/ash/nearby/nearby_dependencies_provider.cc +++ b/chrome/browser/ash/nearby/nearby_dependencies_provider.cc @@ -96,7 +96,6 @@ NearbyDependenciesProvider::NearbyDependenciesProvider( signin::IdentityManager* identity_manager) : profile_(profile), identity_manager_(identity_manager) { DCHECK(profile_); - DCHECK(identity_manager_); bluetooth_manager_ = std::make_unique(); } diff --git a/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.cc b/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.cc index 182d199fc2e78..4b2096a6d8da0 100644 --- a/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.cc +++ b/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ash/nearby/nearby_dependencies_provider_factory.h" +#include "ash/constants/ash_features.h" #include "chrome/browser/ash/nearby/nearby_dependencies_provider.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" @@ -47,4 +48,16 @@ bool NearbyDependenciesProviderFactory::ServiceIsCreatedWithBrowserContext() return true; } +// This needs to be overridden because the default implementation returns +// nullptr for OTR profiles, which would prevent using this with Quick Start. +content::BrowserContext* +NearbyDependenciesProviderFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + if (features::IsOobeQuickStartEnabled()) { + return context; + } else { + return BrowserContextKeyedServiceFactory::GetBrowserContextToUse(context); + } +} + } // namespace ash::nearby diff --git a/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.h b/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.h index c9ee5f4631da0..d61812be62b87 100644 --- a/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.h +++ b/chrome/browser/ash/nearby/nearby_dependencies_provider_factory.h @@ -36,6 +36,8 @@ class NearbyDependenciesProviderFactory KeyedService* BuildServiceInstanceFor( content::BrowserContext* context) const override; bool ServiceIsCreatedWithBrowserContext() const override; + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; }; } // namespace ash::nearby diff --git a/chrome/browser/ash/nearby/nearby_process_manager_factory.cc b/chrome/browser/ash/nearby/nearby_process_manager_factory.cc index 88f8215407f1c..df4c760294264 100644 --- a/chrome/browser/ash/nearby/nearby_process_manager_factory.cc +++ b/chrome/browser/ash/nearby/nearby_process_manager_factory.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ash/nearby/nearby_process_manager_factory.h" +#include "ash/constants/ash_features.h" #include "chrome/browser/ash/nearby/nearby_dependencies_provider_factory.h" #include "chrome/browser/ash/nearby/nearby_process_manager_impl.h" #include "chrome/browser/ash/profiles/profile_helper.h" @@ -28,14 +29,24 @@ NearbyProcessManager* NearbyProcessManagerFactory::GetForProfile( // static bool NearbyProcessManagerFactory::CanBeLaunchedForProfile(Profile* profile) { - // Guest/incognito profiles cannot use Phone Hub. - if (profile->IsOffTheRecord()) + // We allow NearbyProcessManager to be used with the signin profile since it + // is required for OOBE Quick Start. + if (ProfileHelper::IsSigninProfile(profile) && + features::IsOobeQuickStartEnabled()) { + return true; + } + + // Guest/incognito profiles cannot use Nearby Connections. + if (profile->IsOffTheRecord()) { return false; + } // Likewise, kiosk users are ineligible. - if (user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp()) + if (user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp()) { return false; + } + // Nearby Connections is not supported for secondary profiles. return ProfileHelper::IsPrimaryProfile(profile); } @@ -52,7 +63,8 @@ void NearbyProcessManagerFactory::SetBypassPrimaryUserCheckForTesting( } NearbyProcessManagerFactory::NearbyProcessManagerFactory() - : ProfileKeyedServiceFactory("NearbyProcessManager") { + : ProfileKeyedServiceFactory("NearbyProcessManager", + ProfileSelections::BuildForAllProfiles()) { DependsOn(NearbyDependenciesProviderFactory::GetInstance()); } diff --git a/chrome/browser/ash/nearby/quick_start_connectivity_service.cc b/chrome/browser/ash/nearby/quick_start_connectivity_service.cc new file mode 100644 index 0000000000000..ef325643e3458 --- /dev/null +++ b/chrome/browser/ash/nearby/quick_start_connectivity_service.cc @@ -0,0 +1,39 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/nearby/quick_start_connectivity_service.h" + +#include "base/memory/weak_ptr.h" +#include "chrome/browser/nearby_sharing/nearby_connections_manager_impl.h" +#include "chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h" +#include "chromeos/ash/services/nearby/public/cpp/nearby_process_manager.h" + +namespace ash::quick_start { + +namespace { + +constexpr char kServiceId[] = "QuickStart"; + +} // namespace + +QuickStartConnectivityService::QuickStartConnectivityService( + nearby::NearbyProcessManager* nearby_process_manager) + : nearby_process_manager_(nearby_process_manager) {} + +QuickStartConnectivityService::~QuickStartConnectivityService() = default; + +base::WeakPtr +QuickStartConnectivityService::GetNearbyConnectionsManager() { + DCHECK(nearby_process_manager_); + + if (!nearby_connections_manager_) { + nearby_connections_manager_ = + std::make_unique(nearby_process_manager_, + kServiceId); + } + + return nearby_connections_manager_->GetWeakPtr(); +} + +} // namespace ash::quick_start diff --git a/chrome/browser/ash/nearby/quick_start_connectivity_service.h b/chrome/browser/ash/nearby/quick_start_connectivity_service.h new file mode 100644 index 0000000000000..8d5aae978d504 --- /dev/null +++ b/chrome/browser/ash/nearby/quick_start_connectivity_service.h @@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_NEARBY_QUICK_START_CONNECTIVITY_SERVICE_H_ +#define CHROME_BROWSER_ASH_NEARBY_QUICK_START_CONNECTIVITY_SERVICE_H_ + +#include + +#include "base/memory/weak_ptr.h" +#include "chromeos/ash/services/nearby/public/cpp/nearby_process_manager.h" + +class NearbyConnectionsManager; + +namespace ash::quick_start { + +class QuickStartConnectivityService : public KeyedService { + public: + explicit QuickStartConnectivityService( + nearby::NearbyProcessManager* nearby_process_manager); + QuickStartConnectivityService(const QuickStartConnectivityService&) = delete; + QuickStartConnectivityService& operator=( + const QuickStartConnectivityService&) = delete; + ~QuickStartConnectivityService() override; + + // A NearbyConnectionsManager is created the first time a reference is + // requested via this method. On service shutdown the NearbyConnectionsManager + // will be destroyed and the utility process will be terminated. + base::WeakPtr GetNearbyConnectionsManager(); + + private: + std::unique_ptr nearby_connections_manager_; + nearby::NearbyProcessManager* nearby_process_manager_; + + base::WeakPtrFactory weak_ptr_factory_{this}; +}; + +} // namespace ash::quick_start + +#endif // CHROME_BROWSER_ASH_NEARBY_QUICK_START_CONNECTIVITY_SERVICE_H_ diff --git a/chrome/browser/ash/nearby/quick_start_connectivity_service_factory.cc b/chrome/browser/ash/nearby/quick_start_connectivity_service_factory.cc new file mode 100644 index 0000000000000..6000b8525f9cb --- /dev/null +++ b/chrome/browser/ash/nearby/quick_start_connectivity_service_factory.cc @@ -0,0 +1,58 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/nearby/quick_start_connectivity_service_factory.h" +#include "chrome/browser/ash/nearby/nearby_process_manager_factory.h" +#include "chrome/browser/ash/nearby/quick_start_connectivity_service.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" + +namespace ash::quick_start { + +// static +QuickStartConnectivityService* +QuickStartConnectivityServiceFactory::GetForProfile(Profile* profile) { + return static_cast( + QuickStartConnectivityServiceFactory::GetInstance() + ->GetServiceForBrowserContext(profile, /*create=*/true)); +} + +// static +QuickStartConnectivityServiceFactory* +QuickStartConnectivityServiceFactory::GetInstance() { + return base::Singleton::get(); +} + +QuickStartConnectivityServiceFactory::QuickStartConnectivityServiceFactory() + : BrowserContextKeyedServiceFactory( + "QuickStartConnectivityService", + BrowserContextDependencyManager::GetInstance()) { + DependsOn(nearby::NearbyProcessManagerFactory::GetInstance()); +} + +QuickStartConnectivityServiceFactory::~QuickStartConnectivityServiceFactory() = + default; + +KeyedService* QuickStartConnectivityServiceFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + Profile* profile = Profile::FromBrowserContext(context); + + // The NearbyProcessManager* fetched here is bound to the lifetime of the + // profile and is guaranteed to outlive QuickStartConnectivityService. + return new QuickStartConnectivityService( + nearby::NearbyProcessManagerFactory::GetForProfile(profile)); +} + +bool QuickStartConnectivityServiceFactory::ServiceIsCreatedWithBrowserContext() + const { + return true; +} + +content::BrowserContext* +QuickStartConnectivityServiceFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return context; +} + +} // namespace ash::quick_start diff --git a/chrome/browser/ash/nearby/quick_start_connectivity_service_factory.h b/chrome/browser/ash/nearby/quick_start_connectivity_service_factory.h new file mode 100644 index 0000000000000..bab1809a4b968 --- /dev/null +++ b/chrome/browser/ash/nearby/quick_start_connectivity_service_factory.h @@ -0,0 +1,43 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_NEARBY_QUICK_START_CONNECTIVITY_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_ASH_NEARBY_QUICK_START_CONNECTIVITY_SERVICE_FACTORY_H_ + +#include "base/memory/singleton.h" +#include "chrome/browser/ash/nearby/quick_start_connectivity_service.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +namespace ash::quick_start { + +class QuickStartConnectivityServiceFactory + : public BrowserContextKeyedServiceFactory { + public: + static QuickStartConnectivityService* GetForProfile(Profile* profile); + + static QuickStartConnectivityServiceFactory* GetInstance(); + + QuickStartConnectivityServiceFactory( + const QuickStartConnectivityServiceFactory&) = delete; + QuickStartConnectivityServiceFactory& operator=( + const QuickStartConnectivityServiceFactory&) = delete; + ~QuickStartConnectivityServiceFactory() override; + + private: + friend struct base::DefaultSingletonTraits< + QuickStartConnectivityServiceFactory>; + + QuickStartConnectivityServiceFactory(); + + // BrowserContextKeyedServiceFactory: + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* context) const override; + bool ServiceIsCreatedWithBrowserContext() const override; + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; +}; + +} // namespace ash::quick_start + +#endif // CHROME_BROWSER_ASH_NEARBY_QUICK_START_CONNECTIVITY_SERVICE_FACTORY_H_ diff --git a/chrome/browser/nearby_sharing/fake_nearby_connections_manager.cc b/chrome/browser/nearby_sharing/fake_nearby_connections_manager.cc index 9687f714636a5..664e2c223d4a7 100644 --- a/chrome/browser/nearby_sharing/fake_nearby_connections_manager.cc +++ b/chrome/browser/nearby_sharing/fake_nearby_connections_manager.cc @@ -188,6 +188,11 @@ void FakeNearbyConnectionsManager::UpgradeBandwidth( upgrade_bandwidth_endpoint_ids_.insert(endpoint_id); } +base::WeakPtr +FakeNearbyConnectionsManager::GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + void FakeNearbyConnectionsManager::OnEndpointFound( const std::string& endpoint_id, location::nearby::connections::mojom::DiscoveredEndpointInfoPtr info) { diff --git a/chrome/browser/nearby_sharing/fake_nearby_connections_manager.h b/chrome/browser/nearby_sharing/fake_nearby_connections_manager.h index 448b00af4452b..3c751e9e2ac97 100644 --- a/chrome/browser/nearby_sharing/fake_nearby_connections_manager.h +++ b/chrome/browser/nearby_sharing/fake_nearby_connections_manager.h @@ -60,6 +60,7 @@ class FakeNearbyConnectionsManager absl::optional> GetRawAuthenticationToken( const std::string& endpoint_id) override; void UpgradeBandwidth(const std::string& endpoint_id) override; + base::WeakPtr GetWeakPtr() override; void SetRawAuthenticationToken(const std::string& endpoint_id, std::vector token); @@ -146,6 +147,8 @@ class FakeNearbyConnectionsManager payload_status_listeners_; std::map incoming_payloads_; std::map registered_payload_paths_; + + base::WeakPtrFactory weak_ptr_factory_{this}; }; #endif // CHROME_BROWSER_NEARBY_SHARING_FAKE_NEARBY_CONNECTIONS_MANAGER_H_ diff --git a/chrome/browser/nearby_sharing/nearby_connections_manager_impl.cc b/chrome/browser/nearby_sharing/nearby_connections_manager_impl.cc index c4c1eb9abf0be..737c1eed63915 100644 --- a/chrome/browser/nearby_sharing/nearby_connections_manager_impl.cc +++ b/chrome/browser/nearby_sharing/nearby_connections_manager_impl.cc @@ -489,6 +489,11 @@ void NearbyConnectionsManagerImpl::UpgradeBandwidth( endpoint_id)); } +base::WeakPtr +NearbyConnectionsManagerImpl::GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + void NearbyConnectionsManagerImpl::OnNearbyProcessStopped( ash::nearby::NearbyProcessManager::NearbyProcessShutdownReason) { NS_LOG(VERBOSE) << __func__; diff --git a/chrome/browser/nearby_sharing/nearby_connections_manager_impl.h b/chrome/browser/nearby_sharing/nearby_connections_manager_impl.h index 2e19da0c10177..c2a7e8ab35c58 100644 --- a/chrome/browser/nearby_sharing/nearby_connections_manager_impl.h +++ b/chrome/browser/nearby_sharing/nearby_connections_manager_impl.h @@ -7,6 +7,8 @@ #include "chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h" +#include + #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/files/file.h" @@ -68,6 +70,7 @@ class NearbyConnectionsManagerImpl absl::optional> GetRawAuthenticationToken( const std::string& endpoint_id) override; void UpgradeBandwidth(const std::string& endpoint_id) override; + base::WeakPtr GetWeakPtr() override; private: using AdvertisingOptions = diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc index d4d2539befba4..922fbea7626d2 100644 --- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc +++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc @@ -358,7 +358,10 @@ NearbySharingServiceImpl::NearbySharingServiceImpl( NearbySharingServiceImpl::~NearbySharingServiceImpl() { // Make sure the service has been shut down properly before. DCHECK(!nearby_notification_manager_); - DCHECK(!bluetooth_adapter_ || !bluetooth_adapter_->HasObserver(this)); + + if (bluetooth_adapter_) { + DCHECK(!bluetooth_adapter_->HasObserver(this)); + } } void NearbySharingServiceImpl::Shutdown() { @@ -390,8 +393,10 @@ void NearbySharingServiceImpl::Shutdown() { // updated API referenced in the bug which allows setting a per-advertisement // interval. - if (bluetooth_adapter_) + if (bluetooth_adapter_) { bluetooth_adapter_->RemoveObserver(this); + bluetooth_adapter_.reset(); + } auto* session_controller = ash::SessionController::Get(); if (session_controller) diff --git a/chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h b/chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h index e4b0098f06f57..45cecab8c2460 100644 --- a/chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h +++ b/chrome/browser/nearby_sharing/public/cpp/nearby_connections_manager.h @@ -146,6 +146,8 @@ class NearbyConnectionsManager { // Initiates bandwidth upgrade for |endpoint_id|. virtual void UpgradeBandwidth(const std::string& endpoint_id) = 0; + + virtual base::WeakPtr GetWeakPtr() = 0; }; #endif // CHROME_BROWSER_NEARBY_SHARING_PUBLIC_CPP_NEARBY_CONNECTIONS_MANAGER_H_ diff --git a/chromeos/ash/services/nearby/public/cpp/nearby_client_uuids.cc b/chromeos/ash/services/nearby/public/cpp/nearby_client_uuids.cc index 45f5ea8a72dd7..5f9c5fdf205bc 100644 --- a/chromeos/ash/services/nearby/public/cpp/nearby_client_uuids.cc +++ b/chromeos/ash/services/nearby/public/cpp/nearby_client_uuids.cc @@ -16,6 +16,7 @@ namespace nearby { namespace { const char kNearbySharingUuid[] = "a82efa21-ae5c-3dde-9bbc-f16da7b16c5a"; const char kSecureChannelUuid[] = "a384bd4f-41ea-3b02-8901-8c2ed9a79970"; +const char kQuickStartUuid[] = "3274b583-0b06-30df-a317-072a899af6d6"; } // namespace const std::vector& GetNearbyClientUuids() { @@ -25,7 +26,8 @@ const std::vector& GetNearbyClientUuids() { // base::NoDestructor. std::vector allowed_uuids{ device::BluetoothUUID(kNearbySharingUuid), - device::BluetoothUUID(kSecureChannelUuid)}; + device::BluetoothUUID(kSecureChannelUuid), + device::BluetoothUUID(kQuickStartUuid)}; return allowed_uuids; }());