diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index b0ea8455e7d971..12072a15168e3a 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 946e41cc5c8b88..c6b42bd351eba7 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 2805ab4e1149d6..bfca2fd0f87c5b 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 1aa4c4510405e8..7f6c636fd4f96c 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 5c85ac72613c77..937823fd4ee933 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 29ac2bcd50e1f1..0cf0e22b80ab0f 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 a984d3e5c21ef5..9d9364fcc6b04e 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 4adf074d5071dd..91a351b40210d7 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 3f542e7dd18a32..7aa75fa745c257 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 2fdd34d4cb2499..7e7903a01dca7b 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 d181fa18caf794..93fd8ca58ff892 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 8edaf62036ea78..45917d32dd2f7f 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 3ded5d44fd3927..ebd89f4b58857f 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 182d199fc2e781..4b2096a6d8da09 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 c9ee5f4631da08..d61812be62b87f 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 88f8215407f1ce..df4c7602942645 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 00000000000000..ef325643e3458b --- /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 00000000000000..8d5aae978d5048 --- /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 00000000000000..6000b8525f9cbf --- /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 00000000000000..bab1809a4b968f --- /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 9687f714636a5c..664e2c223d4a7d 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 448b00af4452b8..3c751e9e2ac97d 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 c4c1eb9abf0be2..737c1eed639157 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 2e19da0c101772..c2a7e8ab35c587 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 d4d2539befba40..922fbea7626d29 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 e4b0098f06f575..45cecab8c24604 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 45f5ea8a72dd7f..5f9c5fdf205bc7 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; }());