@@ -3,7 +3,6 @@ package com.malinskiy.marathon.android.ddmlib
3
3
import com.android.ddmlib.AndroidDebugBridge
4
4
import com.android.ddmlib.DdmPreferences
5
5
import com.android.ddmlib.IDevice
6
- import com.android.ddmlib.TimeoutException
7
6
import com.malinskiy.marathon.actor.unboundedChannel
8
7
import com.malinskiy.marathon.analytics.internal.pub.Track
9
8
import com.malinskiy.marathon.android.AndroidAppInstaller
@@ -24,12 +23,15 @@ import kotlinx.coroutines.CompletableJob
24
23
import kotlinx.coroutines.CoroutineScope
25
24
import kotlinx.coroutines.Dispatchers
26
25
import kotlinx.coroutines.SupervisorJob
26
+ import kotlinx.coroutines.TimeoutCancellationException
27
27
import kotlinx.coroutines.cancel
28
28
import kotlinx.coroutines.channels.Channel
29
29
import kotlinx.coroutines.delay
30
30
import kotlinx.coroutines.flow.Flow
31
31
import kotlinx.coroutines.flow.consumeAsFlow
32
+ import kotlinx.coroutines.isActive
32
33
import kotlinx.coroutines.launch
34
+ import kotlinx.coroutines.time.withTimeout
33
35
import java.time.Duration
34
36
import java.util.concurrent.ConcurrentHashMap
35
37
import java.util.concurrent.ConcurrentMap
@@ -54,8 +56,6 @@ class DdmlibDeviceProvider(
54
56
private val job = SupervisorJob ()
55
57
private val coroutineScope = CoroutineScope (job + dispatcher)
56
58
57
- override val deviceInitializationTimeoutMillis: Long = 180_000
58
-
59
59
override val deviceEvents: Flow <DeviceEvent >
60
60
get() = channel.consumeAsFlow()
61
61
@@ -74,31 +74,14 @@ class DdmlibDeviceProvider(
74
74
logger.debug(" Reusing existing ADB bridge" )
75
75
}
76
76
77
- var getDevicesCountdown = config.noDevicesTimeoutMillis
78
- val sleepTime = DEFAULT_DDM_LIB_SLEEP_TIME
79
- while (! adb.hasInitialDeviceList() || ! adb.hasDevices() && getDevicesCountdown >= 0 ) {
80
- logger.debug(" No devices, waiting..." )
81
-
82
- try {
83
- delay(sleepTime)
84
- } catch (e: InterruptedException ) {
85
- throw TimeoutException (" Timeout getting device list" , e)
86
- }
87
- getDevicesCountdown - = sleepTime
88
- }
89
-
90
- logger.debug(" Finished waiting for a device" )
77
+ adb.ensureInitialized()
91
78
92
79
if (! newAdbCreated && adb.devices.isNotEmpty()) {
93
80
logger.debug(" Initial connected devices: {}" , adb.devices.joinToString(" , " ))
94
81
adb.devices.forEach {
95
82
deviceConnected(it)
96
83
}
97
84
}
98
-
99
- if (! adb.hasInitialDeviceList() || ! adb.hasDevices()) {
100
- throw NoDevicesException ()
101
- }
102
85
}
103
86
104
87
private fun getDeviceOrPut (androidDevice : DdmlibAndroidDevice ): DdmlibAndroidDevice {
@@ -122,8 +105,6 @@ class DdmlibDeviceProvider(
122
105
}
123
106
}
124
107
125
- private fun AndroidDebugBridge.hasDevices (): Boolean = devices.isNotEmpty()
126
-
127
108
override suspend fun terminate () {
128
109
job.completeRecursively()
129
110
job.join()
@@ -216,6 +197,19 @@ class DdmlibDeviceProvider(
216
197
parentJob = job
217
198
)
218
199
200
+ private suspend fun AndroidDebugBridge.ensureInitialized () {
201
+ try {
202
+ withTimeout(ADB_INIT_TIMEOUT ) {
203
+ while (isActive && ! hasInitialDeviceList()) {
204
+ logger.debug(" Waiting for ADB initialization..." )
205
+ delay(500L )
206
+ }
207
+ }
208
+ } catch (e: TimeoutCancellationException ) {
209
+ throw NoDevicesException (e)
210
+ }
211
+ }
212
+
219
213
private val vendorConfiguration: AndroidConfiguration
220
214
get() = config.vendorConfiguration as AndroidConfiguration
221
215
@@ -229,6 +223,5 @@ class DdmlibDeviceProvider(
229
223
companion object {
230
224
private val ADB_INIT_TIMEOUT = Duration .ofSeconds(60 )
231
225
private const val DEFAULT_DDM_LIB_TIMEOUT = 30000
232
- private const val DEFAULT_DDM_LIB_SLEEP_TIME = 500L
233
226
}
234
227
}
0 commit comments