Skip to content

Commit c3e7993

Browse files
committed
feat: Add timeout to waitUntilTheMapIsSteady animation step
This commit enhances the `waitUntilTheMapIsSteady` animation step by adding an optional timeout parameter. This prevents an animation from getting stuck indefinitely if the map never reaches a steady state. Key changes: - **`WaitUntilTheMapIsSteadyStep`:** Converted from a `data object` to a `data class` to accept a `timeoutMillis` parameter. The animation string command is now `waitUntilTheMapIsSteady=timeout=<milliseconds>`. - **`Map3dViewModel`:** The `awaitMapSteady()` function now takes a `timeoutMillis` argument and uses `withTimeout` to enforce the limit, logging a warning if the timeout is exceeded. - **`ScenarioMapper`:** The animation parser is updated to read the optional `timeout` value for the `waitUntilTheMapIsSteady` command. The parameterless version is still supported and will wait indefinitely. - **`ScenarioData`:** Updated existing scenarios to use a 1000ms timeout for the `waitUntilTheMapIsSteady` step.
1 parent e1cdce9 commit c3e7993

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

Maps3DSamples/advanced/app/src/main/java/com/example/advancedmaps3dsamples/common/Map3dViewModel.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ import kotlinx.coroutines.channels.awaitClose
4444
import kotlinx.coroutines.flow.Flow
4545
import kotlinx.coroutines.flow.MutableSharedFlow
4646
import kotlinx.coroutines.flow.MutableStateFlow
47+
import kotlinx.coroutines.TimeoutCancellationException
4748
import kotlinx.coroutines.flow.asStateFlow
4849
import kotlinx.coroutines.flow.callbackFlow
4950
import kotlinx.coroutines.flow.filterNotNull
5051
import kotlinx.coroutines.flow.first
5152
import kotlinx.coroutines.flow.map
5253
import kotlinx.coroutines.launch
54+
import kotlinx.coroutines.withTimeout
5355
import kotlin.time.Duration
5456

5557
abstract class Map3dViewModel : ViewModel() {
@@ -304,10 +306,22 @@ abstract class Map3dViewModel : ViewModel() {
304306
* Suspends until the map has entered a steady state, meaning it is not moving and has
305307
* finished loading. This is useful to ensure that camera animations start from a stable
306308
* and predictable state.
309+
*
310+
* @param timeoutMillis The maximum time to wait in milliseconds. A value of 0 means no timeout.
307311
*/
308-
suspend fun awaitMapSteady() {
309-
Log.d("Map3dViewModel", "awaitMapSteady: start")
310-
isMapSteady.first { it }
312+
suspend fun awaitMapSteady(timeoutMillis: Long) {
313+
Log.d("Map3dViewModel", "awaitMapSteady: start with timeout $timeoutMillis")
314+
if (timeoutMillis > 0) {
315+
try {
316+
withTimeout(timeoutMillis) {
317+
isMapSteady.first { it }
318+
}
319+
} catch (e: TimeoutCancellationException) {
320+
Log.w("Map3dViewModel", "awaitMapSteady timed out after $timeoutMillis ms")
321+
}
322+
} else {
323+
isMapSteady.first { it }
324+
}
311325
Log.d("Map3dViewModel", "awaitMapSteady: done")
312326
}
313327

Maps3DSamples/advanced/app/src/main/java/com/example/advancedmaps3dsamples/scenarios/Animations.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ data class DelayStep(val durationMillis: Long) : AnimationStep {
3131
/**
3232
* An [AnimationStep] that waits until the map is fully loaded and idle before proceeding
3333
* to the next step in the animation sequence.
34+
*
35+
* @param timeoutMillis The maximum time to wait in milliseconds. A value of 0 means no timeout.
3436
*/
35-
data object WaitUntilTheMapIsSteadyStep : AnimationStep {
37+
data class WaitUntilTheMapIsSteadyStep(val timeoutMillis: Long = 0) : AnimationStep {
3638
override suspend fun invoke(viewModel: ScenariosViewModel) {
37-
viewModel.awaitMapSteady()
39+
viewModel.awaitMapSteady(timeoutMillis)
3840
}
3941
}
4042

Maps3DSamples/advanced/app/src/main/java/com/example/advancedmaps3dsamples/scenarios/ScenarioData.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,10 @@ val scenarios =
290290
initialState =
291291
"mode=satellite;camera=lat=36.10145879,lng=-112.10555998,alt=774.39,hdg=33.198,tilt=74.036,range=9180.62",
292292
animationString =
293-
"waitUntilTheMapIsSteady;" +
293+
"waitUntilTheMapIsSteady=3000;" +
294294
"delay=dur=3000;" +
295295
"flyTo=lat=38.743502,lng=-109.499374,alt=1467,hdg=-10.4,tilt=58.1,range=138.2,dur=3500;" +
296-
"delay=dur=2000;" +
297-
"waitUntilTheMapIsSteady;" +
296+
"waitUntilTheMapIsSteady=timeout=3000;" +
298297
"flyAround=lat=38.743502,lng=-109.499374,alt=1467,hdg=-10.4,tilt=58.1,range=138.2,dur=6000,count=2;" +
299298
"delay=dur=2000",
300299
),
@@ -356,7 +355,7 @@ val scenarios =
356355
"waitUntilTheMapIsSteady;" +
357356
"flyTo=lat=21.306388,lng=-157.859271,alt=6.0,hdg=63,tilt=58,range=689,dur=2500;" +
358357
"delay=dur=750;" +
359-
"waitUntilTheMapIsSteady;" +
358+
"waitUntilTheMapIsSteady=timeout=1000;" +
360359
"flyTo=lat=21.276715,lng=-157.827153,alt=63.3,hdg=16,tilt=65,range=2121,dur=3500;" +
361360
"delay=dur=1000;" +
362361
"waitUntilTheMapIsSteady;" +

Maps3DSamples/advanced/app/src/main/java/com/example/advancedmaps3dsamples/scenarios/ScenarioMapper.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,16 @@ fun String.toAnimation(): List<AnimationStep> {
167167
"flyto" -> add(FlyToStep(value.toFlyTo()))
168168
"delay" -> add(DelayStep(value.toDelay()))
169169
"flyaround" -> add(FlyAroundStep(value.toFlyAround()))
170-
170+
"waitUntilTheMapIsSteady" -> {
171+
add(WaitUntilTheMapIsSteadyStep(value.toLong()))
172+
}
171173
else -> Log.w(TAG, "Unsupported animation step type: $key")
172174
}
173175
} else {
174176
when (trimmedStep.lowercase()) {
175177
"waituntilthemapissteady" -> {
176178
Log.d("ScenarioMapper", "add(WaitUntilTheMapIsSteadyStep)")
177-
add(WaitUntilTheMapIsSteadyStep)
179+
add(WaitUntilTheMapIsSteadyStep(0L))
178180
}
179181
else -> Log.w(TAG, "Ignoring invalid animation step format: $step")
180182
}

0 commit comments

Comments
 (0)