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(); } }