Skip to content

Commit 1521010

Browse files
github-actions[bot]klokantechsysadminsasaprodribaba
authored
RD-1380: Add areTilesLoaded method to the map - Kotlin (#91)
Co-authored-by: klokantechsysadmin <[email protected]> Co-authored-by: sasaprodribaba <[email protected]>
1 parent 9d73696 commit 1521010

File tree

6 files changed

+103
-0
lines changed

6 files changed

+103
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) 2025, MapTiler
3+
* All rights reserved.
4+
* SPDX-License-Identifier: BSD 3-Clause
5+
*/
6+
7+
package com.maptiler.maptilersdk.commands.navigation
8+
9+
import com.maptiler.maptilersdk.bridge.MTBridge
10+
import com.maptiler.maptilersdk.bridge.MTCommand
11+
12+
internal class AreTilesLoaded : MTCommand {
13+
override val isPrimitiveReturnType: Boolean = true
14+
15+
override fun toJS(): String = "${MTBridge.MAP_OBJECT}.areTilesLoaded();"
16+
}

MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,16 @@ class MTMapViewController(
404404
*/
405405
override suspend fun getCenterClampedToGround(): Boolean = navigableWorker.getCenterClampedToGround()
406406

407+
/**
408+
* Returns whether the map is set to render multiple world copies.
409+
*/
407410
override suspend fun getRenderWorldCopies(): Boolean = navigableWorker.getRenderWorldCopies()
408411

412+
/**
413+
* Returns whether all currently requested tiles are loaded.
414+
*/
415+
override suspend fun areTilesLoaded(): Boolean = navigableWorker.areTilesLoaded()
416+
409417
/**
410418
* Returns the pixel ratio currently used to render the map.
411419
*/

MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/workers/navigable/MTNavigable.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ interface MTNavigable {
139139
*/
140140
suspend fun getRenderWorldCopies(): Boolean
141141

142+
/**
143+
* Returns whether all currently requested tiles are loaded.
144+
*/
145+
suspend fun areTilesLoaded(): Boolean
146+
142147
/**
143148
* Returns the pixel ratio currently used to render the map.
144149
*/

MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/workers/navigable/NavigableWorker.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.maptiler.maptilersdk.bridge.MTBridgeReturnType.BoolValue
1111
import com.maptiler.maptilersdk.bridge.MTBridgeReturnType.DoubleValue
1212
import com.maptiler.maptilersdk.bridge.MTBridgeReturnType.Null
1313
import com.maptiler.maptilersdk.bridge.MTBridgeReturnType.StringValue
14+
import com.maptiler.maptilersdk.commands.navigation.AreTilesLoaded
1415
import com.maptiler.maptilersdk.commands.navigation.EaseTo
1516
import com.maptiler.maptilersdk.commands.navigation.FitBounds
1617
import com.maptiler.maptilersdk.commands.navigation.FitToIpBounds
@@ -295,6 +296,27 @@ internal class NavigableWorker(
295296
}
296297
}
297298

299+
override suspend fun areTilesLoaded(): Boolean {
300+
val returnTypeValue =
301+
bridge.execute(
302+
AreTilesLoaded(),
303+
)
304+
305+
return when (returnTypeValue) {
306+
is BoolValue -> returnTypeValue.value
307+
is DoubleValue -> returnTypeValue.value != 0.0
308+
is StringValue -> {
309+
val normalized = returnTypeValue.value.trim().lowercase()
310+
when (normalized) {
311+
"true" -> true
312+
"false" -> false
313+
else -> normalized.toDoubleOrNull()?.let { it != 0.0 } ?: false
314+
}
315+
}
316+
else -> false
317+
}
318+
}
319+
298320
override suspend fun getPixelRatio(): Double {
299321
val returnTypeValue =
300322
bridge.execute(

MapTilerSDK/src/test/java/com/maptiler/maptilersdk/NavigationTests.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.maptiler.maptilersdk
88

99
import com.maptiler.maptilersdk.bridge.MTBridge
10+
import com.maptiler.maptilersdk.commands.navigation.AreTilesLoaded
1011
import com.maptiler.maptilersdk.commands.navigation.GetCenterClampedToGround
1112
import com.maptiler.maptilersdk.commands.navigation.GetCenterElevation
1213
import com.maptiler.maptilersdk.commands.navigation.GetMaxPitch
@@ -41,6 +42,11 @@ class NavigationTests {
4142
assertEquals("${MTBridge.MAP_OBJECT}.getRenderWorldCopies();", command.toJS())
4243
}
4344

45+
@Test fun areTilesLoadedToJS_ReturnsCorrectJSString() {
46+
val command = AreTilesLoaded()
47+
assertEquals("${MTBridge.MAP_OBJECT}.areTilesLoaded();", command.toJS())
48+
}
49+
4450
@Test fun getPixelRatioToJS_ReturnsCorrectJSString() {
4551
val command = GetPixelRatio()
4652
assertEquals("${MTBridge.MAP_OBJECT}.getPixelRatio();", command.toJS())

MapTilerSDK/src/test/java/com/maptiler/maptilersdk/WorkerAndStyleTests.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge
1010
import com.maptiler.maptilersdk.bridge.MTBridgeReturnType
1111
import com.maptiler.maptilersdk.bridge.MTCommand
1212
import com.maptiler.maptilersdk.bridge.MTCommandExecutable
13+
import com.maptiler.maptilersdk.commands.navigation.AreTilesLoaded
1314
import com.maptiler.maptilersdk.commands.navigation.GetBearing
1415
import com.maptiler.maptilersdk.commands.navigation.GetCenterClampedToGround
1516
import com.maptiler.maptilersdk.commands.navigation.GetCenterElevation
@@ -124,6 +125,51 @@ class WorkerAndStyleTests {
124125
assertTrue(executedCommands.all { it is GetRenderWorldCopies })
125126
}
126127

128+
@Test fun navigableWorker_areTilesLoaded_ParsesPrimitiveReturnTypes() =
129+
runBlocking {
130+
val executedCommands = mutableListOf<MTCommand>()
131+
val responses =
132+
ArrayDeque(
133+
listOf(
134+
MTBridgeReturnType.BoolValue(true),
135+
MTBridgeReturnType.DoubleValue(0.0),
136+
MTBridgeReturnType.DoubleValue(1.0),
137+
MTBridgeReturnType.StringValue("false"),
138+
MTBridgeReturnType.StringValue(" TRUE "),
139+
MTBridgeReturnType.StringValue("0"),
140+
MTBridgeReturnType.StringValue("unexpected"),
141+
),
142+
)
143+
144+
val exec =
145+
object : MTCommandExecutable {
146+
override suspend fun execute(command: MTCommand): MTBridgeReturnType {
147+
executedCommands.add(command)
148+
return responses.removeFirst()
149+
}
150+
}
151+
152+
val bridge = MTBridge(exec)
153+
val worker = NavigableWorker(bridge, this)
154+
155+
val first = worker.areTilesLoaded()
156+
val second = worker.areTilesLoaded()
157+
val third = worker.areTilesLoaded()
158+
val fourth = worker.areTilesLoaded()
159+
val fifth = worker.areTilesLoaded()
160+
val sixth = worker.areTilesLoaded()
161+
val seventh = worker.areTilesLoaded()
162+
163+
assertEquals(true, first)
164+
assertEquals(false, second)
165+
assertEquals(true, third)
166+
assertEquals(false, fourth)
167+
assertEquals(true, fifth)
168+
assertEquals(false, sixth)
169+
assertEquals(false, seventh)
170+
assertTrue(executedCommands.all { it is AreTilesLoaded })
171+
}
172+
127173
@Test fun navigableWorker_getCenterElevation_ParsesStringReturnType() =
128174
runBlocking {
129175
var usedGetCenterElevation = false

0 commit comments

Comments
 (0)