Set deviceState before notifying about added devices
To match ddmlib behavior in `AdbLibIDeviceManager`, query
device state so that it can be set on `IDevice` before notifying
listeners about `addedDevices`.
Test: updated
Bug: 293350579
Change-Id: I9827375b7bb17758bffad9e6e5a4844173a97c3a
diff --git a/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt b/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt
index c63d4fc..15bbb00 100644
--- a/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt
+++ b/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt
@@ -89,19 +89,32 @@
initialDeviceListDone = true
if (addedIDevices.isNotEmpty()) {
+ //Set current deviceState before triggering `iDeviceManagerListener.addedDevices`
+ for (addedConnectedDevice in added) {
+ val iDevice = deviceMap.getValue(addedConnectedDevice)
+ iDevice.deviceState =
+ addedConnectedDevice.deviceInfoFlow.value.deviceState
+ }
postAndWaitForCompletion(scope, "devices added") {
iDeviceManagerListener.addedDevices(addedIDevices)
}
+
for (addedConnectedDevice in added) {
val iDevice = deviceMap.getValue(addedConnectedDevice)
addedConnectedDevice.scope.launch {
addedConnectedDevice.deviceInfoFlow.map { it.deviceState }.collect {
- iDevice.deviceState = it
- // Match ddmlib behavior by not triggering device state change
- // event for a `DISCONNECTED` device state value.
- if (it != DeviceState.DISCONNECTED) {
- postAndWaitForCompletion(scope, "device state changed") {
- iDeviceManagerListener.deviceStateChanged(iDevice)
+ if (iDevice.deviceState != it) {
+ iDevice.deviceState = it
+
+ // Match ddmlib behavior by not triggering device state
+ // change event for a `DISCONNECTED` device state value.
+ if (it != DeviceState.DISCONNECTED) {
+ postAndWaitForCompletion(
+ scope,
+ "device state changed"
+ ) {
+ iDeviceManagerListener.deviceStateChanged(iDevice)
+ }
}
}
}
diff --git a/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt b/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt
index 827c5ee..ab80025 100644
--- a/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt
+++ b/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt
@@ -12,6 +12,7 @@
import kotlinx.coroutines.delay
import org.junit.Assert.assertArrayEquals
import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
@@ -73,13 +74,17 @@
"sdk",
DeviceState.HostConnectionType.USB
)
- fakeDevice.deviceStatus = DeviceState.DeviceStatus.ONLINE
+ fakeDevice.deviceStatus = DeviceState.DeviceStatus.FASTBOOTD
// Act / Assert
- yieldUntil { deviceManager.devices.size == 1 && iDeviceManagerListener.events.size == 2 }
- // Delay a little to check that no other state change events are being triggered
+ yieldUntil { deviceManager.devices.size == 1 }
+ // Wait a little for the `IDeviceManagerListener` events to get processed
delay(100)
- assertEquals(2, iDeviceManagerListener.events.size)
+ assertFalse(deviceManager.devices[0].isOnline)
+
+ fakeDevice.deviceStatus = DeviceState.DeviceStatus.ONLINE
+ // Wait a little for the `IDeviceManagerListener` events to get processed
+ delay(100)
assertTrue(deviceManager.devices[0].isOnline)
assertArrayEquals(
arrayOf(
@@ -111,7 +116,9 @@
fakeDevice.deviceStatus = DeviceState.DeviceStatus.ONLINE
// Act / Assert
- yieldUntil { deviceManager.devices.size == 1 && iDeviceManagerListener.events.size == 2 }
+ yieldUntil { deviceManager.devices.size == 1 }
+ // Wait a little for the `IDeviceManagerListener` events to get processed
+ delay(100)
val device = deviceManager.devices[0]
assertTrue(device.isOnline)
@@ -123,15 +130,11 @@
assertArrayEquals(
arrayOf(
TestIDeviceManagerListener.EventType.Added,
- TestIDeviceManagerListener.EventType.StateChanged,
TestIDeviceManagerListener.EventType.Removed
), iDeviceManagerListener.events.toTypedArray()
)
// Assert that `DISCONNECTED` device state changed event didn't trigger
- assertArrayEquals(
- arrayOf(IDevice.DeviceState.ONLINE),
- iDeviceManagerListener.deviceStateChangedValues.toTypedArray()
- )
+ assertTrue(iDeviceManagerListener.deviceStateChangedValues.isEmpty())
}
@Test
@@ -158,7 +161,6 @@
@WorkerThread
override fun deviceStateChanged(device: IDevice) {
Thread.sleep(1)
- println(device.isOnline)
synchronized(lock) {
totalCalls++
concurrentCalls++