From 0614f439d9f5bb7bb87e9bab1997210d3f45c56c Mon Sep 17 00:00:00 2001 From: Guogang Li Date: Tue, 1 Jul 2025 23:28:40 -0700 Subject: [PATCH] Control Advertising/Scanning of instant on lost separately PiperOrigin-RevId: 778356456 --- connections/c/nc.cc | 2 +- connections/implementation/bwu_manager.cc | 4 +- .../flags/nearby_connections_feature_flags.h | 57 +++++++++++-------- connections/implementation/mediums/ble_v2.cc | 30 +++++++--- .../ble_v2/discovered_peripheral_tracker.cc | 13 +++-- .../ble_v2/discovered_peripheral_tracker.h | 5 +- .../discovered_peripheral_tracker_test.cc | 12 ++-- 7 files changed, 77 insertions(+), 46 deletions(-) diff --git a/connections/c/nc.cc b/connections/c/nc.cc index 1519c3d2..26f36107 100644 --- a/connections/c/nc.cc +++ b/connections/c/nc.cc @@ -256,7 +256,7 @@ NC_INSTANCE NcCreateService() { true); nearby::NearbyFlags::GetInstance().OverrideBoolFlagValue( ::nearby::connections::config_package_nearby::nearby_connections_feature:: - kEnableStopBLEScanningOnWifiUpgrade, + kEnableStopBleScanningOnWifiUpgrade, true); nearby::NearbyFlags::GetInstance().OverrideBoolFlagValue( ::nearby::connections::config_package_nearby::nearby_connections_feature:: diff --git a/connections/implementation/bwu_manager.cc b/connections/implementation/bwu_manager.cc index 1c5705e4..89b4b819 100644 --- a/connections/implementation/bwu_manager.cc +++ b/connections/implementation/bwu_manager.cc @@ -983,7 +983,7 @@ BwuManager::ProcessBwuPathAvailableEventInternal( config_package_nearby::nearby_connections_feature::kEnableBleV2); if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableStopBLEScanningOnWifiUpgrade)) { + kEnableStopBleScanningOnWifiUpgrade)) { if (client->GetLocalOsInfo().type() == location::nearby::connections::OsInfo::APPLE && old_medium == Medium::BLE && medium == Medium::WIFI_HOTSPOT) { @@ -1005,7 +1005,7 @@ BwuManager::ProcessBwuPathAvailableEventInternal( if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableStopBLEScanningOnWifiUpgrade)) { + kEnableStopBleScanningOnWifiUpgrade)) { if (disable_ble_scanning) { if (enable_ble_v2) { NEARBY_LOGS(INFO) << "Resume BLE_V2 scanning."; diff --git a/connections/implementation/flags/nearby_connections_feature_flags.h b/connections/implementation/flags/nearby_connections_feature_flags.h index 5804a1f7..fb9ad667 100644 --- a/connections/implementation/flags/nearby_connections_feature_flags.h +++ b/connections/implementation/flags/nearby_connections_feature_flags.h @@ -34,15 +34,33 @@ constexpr auto kBlePeripheralLostTimeoutMillis = // When true, disable Bluetooth classic scanning. constexpr auto kDisableBluetoothClassicScanning = flags::Flag(kConfigPackage, "45639961", false); +// Disable instant on lost on BLE without extended feature. +constexpr auto kDisableInstantOnLostOnBleWithoutExtended = + flags::Flag(kConfigPackage, "45687098", true); +// When true, enable advertising for instant on lost feature. +constexpr auto kEnableAdvertisingForInstantOnLost = + flags::Flag(kConfigPackage, "45708614", false); // Enable/Disable auto_reconnect feature. constexpr auto kEnableAutoReconnect = flags::Flag(kConfigPackage, "45427690", false); -// Disable/Enable BLE v2 in Nearby Connections SDK. -constexpr auto kEnableBleV2 = - flags::Flag(kConfigPackage, "45401515", false); +// Enable/Disable AWDL in Nearby connections SDK. +constexpr auto kEnableAwdl = + flags::Flag(kConfigPackage, "45690762", false); // Disable/Enable BLE L2CAP in Nearby Connections SDK. constexpr auto kEnableBleL2cap = flags::Flag(kConfigPackage, "45685706", false); +// Disable/Enable BLE v2 in Nearby Connections SDK. +constexpr auto kEnableBleV2 = + flags::Flag(kConfigPackage, "45401515", false); +// Enable/Disable DCT advertising/scanning specification. +constexpr auto kEnableDct = + flags::Flag(kConfigPackage, "45697202", false); +// Disable/Enable dynamic role switch in Nearby Connections SDK. +constexpr auto kEnableDynamicRoleSwitch = + flags::Flag(kConfigPackage, "45696452", false); +// Enable/Disable GATT client disconnection. +constexpr auto kEnableGattClientDisconnection = + flags::Flag(kConfigPackage, "45698964", false); // Disable/Enable GATT query in thread in BLE V2. // Manual edit: setting this to false for ChromeOS rollout as well. constexpr auto kEnableGattQueryInThread = @@ -53,10 +71,13 @@ constexpr auto kEnableInstantOnLost = // When true, enable multiplexing in NC. constexpr auto kEnableMultiplex = flags::Flag(kConfigPackage, "45647946", false); +// Enable/disable multiplex in NC for AWDL. +constexpr auto kEnableMultiplexAwdl = + flags::Flag(kConfigPackage, "45690761", false); // When true, enable multiplexing in NC for Bluetooth. constexpr auto kEnableMultiplexBluetooth = flags::Flag(kConfigPackage, "45676646", false); -// When true, enable multiplexing in NC for WifiLan. +// When true, enable multiplexing in NC for Wifi. constexpr auto kEnableMultiplexWifiLan = flags::Flag(kConfigPackage, "45676647", false); // Enable/Disable payload manager to skip chunk update. @@ -68,6 +89,12 @@ constexpr auto kEnablePayloadReceivedAck = // Enable/Disable safe-to-disconnect feature. constexpr auto kEnableSafeToDisconnect = flags::Flag(kConfigPackage, "45425789", false); +// When true, enable scanning for instant on lost feature. +constexpr auto kEnableScanningForInstantOnLost = + flags::Flag(kConfigPackage, "45708613", false); +// Stop BLE_V2 scanning when upgrading to WIFI Hotspot or WFD. +constexpr auto kEnableStopBleScanningOnWifiUpgrade = + flags::Flag(kConfigPackage, "45687902", false); // by default, enable Wi-Fi Hotspot client. constexpr auto kEnableWifiHotspotClient = flags::Flag(kConfigPackage, "45648734", true); @@ -86,27 +113,7 @@ constexpr auto kSafeToDisconnectVersion = // When true, use stable endpoint ID. constexpr auto kUseStableEndpointId = flags::Flag(kConfigPackage, "45639298", false); -// When true, disable instant on lost on BLE without extended feature. -constexpr auto kDisableInstantOnLostOnBleWithoutExtended = - flags::Flag(kConfigPackage, "45687098", true); -// When true, stop BLE_V2 scanning when upgrading to WIFI Hotspot or WFD. -constexpr auto kEnableStopBLEScanningOnWifiUpgrade = - flags::Flag(kConfigPackage, "45687902", false); -// When true, enable multiplexing in NC for AWDL. -constexpr auto kEnableMultiplexAwdl = - flags::Flag(kConfigPackage, "45690761", false); -// Enable/Disable AWDL in Nearby connections SDK. -constexpr auto kEnableAwdl = - flags::Flag(kConfigPackage, "45690762", false); -// When true, enable dynamic role switch in NC. -constexpr auto kEnableDynamicRoleSwitch = - flags::Flag(kConfigPackage, "45696452", false); -// Enable/Disable DCT advertising/scanning specification. -constexpr auto kEnableDct = - flags::Flag(kConfigPackage, "45697202", false); -// Enable/Disable GATT client disconnection. -constexpr auto kEnableGattClientDisconnection = - flags::Flag(kConfigPackage, "45698964", false); + } // namespace nearby_connections_feature } // namespace config_package_nearby } // namespace connections diff --git a/connections/implementation/mediums/ble_v2.cc b/connections/implementation/mediums/ble_v2.cc index 1f7be85b..bc8a1254 100644 --- a/connections/implementation/mediums/ble_v2.cc +++ b/connections/implementation/mediums/ble_v2.cc @@ -107,7 +107,10 @@ BleV2::~BleV2() { if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableInstantOnLost)) { + kEnableInstantOnLost) || + NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_connections_feature:: + kEnableAdvertisingForInstantOnLost)) { instant_on_lost_manager_.Shutdown(); } } @@ -272,7 +275,10 @@ bool BleV2::StopAdvertising(const std::string& service_id) { if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableInstantOnLost)) { + kEnableInstantOnLost) || + NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_connections_feature:: + kEnableAdvertisingForInstantOnLost)) { instant_on_lost_manager_.OnAdvertisingStopped(service_id); } @@ -1197,7 +1203,10 @@ bool BleV2::StartFastAdvertisingLocked( if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableInstantOnLost)) { + kEnableInstantOnLost) || + NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_connections_feature:: + kEnableAdvertisingForInstantOnLost)) { instant_on_lost_manager_.OnAdvertisingStarted(service_id, medium_advertisement_bytes); } @@ -1233,7 +1242,10 @@ bool BleV2::StartRegularAdvertisingLocked( } else { if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableInstantOnLost)) { + kEnableInstantOnLost) || + NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_connections_feature:: + kEnableAdvertisingForInstantOnLost)) { instant_on_lost_manager_.OnAdvertisingStarted( service_id, medium_advertisement_bytes); } @@ -1319,10 +1331,12 @@ bool BleV2::StartGattAdvertisingLocked( if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableInstantOnLost)) { - for (const auto& item : advertising_data.service_data) { - instant_on_lost_manager_.OnAdvertisingStarted(service_id, item.second); - } + kEnableInstantOnLost) || + NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_connections_feature:: + kEnableAdvertisingForInstantOnLost)) { + instant_on_lost_manager_.OnAdvertisingStarted(service_id, + medium_advertisement_bytes); } return true; diff --git a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc index 9ed97989..96564f0c 100644 --- a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc +++ b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc @@ -196,8 +196,7 @@ bool DiscoveredPeripheralTracker::HandleOnLostAdvertisementLocked( for (const auto& hash : on_lost_advertisement->hashes()) { for (const auto& it : gatt_advertisement_infos_) { - if (it.second.advertisement_header.GetAdvertisementHash().string_data() == - hash) { + if (it.second.instant_on_lost_hash.string_data() == hash) { auto discovery_cb_it = service_id_infos_.find(it.second.service_id); if (discovery_cb_it == service_id_infos_.end()) { LOG(INFO) @@ -216,7 +215,10 @@ bool DiscoveredPeripheralTracker::HandleOnLostAdvertisementLocked( if (gatt_advertisement.IsValid()) { if (NearbyFlags::GetInstance().GetBoolFlag( config_package_nearby::nearby_connections_feature:: - kEnableInstantOnLost)) { + kEnableInstantOnLost) || + NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_connections_feature:: + kEnableScanningForInstantOnLost)) { AddInstantLostAdvertisement(it.second.advertisement_header); discovery_cb_it->second.discovered_peripheral_callback .instant_lost_cb(lost_peripheral, it.second.service_id, @@ -500,7 +502,10 @@ BleAdvertisementHeader DiscoveredPeripheralTracker::HandleRawGattAdvertisements( GattAdvertisementInfo gatt_advertisement_info = { .service_id = service_id, .advertisement_header = new_advertisement_header, - .peripheral = peripheral}; + .peripheral = peripheral, + .instant_on_lost_hash = bleutils::GenerateAdvertisementHash( + gatt_advertisement.ByteArrayWithExtraField())}; + gatt_advertisement_infos_.insert_or_assign( gatt_advertisement, std::move(gatt_advertisement_info)); } diff --git a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h index 3792382e..4eb86bed 100644 --- a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h +++ b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h @@ -141,8 +141,11 @@ class DiscoveredPeripheralTracker { // gatt_advertisements_. BleAdvertisementHeader advertisement_header; - // A proxy BlePeripheral for found/lost disovery callback. + // A proxy BlePeripheral for found/lost discovery callback. BleV2Peripheral peripheral; + + // Hash for instant on lost. + ByteArray instant_on_lost_hash; }; // Clears stale data from any previous sessions. diff --git a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker_test.cc b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker_test.cc index 40aa5998..12709b18 100644 --- a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker_test.cc +++ b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker_test.cc @@ -341,8 +341,7 @@ TEST_P(DiscoveredPeripheralTrackerTest, EXPECT_EQ(GetFetchAdvertisementCallbackCount(), 0); } -TEST_P(DiscoveredPeripheralTrackerTest, - DctAdvertisementPeripheralDiscovered) { +TEST_P(DiscoveredPeripheralTrackerTest, DctAdvertisementPeripheralDiscovered) { ByteArray dct_advertisement_bytes = CreateDctAdvertisement( std::string(kServiceIdA), std::string(kDeviceName)); CountDownLatch found_latch(1); @@ -1204,7 +1203,8 @@ TEST_P(DiscoveredPeripheralTrackerTest, LostPeripheralForInstantOnLost) { EXPECT_EQ(GetFetchAdvertisementCallbackCount(), 1); auto advertisement = InstantOnLostAdvertisement::CreateFromHashes( - std::list({std::string(advertisement_hash)})); + std::list({std::string( + bleutils::GenerateAdvertisementHash(advertisement_bytes))})); ASSERT_OK(advertisement); api::ble_v2::BleAdvertisementData loss_advertisement_data{}; loss_advertisement_data.service_data.insert( @@ -1269,7 +1269,8 @@ TEST_P(DiscoveredPeripheralTrackerTest, InstantLostPeripheralForInstantOnLost) { EXPECT_EQ(GetFetchAdvertisementCallbackCount(), 1); auto advertisement = InstantOnLostAdvertisement::CreateFromHashes( - std::list({std::string(advertisement_hash)})); + std::list({std::string( + bleutils::GenerateAdvertisementHash(advertisement_bytes))})); ASSERT_OK(advertisement); api::ble_v2::BleAdvertisementData loss_advertisement_data{}; loss_advertisement_data.service_data.insert( @@ -1340,7 +1341,8 @@ TEST_P(DiscoveredPeripheralTrackerTest, CountDownLatch fetch_latch2(1); auto advertisement = InstantOnLostAdvertisement::CreateFromHashes( - std::list({std::string(advertisement_hash)})); + std::list({std::string( + bleutils::GenerateAdvertisementHash(advertisement_bytes))})); ASSERT_OK(advertisement); api::ble_v2::BleAdvertisementData loss_advertisement_data{}; loss_advertisement_data.service_data.insert(