[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
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 5c04a6c..fe952fe 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 @@
 
     /** 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 @@
     @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 @@
      * @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 @@
         }
         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 549a6bf..65168d0 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 @@
 
     /** 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 @@
             Log.w(TAG, "failed to start any provider because client disabled BLE");
             return false;
         }
+        if (!enableBle()) {
+            return false;
+        }
         List<ScanFilter> scanFilters = getPresenceScanFilters();
         boolean chreOnly = isChreOnly(scanFilters);
         Boolean chreAvailable = mChreDiscoveryProvider.available();
@@ -413,7 +414,9 @@
         }
     }
 
-    private void stopProviders() {
+    @VisibleForTesting
+    protected void stopProviders() {
+        disableBle();
         stopBleProvider();
         stopChreProvider();
     }
@@ -512,7 +515,7 @@
      * @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 @@
         }
         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 a8c30a8..c04cb38 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 @@
     @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 @@
                 .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 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(true);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -407,7 +411,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(true);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -417,7 +421,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(true);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -427,7 +431,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(false);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse();
+        assertThat(mDiscoveryProviderManager.enableBle()).isFalse();
     }
 
     @Test
@@ -436,7 +440,7 @@
         when(mBluetoothAdapter.isLeEnabled()).thenReturn(false);
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -445,6 +449,6 @@
         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 b05893f..d747e59 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,11 +166,26 @@
     @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);
         when(mChreDiscoveryProvider.available()).thenReturn(true);
@@ -358,7 +373,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(true);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -368,7 +383,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(true);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -378,7 +393,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(true);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -388,7 +403,7 @@
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(true);
         when(mBluetoothAdapter.enableBLE()).thenReturn(false);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse();
+        assertThat(mDiscoveryProviderManager.enableBle()).isFalse();
     }
 
     @Test
@@ -397,7 +412,7 @@
         when(mBluetoothAdapter.isLeEnabled()).thenReturn(false);
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isTrue();
+        assertThat(mDiscoveryProviderManager.enableBle()).isTrue();
     }
 
     @Test
@@ -406,6 +421,6 @@
         when(mBluetoothAdapter.isLeEnabled()).thenReturn(false);
         when(mBluetoothAdapter.isBleScanAlwaysAvailable()).thenReturn(false);
 
-        assertThat(mDiscoveryProviderManager.setBleScanEnabled()).isFalse();
+        assertThat(mDiscoveryProviderManager.enableBle()).isFalse();
     }
 }