From a3eb71b63362d554571702dff07424bc2e871d34 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 15 Aug 2023 15:47:05 -0700 Subject: [PATCH 01/13] [nearby] Update README to add build env script Test: n/a Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:85afaab1ac308f12d7263ef4b8a2b1ba6a3a2f13) Merged-In: I43257c79d212ed24fb0cd69f363b25bceb098f01 Change-Id: I43257c79d212ed24fb0cd69f363b25bceb098f01 --- nearby/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/nearby/README.md b/nearby/README.md index 2731b3e220..0d265638ba 100644 --- a/nearby/README.md +++ b/nearby/README.md @@ -49,6 +49,7 @@ Then, add the jar in IDE as below. ```sh Build unbundled module using banchan +$ source build/envsetup.sh $ banchan com.google.android.tethering mainline_modules_arm64 $ m apps_only dist $ adb install out/dist/com.google.android.tethering.apex From e899d26468e9e0f3f53f05f670c8c410ad59b8cd Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Mon, 11 Sep 2023 15:38:52 -0700 Subject: [PATCH 02/13] [nearby] Catches NPE in ChreDiscoveryProvider Test: -m Ignore-AOSP-First: neary not in aosp yet Fix: 298597342 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5d07eee4c1671a3d1d6b6669c338d098cfe488f9) Merged-In: I1ef411aea6db6d0c169aa08c303f4234c77baed9 Change-Id: I1ef411aea6db6d0c169aa08c303f4234c77baed9 --- nearby/framework/java/android/nearby/NearbyManager.java | 2 ++ .../android/server/nearby/provider/ChreDiscoveryProvider.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/nearby/framework/java/android/nearby/NearbyManager.java b/nearby/framework/java/android/nearby/NearbyManager.java index 070a2b66cb..00f1c38923 100644 --- a/nearby/framework/java/android/nearby/NearbyManager.java +++ b/nearby/framework/java/android/nearby/NearbyManager.java @@ -284,6 +284,8 @@ public class NearbyManager { */ public void queryOffloadCapability(@NonNull @CallbackExecutor Executor executor, @NonNull Consumer callback) { + Objects.requireNonNull(executor); + Objects.requireNonNull(callback); try { mService.queryOffloadCapability(new OffloadTransport(executor, callback)); } catch (RemoteException e) { diff --git a/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java b/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java index d69d42d44d..0302e4fcc1 100644 --- a/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java +++ b/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java @@ -155,7 +155,7 @@ public class ChreDiscoveryProvider extends AbstractDiscoveryProvider { builder.setFastPairSupported(version != ChreCommunication.INVALID_NANO_APP_VERSION); try { callback.onQueryComplete(builder.build()); - } catch (RemoteException e) { + } catch (RemoteException | NullPointerException e) { e.printStackTrace(); } }); From d9da74a98ea3a1206066c16f4d6ef03e6d1c5cba Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Thu, 14 Sep 2023 15:48:54 -0700 Subject: [PATCH 03/13] [nearby] Fix the user-debug only test Test: -m Fix: 273887455 Ignore-AOSP-First: aosp first on Oct (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:0f192c89c541536ba45a243b2a21815c7dc4d0bf) Merged-In: I7644a8187c36c944b36f1b4eb741edf46d9b1ad2 Change-Id: I7644a8187c36c944b36f1b4eb741edf46d9b1ad2 --- .../server/nearby/provider/ChreDiscoveryProviderTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java b/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java index 154441b537..6f035a9c54 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java @@ -288,8 +288,12 @@ public class ChreDiscoveryProviderTest { } @Test - @SdkSuppress(minSdkVersion = 32, codeName = "T") + @SdkSuppress(minSdkVersion = 33, codeName = "T") public void testOnNearbyDeviceDiscoveredWithTestDataElements() { + // The feature only supports user-debug builds. + if (!Build.isDebuggable()) { + return; + } // Enables the setting of test app support boolean isSupportedTestApp = getDeviceConfigBoolean( NEARBY_SUPPORT_TEST_APP, false /* defaultValue */); From 64cbadfad94d247d670b96913d0cbd3215491011 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:52:00 +0000 Subject: [PATCH 04/13] [nearby][clean up] Remove useless legacy code This was used back when Bluetooth 4.2 was used. We should remove the empty code here. Test: -m Ignore-AOSP-First: nearby not in aosp yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d671163a9a5d5d6cb8392fad08143c81b8ad5e0b) Merged-In: I0ea54f77c66c01f02fbee9eb1e782a3a9ade6566 Change-Id: I0ea54f77c66c01f02fbee9eb1e782a3a9ade6566 --- .../server/nearby/provider/BleDiscoveryProvider.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/nearby/service/java/com/android/server/nearby/provider/BleDiscoveryProvider.java b/nearby/service/java/com/android/server/nearby/provider/BleDiscoveryProvider.java index 9dd07a4d9f..e4651b791b 100644 --- a/nearby/service/java/com/android/server/nearby/provider/BleDiscoveryProvider.java +++ b/nearby/service/java/com/android/server/nearby/provider/BleDiscoveryProvider.java @@ -68,15 +68,6 @@ public class BleDiscoveryProvider extends AbstractDiscoveryProvider { @GuardedBy("mLock") @Nullable private List mScanFilters; - private android.bluetooth.le.ScanCallback mScanCallbackLegacy = - new android.bluetooth.le.ScanCallback() { - @Override - public void onScanResult(int callbackType, ScanResult scanResult) { - } - @Override - public void onScanFailed(int errorCode) { - } - }; private android.bluetooth.le.ScanCallback mScanCallback = new android.bluetooth.le.ScanCallback() { @Override @@ -170,7 +161,6 @@ public class BleDiscoveryProvider extends AbstractDiscoveryProvider { if (isBleAvailable()) { Log.d(TAG, "BleDiscoveryProvider started"); startScan(getScanFilters(), getScanSettings(/* legacy= */ false), mScanCallback); - startScan(getScanFilters(), getScanSettings(/* legacy= */ true), mScanCallbackLegacy); return; } Log.w(TAG, "Cannot start BleDiscoveryProvider because Ble is not available."); @@ -187,7 +177,6 @@ public class BleDiscoveryProvider extends AbstractDiscoveryProvider { } Log.v(TAG, "Ble scan stopped."); bluetoothLeScanner.stopScan(mScanCallback); - bluetoothLeScanner.stopScan(mScanCallbackLegacy); synchronized (mLock) { if (mScanFilters != null) { mScanFilters = null; From df7db9c554c344f55f8dbb8393f3a091630bfc00 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:52:09 +0000 Subject: [PATCH 05/13] [nearby] Fix flakeness in the unit test Test: -m Ignore-AOSP-First: nearby not in aosp yet Fix: 302599461 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:08356f82527aad27dc9613f3e406f7732b363e42) Merged-In: Id438f453893e4e4adbd341ba36c4a0e3d3dbcb4f Change-Id: Id438f453893e4e4adbd341ba36c4a0e3d3dbcb4f --- .../server/nearby/provider/BleBroadcastProviderTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nearby/tests/unit/src/com/android/server/nearby/provider/BleBroadcastProviderTest.java b/nearby/tests/unit/src/com/android/server/nearby/provider/BleBroadcastProviderTest.java index 05b556b098..c064844055 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/provider/BleBroadcastProviderTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/provider/BleBroadcastProviderTest.java @@ -16,6 +16,7 @@ package com.android.server.nearby.provider; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.times; @@ -69,7 +70,7 @@ public class BleBroadcastProviderTest { AdvertiseSettings settings = new AdvertiseSettings.Builder().build(); mBleBroadcastProvider.onStartSuccess(settings); - verify(mBroadcastListener).onStatusChanged(eq(BroadcastCallback.STATUS_OK)); + verify(mBroadcastListener, times(any())).onStatusChanged(eq(BroadcastCallback.STATUS_OK)); } @Test @@ -81,7 +82,7 @@ public class BleBroadcastProviderTest { // advertising set can not be mocked, so we will allow nulls mBleBroadcastProvider.mAdvertisingSetCallback.onAdvertisingSetStarted(null, -30, AdvertisingSetCallback.ADVERTISE_SUCCESS); - verify(mBroadcastListener).onStatusChanged(eq(BroadcastCallback.STATUS_OK)); + verify(mBroadcastListener, times(any())).onStatusChanged(eq(BroadcastCallback.STATUS_OK)); } @Test From a34d7e89495670bd999fc8a5f5c7fc61e92a2497 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:52:31 +0000 Subject: [PATCH 06/13] [nearby] Add discoveryTimestamp field Test: -m Bug: 306043245 Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:730894831d541ef67063e1d85e3b770476053fe6) Merged-In: I2151cdeceec1a3180c79b0ea10adb6e5581f4845 Change-Id: I2151cdeceec1a3180c79b0ea10adb6e5581f4845 --- .../server/nearby/provider/ChreDiscoveryProvider.java | 5 ++++- nearby/service/proto/src/presence/blefilter.proto | 1 + .../server/nearby/provider/ChreDiscoveryProviderTest.java | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java b/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java index 0302e4fcc1..035da294bf 100644 --- a/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java +++ b/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java @@ -350,7 +350,10 @@ public class ChreDiscoveryProvider extends AbstractDiscoveryProvider { DataElement.DataType.ACTION, new byte[]{(byte) filterResult.getIntent()})); } - + if (filterResult.hasDiscoveryTimestamp()) { + presenceDeviceBuilder.setDiscoveryTimestampMillis( + filterResult.getDiscoveryTimestamp()); + } PublicCredential publicCredential = new PublicCredential.Builder( secretId, diff --git a/nearby/service/proto/src/presence/blefilter.proto b/nearby/service/proto/src/presence/blefilter.proto index e1bf45595a..01f16cb961 100644 --- a/nearby/service/proto/src/presence/blefilter.proto +++ b/nearby/service/proto/src/presence/blefilter.proto @@ -115,6 +115,7 @@ message BleFilterResult { repeated DataElement data_element = 7; optional bytes ble_service_data = 8; optional ResultType result_type = 9; + optional uint64 discovery_timestamp = 10; // Timestamp when the device is discovered. } message BleFilterResults { diff --git a/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java b/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java index 6f035a9c54..1f727a7664 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java @@ -262,6 +262,7 @@ public class ChreDiscoveryProviderTest { .setValue(ByteString.copyFrom(testData)) .setValueLength(testData.length) ) + .setDiscoveryTimestamp(1697765417070L) .build(); Blefilter.BleFilterResults results = Blefilter.BleFilterResults.newBuilder().addResult(result).build(); From d145497f3145d9cd1033fcd59a8eb554f38fda33 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:52:38 +0000 Subject: [PATCH 07/13] [nearby] Add logs to broadcaster Test: -m Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:85f260c4dd7503978f2c6e83a7eadadc8e9b73a7) Merged-In: I9fd0009d21ac5193a2e7b715067c4956902cd2db Change-Id: I9fd0009d21ac5193a2e7b715067c4956902cd2db --- .../android/server/nearby/provider/BleBroadcastProvider.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nearby/service/java/com/android/server/nearby/provider/BleBroadcastProvider.java b/nearby/service/java/com/android/server/nearby/provider/BleBroadcastProvider.java index 72edad0326..66ae79c567 100644 --- a/nearby/service/java/com/android/server/nearby/provider/BleBroadcastProvider.java +++ b/nearby/service/java/com/android/server/nearby/provider/BleBroadcastProvider.java @@ -85,6 +85,7 @@ public class BleBroadcastProvider extends AdvertiseCallback { case BroadcastRequest.PRESENCE_VERSION_V0: bluetoothLeAdvertiser.startAdvertising(getAdvertiseSettings(), advertiseData, this); + Log.v(TAG, "Start to broadcast V0 advertisement."); break; case BroadcastRequest.PRESENCE_VERSION_V1: if (adapter.isLeExtendedAdvertisingSupported()) { @@ -92,6 +93,7 @@ public class BleBroadcastProvider extends AdvertiseCallback { getAdvertisingSetParameters(), advertiseData, null, null, null, mAdvertisingSetCallback); + Log.v(TAG, "Start to broadcast V1 advertisement."); } else { Log.w(TAG, "Failed to start advertising set because the chipset" + " does not supports LE Extended Advertising feature."); From 6fca26676aa6e650ab5b87458d40821c5f9bdeda Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:52:48 +0000 Subject: [PATCH 08/13] [nearby] Enable BLE when init Fix: 294906731 Test: -m Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:2a9323b184edda09184d5d94c32ca5dfaedf2690) Merged-In: Ie380efbc452af51691daa1e96e04dd575801c3a9 Change-Id: Ie380efbc452af51691daa1e96e04dd575801c3a9 --- .../managers/DiscoveryProviderManager.java | 28 ++++++++ .../DiscoveryProviderManagerLegacy.java | 28 ++++++++ .../DiscoveryProviderManagerLegacyTest.java | 72 +++++++++++++++++++ .../DiscoveryProviderManagerTest.java | 72 +++++++++++++++++++ 4 files changed, 200 insertions(+) diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java index 0c4142657c..5797d3d25b 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java @@ -21,6 +21,7 @@ import static android.nearby.ScanRequest.SCAN_TYPE_NEARBY_PRESENCE; import static com.android.server.nearby.NearbyService.TAG; import android.annotation.Nullable; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.nearby.DataElement; import android.nearby.IScanListener; @@ -141,6 +142,8 @@ public class DiscoveryProviderManager extends /** Called after boot completed. */ public void init() { + // Register BLE only scan when Bluetooth is turned off + setBleScanEnabled(); if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } @@ -313,4 +316,29 @@ public class DiscoveryProviderManager extends public void onMergedRegistrationsUpdated() { invalidateProviderScanMode(); } + + /** + * Registers Nearby service to Ble scan if Bluetooth is off. (Even when Bluetooth is off) + * @return {@code true} when Nearby currently can scan through Bluetooth or Ble or successfully + * registers Nearby service to Ble scan when Blutooth is off. + */ + public boolean setBleScanEnabled() { + BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); + if (adapter == null) { + Log.e(TAG, "BluetoothAdapter is null."); + return false; + } + if (adapter.isEnabled() || adapter.isLeEnabled()) { + return true; + } + if (!adapter.isBleScanAlwaysAvailable()) { + Log.v(TAG, "Ble always on scan is disabled."); + return false; + } + if (!adapter.enableBLE()) { + Log.e(TAG, "Failed to register Ble scan."); + return false; + } + return true; + } } diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java index 4b76eba888..df33773278 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java @@ -22,6 +22,7 @@ import static com.android.server.nearby.NearbyService.TAG; import android.annotation.Nullable; import android.app.AppOpsManager; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.nearby.DataElement; import android.nearby.IScanListener; @@ -220,6 +221,8 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider /** Called after boot completed. */ public void init() { + // Register BLE only scan when Bluetooth is turned off + setBleScanEnabled(); if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } @@ -503,4 +506,29 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider unregisterScanListener(listener); } } + + /** + * Registers Nearby service to Ble scan if Bluetooth is off. (Even when Bluetooth is off) + * @return {@code true} when Nearby currently can scan through Bluetooth or Ble or successfully + * registers Nearby service to Ble scan when Blutooth is off. + */ + public boolean setBleScanEnabled() { + BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); + if (adapter == null) { + Log.e(TAG, "BluetoothAdapter is null."); + return false; + } + if (adapter.isEnabled() || adapter.isLeEnabled()) { + return true; + } + if (!adapter.isBleScanAlwaysAvailable()) { + Log.v(TAG, "Ble always on scan is disabled."); + return false; + } + if (!adapter.enableBLE()) { + Log.e(TAG, "Failed to register Ble scan."); + return false; + } + return true; + } } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java index aa0dad328c..a8c30a86a9 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java @@ -23,10 +23,12 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.nearby.DataElement; import android.nearby.IScanListener; @@ -86,6 +88,8 @@ public class DiscoveryProviderManagerLegacyTest { DiscoveryProviderManagerLegacy.ScanListenerDeathRecipient mScanListenerDeathRecipient; @Mock IBinder mIBinder; + @Mock + BluetoothAdapter mBluetoothAdapter; private DiscoveryProviderManagerLegacy mDiscoveryProviderManager; private Map mScanTypeScanListenerRecordMap; @@ -137,8 +141,11 @@ public class DiscoveryProviderManagerLegacyTest { public void setup() { MockitoAnnotations.initMocks(this); when(mInjector.getAppOpsManager()).thenReturn(mAppOpsManager); + when(mInjector.getBluetoothAdapter()).thenReturn(mBluetoothAdapter); when(mBleDiscoveryProvider.getController()).thenReturn(mBluetoothController); when(mChreDiscoveryProvider.getController()).thenReturn(mChreController); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.isEnabled()).thenReturn(true); mScanTypeScanListenerRecordMap = new HashMap<>(); mDiscoveryProviderManager = @@ -163,6 +170,13 @@ public class DiscoveryProviderManagerLegacyTest { mDiscoveryProviderManager.invalidateProviderScanMode(); } + @Test + public void test_enableBleWhenBleOff() throws Exception { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + mDiscoveryProviderManager.init(); + verify(mBluetoothAdapter, times(1)).enableBLE(); + } + @Test public void testStartProviders_chreOnlyChreAvailable_bleProviderNotStarted() { when(mChreDiscoveryProvider.available()).thenReturn(true); @@ -375,4 +389,62 @@ public class DiscoveryProviderManagerLegacyTest { .isTrue(); assertThat(manager.mChreDiscoveryProvider.getFiltersLocked()).isNotNull(); } + + @Test + public void isBluetoothEnabledTest_bluetoothEnabled() { + when(mBluetoothAdapter.isEnabled()).thenReturn(true); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(true); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void isBluetoothEnabledTest_bleEnabled() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(true); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(true); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void enabledTest_enabled() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(true); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void enabledTest_enableFailed() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(false); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + } + + @Test + public void enabledTest_scanIsOn() { + when(mBluetoothAdapter.isEnabled()).thenReturn(true); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void enabledTest_failed() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + } } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java index 7ecf631df3..b05893fa4d 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java @@ -24,10 +24,12 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.nearby.DataElement; import android.nearby.IScanListener; @@ -80,6 +82,8 @@ public class DiscoveryProviderManagerTest { CallerIdentity mCallerIdentity; @Mock IBinder mIBinder; + @Mock + BluetoothAdapter mBluetoothAdapter; private Executor mExecutor; private DiscoveryProviderManager mDiscoveryProviderManager; @@ -134,6 +138,9 @@ public class DiscoveryProviderManagerTest { when(mBleDiscoveryProvider.getController()).thenReturn(mBluetoothController); when(mChreDiscoveryProvider.getController()).thenReturn(mChreController); when(mScanListener.asBinder()).thenReturn(mIBinder); + when(mInjector.getBluetoothAdapter()).thenReturn(mBluetoothAdapter); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.isEnabled()).thenReturn(true); mDiscoveryProviderManager = new DiscoveryProviderManager(mContext, mExecutor, mInjector, @@ -156,6 +163,13 @@ public class DiscoveryProviderManagerTest { mDiscoveryProviderManager.invalidateProviderScanMode(); } + @Test + public void test_enableBleWhenBleOff() throws Exception { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + mDiscoveryProviderManager.init(); + verify(mBluetoothAdapter, times(1)).enableBLE(); + } + @Test public void testStartProviders_chreOnlyChreAvailable_bleProviderNotStarted() { reset(mBluetoothController); @@ -336,4 +350,62 @@ public class DiscoveryProviderManagerTest { .isTrue(); assertThat(manager.mChreDiscoveryProvider.getFiltersLocked()).isNotNull(); } + + @Test + public void isBluetoothEnabledTest_bluetoothEnabled() { + when(mBluetoothAdapter.isEnabled()).thenReturn(true); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(true); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void isBluetoothEnabledTest_bleEnabled() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(true); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(true); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void enabledTest_enabled() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(true); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void enabledTest_enableFailed() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); + when(mBluetoothAdapter.enableBLE()).thenReturn(false); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + } + + @Test + public void enabledTest_scanIsOn() { + when(mBluetoothAdapter.isEnabled()).thenReturn(true); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + } + + @Test + public void enabledTest_failed() { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); + when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); + + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + } } From 64e14583cc7f4c0e5e2d7f8c3cde32a1130dc9bc Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:52:56 +0000 Subject: [PATCH 09/13] [nearby] Sync discoveryTimestamp field name Test: -m Bug: 306043245 Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d6acb0655f4fa619bd0ff7a6e7a1a76959db29d9) Merged-In: I96e03660dbd49f361a436276d62473504f88d657 Change-Id: I96e03660dbd49f361a436276d62473504f88d657 --- .../server/nearby/provider/ChreDiscoveryProvider.java | 10 +++++++--- nearby/service/proto/src/presence/blefilter.proto | 4 +++- .../nearby/provider/ChreDiscoveryProviderTest.java | 8 ++++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java b/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java index 035da294bf..21ec2520d3 100644 --- a/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java +++ b/nearby/service/java/com/android/server/nearby/provider/ChreDiscoveryProvider.java @@ -20,6 +20,9 @@ import static android.nearby.ScanRequest.SCAN_TYPE_NEARBY_PRESENCE; import static com.android.server.nearby.NearbyService.TAG; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.Context; @@ -350,9 +353,10 @@ public class ChreDiscoveryProvider extends AbstractDiscoveryProvider { DataElement.DataType.ACTION, new byte[]{(byte) filterResult.getIntent()})); } - if (filterResult.hasDiscoveryTimestamp()) { - presenceDeviceBuilder.setDiscoveryTimestampMillis( - filterResult.getDiscoveryTimestamp()); + if (filterResult.hasTimestampNs()) { + presenceDeviceBuilder + .setDiscoveryTimestampMillis(MILLISECONDS.convert( + filterResult.getTimestampNs(), NANOSECONDS)); } PublicCredential publicCredential = new PublicCredential.Builder( diff --git a/nearby/service/proto/src/presence/blefilter.proto b/nearby/service/proto/src/presence/blefilter.proto index 01f16cb961..bf9357b286 100644 --- a/nearby/service/proto/src/presence/blefilter.proto +++ b/nearby/service/proto/src/presence/blefilter.proto @@ -115,7 +115,9 @@ message BleFilterResult { repeated DataElement data_element = 7; optional bytes ble_service_data = 8; optional ResultType result_type = 9; - optional uint64 discovery_timestamp = 10; // Timestamp when the device is discovered. + // Timestamp when the device is discovered, in nanoseconds, + // relative to Android SystemClock.elapsedRealtimeNanos(). + optional uint64 timestamp_ns = 10; } message BleFilterResults { diff --git a/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java b/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java index 1f727a7664..8ee661f300 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/provider/ChreDiscoveryProviderTest.java @@ -192,7 +192,7 @@ public class ChreDiscoveryProviderTest { @Test @SdkSuppress(minSdkVersion = 32, codeName = "T") - public void testOnNearbyDeviceDiscoveredWithDataElements() { + public void testOnNearbyDeviceDiscoveredWithDataElements_TIME() { // Disables the setting of test app support boolean isSupportedTestApp = getDeviceConfigBoolean( NEARBY_SUPPORT_TEST_APP, false /* defaultValue */); @@ -209,6 +209,7 @@ public class ChreDiscoveryProviderTest { // First byte is length of service data, padding zeros should be thrown away. final byte [] bleServiceData = new byte[] {5, 1, 2, 3, 4, 5, 0, 0, 0, 0}; final byte [] testData = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + final long timestampNs = 1697765417070000000L; final List expectedExtendedProperties = new ArrayList<>(); expectedExtendedProperties.add(new DataElement(DATA_TYPE_CONNECTION_STATUS_KEY, @@ -262,7 +263,7 @@ public class ChreDiscoveryProviderTest { .setValue(ByteString.copyFrom(testData)) .setValueLength(testData.length) ) - .setDiscoveryTimestamp(1697765417070L) + .setTimestampNs(timestampNs) .build(); Blefilter.BleFilterResults results = Blefilter.BleFilterResults.newBuilder().addResult(result).build(); @@ -286,6 +287,9 @@ public class ChreDiscoveryProviderTest { DeviceConfig.setProperty(NAMESPACE, NEARBY_SUPPORT_TEST_APP, "true", false); assertThat(new NearbyConfiguration().isTestAppSupported()).isTrue(); } + // Nanoseconds to Milliseconds + assertThat((mNearbyDevice.getValue().getPresenceDevice()) + .getDiscoveryTimestampMillis()).isEqualTo(timestampNs / 1000000); } @Test From 4dfc0895316272fe3cbb64fe65495bfda4dd7f26 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:53:05 +0000 Subject: [PATCH 10/13] [nearby] Log changes Test: -m Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:2a4cadec922725cf89992103f6ade337d5a8ec86) Merged-In: I11a03bd3bf40cd7cd6f0ac892f040c9eb3ce822c Change-Id: I11a03bd3bf40cd7cd6f0ac892f040c9eb3ce822c --- .../managers/DiscoveryProviderManager.java | 2 +- .../DiscoveryProviderManagerLegacy.java | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java index 5797d3d25b..5c04a6cf28 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java @@ -245,7 +245,7 @@ public class DiscoveryProviderManager extends @GuardedBy("mMultiplexerLock") private void startBleProvider(Set scanFilters) { if (!mBleDiscoveryProvider.getController().isStarted()) { - Log.d(TAG, "DiscoveryProviderManager starts Ble scanning."); + Log.d(TAG, "DiscoveryProviderManager starts BLE scanning."); mBleDiscoveryProvider.getController().setListener(this); mBleDiscoveryProvider.getController().setProviderScanMode(mMerged.getScanMode()); mBleDiscoveryProvider.getController().setProviderScanFilters( diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java index df33773278..549a6bf757 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java @@ -143,18 +143,18 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider for (IBinder listenerBinder : mScanTypeScanListenerRecordMap.keySet()) { ScanListenerRecord record = mScanTypeScanListenerRecordMap.get(listenerBinder); if (record == null) { - Log.w(TAG, "DiscoveryProviderManager cannot find the scan record."); + Log.w(TAG, "DiscoveryProviderManagerLegacy cannot find the scan record."); continue; } CallerIdentity callerIdentity = record.getCallerIdentity(); if (!DiscoveryPermissions.noteDiscoveryResultDelivery( appOpsManager, callerIdentity)) { - Log.w(TAG, "[DiscoveryProviderManager] scan permission revoked " + Log.w(TAG, "[DiscoveryProviderManagerLegacy] scan permission revoked " + "- not forwarding results"); try { record.getScanListener().onError(ScanCallback.ERROR_PERMISSION_DENIED); } catch (RemoteException e) { - Log.w(TAG, "DiscoveryProviderManager failed to report error.", e); + Log.w(TAG, "DiscoveryProviderManagerLegacy failed to report error.", e); } return; } @@ -181,7 +181,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider NearbyMetrics.logScanDeviceDiscovered( record.hashCode(), record.getScanRequest(), nearbyDevice); } catch (RemoteException e) { - Log.w(TAG, "DiscoveryProviderManager failed to report onDiscovered.", e); + Log.w(TAG, "DiscoveryProviderManagerLegacy failed to report onDiscovered.", e); } } } @@ -194,18 +194,18 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider for (IBinder listenerBinder : mScanTypeScanListenerRecordMap.keySet()) { ScanListenerRecord record = mScanTypeScanListenerRecordMap.get(listenerBinder); if (record == null) { - Log.w(TAG, "DiscoveryProviderManager cannot find the scan record."); + Log.w(TAG, "DiscoveryProviderManagerLegacy cannot find the scan record."); continue; } CallerIdentity callerIdentity = record.getCallerIdentity(); if (!DiscoveryPermissions.noteDiscoveryResultDelivery( appOpsManager, callerIdentity)) { - Log.w(TAG, "[DiscoveryProviderManager] scan permission revoked " + Log.w(TAG, "[DiscoveryProviderManagerLegacy] scan permission revoked " + "- not forwarding results"); try { record.getScanListener().onError(ScanCallback.ERROR_PERMISSION_DENIED); } catch (RemoteException e) { - Log.w(TAG, "DiscoveryProviderManager failed to report error.", e); + Log.w(TAG, "DiscoveryProviderManagerLegacy failed to report error.", e); } return; } @@ -213,7 +213,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider try { record.getScanListener().onError(errorCode); } catch (RemoteException e) { - Log.w(TAG, "DiscoveryProviderManager failed to report onError.", e); + Log.w(TAG, "DiscoveryProviderManagerLegacy failed to report onError.", e); } } } @@ -296,10 +296,10 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider if (listenerBinder != null && deathRecipient != null) { listenerBinder.unlinkToDeath(removedRecord.getDeathRecipient(), 0); } - Log.v(TAG, "DiscoveryProviderManager unregistered scan listener."); + Log.v(TAG, "DiscoveryProviderManagerLegacy unregistered scan listener."); NearbyMetrics.logScanStopped(removedRecord.hashCode(), removedRecord.getScanRequest()); if (mScanTypeScanListenerRecordMap.isEmpty()) { - Log.v(TAG, "DiscoveryProviderManager stops provider because there is no " + Log.v(TAG, "DiscoveryProviderManagerLegacy stops provider because there is no " + "scan listener registered."); stopProviders(); return; @@ -309,8 +309,8 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider // Removes current highest scan mode requested and sets the next highest scan mode. if (removedRecord.getScanRequest().getScanMode() == mScanMode) { - Log.v(TAG, "DiscoveryProviderManager starts to find the new highest scan mode " - + "because the highest scan mode listener was unregistered."); + Log.v(TAG, "DiscoveryProviderManagerLegacy starts to find the new highest " + + "scan mode because the highest scan mode listener was unregistered."); @ScanRequest.ScanMode int highestScanModeRequested = ScanRequest.SCAN_MODE_NO_POWER; // find the next highest scan mode; for (ScanListenerRecord record : mScanTypeScanListenerRecordMap.values()) { @@ -380,7 +380,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider private void startBleProvider(List scanFilters) { if (!mBleDiscoveryProvider.getController().isStarted()) { - Log.d(TAG, "DiscoveryProviderManager starts Ble scanning."); + Log.d(TAG, "DiscoveryProviderManagerLegacy starts BLE scanning."); mBleDiscoveryProvider.getController().setListener(this); mBleDiscoveryProvider.getController().setProviderScanMode(mScanMode); mBleDiscoveryProvider.getController().setProviderScanFilters(scanFilters); @@ -390,7 +390,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider @VisibleForTesting void startChreProvider(List scanFilters) { - Log.d(TAG, "DiscoveryProviderManager starts CHRE scanning."); + Log.d(TAG, "DiscoveryProviderManagerLegacy starts CHRE scanning."); mChreDiscoveryProvider.getController().setProviderScanFilters(scanFilters); mChreDiscoveryProvider.getController().setProviderScanMode(mScanMode); mChreDiscoveryProvider.getController().start(); From 164969d6002957cd9c23545bb4a358adb6dd51b6 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:53:12 +0000 Subject: [PATCH 11/13] [nearby] Add disable logic Also moves enableBLE logic from init to when there is at least one client Test: -m Bug: 294906731 Ignore-AOSP-First: nearby_not_in_aosp_yet (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3f5aea69f9f36097b407822b0cc177c0df51f061) Merged-In: I24ca7581d60afee484d14f66a411344ce132425a Change-Id: I24ca7581d60afee484d14f66a411344ce132425a --- .../managers/DiscoveryProviderManager.java | 20 +++++++++++-- .../DiscoveryProviderManagerLegacy.java | 25 +++++++++++++--- .../DiscoveryProviderManagerLegacyTest.java | 20 ++++++++----- .../DiscoveryProviderManagerTest.java | 29 ++++++++++++++----- 4 files changed, 72 insertions(+), 22 deletions(-) diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java index 5c04a6cf28..fe952fea69 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java @@ -142,8 +142,6 @@ public class DiscoveryProviderManager extends /** Called after boot completed. */ public void init() { - // Register BLE only scan when Bluetooth is turned off - setBleScanEnabled(); if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } @@ -167,12 +165,14 @@ public class DiscoveryProviderManager extends @Override public void onRegister() { Log.v(TAG, "Registering the DiscoveryProviderManager."); + enableBle(); startProviders(); } @Override public void onUnregister() { Log.v(TAG, "Unregistering the DiscoveryProviderManager."); + disableBle(); stopProviders(); } @@ -322,7 +322,7 @@ public class DiscoveryProviderManager extends * @return {@code true} when Nearby currently can scan through Bluetooth or Ble or successfully * registers Nearby service to Ble scan when Blutooth is off. */ - public boolean setBleScanEnabled() { + public boolean enableBle() { BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); if (adapter == null) { Log.e(TAG, "BluetoothAdapter is null."); @@ -341,4 +341,18 @@ public class DiscoveryProviderManager extends } return true; } + + /** + * Unregisters Nearby service to Ble. + * Ble can be disabled when there is no app register the Ble service, so we can only to know we + * successfully unregister Ble by getting result from {@link BluetoothAdapter#disableBle()}. + */ + public boolean disableBle() { + BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); + if (adapter == null) { + Log.e(TAG, "BluetoothAdapter is null."); + return false; + } + return adapter.disableBLE(); + } } diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java index 549a6bf757..65168d0ca4 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java @@ -221,8 +221,6 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider /** Called after boot completed. */ public void init() { - // Register BLE only scan when Bluetooth is turned off - setBleScanEnabled(); if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } @@ -346,6 +344,9 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider Log.w(TAG, "failed to start any provider because client disabled BLE"); return false; } + if (!enableBle()) { + return false; + } List scanFilters = getPresenceScanFilters(); boolean chreOnly = isChreOnly(scanFilters); Boolean chreAvailable = mChreDiscoveryProvider.available(); @@ -413,7 +414,9 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider } } - private void stopProviders() { + @VisibleForTesting + protected void stopProviders() { + disableBle(); stopBleProvider(); stopChreProvider(); } @@ -512,7 +515,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider * @return {@code true} when Nearby currently can scan through Bluetooth or Ble or successfully * registers Nearby service to Ble scan when Blutooth is off. */ - public boolean setBleScanEnabled() { + public boolean enableBle() { BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); if (adapter == null) { Log.e(TAG, "BluetoothAdapter is null."); @@ -531,4 +534,18 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider } return true; } + + /** + * Unregisters Nearby service to Ble. + * Ble can be disabled when there is no app register the Ble service, so we can only to know we + * successfully unregister Ble by getting result from {@link BluetoothAdapter#disableBle()}. + */ + public boolean disableBle() { + BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); + if (adapter == null) { + Log.e(TAG, "BluetoothAdapter is null."); + return false; + } + return adapter.disableBLE(); + } } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java index a8c30a86a9..c04cb38c57 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java @@ -173,7 +173,10 @@ public class DiscoveryProviderManagerLegacyTest { @Test public void test_enableBleWhenBleOff() throws Exception { when(mBluetoothAdapter.isEnabled()).thenReturn(false); - mDiscoveryProviderManager.init(); + ScanRequest scanRequest = new ScanRequest.Builder() + .setScanType(SCAN_TYPE_NEARBY_PRESENCE) + .addScanFilter(getChreOnlyPresenceScanFilter()).build(); + mDiscoveryProviderManager.startProviders(scanRequest); verify(mBluetoothAdapter, times(1)).enableBLE(); } @@ -333,9 +336,10 @@ public class DiscoveryProviderManagerLegacyTest { .isTrue(); assertThat(manager.mChreDiscoveryProvider.getFiltersLocked()).isNotNull(); - manager.stopChreProvider(); + manager.stopProviders(); Thread.sleep(200); // The filters should be cleared right after. + verify(mBluetoothAdapter, times(1)).disableBLE(); assertThat(manager.mChreDiscoveryProvider.getController().isStarted()) .isFalse(); assertThat(manager.mChreDiscoveryProvider.getFiltersLocked()).isEmpty(); @@ -397,7 +401,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -407,7 +411,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -417,7 +421,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -427,7 +431,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(false); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); } @Test @@ -436,7 +440,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -445,6 +449,6 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); } } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java index b05893fa4d..d747e59534 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java @@ -166,10 +166,25 @@ public class DiscoveryProviderManagerTest { @Test public void test_enableBleWhenBleOff() throws Exception { when(mBluetoothAdapter.isEnabled()).thenReturn(false); - mDiscoveryProviderManager.init(); + ScanRequest scanRequest = new ScanRequest.Builder() + .setScanType(SCAN_TYPE_NEARBY_PRESENCE) + .addScanFilter(getChreOnlyPresenceScanFilter()).build(); + mDiscoveryProviderManager.registerScanListener(scanRequest, mScanListener, mCallerIdentity); verify(mBluetoothAdapter, times(1)).enableBLE(); } + @Test + public void test_disBleBleWhenNoClient() throws Exception { + when(mBluetoothAdapter.isEnabled()).thenReturn(false); + ScanRequest scanRequest = new ScanRequest.Builder() + .setScanType(SCAN_TYPE_NEARBY_PRESENCE) + .addScanFilter(getChreOnlyPresenceScanFilter()).build(); + mDiscoveryProviderManager.registerScanListener(scanRequest, mScanListener, mCallerIdentity); + verify(mBluetoothAdapter, times(1)).enableBLE(); + mDiscoveryProviderManager.unregisterScanListener(mScanListener); + verify(mBluetoothAdapter, times(1)).disableBLE(); + } + @Test public void testStartProviders_chreOnlyChreAvailable_bleProviderNotStarted() { reset(mBluetoothController); @@ -358,7 +373,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -368,7 +383,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -378,7 +393,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -388,7 +403,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(false); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); } @Test @@ -397,7 +412,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); + assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); } @Test @@ -406,6 +421,6 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); + assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); } } From 11234fe8c1a8cb5296b46df5f4e441cf65de955e Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:53:21 +0000 Subject: [PATCH 12/13] Revert "[nearby] Add disable logic" This reverts commit 3f5aea69f9f36097b407822b0cc177c0df51f061. Reason for revert: Caused crash Fix: 312430336 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:4ed63b1873841a37f3ebbef5ff5072a253fa6186) Merged-In: Id664a6cba297674d8edeb0af700df1e96baaf70e Change-Id: Id664a6cba297674d8edeb0af700df1e96baaf70e --- .../managers/DiscoveryProviderManager.java | 20 ++----------- .../DiscoveryProviderManagerLegacy.java | 25 +++------------- .../DiscoveryProviderManagerLegacyTest.java | 20 +++++-------- .../DiscoveryProviderManagerTest.java | 29 +++++-------------- 4 files changed, 22 insertions(+), 72 deletions(-) diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java index fe952fea69..5c04a6cf28 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java @@ -142,6 +142,8 @@ public class DiscoveryProviderManager extends /** Called after boot completed. */ public void init() { + // Register BLE only scan when Bluetooth is turned off + setBleScanEnabled(); if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } @@ -165,14 +167,12 @@ public class DiscoveryProviderManager extends @Override public void onRegister() { Log.v(TAG, "Registering the DiscoveryProviderManager."); - enableBle(); startProviders(); } @Override public void onUnregister() { Log.v(TAG, "Unregistering the DiscoveryProviderManager."); - disableBle(); stopProviders(); } @@ -322,7 +322,7 @@ public class DiscoveryProviderManager extends * @return {@code true} when Nearby currently can scan through Bluetooth or Ble or successfully * registers Nearby service to Ble scan when Blutooth is off. */ - public boolean enableBle() { + public boolean setBleScanEnabled() { BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); if (adapter == null) { Log.e(TAG, "BluetoothAdapter is null."); @@ -341,18 +341,4 @@ public class DiscoveryProviderManager extends } return true; } - - /** - * Unregisters Nearby service to Ble. - * Ble can be disabled when there is no app register the Ble service, so we can only to know we - * successfully unregister Ble by getting result from {@link BluetoothAdapter#disableBle()}. - */ - public boolean disableBle() { - BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); - if (adapter == null) { - Log.e(TAG, "BluetoothAdapter is null."); - return false; - } - return adapter.disableBLE(); - } } diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java index 65168d0ca4..549a6bf757 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java @@ -221,6 +221,8 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider /** Called after boot completed. */ public void init() { + // Register BLE only scan when Bluetooth is turned off + setBleScanEnabled(); if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } @@ -344,9 +346,6 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider Log.w(TAG, "failed to start any provider because client disabled BLE"); return false; } - if (!enableBle()) { - return false; - } List scanFilters = getPresenceScanFilters(); boolean chreOnly = isChreOnly(scanFilters); Boolean chreAvailable = mChreDiscoveryProvider.available(); @@ -414,9 +413,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider } } - @VisibleForTesting - protected void stopProviders() { - disableBle(); + private void stopProviders() { stopBleProvider(); stopChreProvider(); } @@ -515,7 +512,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider * @return {@code true} when Nearby currently can scan through Bluetooth or Ble or successfully * registers Nearby service to Ble scan when Blutooth is off. */ - public boolean enableBle() { + public boolean setBleScanEnabled() { BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); if (adapter == null) { Log.e(TAG, "BluetoothAdapter is null."); @@ -534,18 +531,4 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider } return true; } - - /** - * Unregisters Nearby service to Ble. - * Ble can be disabled when there is no app register the Ble service, so we can only to know we - * successfully unregister Ble by getting result from {@link BluetoothAdapter#disableBle()}. - */ - public boolean disableBle() { - BluetoothAdapter adapter = mInjector.getBluetoothAdapter(); - if (adapter == null) { - Log.e(TAG, "BluetoothAdapter is null."); - return false; - } - return adapter.disableBLE(); - } } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java index c04cb38c57..a8c30a86a9 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java @@ -173,10 +173,7 @@ public class DiscoveryProviderManagerLegacyTest { @Test public void test_enableBleWhenBleOff() throws Exception { when(mBluetoothAdapter.isEnabled()).thenReturn(false); - ScanRequest scanRequest = new ScanRequest.Builder() - .setScanType(SCAN_TYPE_NEARBY_PRESENCE) - .addScanFilter(getChreOnlyPresenceScanFilter()).build(); - mDiscoveryProviderManager.startProviders(scanRequest); + mDiscoveryProviderManager.init(); verify(mBluetoothAdapter, times(1)).enableBLE(); } @@ -336,10 +333,9 @@ public class DiscoveryProviderManagerLegacyTest { .isTrue(); assertThat(manager.mChreDiscoveryProvider.getFiltersLocked()).isNotNull(); - manager.stopProviders(); + manager.stopChreProvider(); Thread.sleep(200); // The filters should be cleared right after. - verify(mBluetoothAdapter, times(1)).disableBLE(); assertThat(manager.mChreDiscoveryProvider.getController().isStarted()) .isFalse(); assertThat(manager.mChreDiscoveryProvider.getFiltersLocked()).isEmpty(); @@ -401,7 +397,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -411,7 +407,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -421,7 +417,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -431,7 +427,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(false); - assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); } @Test @@ -440,7 +436,7 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -449,6 +445,6 @@ public class DiscoveryProviderManagerLegacyTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); } } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java index d747e59534..b05893fa4d 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java @@ -166,25 +166,10 @@ public class DiscoveryProviderManagerTest { @Test public void test_enableBleWhenBleOff() throws Exception { when(mBluetoothAdapter.isEnabled()).thenReturn(false); - ScanRequest scanRequest = new ScanRequest.Builder() - .setScanType(SCAN_TYPE_NEARBY_PRESENCE) - .addScanFilter(getChreOnlyPresenceScanFilter()).build(); - mDiscoveryProviderManager.registerScanListener(scanRequest, mScanListener, mCallerIdentity); + mDiscoveryProviderManager.init(); verify(mBluetoothAdapter, times(1)).enableBLE(); } - @Test - public void test_disBleBleWhenNoClient() throws Exception { - when(mBluetoothAdapter.isEnabled()).thenReturn(false); - ScanRequest scanRequest = new ScanRequest.Builder() - .setScanType(SCAN_TYPE_NEARBY_PRESENCE) - .addScanFilter(getChreOnlyPresenceScanFilter()).build(); - mDiscoveryProviderManager.registerScanListener(scanRequest, mScanListener, mCallerIdentity); - verify(mBluetoothAdapter, times(1)).enableBLE(); - mDiscoveryProviderManager.unregisterScanListener(mScanListener); - verify(mBluetoothAdapter, times(1)).disableBLE(); - } - @Test public void testStartProviders_chreOnlyChreAvailable_bleProviderNotStarted() { reset(mBluetoothController); @@ -373,7 +358,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -383,7 +368,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -393,7 +378,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(true); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -403,7 +388,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true); when(mBluetoothAdapter.enableBLE()).thenReturn(false); - assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); } @Test @@ -412,7 +397,7 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.enableBle()).isTrue(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue(); } @Test @@ -421,6 +406,6 @@ public class DiscoveryProviderManagerTest { when(mBluetoothAdapter.isLeEnabled()).thenReturn(false); when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false); - assertThat(mDiscoveryProviderManager.enableBle()).isFalse(); + assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse(); } } From f83d4df182c853b1718e22ba8ee3b8201f49d8e6 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 12 Dec 2023 19:53:31 +0000 Subject: [PATCH 13/13] [nearby] Add nearby_enable_ble_in_init flag Bug: 312430336 Ignore-AOSP-First: nearby_not_in_aosp_yet Test: -m (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:fc084ea87ce18275c788c21ba9018636dfdff5e0) Merged-In: I5bafa8a85d4f2169fcdef73e2d9f21534553ff72 Change-Id: I5bafa8a85d4f2169fcdef73e2d9f21534553ff72 --- .../server/nearby/NearbyConfiguration.java | 18 ++++++++++++++++++ .../managers/DiscoveryProviderManager.java | 8 +++++++- .../DiscoveryProviderManagerLegacy.java | 8 +++++++- .../DiscoveryProviderManagerLegacyTest.java | 5 +++++ .../managers/DiscoveryProviderManagerTest.java | 5 +++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/nearby/service/java/com/android/server/nearby/NearbyConfiguration.java b/nearby/service/java/com/android/server/nearby/NearbyConfiguration.java index 9b32d699bb..9ef905d90e 100644 --- a/nearby/service/java/com/android/server/nearby/NearbyConfiguration.java +++ b/nearby/service/java/com/android/server/nearby/NearbyConfiguration.java @@ -54,6 +54,11 @@ public class NearbyConfiguration { public static final String NEARBY_REFACTOR_DISCOVERY_MANAGER = "nearby_refactor_discovery_manager"; + /** + * Flag to guard enable BLE during Nearby Service init time. + */ + public static final String NEARBY_ENABLE_BLE_IN_INIT = "nearby_enable_ble_in_init"; + private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE); private final DeviceConfigListener mDeviceConfigListener = new DeviceConfigListener(); @@ -67,6 +72,8 @@ public class NearbyConfiguration { private boolean mSupportTestApp; @GuardedBy("mDeviceConfigLock") private boolean mRefactorDiscoveryManager; + @GuardedBy("mDeviceConfigLock") + private boolean mEnableBleInInit; public NearbyConfiguration() { mDeviceConfigListener.start(); @@ -131,6 +138,15 @@ public class NearbyConfiguration { } } + /** + * @return {@code true} if enableBLE() is called during NearbyService init time. + */ + public boolean enableBleInInit() { + synchronized (mDeviceConfigLock) { + return mEnableBleInInit; + } + } + private class DeviceConfigListener implements DeviceConfig.OnPropertiesChangedListener { public void start() { DeviceConfig.addOnPropertiesChangedListener(getNamespace(), @@ -149,6 +165,8 @@ public class NearbyConfiguration { NEARBY_SUPPORT_TEST_APP, false /* defaultValue */); mRefactorDiscoveryManager = getDeviceConfigBoolean( NEARBY_REFACTOR_DISCOVERY_MANAGER, false /* defaultValue */); + mEnableBleInInit = getDeviceConfigBoolean( + NEARBY_ENABLE_BLE_IN_INIT, true /* defaultValue */); } } } diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java index 5c04a6cf28..8995232025 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManager.java @@ -36,6 +36,7 @@ import android.util.Log; import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.nearby.NearbyConfiguration; import com.android.server.nearby.injector.Injector; import com.android.server.nearby.managers.registration.DiscoveryRegistration; import com.android.server.nearby.provider.AbstractDiscoveryProvider; @@ -67,6 +68,7 @@ public class DiscoveryProviderManager extends private final BleDiscoveryProvider mBleDiscoveryProvider; private final Injector mInjector; private final Executor mExecutor; + private final NearbyConfiguration mNearbyConfiguration; public DiscoveryProviderManager(Context context, Injector injector) { Log.v(TAG, "DiscoveryProviderManager: "); @@ -76,6 +78,7 @@ public class DiscoveryProviderManager extends mChreDiscoveryProvider = new ChreDiscoveryProvider(mContext, new ChreCommunication(injector, mContext, mExecutor), mExecutor); mInjector = injector; + mNearbyConfiguration = new NearbyConfiguration(); } @VisibleForTesting @@ -87,6 +90,7 @@ public class DiscoveryProviderManager extends mInjector = injector; mBleDiscoveryProvider = bleDiscoveryProvider; mChreDiscoveryProvider = chreDiscoveryProvider; + mNearbyConfiguration = new NearbyConfiguration(); } private static boolean isChreOnly(Set scanFilters) { @@ -143,7 +147,9 @@ public class DiscoveryProviderManager extends /** Called after boot completed. */ public void init() { // Register BLE only scan when Bluetooth is turned off - setBleScanEnabled(); + if (mNearbyConfiguration.enableBleInInit()) { + setBleScanEnabled(); + } if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } diff --git a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java index 549a6bf757..3ef8fb79e0 100644 --- a/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java +++ b/nearby/service/java/com/android/server/nearby/managers/DiscoveryProviderManagerLegacy.java @@ -39,6 +39,7 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.nearby.NearbyConfiguration; import com.android.server.nearby.injector.Injector; import com.android.server.nearby.metrics.NearbyMetrics; import com.android.server.nearby.presence.PresenceDiscoveryResult; @@ -70,6 +71,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider private final Context mContext; private final BleDiscoveryProvider mBleDiscoveryProvider; private final Injector mInjector; + private final NearbyConfiguration mNearbyConfiguration; @ScanRequest.ScanMode private int mScanMode; @GuardedBy("mLock") @@ -84,6 +86,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider mContext, new ChreCommunication(injector, mContext, executor), executor); mScanTypeScanListenerRecordMap = new HashMap<>(); mInjector = injector; + mNearbyConfiguration = new NearbyConfiguration(); Log.v(TAG, "DiscoveryProviderManagerLegacy: "); } @@ -97,6 +100,7 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider mBleDiscoveryProvider = bleDiscoveryProvider; mChreDiscoveryProvider = chreDiscoveryProvider; mScanTypeScanListenerRecordMap = scanTypeScanListenerRecordMap; + mNearbyConfiguration = new NearbyConfiguration(); } private static boolean isChreOnly(List scanFilters) { @@ -222,7 +226,9 @@ public class DiscoveryProviderManagerLegacy implements AbstractDiscoveryProvider /** Called after boot completed. */ public void init() { // Register BLE only scan when Bluetooth is turned off - setBleScanEnabled(); + if (mNearbyConfiguration.enableBleInInit()) { + setBleScanEnabled(); + } if (mInjector.getContextHubManager() != null) { mChreDiscoveryProvider.init(); } diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java index a8c30a86a9..0ca571a8dc 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerLegacyTest.java @@ -16,6 +16,7 @@ package com.android.server.nearby.managers; +import static android.Manifest.permission.READ_DEVICE_CONFIG; import static android.nearby.PresenceCredential.IDENTITY_TYPE_PRIVATE; import static android.nearby.ScanRequest.SCAN_TYPE_NEARBY_PRESENCE; @@ -38,6 +39,8 @@ import android.nearby.PublicCredential; import android.nearby.ScanRequest; import android.os.IBinder; +import androidx.test.platform.app.InstrumentationRegistry; + import com.android.server.nearby.injector.Injector; import com.android.server.nearby.provider.BleDiscoveryProvider; import com.android.server.nearby.provider.ChreCommunication; @@ -139,6 +142,8 @@ public class DiscoveryProviderManagerLegacyTest { @Before public void setup() { + InstrumentationRegistry.getInstrumentation().getUiAutomation().adoptShellPermissionIdentity( + READ_DEVICE_CONFIG); MockitoAnnotations.initMocks(this); when(mInjector.getAppOpsManager()).thenReturn(mAppOpsManager); when(mInjector.getBluetoothAdapter()).thenReturn(mBluetoothAdapter); diff --git a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java index b05893fa4d..7cea34a5f6 100644 --- a/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java +++ b/nearby/tests/unit/src/com/android/server/nearby/managers/DiscoveryProviderManagerTest.java @@ -16,6 +16,7 @@ package com.android.server.nearby.managers; +import static android.Manifest.permission.READ_DEVICE_CONFIG; import static android.nearby.PresenceCredential.IDENTITY_TYPE_PRIVATE; import static android.nearby.ScanRequest.SCAN_TYPE_NEARBY_PRESENCE; @@ -39,6 +40,8 @@ import android.nearby.PublicCredential; import android.nearby.ScanRequest; import android.os.IBinder; +import androidx.test.platform.app.InstrumentationRegistry; + import com.android.server.nearby.injector.Injector; import com.android.server.nearby.provider.BleDiscoveryProvider; import com.android.server.nearby.provider.ChreCommunication; @@ -132,6 +135,8 @@ public class DiscoveryProviderManagerTest { @Before public void setup() { + InstrumentationRegistry.getInstrumentation().getUiAutomation().adoptShellPermissionIdentity( + READ_DEVICE_CONFIG); MockitoAnnotations.initMocks(this); mExecutor = Executors.newSingleThreadExecutor(); when(mInjector.getAppOpsManager()).thenReturn(mAppOpsManager);