Merge changes I2b50eb83,I439cb5a4 into tm-dev
* changes:
Update the event timeout seconds according to snippet side.
Refactor Fast Pair provider side.
diff --git a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/BluetoothA2dpSinkService.kt b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/BluetoothA2dpSinkService.kt
deleted file mode 100644
index f65dfab..0000000
--- a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/BluetoothA2dpSinkService.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.nearby.multidevices.fastpair.provider
-
-import android.Manifest.permission.BLUETOOTH_CONNECT
-import android.Manifest.permission.BLUETOOTH_SCAN
-import android.annotation.TargetApi
-import android.bluetooth.BluetoothClass
-import android.bluetooth.BluetoothDevice
-import android.bluetooth.BluetoothManager
-import android.bluetooth.BluetoothProfile
-import android.content.Context
-import android.os.Build
-import androidx.annotation.RequiresPermission
-import androidx.annotation.VisibleForTesting
-
-/** Maintains an environment for Bluetooth A2DP sink profile. */
-@TargetApi(Build.VERSION_CODES.LOLLIPOP)
-class BluetoothA2dpSinkService(private val context: Context) {
- private val bluetoothAdapter =
- (context.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager)?.adapter!!
- private var a2dpSinkProxy: BluetoothProfile? = null
-
- /**
- * Starts the Bluetooth A2DP sink profile proxy.
- *
- * @param onServiceConnected the callback for the first time onServiceConnected.
- */
- fun start(onServiceConnected: () -> Unit) {
- // Get the A2DP proxy before continuing with initialization.
- bluetoothAdapter.getProfileProxy(
- context,
- object : BluetoothProfile.ServiceListener {
- override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
- // When Bluetooth turns off and then on again, this is called again. But we only care
- // the first time. There doesn't seem to be a way to unregister our listener.
- if (a2dpSinkProxy == null) {
- a2dpSinkProxy = proxy
- onServiceConnected()
- }
- }
-
- override fun onServiceDisconnected(profile: Int) {}
- },
- BLUETOOTH_PROFILE_A2DP_SINK
- )
- }
-
- /**
- * Checks the device is paired or not.
- *
- * @param remoteBluetoothDevice the device to check is paired or not.
- */
- @RequiresPermission(BLUETOOTH_CONNECT)
- fun isPaired(remoteBluetoothDevice: BluetoothDevice?): Boolean =
- bluetoothAdapter.bondedDevices.contains(remoteBluetoothDevice)
-
- /**
- * Gets the current Bluetooth scan mode of the local Bluetooth adapter.
- */
- @RequiresPermission(BLUETOOTH_SCAN)
- fun getScanMode(): Int = bluetoothAdapter.scanMode
-
- /**
- * Clears the bounded devices.
- *
- * @param removeBondDevice the callback to remove bounded devices.
- */
- @RequiresPermission(BLUETOOTH_CONNECT)
- fun clearBoundedDevices(removeBondDevice: (BluetoothDevice) -> Unit) {
- for (device in bluetoothAdapter.bondedDevices) {
- if (device.bluetoothClass.majorDeviceClass == BluetoothClass.Device.Major.PHONE) {
- removeBondDevice(device)
- }
- }
- }
-
- /**
- * Clears the connected but unbounded devices.
- *
- * Sometimes a device will still be connected even though it's not bonded. :( Clear that too.
- *
- * @param disconnectDevice the callback to clear connected but unbounded devices.
- */
- fun clearConnectedUnboundedDevices(
- disconnectDevice: (BluetoothProfile, BluetoothDevice) -> Unit,
- ) {
- for (device in a2dpSinkProxy!!.connectedDevices) {
- disconnectDevice(a2dpSinkProxy!!, device)
- }
- }
-
- companion object {
- /** Hidden SystemApi field in [android.bluetooth.BluetoothProfile] interface. */
- @VisibleForTesting
- const val BLUETOOTH_PROFILE_A2DP_SINK = 11
- }
-}
diff --git a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/BluetoothStateChangeReceiver.kt b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/BluetoothStateChangeReceiver.kt
deleted file mode 100644
index f9c77f7..0000000
--- a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/BluetoothStateChangeReceiver.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.nearby.multidevices.fastpair.provider
-
-import android.Manifest.permission.BLUETOOTH
-import android.Manifest.permission.BLUETOOTH_CONNECT
-import android.bluetooth.BluetoothAdapter
-import android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE
-import android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE
-import android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE
-import android.bluetooth.BluetoothDevice
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import android.util.Log
-import androidx.annotation.RequiresPermission
-import androidx.annotation.VisibleForTesting
-
-/** Processes the state of the local Bluetooth adapter. */
-class BluetoothStateChangeReceiver(private val context: Context) : BroadcastReceiver() {
- @VisibleForTesting
- var listener: EventListener? = null
-
- /**
- * Registers this Bluetooth state change receiver.
- *
- * @param listener the listener for Bluetooth state events.
- */
- fun register(listener: EventListener) {
- this.listener = listener
- val bondStateFilter =
- IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED).apply {
- addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)
- addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)
- }
- context.registerReceiver(
- this,
- bondStateFilter,
- /* broadcastPermission= */ null,
- /* scheduler= */ null
- )
- }
-
- /** Unregisters this Bluetooth state change receiver. */
- fun unregister() {
- context.unregisterReceiver(this)
- this.listener = null
- }
-
- /**
- * Callback method for receiving Intent broadcast for Bluetooth state.
- *
- * See [android.content.BroadcastReceiver#onReceive].
- *
- * @param context the Context in which the receiver is running.
- * @param intent the Intent being received.
- */
- @RequiresPermission(allOf = [BLUETOOTH, BLUETOOTH_CONNECT])
- override fun onReceive(context: Context, intent: Intent) {
- Log.i(TAG, "BluetoothStateChangeReceiver received intent, action=${intent.action}")
-
- when (intent.action) {
- BluetoothAdapter.ACTION_SCAN_MODE_CHANGED -> {
- val scanMode =
- intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, SCAN_MODE_NONE)
- val scanModeStr = scanModeToString(scanMode)
- Log.i(TAG, "ACTION_SCAN_MODE_CHANGED, the new scanMode: $scanModeStr")
- listener?.onScanModeChange(scanModeStr)
- }
- BluetoothDevice.ACTION_BOND_STATE_CHANGED -> {
- val remoteDevice = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
- val remoteDeviceString =
- if (remoteDevice != null) "${remoteDevice.name}-${remoteDevice.address}" else "none"
- var boundStateString = "ERROR"
- when (intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR)) {
- BluetoothDevice.BOND_NONE -> {
- boundStateString = "BOND_NONE"
- }
- BluetoothDevice.BOND_BONDING -> {
- boundStateString = "BOND_BONDING"
- }
- BluetoothDevice.BOND_BONDED -> {
- boundStateString = "BOND_BONDED"
- }
- }
- Log.i(
- TAG,
- "The bound state of the remote device ($remoteDeviceString) change to $boundStateString."
- )
- }
- else -> {}
- }
- }
-
- private fun scanModeToString(scanMode: Int): String {
- return when (scanMode) {
- SCAN_MODE_CONNECTABLE_DISCOVERABLE -> "DISCOVERABLE"
- SCAN_MODE_CONNECTABLE -> "CONNECTABLE"
- SCAN_MODE_NONE -> "NOT CONNECTABLE"
- else -> "UNKNOWN($scanMode)"
- }
- }
-
- /** Interface for listening the events from Bluetooth adapter. */
- interface EventListener {
- /**
- * Reports the current scan mode of the local Adapter.
- *
- * @param mode the current scan mode in string.
- */
- fun onScanModeChange(mode: String)
- }
-
- companion object {
- private const val TAG = "BluetoothStateReceiver"
- }
-}
diff --git a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorController.kt b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorController.kt
new file mode 100644
index 0000000..0eacb71
--- /dev/null
+++ b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorController.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.nearby.multidevices.fastpair.provider
+
+import android.bluetooth.le.AdvertiseSettings
+import android.content.Context
+import android.nearby.fastpair.provider.FastPairSimulator
+import android.nearby.fastpair.provider.bluetooth.BluetoothController
+import com.google.android.mobly.snippet.util.Log
+import com.google.common.io.BaseEncoding
+
+class FastPairProviderSimulatorController(
+ private val context: Context,
+ private val modelId: String,
+ private val antiSpoofingKeyString: String,
+ private val eventListener: EventListener,
+) : BluetoothController.EventListener {
+ private lateinit var bluetoothController: BluetoothController
+ lateinit var simulator: FastPairSimulator
+
+ fun startProviderSimulator() {
+ bluetoothController = BluetoothController(context, this)
+ bluetoothController.registerBluetoothStateReceiver()
+ bluetoothController.enableBluetooth()
+ bluetoothController.connectA2DPSinkProfile()
+ }
+
+ fun stopProviderSimulator() {
+ simulator.destroy()
+ bluetoothController.unregisterBluetoothStateReceiver()
+ }
+
+ override fun onA2DPSinkProfileConnected() {
+ createFastPairSimulator()
+ }
+
+ override fun onBondStateChanged(bondState: Int) {
+ }
+
+ override fun onConnectionStateChanged(connectionState: Int) {
+ }
+
+ override fun onScanModeChange(mode: Int) {
+ eventListener.onScanModeChange(FastPairSimulator.scanModeToString(mode))
+ }
+
+ private fun createFastPairSimulator() {
+ val antiSpoofingKey = BaseEncoding.base64().decode(antiSpoofingKeyString)
+ simulator = FastPairSimulator(context, FastPairSimulator.Options.builder(modelId)
+ .setAdvertisingModelId(modelId)
+ .setBluetoothAddress(null)
+ .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
+ .setAdvertisingChangedCallback {
+ val isAdvertising = simulator.isAdvertising
+ Log.i("FastPairSimulator callback(), isAdvertising: $isAdvertising")
+ eventListener.onAdvertisingChange(isAdvertising)
+ }
+ .setAntiSpoofingPrivateKey(antiSpoofingKey)
+ .setUseRandomSaltForAccountKeyRotation(false)
+ .setDataOnlyConnection(false)
+ .setShowsPasskeyConfirmation(false)
+ .setRemoveAllDevicesDuringPairing(true)
+ .build())
+ }
+
+ /** Interface for listening the events from Fast Pair Provider Simulator. */
+ interface EventListener {
+ /**
+ * Reports the current scan mode of the local Adapter.
+ *
+ * @param mode the current scan mode in string.
+ */
+ fun onScanModeChange(mode: String)
+
+ /**
+ * Indicates the advertising state of the Fast Pair provider simulator has changed.
+ *
+ * @param isAdvertising the current advertising state, true if advertising otherwise false.
+ */
+ fun onAdvertisingChange(isAdvertising: Boolean)
+ }
+}
\ No newline at end of file
diff --git a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorSnippet.kt b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorSnippet.kt
index a03085c..356823e 100644
--- a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorSnippet.kt
+++ b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/FastPairProviderSimulatorSnippet.kt
@@ -17,25 +17,18 @@
package android.nearby.multidevices.fastpair.provider
import android.annotation.TargetApi
-import android.bluetooth.le.AdvertiseSettings
import android.content.Context
import android.os.Build
import androidx.test.platform.app.InstrumentationRegistry
-import android.nearby.fastpair.provider.FastPairSimulator
import com.google.android.mobly.snippet.Snippet
import com.google.android.mobly.snippet.rpc.AsyncRpc
import com.google.android.mobly.snippet.rpc.Rpc
-import com.google.android.mobly.snippet.util.Log
-import com.google.common.io.BaseEncoding.base64
/** Expose Mobly RPC methods for Python side to simulate fast pair provider role. */
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
class FastPairProviderSimulatorSnippet : Snippet {
private val context: Context = InstrumentationRegistry.getInstrumentation().context
- private val bluetoothA2dpSinkService = BluetoothA2dpSinkService(context)
- private val bluetoothStateChangeReceiver = BluetoothStateChangeReceiver(context)
- private lateinit var fastPairSimulator: FastPairSimulator
- private lateinit var providerStatusEvents: ProviderStatusEvents
+ private lateinit var fastPairProviderSimulatorController: FastPairProviderSimulatorController
/**
* Starts the Fast Pair provider simulator.
@@ -47,47 +40,21 @@
*/
@AsyncRpc(description = "Starts FP provider simulator for seekers to discover.")
fun startProviderSimulator(callbackId: String, modelId: String, antiSpoofingKeyString: String) {
- providerStatusEvents = ProviderStatusEvents(callbackId)
- bluetoothStateChangeReceiver.register(listener = providerStatusEvents)
- bluetoothA2dpSinkService.start { createFastPairSimulator(modelId, antiSpoofingKeyString) }
+ fastPairProviderSimulatorController = FastPairProviderSimulatorController(
+ context, modelId, antiSpoofingKeyString, ProviderStatusEvents(callbackId)
+ )
+ fastPairProviderSimulatorController.startProviderSimulator()
}
/** Stops the Fast Pair provider simulator. */
@Rpc(description = "Stops FP provider simulator.")
fun stopProviderSimulator() {
- fastPairSimulator.destroy()
- bluetoothStateChangeReceiver.unregister()
+ fastPairProviderSimulatorController.stopProviderSimulator()
}
/** Gets BLE mac address of the Fast Pair provider simulator. */
@Rpc(description = "Gets BLE mac address of the Fast Pair provider simulator.")
fun getBluetoothLeAddress(): String {
- return fastPairSimulator.bleAddress!!
- }
-
- private fun createFastPairSimulator(modelId: String, antiSpoofingKeyString: String) {
- val antiSpoofingKey = base64().decode(antiSpoofingKeyString)
- fastPairSimulator =
- FastPairSimulator(
- context,
- FastPairSimulator.Options.builder(
- modelId
- )
- .setAdvertisingModelId(modelId)
- .setBluetoothAddress(null)
- .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
- .setCallback {
- val isAdvertising = fastPairSimulator.isAdvertising
- Log.i("FastPairSimulator callback(), isAdvertising: $isAdvertising")
- providerStatusEvents.onAdvertisingChange(isAdvertising)
- }
- .setAntiSpoofingPrivateKey(antiSpoofingKey)
- .setUseRandomSaltForAccountKeyRotation(false)
- .setDataOnlyConnection(false)
- .setIsMemoryTest(false)
- .setShowsPasskeyConfirmation(false)
- .setRemoveAllDevicesDuringPairing(true)
- .build()
- )
+ return fastPairProviderSimulatorController.simulator.bleAddress!!
}
}
diff --git a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/ProviderStatusEvents.kt b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/ProviderStatusEvents.kt
index eef4b8b..20983d3 100644
--- a/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/ProviderStatusEvents.kt
+++ b/nearby/tests/multidevices/clients/src/android/nearby/multidevices/fastpair/provider/ProviderStatusEvents.kt
@@ -20,7 +20,7 @@
/** The Mobly snippet events to report to the Python side. */
class ProviderStatusEvents(private val callbackId: String) :
- BluetoothStateChangeReceiver.EventListener {
+ FastPairProviderSimulatorController.EventListener {
/**
* Indicates the Bluetooth scan mode of the Fast Pair provider simulator has changed.
@@ -36,7 +36,7 @@
*
* @param isAdvertising the current advertising state, true if advertising otherwise false.
*/
- fun onAdvertisingChange(isAdvertising: Boolean) {
+ override fun onAdvertisingChange(isAdvertising: Boolean) {
postSnippetEvent(callbackId, "onAdvertisingChange") {
putBoolean("isAdvertising", isAdvertising)
}
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/AppLogger.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/AppLogger.java
deleted file mode 100644
index befc64b..0000000
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/AppLogger.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.nearby.fastpair.provider.simulator.app;
-
-import android.util.Log;
-
-import com.google.errorprone.annotations.FormatMethod;
-
-/** Sends log to logcat with TAG. */
-public class AppLogger {
- private static final String TAG = "FastPairSimulator";
-
- @FormatMethod
- public static void log(String message, Object... objects) {
- Log.i(TAG, String.format(message, objects));
- }
-
- @FormatMethod
- public static void warning(String message, Object... objects) {
- Log.w(TAG, String.format(message, objects));
- }
-
- @FormatMethod
- public static void error(String message, Object... objects) {
- Log.e(TAG, String.format(message, objects));
- }
-
- private AppLogger() {
- }
-}
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java
index 9252173..97f3bf4 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java
@@ -20,8 +20,6 @@
import static android.nearby.fastpair.provider.simulator.SimulatorStreamProtocol.Event.Code.BLUETOOTH_STATE_BOND;
import static android.nearby.fastpair.provider.simulator.SimulatorStreamProtocol.Event.Code.BLUETOOTH_STATE_CONNECTION;
import static android.nearby.fastpair.provider.simulator.SimulatorStreamProtocol.Event.Code.BLUETOOTH_STATE_SCAN_MODE;
-import static android.nearby.fastpair.provider.simulator.app.AppLogger.log;
-import static android.nearby.fastpair.provider.simulator.app.AppLogger.warning;
import static com.google.common.io.BaseEncoding.base16;
import static com.google.common.io.BaseEncoding.base64;
@@ -41,6 +39,7 @@
import android.nearby.fastpair.provider.FastPairSimulator.BatteryValue;
import android.nearby.fastpair.provider.FastPairSimulator.KeyInputCallback;
import android.nearby.fastpair.provider.FastPairSimulator.PasskeyEventCallback;
+import android.nearby.fastpair.provider.bluetooth.BluetoothController;
import android.nearby.fastpair.provider.simulator.SimulatorStreamProtocol.Event;
import android.nearby.fastpair.provider.simulator.testing.RemoteDevice;
import android.nearby.fastpair.provider.simulator.testing.RemoteDevicesManager;
@@ -96,6 +95,9 @@
*/
@SuppressLint("SetTextI18n")
public class MainActivity extends Activity {
+ public static final String TAG = "FastPairProviderSimulatorApp";
+ private final Logger mLogger = new Logger(TAG);
+
/** Device has a display and the ability to input Yes/No. */
private static final int IO_CAPABILITY_IO = 1;
@@ -213,7 +215,7 @@
return;
}
- log("Send data to output stream: %s", eventBuilder.getCode().getNumber());
+ mLogger.log("Send data to output stream: %s", eventBuilder.getCode().getNumber());
mRemoteDevicesManager.writeDataToRemoteDevice(
mRemoteDeviceId,
eventBuilder.build().toByteString(),
@@ -446,7 +448,7 @@
private void setupRemoteDevices() {
if (Strings.isNullOrEmpty(getIntent().getStringExtra(EXTRA_REMOTE_DEVICE_ID))) {
- log("Can't get remote device id");
+ mLogger.log("Can't get remote device id");
return;
}
mRemoteDeviceId = getIntent().getStringExtra(EXTRA_REMOTE_DEVICE_ID);
@@ -463,7 +465,7 @@
REMOTE_DEVICE_OUTPUT_STREAM_URI),
mInputStreamListener));
} catch (IOException e) {
- warning("Failed to create stream IO handler: %s", e);
+ mLogger.log(e, "Failed to create stream IO handler");
}
}
@@ -503,7 +505,7 @@
private boolean setModelId(String modelId) {
String validModelId = getValidModelId(modelId);
if (TextUtils.isEmpty(validModelId)) {
- log("Can't do setModelId because inputted modelId is invalid!");
+ mLogger.log("Can't do setModelId because inputted modelId is invalid!");
return false;
}
@@ -612,7 +614,7 @@
try {
Preconditions.checkArgument(base16().decode(bluetoothAddress).length == 6);
} catch (IllegalArgumentException e) {
- log("Invalid BLUETOOTH_ADDRESS extra (%s), using default.", bluetoothAddress);
+ mLogger.log("Invalid BLUETOOTH_ADDRESS extra (%s), using default.", bluetoothAddress);
bluetoothAddress = null;
}
final String finalBluetoothAddress = bluetoothAddress;
@@ -669,11 +671,10 @@
mAppLaunchSwitch.isChecked() ? MODEL_ID_APP_LAUNCH : modelId)
.setBluetoothAddress(finalBluetoothAddress)
.setTxPowerLevel(toTxPowerLevel(txPower))
- .setCallback(this::updateStatusView)
+ .setAdvertisingChangedCallback(this::updateStatusView)
.setAntiSpoofingPrivateKey(antiSpoofingKey)
.setUseRandomSaltForAccountKeyRotation(useRandomSaltForAccountKeyRotation)
.setDataOnlyConnection(device != null && device.getDataOnlyConnection())
- .setIsMemoryTest(mInputStreamListener != null)
.setShowsPasskeyConfirmation(
device.getDeviceType().equals(DeviceType.ANDROID_AUTO))
.setRemoveAllDevicesDuringPairing(mRemoveAllDevicesDuringPairing)
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulator.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulator.java
index 931f2e0..aa7daa6 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulator.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulator.java
@@ -163,6 +163,10 @@
public static final String TAG = "FastPairSimulator";
private final Logger mLogger;
+ private static final int BECOME_DISCOVERABLE_TIMEOUT_SEC = 3;
+
+ private static final int SCAN_MODE_REFRESH_SEC = 30;
+
/**
* Headphones. Generated by
* http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
@@ -170,18 +174,16 @@
private static final Value CLASS_OF_DEVICE =
new Value(base16().decode("200418"), ByteOrder.BIG_ENDIAN);
- private static final byte[] SUPPORTED_SERVICES_LTV =
- new Ltv(
- TransportDiscoveryService.SERVICE_UUIDS_16_BIT_LIST_TYPE,
- toBytes(ByteOrder.LITTLE_ENDIAN, A2DP_SINK_SERVICE_UUID))
- .getBytes();
+ private static final byte[] SUPPORTED_SERVICES_LTV = new Ltv(
+ TransportDiscoveryService.SERVICE_UUIDS_16_BIT_LIST_TYPE,
+ toBytes(ByteOrder.LITTLE_ENDIAN, A2DP_SINK_SERVICE_UUID)
+ ).getBytes();
private static final byte[] TDS_CONTROL_POINT_RESPONSE_PARAMETER =
Bytes.concat(new byte[]{BLUETOOTH_SIG_ORGANIZATION_ID}, SUPPORTED_SERVICES_LTV);
private static final String SIMULATOR_FAKE_BLE_ADDRESS = "11:22:33:44:55:66";
private static final long ADVERTISING_REFRESH_DELAY_1_MIN = TimeUnit.MINUTES.toMillis(1);
- private static final long ADVERTISING_REFRESH_DELAY_5_MINS = TimeUnit.MINUTES.toMillis(5);
/** The user will be prompted to accept or deny the incoming pairing request */
public static final int PAIRING_VARIANT_CONSENT = 3;
@@ -250,140 +252,139 @@
private final ScheduledExecutorService mExecutor =
Executors.newSingleThreadScheduledExecutor(); // exempt
private final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- private final BroadcastReceiver mBroadcastReceiver =
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (mShouldFailPairing) {
- mLogger.log("Pairing disabled by test app switch");
- return;
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (mShouldFailPairing) {
+ mLogger.log("Pairing disabled by test app switch");
+ return;
+ }
+ if (mIsDestroyed) {
+ // Sometimes this receiver does not successfully unregister in destroy()
+ // which causes events to occur after the simulator is stopped, so ignore
+ // those events.
+ mLogger.log("Intent received after simulator destroyed, ignoring");
+ return;
+ }
+ BluetoothDevice device = intent.getParcelableExtra(
+ BluetoothDevice.EXTRA_DEVICE);
+ switch (intent.getAction()) {
+ case BluetoothAdapter.ACTION_SCAN_MODE_CHANGED:
+ if (isDiscoverable()) {
+ mIsDiscoverableLatch.countDown();
}
- if (mIsDestroyed) {
- // Sometimes this receiver does not successfully unregister in destroy()
- // which causes events to occur after the simulator is stopped, so ignore
- // those events.
- mLogger.log("Intent received after simulator destroyed, ignoring");
- return;
+ break;
+ case BluetoothDevice.ACTION_PAIRING_REQUEST:
+ int variant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
+ ERROR);
+ int key = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, ERROR);
+ mLogger.log(
+ "Pairing request, variant=%d, key=%s", variant,
+ key == ERROR ? "(none)" : key);
+
+ // Prevent Bluetooth Settings from getting the pairing request.
+ abortBroadcast();
+
+ mPairingDevice = device;
+ if (mSecret == null) {
+ // We haven't done the handshake over GATT to agree on the shared
+ // secret. For now, just accept anyway (so we can still simulate
+ // old 1.0 model IDs).
+ mLogger.log("No handshake, auto-accepting anyway.");
+ setPasskeyConfirmation(true);
+ } else if (variant
+ == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
+ // Store the passkey. And check it, since there's a race (see
+ // method for why). Usually this check is a no-op and we'll get
+ // the passkey later over GATT.
+ mLocalPasskey = key;
+ checkPasskey();
+ } else if (variant == PAIRING_VARIANT_DISPLAY_PASSKEY) {
+ if (mPasskeyEventCallback != null) {
+ mPasskeyEventCallback.onPasskeyRequested(
+ FastPairSimulator.this::enterPassKey);
+ } else {
+ mLogger.log("passkeyEventCallback is not set!");
+ enterPassKey(key);
+ }
+ } else if (variant == PAIRING_VARIANT_CONSENT) {
+ setPasskeyConfirmation(true);
+
+ } else if (variant == BluetoothDevice.PAIRING_VARIANT_PIN) {
+ if (mPasskeyEventCallback != null) {
+ mPasskeyEventCallback.onPasskeyRequested(
+ (int pin) -> {
+ byte[] newPin = convertPinToBytes(
+ String.format(Locale.ENGLISH, "%d", pin));
+ mPairingDevice.setPin(newPin);
+ });
+ }
+ } else {
+ // Reject the pairing request if it's not using the Numeric
+ // Comparison (aka Passkey Confirmation) method.
+ setPasskeyConfirmation(false);
}
- BluetoothDevice device = intent.getParcelableExtra(
- BluetoothDevice.EXTRA_DEVICE);
- switch (intent.getAction()) {
- case BluetoothAdapter.ACTION_SCAN_MODE_CHANGED:
- if (isDiscoverable()) {
- mIsDiscoverableLatch.countDown();
+ break;
+ case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
+ int bondState =
+ intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
+ BluetoothDevice.BOND_NONE);
+ mLogger.log("Bond state to %s changed to %d", device, bondState);
+ switch (bondState) {
+ case BluetoothDevice.BOND_BONDING:
+ // If we've started bonding, we shouldn't be advertising.
+ mAdvertiser.stopAdvertising();
+ // Not discoverable anymore, but still connectable.
+ setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+ break;
+ case BluetoothDevice.BOND_BONDED:
+ // Once bonded, advertise the account keys.
+ mAdvertiser.startAdvertising(accountKeysServiceData());
+ setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+
+ // If it is subsequent pair, we need to add paired device here.
+ if (mIsSubsequentPair
+ && mSecret != null
+ && mSecret.length == AES_BLOCK_LENGTH) {
+ addAccountKey(mSecret, mPairingDevice);
}
break;
- case BluetoothDevice.ACTION_PAIRING_REQUEST:
- int variant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
- ERROR);
- int key = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, ERROR);
- mLogger.log(
- "Pairing request, variant=%d, key=%s", variant,
- key == ERROR ? "(none)" : key);
-
- // Prevent Bluetooth Settings from getting the pairing request.
- abortBroadcast();
-
- mPairingDevice = device;
- if (mSecret == null) {
- // We haven't done the handshake over GATT to agree on the shared
- // secret. For now, just accept anyway (so we can still simulate
- // old 1.0 model IDs).
- mLogger.log("No handshake, auto-accepting anyway.");
- setPasskeyConfirmation(true);
- } else if (variant
- == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
- // Store the passkey. And check it, since there's a race (see
- // method for why). Usually this check is a no-op and we'll get
- // the passkey later over GATT.
- mLocalPasskey = key;
- checkPasskey();
- } else if (variant == PAIRING_VARIANT_DISPLAY_PASSKEY) {
- if (mPasskeyEventCallback != null) {
- mPasskeyEventCallback.onPasskeyRequested(
- FastPairSimulator.this::enterPassKey);
- } else {
- mLogger.log("passkeyEventCallback is not set!");
- enterPassKey(key);
- }
- } else if (variant == PAIRING_VARIANT_CONSENT) {
- setPasskeyConfirmation(true);
-
- } else if (variant == BluetoothDevice.PAIRING_VARIANT_PIN) {
- if (mPasskeyEventCallback != null) {
- mPasskeyEventCallback.onPasskeyRequested(
- (int pin) -> {
- byte[] newPin = convertPinToBytes(
- String.format(Locale.ENGLISH, "%d", pin));
- mPairingDevice.setPin(newPin);
- });
- }
- } else {
- // Reject the pairing request if it's not using the Numeric
- // Comparison (aka Passkey Confirmation) method.
- setPasskeyConfirmation(false);
- }
- break;
- case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
- int bondState =
- intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
- BluetoothDevice.BOND_NONE);
- mLogger.log("Bond state to %s changed to %d", device, bondState);
- switch (bondState) {
- case BluetoothDevice.BOND_BONDING:
- // If we've started bonding, we shouldn't be advertising.
- mAdvertiser.stopAdvertising();
- // Not discoverable anymore, but still connectable.
- setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
- break;
- case BluetoothDevice.BOND_BONDED:
- // Once bonded, advertise the account keys.
- mAdvertiser.startAdvertising(accountKeysServiceData());
- setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
-
- // If it is subsequent pair, we need to add paired device here.
- if (mIsSubsequentPair
- && mSecret != null
- && mSecret.length == AES_BLOCK_LENGTH) {
- addAccountKey(mSecret, mPairingDevice);
- }
- break;
- case BluetoothDevice.BOND_NONE:
- // If the bonding process fails, we should be advertising again.
- mAdvertiser.startAdvertising(getServiceData());
- break;
- default:
- break;
- }
- break;
- case BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED:
- mLogger.log(
- "Connection state to %s changed to %d",
- device,
- intent.getIntExtra(
- BluetoothAdapter.EXTRA_CONNECTION_STATE,
- BluetoothAdapter.STATE_DISCONNECTED));
- break;
- case BluetoothAdapter.ACTION_STATE_CHANGED:
- int state = intent.getIntExtra(EXTRA_STATE, -1);
- mLogger.log("Bluetooth adapter state=%s", state);
- switch (state) {
- case STATE_ON:
- startRfcommServer();
- break;
- case STATE_OFF:
- stopRfcommServer();
- break;
- default: // fall out
- }
+ case BluetoothDevice.BOND_NONE:
+ // If the bonding process fails, we should be advertising again.
+ mAdvertiser.startAdvertising(getServiceData());
break;
default:
- mLogger.log(new IllegalArgumentException(intent.toString()),
- "Received unexpected intent");
break;
}
- }
- };
+ break;
+ case BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED:
+ mLogger.log(
+ "Connection state to %s changed to %d",
+ device,
+ intent.getIntExtra(
+ BluetoothAdapter.EXTRA_CONNECTION_STATE,
+ BluetoothAdapter.STATE_DISCONNECTED));
+ break;
+ case BluetoothAdapter.ACTION_STATE_CHANGED:
+ int state = intent.getIntExtra(EXTRA_STATE, -1);
+ mLogger.log("Bluetooth adapter state=%s", state);
+ switch (state) {
+ case STATE_ON:
+ startRfcommServer();
+ break;
+ case STATE_OFF:
+ stopRfcommServer();
+ break;
+ default: // fall out
+ }
+ break;
+ default:
+ mLogger.log(new IllegalArgumentException(intent.toString()),
+ "Received unexpected intent");
+ break;
+ }
+ }
+ };
@Nullable
private byte[] convertPinToBytes(@Nullable String pin) {
@@ -508,7 +509,6 @@
@Nullable
private CountDownLatch mWriteNameCountDown;
private final RfcommServer mRfcommServer = new RfcommServer();
- private final boolean mDataOnlyConnection;
private boolean mSupportDynamicBufferSize = false;
private NotifiableGattServlet mBeaconActionsServlet;
private final FastPairSimulatorDatabase mFastPairSimulatorDatabase;
@@ -570,8 +570,8 @@
this.mUseLogFullEvent = useLogFullEvent;
}
- /** An optional way to get status updates. */
- public interface Callback {
+ /** An optional way to get advertising status updates. */
+ public interface AdvertisingChangedCallback {
/** Called when we change our BLE advertisement. */
void onAdvertisingChanged();
}
@@ -618,7 +618,7 @@
private final boolean mEnableNameCharacteristic;
- private final Callback mCallback;
+ private final AdvertisingChangedCallback mAdvertisingChangedCallback;
private final boolean mIncludeTransportDataDescriptor;
@@ -627,8 +627,6 @@
private final boolean mUseRandomSaltForAccountKeyRotation;
- private final boolean mIsMemoryTest;
-
private final boolean mBecomeDiscoverable;
private final boolean mShowsPasskeyConfirmation;
@@ -648,11 +646,10 @@
boolean dataOnlyConnection,
int txPowerLevel,
boolean enableNameCharacteristic,
- Callback callback,
+ AdvertisingChangedCallback advertisingChangedCallback,
boolean includeTransportDataDescriptor,
@Nullable byte[] antiSpoofingPrivateKey,
boolean useRandomSaltForAccountKeyRotation,
- boolean isMemoryTest,
boolean becomeDiscoverable,
boolean showsPasskeyConfirmation,
boolean enableBeaconActionsCharacteristic,
@@ -665,11 +662,10 @@
this.mDataOnlyConnection = dataOnlyConnection;
this.mTxPowerLevel = txPowerLevel;
this.mEnableNameCharacteristic = enableNameCharacteristic;
- this.mCallback = callback;
+ this.mAdvertisingChangedCallback = advertisingChangedCallback;
this.mIncludeTransportDataDescriptor = includeTransportDataDescriptor;
this.mAntiSpoofingPrivateKey = antiSpoofingPrivateKey;
this.mUseRandomSaltForAccountKeyRotation = useRandomSaltForAccountKeyRotation;
- this.mIsMemoryTest = isMemoryTest;
this.mBecomeDiscoverable = becomeDiscoverable;
this.mShowsPasskeyConfirmation = showsPasskeyConfirmation;
this.mEnableBeaconActionsCharacteristic = enableBeaconActionsCharacteristic;
@@ -708,8 +704,8 @@
return mEnableNameCharacteristic;
}
- public Callback getCallback() {
- return mCallback;
+ public AdvertisingChangedCallback getAdvertisingChangedCallback() {
+ return mAdvertisingChangedCallback;
}
public boolean getIncludeTransportDataDescriptor() {
@@ -725,10 +721,6 @@
return mUseRandomSaltForAccountKeyRotation;
}
- public boolean getIsMemoryTest() {
- return mIsMemoryTest;
- }
-
public boolean getBecomeDiscoverable() {
return mBecomeDiscoverable;
}
@@ -766,13 +758,12 @@
.setModelId(Ascii.toUpperCase(modelId))
.setAdvertisingModelId(Ascii.toUpperCase(modelId))
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
- .setCallback(() -> {
+ .setAdvertisingChangedCallback(() -> {
})
.setIncludeTransportDataDescriptor(true)
.setUseRandomSaltForAccountKeyRotation(false)
.setEnableNameCharacteristic(true)
.setDataOnlyConnection(false)
- .setIsMemoryTest(false)
.setBecomeDiscoverable(true)
.setShowsPasskeyConfirmation(false)
.setEnableBeaconActionsCharacteristic(true)
@@ -799,7 +790,7 @@
private boolean mEnableNameCharacteristic;
- private Callback mCallback;
+ private AdvertisingChangedCallback mAdvertisingChangedCallback;
private boolean mIncludeTransportDataDescriptor;
@@ -808,8 +799,6 @@
private boolean mUseRandomSaltForAccountKeyRotation;
- private boolean mIsMemoryTest;
-
private boolean mBecomeDiscoverable;
private boolean mShowsPasskeyConfirmation;
@@ -832,12 +821,11 @@
this.mDataOnlyConnection = option.mDataOnlyConnection;
this.mTxPowerLevel = option.mTxPowerLevel;
this.mEnableNameCharacteristic = option.mEnableNameCharacteristic;
- this.mCallback = option.mCallback;
+ this.mAdvertisingChangedCallback = option.mAdvertisingChangedCallback;
this.mIncludeTransportDataDescriptor = option.mIncludeTransportDataDescriptor;
this.mAntiSpoofingPrivateKey = option.mAntiSpoofingPrivateKey;
this.mUseRandomSaltForAccountKeyRotation =
option.mUseRandomSaltForAccountKeyRotation;
- this.mIsMemoryTest = option.mIsMemoryTest;
this.mBecomeDiscoverable = option.mBecomeDiscoverable;
this.mShowsPasskeyConfirmation = option.mShowsPasskeyConfirmation;
this.mEnableBeaconActionsCharacteristic = option.mEnableBeaconActionsCharacteristic;
@@ -874,9 +862,10 @@
return this;
}
- /** @see Callback */
- public Builder setCallback(Callback callback) {
- this.mCallback = callback;
+ /** @see AdvertisingChangedCallback */
+ public Builder setAdvertisingChangedCallback(
+ AdvertisingChangedCallback advertisingChangedCallback) {
+ this.mAdvertisingChangedCallback = advertisingChangedCallback;
return this;
}
@@ -913,11 +902,6 @@
return this;
}
- public Builder setIsMemoryTest(boolean isMemoryTest) {
- this.mIsMemoryTest = isMemoryTest;
- return this;
- }
-
public Builder setBecomeDiscoverable(boolean becomeDiscoverable) {
this.mBecomeDiscoverable = becomeDiscoverable;
return this;
@@ -963,11 +947,10 @@
mDataOnlyConnection,
mTxPowerLevel,
mEnableNameCharacteristic,
- mCallback,
+ mAdvertisingChangedCallback,
mIncludeTransportDataDescriptor,
mAntiSpoofingPrivateKey,
mUseRandomSaltForAccountKeyRotation,
- mIsMemoryTest,
mBecomeDiscoverable,
mShowsPasskeyConfirmation,
mEnableBeaconActionsCharacteristic,
@@ -1001,7 +984,6 @@
this.mBluetoothAddress =
new Value(BluetoothAddress.decode(bluetoothAddress), ByteOrder.BIG_ENDIAN);
this.mBleAddress = options.getBleAddress();
- this.mDataOnlyConnection = options.getDataOnlyConnection();
this.mAdvertiser = new OreoFastPairAdvertiser(this);
mFastPairSimulatorDatabase = new FastPairSimulatorDatabase(context);
@@ -1011,7 +993,7 @@
"Provider default device name is %s",
deviceName != null ? new String(deviceName, StandardCharsets.UTF_8) : null);
- if (mDataOnlyConnection) {
+ if (mOptions.getDataOnlyConnection()) {
// To get BLE address, we need to start advertising first, and then
// {@code#setBleAddress} will be called with BLE address.
mAdvertiser.startAdvertising(modelIdServiceData(/* forAdvertising= */ true));
@@ -1055,19 +1037,11 @@
*/
@SuppressWarnings("FutureReturnValueIgnored")
private void scheduleAdvertisingRefresh() {
- mExecutor.scheduleAtFixedRate(
- () -> {
- if (mIsAdvertising) {
- mAdvertiser.startAdvertising(getServiceData());
- }
- },
- mOptions.getIsMemoryTest()
- ? ADVERTISING_REFRESH_DELAY_5_MINS
- : ADVERTISING_REFRESH_DELAY_1_MIN,
- mOptions.getIsMemoryTest()
- ? ADVERTISING_REFRESH_DELAY_5_MINS
- : ADVERTISING_REFRESH_DELAY_1_MIN,
- TimeUnit.MILLISECONDS);
+ mExecutor.scheduleAtFixedRate(() -> {
+ if (mIsAdvertising) {
+ mAdvertiser.startAdvertising(getServiceData());
+ }
+ }, ADVERTISING_REFRESH_DELAY_1_MIN, ADVERTISING_REFRESH_DELAY_1_MIN, TimeUnit.MILLISECONDS);
}
public void destroy() {
@@ -1103,7 +1077,7 @@
public void setIsAdvertising(boolean isAdvertising) {
if (this.mIsAdvertising != isAdvertising) {
this.mIsAdvertising = isAdvertising;
- mOptions.getCallback().onAdvertisingChanged();
+ mOptions.getAdvertisingChangedCallback().onAdvertisingChanged();
}
}
@@ -1113,7 +1087,7 @@
public void setBleAddress(String bleAddress) {
this.mBleAddress = bleAddress;
- if (mDataOnlyConnection) {
+ if (mOptions.getDataOnlyConnection()) {
mBluetoothAddress = new Value(BluetoothAddress.decode(bleAddress),
ByteOrder.BIG_ENDIAN);
start(bleAddress);
@@ -2086,7 +2060,7 @@
if (isDiscoverable()) {
mIsDiscoverableLatch.countDown();
}
- if (mIsDiscoverableLatch.await(3, TimeUnit.SECONDS)) {
+ if (mIsDiscoverableLatch.await(BECOME_DISCOVERABLE_TIMEOUT_SEC, TimeUnit.SECONDS)) {
mLogger.log("Successfully became switched discoverable mode %s", discoverable);
} else {
throw new TimeoutException();
@@ -2105,10 +2079,8 @@
if (scanMode == SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
mRevertDiscoverableFuture =
- mExecutor.schedule(
- () -> setScanMode(SCAN_MODE_CONNECTABLE),
- mOptions.getIsMemoryTest() ? 300 : 30,
- TimeUnit.SECONDS);
+ mExecutor.schedule(() -> setScanMode(SCAN_MODE_CONNECTABLE),
+ SCAN_MODE_REFRESH_SEC, TimeUnit.SECONDS);
}
} catch (Exception e) {
mLogger.log(e, "Error setting scan mode to %d", scanMode);
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulatorDatabase.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulatorDatabase.java
index 254ec51..cbe39ff 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulatorDatabase.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/FastPairSimulatorDatabase.java
@@ -37,7 +37,7 @@
public class FastPairSimulatorDatabase {
private static final String SHARED_PREF_NAME =
- "android.nearby.multidevices.fastpair.provider.fastpairsimulator";
+ "android.nearby.fastpair.provider.fastpairsimulator";
private static final String KEY_DEVICE_NAME = "DEVICE_NAME";
private static final String KEY_ACCOUNT_KEYS = "ACCOUNT_KEYS";
private static final int MAX_NUMBER_OF_ACCOUNT_KEYS = 8;
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/OreoFastPairAdvertiser.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/OreoFastPairAdvertiser.java
index dd664ea..bb77c11 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/OreoFastPairAdvertiser.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/OreoFastPairAdvertiser.java
@@ -54,53 +54,54 @@
public OreoFastPairAdvertiser(FastPairSimulator simulator) {
this.mSimulator = simulator;
this.mAdvertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
- this.mAdvertisingSetCallback =
- new AdvertisingSetCallback() {
- @Override
- public void onAdvertisingSetStarted(
- AdvertisingSet set, int txPower, int status) {
- if (status == AdvertisingSetCallback.ADVERTISE_SUCCESS) {
- mLogger.log("Advertising succeeded, advertising at %s dBm", txPower);
- simulator.setIsAdvertising(true);
- mAdvertisingSet = set;
+ this.mAdvertisingSetCallback = new AdvertisingSetCallback() {
- try {
- // Requires custom Android build, see callback below.
- Reflect.on(set).withMethod("getOwnAddress").invoke();
- } catch (ReflectionException e) {
- mLogger.log(e, "Error calling getOwnAddress for AdvertisingSet");
- }
- } else {
- mLogger.log(
- new IllegalStateException(),
- "Advertising failed, error code=%d", status);
- }
- }
+ @Override
+ public void onAdvertisingSetStarted(
+ AdvertisingSet set, int txPower, int status) {
+ if (status == AdvertisingSetCallback.ADVERTISE_SUCCESS) {
+ mLogger.log("Advertising succeeded, advertising at %s dBm", txPower);
+ simulator.setIsAdvertising(true);
+ mAdvertisingSet = set;
- @Override
- public void onAdvertisingDataSet(AdvertisingSet set, int status) {
- if (status != AdvertisingSetCallback.ADVERTISE_SUCCESS) {
- mLogger.log(
- new IllegalStateException(),
- "Updating advertisement failed, error code=%d",
- status);
- stopAdvertising();
- }
+ try {
+ // Requires custom Android build, see callback below.
+ Reflect.on(set).withMethod("getOwnAddress").invoke();
+ } catch (ReflectionException e) {
+ mLogger.log(e, "Error calling getOwnAddress for AdvertisingSet");
}
+ } else {
+ mLogger.log(
+ new IllegalStateException(),
+ "Advertising failed, error code=%d", status);
+ }
+ }
- // Called via reflection with AdvertisingSet.getOwnAddress().
- public void onOwnAddressRead(
- AdvertisingSet set, int addressType, String address) {
- if (!address.equals(simulator.getBleAddress())) {
- mLogger.log(
- "Read own BLE address=%s at %s",
- address,
- new SimpleDateFormat("HH:mm:ss:SSS", Locale.US)
- .format(Calendar.getInstance().getTime()));
- simulator.setBleAddress(address);
- }
- }
- };
+ @Override
+ public void onAdvertisingDataSet(AdvertisingSet set, int status) {
+ if (status != AdvertisingSetCallback.ADVERTISE_SUCCESS) {
+ mLogger.log(
+ new IllegalStateException(),
+ "Updating advertisement failed, error code=%d",
+ status);
+ stopAdvertising();
+ }
+ }
+
+ // Called via reflection with AdvertisingSet.getOwnAddress().
+ public void onOwnAddressRead(
+ AdvertisingSet set, int addressType, String address) {
+ if (!address.equals(simulator.getBleAddress())) {
+ mLogger.log(
+ "Read own BLE address=%s at %s",
+ address,
+ new SimpleDateFormat("HH:mm:ss:SSS", Locale.US)
+ .format(Calendar.getInstance().getTime()));
+ // Implicitly start the advertising once BLE address callback arrived.
+ simulator.setBleAddress(address);
+ }
+ }
+ };
}
@Override
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/BluetoothController.kt b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt
similarity index 92%
rename from nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/BluetoothController.kt
rename to nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt
index ed04eae..6a3e59e 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/BluetoothController.kt
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.nearby.fastpair.provider.simulator.app
+package android.nearby.fastpair.provider.bluetooth
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
@@ -25,9 +25,9 @@
import android.content.Intent
import android.content.IntentFilter
import android.nearby.fastpair.provider.FastPairSimulator
-import android.nearby.fastpair.provider.simulator.app.AppLogger.*
-import android.nearby.fastpair.provider.simulator.testing.Reflect
-import android.nearby.fastpair.provider.simulator.testing.ReflectionException
+import android.nearby.fastpair.provider.utils.Logger
+import android.nearby.fastpair.provider.utils.Reflect
+import android.nearby.fastpair.provider.utils.ReflectionException
import android.os.SystemClock
import android.provider.Settings
@@ -36,6 +36,7 @@
private val context: Context,
private val listener: EventListener,
) : BroadcastReceiver() {
+ private val mLogger = Logger(TAG)
private val bluetoothAdapter: BluetoothAdapter =
(context.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager)?.adapter!!
private var remoteDevice: BluetoothDevice? = null
@@ -71,14 +72,14 @@
.withMethod("setIoCapability", Int::class.javaPrimitiveType)[
ioCapabilityClassic]
} catch (e: ReflectionException) {
- warning("Error setIoCapability to %s: %s", ioCapabilityClassic, e)
+ mLogger.log(e, "Error setIoCapability to %s: %s", ioCapabilityClassic)
}
try {
Reflect.on(bluetoothAdapter)
.withMethod("setLeIoCapability", Int::class.javaPrimitiveType)[
ioCapabilityBLE]
} catch (e: ReflectionException) {
- warning("Error setLeIoCapability to %s: %s", ioCapabilityBLE, e)
+ mLogger.log(e, "Error setLeIoCapability to %s: %s", ioCapabilityBLE)
}
// Toggling airplane mode on/off to restart Bluetooth stack and reset the BLE.
@@ -90,7 +91,10 @@
TURN_AIRPLANE_MODE_ON
)
} catch (expectedOnNonCustomAndroid: SecurityException) {
- warning("Requires custom Android to toggle airplane mode")
+ mLogger.log(
+ expectedOnNonCustomAndroid,
+ "Requires custom Android to toggle airplane mode"
+ )
// Fall back to turn off Bluetooth.
bluetoothAdapter.disable()
}
@@ -102,7 +106,10 @@
TURN_AIRPLANE_MODE_OFF
)
} catch (expectedOnNonCustomAndroid: SecurityException) {
- error("SecurityException while toggled airplane mode.")
+ mLogger.log(
+ expectedOnNonCustomAndroid,
+ "SecurityException while toggled airplane mode."
+ )
} finally {
// Double confirm that Bluetooth is turned on.
bluetoothAdapter.enable()
@@ -183,8 +190,6 @@
* @param intent the Intent being received.
*/
override fun onReceive(context: Context, intent: Intent) {
- log("BluetoothController received intent, action=%s", intent.action)
-
when (intent.action) {
BluetoothDevice.ACTION_BOND_STATE_CHANGED -> {
// After a device starts bonding, we only pay attention to intents about that device.
@@ -198,7 +203,7 @@
BluetoothDevice.BOND_NONE -> null
else -> remoteDevice
}
- log(
+ mLogger.log(
"ACTION_BOND_STATE_CHANGED, the bound state of the remote device (%s) change to %s.",
remoteDevice?.remoteDeviceToString(),
bondState.bondStateToString()
@@ -211,7 +216,7 @@
BluetoothAdapter.EXTRA_CONNECTION_STATE,
BluetoothAdapter.STATE_DISCONNECTED
)
- log(
+ mLogger.log(
"ACTION_CONNECTION_STATE_CHANGED, the new connectionState: %s",
remoteDeviceConnectionState
)
@@ -223,7 +228,7 @@
BluetoothAdapter.EXTRA_SCAN_MODE,
BluetoothAdapter.SCAN_MODE_NONE
)
- log(
+ mLogger.log(
"ACTION_SCAN_MODE_CHANGED, the new scanMode: %s",
FastPairSimulator.scanModeToString(scanMode)
)
@@ -277,10 +282,12 @@
}
companion object {
+ private const val TAG = "BluetoothController"
+
/** Hidden SystemApi field in [BluetoothProfile] interface. */
private const val BLUETOOTH_PROFILE_A2DP_SINK = 11
private const val TURN_AIRPLANE_MODE_OFF = 0
private const val TURN_AIRPLANE_MODE_ON = 1
}
-}
+}
\ No newline at end of file
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/testing/Reflect.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/utils/Reflect.java
similarity index 98%
rename from nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/testing/Reflect.java
rename to nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/utils/Reflect.java
index 16fbc71..5ae5310 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/testing/Reflect.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/utils/Reflect.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.nearby.fastpair.provider.simulator.testing;
+package android.nearby.fastpair.provider.utils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/testing/ReflectionException.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/utils/ReflectionException.java
similarity index 93%
rename from nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/testing/ReflectionException.java
rename to nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/utils/ReflectionException.java
index 2a65f39..959fd11 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/testing/ReflectionException.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/utils/ReflectionException.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.nearby.fastpair.provider.simulator.testing;
+package android.nearby.fastpair.provider.utils;
/**
* An exception thrown during a reflection operation. Like ReflectiveOperationException, except
diff --git a/nearby/tests/multidevices/clients/tests/Android.bp b/nearby/tests/multidevices/clients/tests/Android.bp
deleted file mode 100644
index a29a298..0000000
--- a/nearby/tests/multidevices/clients/tests/Android.bp
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (C) 2022 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-// Run the tests: atest --host NearbyMultiDevicesClientsRoboTest
-android_robolectric_test {
- name: "NearbyMultiDevicesClientsRoboTest",
- srcs: ["src/**/*.kt"],
- instrumentation_for: "NearbyMultiDevicesClientsSnippets",
- java_resources: ["robolectric.properties"],
-
- static_libs: [
- "NearbyMultiDevicesClientsLib",
- "androidx.test.ext.junit",
- "androidx.test.rules",
- "junit",
- "mobly-snippet-lib",
- "platform-test-annotations",
- "truth-prebuilt",
- ],
- test_options: {
- // timeout in seconds.
- timeout: 36000,
- },
-}
\ No newline at end of file
diff --git a/nearby/tests/multidevices/clients/tests/AndroidManifest.xml b/nearby/tests/multidevices/clients/tests/AndroidManifest.xml
deleted file mode 100644
index c8e17e8..0000000
--- a/nearby/tests/multidevices/clients/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2022 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.nearby.multidevices"/>
diff --git a/nearby/tests/multidevices/clients/tests/robolectric.properties b/nearby/tests/multidevices/clients/tests/robolectric.properties
deleted file mode 100644
index 2ea03bb..0000000
--- a/nearby/tests/multidevices/clients/tests/robolectric.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright (C) 2022 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-sdk=NEWEST_SDK
\ No newline at end of file
diff --git a/nearby/tests/multidevices/clients/tests/src/com/android/nearby/multidevices/common/Mockotlin.kt b/nearby/tests/multidevices/clients/tests/src/com/android/nearby/multidevices/common/Mockotlin.kt
deleted file mode 100644
index 8e70d9f..0000000
--- a/nearby/tests/multidevices/clients/tests/src/com/android/nearby/multidevices/common/Mockotlin.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.nearby.multidevices.common
-
-import org.mockito.ArgumentCaptor
-import org.mockito.Mockito
-import org.mockito.MockitoAnnotations
-
-/**
- * Helper methods to wrap common Mockito functions that don't do quite what you would expect in
- * Kotlin. The returned null values need to be recast to their original type in Kotlin otherwise it
- * breaks.
- */
-object Mockotlin {
-
- /**
- * Delegates to [Mockito.any].
- * @return null as T
- */
- fun <T> any() = Mockito.any<T>() as T
-
- /**
- * Delegates to [Mockito.eq].
- * @return null as T
- */
- fun <T> eq(match: T) = Mockito.eq(match) as T
-
- /**
- * Delegates to [Mockito.isA].
- * @return null as T
- */
- fun <T> isA(match: Class<T>): T = Mockito.isA(match) as T
-
- /** Delegates to [Mockito.when ], uses the same API as the mockitokotlin2 library. */
- fun <T> whenever(methodCall: T) = Mockito.`when`(methodCall)!!
-
- /**
- * Delegates to [Mockito.any] and calls it with Class<T>.
- * @return Class<T>
- */
- inline fun <reified T> anyClass(): Class<T> {
- Mockito.any(T::class.java)
- return T::class.java
- }
-
- /**
- * Delegates to [Mockito.anyListOf] and calls it with Class<T>.
- * @return List<T>
- */
- fun <T> anyListOf(): List<T> = Mockito.anyList<T>()
-
- /**
- * Delegates to [Mockito.mock].
- * @return T
- */
- inline fun <reified T> mock() = Mockito.mock(T::class.java)!!
-
- /** This is the same as calling `MockitoAnnotations.initMocks(this)` */
- fun Any.initMocks() {
- MockitoAnnotations.initMocks(this)
- }
-
- /**
- * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException
- * when null is returned.
- */
- fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
-}
diff --git a/nearby/tests/multidevices/clients/tests/src/com/android/nearby/multidevices/fastpair/provider/BluetoothStateChangeReceiverTest.kt b/nearby/tests/multidevices/clients/tests/src/com/android/nearby/multidevices/fastpair/provider/BluetoothStateChangeReceiverTest.kt
deleted file mode 100644
index f23ccbb..0000000
--- a/nearby/tests/multidevices/clients/tests/src/com/android/nearby/multidevices/fastpair/provider/BluetoothStateChangeReceiverTest.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.nearby.multidevices.fastpair.provider
-
-import android.Manifest
-import android.bluetooth.BluetoothAdapter
-import android.content.Context
-import android.content.Intent
-import android.nearby.multidevices.fastpair.provider.BluetoothStateChangeReceiver
-import androidx.annotation.RequiresPermission
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
-import com.google.android.mobly.snippet.util.Log
-import com.google.common.truth.Truth.assertThat
-import com.android.nearby.multidevices.common.Mockotlin.mock
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.verify
-
-/** Robolectric tests for [BluetoothStateChangeReceiver]. */
-@RunWith(AndroidJUnit4::class)
-class BluetoothStateChangeReceiverTest {
- private lateinit var bluetoothStateChangeReceiver: BluetoothStateChangeReceiver
- private lateinit var context: Context
- private val mockListener = mock<BluetoothStateChangeReceiver.EventListener>()
-
- @Before
- fun setUp() {
- context = InstrumentationRegistry.getInstrumentation().context
- bluetoothStateChangeReceiver = BluetoothStateChangeReceiver(context)
- Log.apkLogTag = "BluetoothStateChangeReceiverTest"
- }
-
- @Test
- fun testRegister_setsListener() {
- bluetoothStateChangeReceiver.register(mockListener)
-
- assertThat(bluetoothStateChangeReceiver.listener).isNotNull()
- }
-
- @Test
- fun testUnregister_clearListener() {
- bluetoothStateChangeReceiver.register(mockListener)
-
- bluetoothStateChangeReceiver.unregister()
-
- assertThat(bluetoothStateChangeReceiver.listener).isNull()
- }
-
- @Test
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- fun testOnReceive_actionScanModeChanged_reportsOnScanModeChange() {
- val intent =
- Intent(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)
- .putExtra(
- BluetoothAdapter.EXTRA_SCAN_MODE,
- BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE
- )
- bluetoothStateChangeReceiver.register(mockListener)
-
- bluetoothStateChangeReceiver.onReceive(context, intent)
-
- verify(mockListener).onScanModeChange("DISCOVERABLE")
- }
-}
diff --git a/nearby/tests/multidevices/host/seeker_discover_provider_test.py b/nearby/tests/multidevices/host/seeker_discover_provider_test.py
index f875250..a52ca15 100644
--- a/nearby/tests/multidevices/host/seeker_discover_provider_test.py
+++ b/nearby/tests/multidevices/host/seeker_discover_provider_test.py
@@ -16,8 +16,10 @@
DEFAULT_MODEL_ID = '00000C'
# Default public key to simulate as registered headsets.
DEFAULT_ANTI_SPOOFING_KEY = 'Cbj9eCJrTdDgSYxLkqtfADQi86vIaMvxJsQ298sZYWE='
-# Default time in seconds for events waiting.
-DEFAULT_TIMEOUT_SEC = 60
+# Time in seconds for events waiting.
+BECOME_DISCOVERABLE_TIMEOUT_SEC = 10
+START_ADVERTISING_TIMEOUT_SEC = 5
+SCAN_TIMEOUT_SEC = 30
# Abbreviations for common use type.
FastPairProviderSimulator = fast_pair_provider_simulator.FastPairProviderSimulator
@@ -47,8 +49,8 @@
super().setup_test()
self._provider.start_provider_simulator(DEFAULT_MODEL_ID,
DEFAULT_ANTI_SPOOFING_KEY)
- self._provider.wait_for_discoverable_mode(DEFAULT_TIMEOUT_SEC)
- self._provider.wait_for_advertising_start(DEFAULT_TIMEOUT_SEC)
+ self._provider.wait_for_discoverable_mode(BECOME_DISCOVERABLE_TIMEOUT_SEC)
+ self._provider.wait_for_advertising_start(START_ADVERTISING_TIMEOUT_SEC)
self._seeker.start_scan()
def teardown_test(self) -> None:
@@ -62,7 +64,7 @@
def test_seeker_start_scanning_find_provider(self) -> None:
provider_ble_mac_address = self._provider.get_ble_mac_address()
self._seeker.wait_and_assert_provider_found(
- timeout_seconds=DEFAULT_TIMEOUT_SEC,
+ timeout_seconds=SCAN_TIMEOUT_SEC,
expected_model_id=DEFAULT_MODEL_ID,
expected_ble_mac_address=provider_ble_mac_address)