From fc084ea87ce18275c788c21ba9018636dfdff5e0 Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Tue, 28 Nov 2023 11:49:02 -0800 Subject: [PATCH] [nearby] Add nearby_enable_ble_in_init flag Bug: 312430336 Ignore-AOSP-First: nearby_not_in_aosp_yet Test: -m 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);