Skip to content

Commit 471b7af

Browse files
committed
NAVAND-960: allow different PredictiveCacheLocationOptions for different zooms
1 parent a093390 commit 471b7af

File tree

10 files changed

+396
-117
lines changed

10 files changed

+396
-117
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Introduced `PredictiveCacheOptions.Builder#predictiveCacheMapsOptionsList` as an alternative for deprecated `PredictiveCacheOptions.Builder#predictiveCacheMapsOptions`. This allows to use different `PredictiveCacheLocationOptions` for different zoom level ranges.

libnavigation-base/api/current.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -542,17 +542,20 @@ package com.mapbox.navigation.base.options {
542542
}
543543

544544
public final class PredictiveCacheOptions {
545-
method public com.mapbox.navigation.base.options.PredictiveCacheMapsOptions getPredictiveCacheMapsOptions();
545+
method @Deprecated public com.mapbox.navigation.base.options.PredictiveCacheMapsOptions getPredictiveCacheMapsOptions();
546+
method public java.util.List<com.mapbox.navigation.base.options.PredictiveCacheMapsOptions> getPredictiveCacheMapsOptionsList();
546547
method public com.mapbox.navigation.base.options.PredictiveCacheNavigationOptions getPredictiveCacheNavigationOptions();
547548
method public com.mapbox.navigation.base.options.PredictiveCacheOptions.Builder toBuilder();
548-
property public final com.mapbox.navigation.base.options.PredictiveCacheMapsOptions predictiveCacheMapsOptions;
549+
property @Deprecated public final com.mapbox.navigation.base.options.PredictiveCacheMapsOptions predictiveCacheMapsOptions;
550+
property public final java.util.List<com.mapbox.navigation.base.options.PredictiveCacheMapsOptions> predictiveCacheMapsOptionsList;
549551
property public final com.mapbox.navigation.base.options.PredictiveCacheNavigationOptions predictiveCacheNavigationOptions;
550552
}
551553

552554
public static final class PredictiveCacheOptions.Builder {
553555
ctor public PredictiveCacheOptions.Builder();
554556
method public com.mapbox.navigation.base.options.PredictiveCacheOptions build();
555-
method public com.mapbox.navigation.base.options.PredictiveCacheOptions.Builder predictiveCacheMapsOptions(com.mapbox.navigation.base.options.PredictiveCacheMapsOptions predictiveCacheMapsOptions);
557+
method @Deprecated public com.mapbox.navigation.base.options.PredictiveCacheOptions.Builder predictiveCacheMapsOptions(com.mapbox.navigation.base.options.PredictiveCacheMapsOptions predictiveCacheMapsOptions);
558+
method @kotlin.jvm.Throws(exceptionClasses=IllegalArgumentException::class) public com.mapbox.navigation.base.options.PredictiveCacheOptions.Builder predictiveCacheMapsOptionsList(java.util.List<com.mapbox.navigation.base.options.PredictiveCacheMapsOptions> predictiveCacheMapsOptionsList) throws java.lang.IllegalArgumentException;
556559
method public com.mapbox.navigation.base.options.PredictiveCacheOptions.Builder predictiveCacheNavigationOptions(com.mapbox.navigation.base.options.PredictiveCacheNavigationOptions predictiveCacheNavigationOptions);
557560
}
558561

libnavigation-base/src/main/java/com/mapbox/navigation/base/options/PredictiveCacheOptions.kt

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@ package com.mapbox.navigation.base.options
44
* PredictiveCacheOptions
55
*
66
* @param predictiveCacheNavigationOptions [PredictiveCacheNavigationOptions] Predictive cache Navigation related options.
7-
* @param predictiveCacheMapsOptions [PredictiveCacheMapsOptions] Predictive cache Maps related options.
7+
* @param predictiveCacheMapsOptionsList List of predictive cache Maps related options ([PredictiveCacheMapsOptions]).
8+
* Use this instead of [predictiveCacheMapsOptions] so that you can specify different
9+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
810
*/
911
class PredictiveCacheOptions private constructor(
1012
val predictiveCacheNavigationOptions: PredictiveCacheNavigationOptions,
11-
val predictiveCacheMapsOptions: PredictiveCacheMapsOptions,
13+
val predictiveCacheMapsOptionsList: List<PredictiveCacheMapsOptions>
1214
) {
1315

16+
/**
17+
* Predictive cache Maps related options.
18+
* @deprecated use predictiveCacheMapsOptionsList instead to provide different
19+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
20+
*/
21+
@Deprecated("Use predictiveCacheMapsOptionsList")
22+
val predictiveCacheMapsOptions: PredictiveCacheMapsOptions =
23+
predictiveCacheMapsOptionsList.first()
24+
1425
/**
1526
* Get a builder to customize a subset of current options.
1627
*/
@@ -29,7 +40,7 @@ class PredictiveCacheOptions private constructor(
2940
other as PredictiveCacheOptions
3041

3142
if (predictiveCacheNavigationOptions != other.predictiveCacheNavigationOptions) return false
32-
if (predictiveCacheMapsOptions != other.predictiveCacheMapsOptions) return false
43+
if (predictiveCacheMapsOptionsList != other.predictiveCacheMapsOptionsList) return false
3344

3445
return true
3546
}
@@ -39,7 +50,7 @@ class PredictiveCacheOptions private constructor(
3950
*/
4051
override fun hashCode(): Int {
4152
var result = predictiveCacheNavigationOptions.hashCode()
42-
result = 31 * result + predictiveCacheMapsOptions.hashCode()
53+
result = 31 * result + predictiveCacheMapsOptionsList.hashCode()
4354
return result
4455
}
4556

@@ -49,7 +60,7 @@ class PredictiveCacheOptions private constructor(
4960
override fun toString(): String {
5061
return "PredictiveCacheOptions(" +
5162
"predictiveCacheNavigationOptions=$predictiveCacheNavigationOptions, " +
52-
"predictiveCacheMapsOptions=$predictiveCacheMapsOptions" +
63+
"predictiveCacheMapsOptionsList=$predictiveCacheMapsOptionsList" +
5364
")"
5465
}
5566

@@ -58,7 +69,7 @@ class PredictiveCacheOptions private constructor(
5869
*/
5970
class Builder {
6071
private var predictiveCacheNavigationOptions: PredictiveCacheNavigationOptions? = null
61-
private var predictiveCacheMapsOptions: PredictiveCacheMapsOptions? = null
72+
private var predictiveCacheMapsOptionsList = emptyList<PredictiveCacheMapsOptions>()
6273

6374
/**
6475
* Predictive cache Navigation related options.
@@ -71,17 +82,42 @@ class PredictiveCacheOptions private constructor(
7182

7283
/**
7384
* Predictive cache Maps related options.
85+
* @deprecated use predictiveCacheMapsOptionsList instead to provide different
86+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
7487
*/
88+
@Deprecated(
89+
"Use predictiveCacheMapsOptionsList",
90+
ReplaceWith("predictiveCacheMapsOptionsList(listOf(predictiveCacheMapsOptions))")
91+
)
7592
fun predictiveCacheMapsOptions(
7693
predictiveCacheMapsOptions: PredictiveCacheMapsOptions
77-
): Builder = apply { this.predictiveCacheMapsOptions = predictiveCacheMapsOptions }
94+
): Builder = predictiveCacheMapsOptionsList(listOf(predictiveCacheMapsOptions))
95+
96+
/**
97+
* List of predictive cache Maps related options ([PredictiveCacheMapsOptions]).
98+
* Use this instead of [predictiveCacheMapsOptions] so that you can specify different
99+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
100+
*
101+
* @throws IllegalArgumentException if [predictiveCacheMapsOptionsList] is empty.
102+
*/
103+
@Throws(IllegalArgumentException::class)
104+
fun predictiveCacheMapsOptionsList(
105+
predictiveCacheMapsOptionsList: List<PredictiveCacheMapsOptions>
106+
): Builder = apply {
107+
if (predictiveCacheMapsOptionsList.isEmpty()) {
108+
throw IllegalArgumentException("predictiveCacheMapsOptionsList must not be empty")
109+
}
110+
this.predictiveCacheMapsOptionsList = predictiveCacheMapsOptionsList.toList()
111+
}
78112

79113
/**
80114
* Build [PredictiveCacheOptions].
81115
*/
82116
fun build(): PredictiveCacheOptions = PredictiveCacheOptions(
83117
predictiveCacheNavigationOptions ?: PredictiveCacheNavigationOptions.Builder().build(),
84-
predictiveCacheMapsOptions ?: PredictiveCacheMapsOptions.Builder().build(),
118+
predictiveCacheMapsOptionsList.ifEmpty {
119+
listOf(PredictiveCacheMapsOptions.Builder().build())
120+
}
85121
)
86122
}
87123
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.mapbox.navigation.base.options
2+
3+
import com.mapbox.navigation.testing.BuilderTest
4+
import org.junit.Test
5+
import kotlin.reflect.KClass
6+
7+
class PredictiveCacheOptionsBuilderTest :
8+
BuilderTest<PredictiveCacheOptions, PredictiveCacheOptions.Builder>() {
9+
override fun getImplementationClass(): KClass<PredictiveCacheOptions> =
10+
PredictiveCacheOptions::class
11+
12+
override fun getFilledUpBuilder(): PredictiveCacheOptions.Builder =
13+
PredictiveCacheOptions.Builder().apply {
14+
predictiveCacheNavigationOptions(
15+
PredictiveCacheNavigationOptions.Builder().apply {
16+
predictiveCacheLocationOptions(
17+
PredictiveCacheLocationOptions.Builder().apply {
18+
currentLocationRadiusInMeters(300)
19+
routeBufferRadiusInMeters(50)
20+
destinationLocationRadiusInMeters(20)
21+
}.build()
22+
)
23+
}.build()
24+
)
25+
predictiveCacheMapsOptions(
26+
PredictiveCacheMapsOptions.Builder().apply {
27+
predictiveCacheLocationOptions(
28+
PredictiveCacheLocationOptions.Builder().apply {
29+
currentLocationRadiusInMeters(100)
30+
routeBufferRadiusInMeters(2)
31+
destinationLocationRadiusInMeters(15)
32+
}.build()
33+
)
34+
minZoom(1)
35+
maxZoom(3)
36+
}.build()
37+
)
38+
}
39+
40+
@Test
41+
override fun trigger() {
42+
// trigger, see KDoc
43+
}
44+
}
Lines changed: 73 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,80 @@
11
package com.mapbox.navigation.base.options
22

3-
import com.mapbox.navigation.testing.BuilderTest
3+
import org.junit.Assert.assertEquals
44
import org.junit.Test
5-
import kotlin.reflect.KClass
6-
7-
class PredictiveCacheOptionsTest :
8-
BuilderTest<PredictiveCacheOptions, PredictiveCacheOptions.Builder>() {
9-
override fun getImplementationClass(): KClass<PredictiveCacheOptions> =
10-
PredictiveCacheOptions::class
11-
12-
override fun getFilledUpBuilder(): PredictiveCacheOptions.Builder =
13-
PredictiveCacheOptions.Builder().apply {
14-
predictiveCacheNavigationOptions(
15-
PredictiveCacheNavigationOptions.Builder().apply {
16-
predictiveCacheLocationOptions(
17-
PredictiveCacheLocationOptions.Builder().apply {
18-
currentLocationRadiusInMeters(300)
19-
routeBufferRadiusInMeters(50)
20-
destinationLocationRadiusInMeters(20)
21-
}.build()
22-
)
23-
}.build()
24-
)
25-
predictiveCacheMapsOptions(
26-
PredictiveCacheMapsOptions.Builder().apply {
27-
predictiveCacheLocationOptions(
28-
PredictiveCacheLocationOptions.Builder().apply {
29-
currentLocationRadiusInMeters(100)
30-
routeBufferRadiusInMeters(2)
31-
destinationLocationRadiusInMeters(15)
32-
}.build()
33-
)
34-
minZoom(1)
35-
maxZoom(3)
36-
}.build()
37-
)
38-
}
5+
6+
class PredictiveCacheOptionsTest {
7+
8+
@Test
9+
fun defaultMapsOptionsList() {
10+
val expected = PredictiveCacheMapsOptions.Builder().build()
11+
val actual = PredictiveCacheOptions.Builder().build()
12+
13+
assertEquals(expected, actual.predictiveCacheMapsOptions)
14+
assertEquals(listOf(expected), actual.predictiveCacheMapsOptionsList)
15+
}
16+
17+
@Test
18+
fun deprecatedMapsOptions() {
19+
val mapsOptions = PredictiveCacheMapsOptions.Builder().minZoom(12).maxZoom(14).build()
20+
val actual = PredictiveCacheOptions.Builder()
21+
.predictiveCacheMapsOptions(mapsOptions)
22+
.build()
23+
24+
assertEquals(mapsOptions, actual.predictiveCacheMapsOptions)
25+
assertEquals(listOf(mapsOptions), actual.predictiveCacheMapsOptionsList)
26+
}
27+
28+
@Test
29+
fun customMapsOptionsList() {
30+
val mapsOptions1 = PredictiveCacheMapsOptions.Builder().minZoom(12).maxZoom(14).build()
31+
val mapsOptions2 = PredictiveCacheMapsOptions.Builder().minZoom(11).maxZoom(13).build()
32+
val actual = PredictiveCacheOptions.Builder()
33+
.predictiveCacheMapsOptionsList(listOf(mapsOptions1, mapsOptions2))
34+
.build()
35+
36+
assertEquals(mapsOptions1, actual.predictiveCacheMapsOptions)
37+
assertEquals(listOf(mapsOptions1, mapsOptions2), actual.predictiveCacheMapsOptionsList)
38+
}
39+
40+
@Test(expected = IllegalArgumentException::class)
41+
fun customEmptyMapsOptionsList() {
42+
PredictiveCacheOptions.Builder()
43+
.predictiveCacheMapsOptionsList(emptyList())
44+
.build()
45+
}
3946

4047
@Test
41-
override fun trigger() {
42-
// trigger, see KDoc
48+
fun customMapsOptionsAfterDeprecatedMapsOptions() {
49+
val deprecatedMapsOptions = PredictiveCacheMapsOptions.Builder()
50+
.minZoom(7)
51+
.maxZoom(9)
52+
.build()
53+
val mapsOptions1 = PredictiveCacheMapsOptions.Builder().minZoom(12).maxZoom(14).build()
54+
val mapsOptions2 = PredictiveCacheMapsOptions.Builder().minZoom(11).maxZoom(13).build()
55+
val actual = PredictiveCacheOptions.Builder()
56+
.predictiveCacheMapsOptions(deprecatedMapsOptions)
57+
.predictiveCacheMapsOptionsList(listOf(mapsOptions1, mapsOptions2))
58+
.build()
59+
60+
assertEquals(mapsOptions1, actual.predictiveCacheMapsOptions)
61+
assertEquals(listOf(mapsOptions1, mapsOptions2), actual.predictiveCacheMapsOptionsList)
62+
}
63+
64+
@Test
65+
fun deprecatedMapsOptionsAfterCustomMapsOptionsList() {
66+
val deprecatedMapsOptions = PredictiveCacheMapsOptions.Builder()
67+
.minZoom(7)
68+
.maxZoom(9)
69+
.build()
70+
val mapsOptions1 = PredictiveCacheMapsOptions.Builder().minZoom(12).maxZoom(14).build()
71+
val mapsOptions2 = PredictiveCacheMapsOptions.Builder().minZoom(11).maxZoom(13).build()
72+
val actual = PredictiveCacheOptions.Builder()
73+
.predictiveCacheMapsOptionsList(listOf(mapsOptions1, mapsOptions2))
74+
.predictiveCacheMapsOptions(deprecatedMapsOptions)
75+
.build()
76+
77+
assertEquals(deprecatedMapsOptions, actual.predictiveCacheMapsOptions)
78+
assertEquals(listOf(deprecatedMapsOptions), actual.predictiveCacheMapsOptionsList)
4379
}
4480
}

libnavigation-core/api/current.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,9 @@ package com.mapbox.navigation.core.replay.history {
529529
property public final Double? time;
530530
}
531531

532+
public final class ReplayEventLocationMapperKt {
533+
}
534+
532535
public final class ReplayEventUpdateLocation implements com.mapbox.navigation.core.replay.history.ReplayEventBase {
533536
ctor public ReplayEventUpdateLocation(@com.google.gson.annotations.SerializedName("event_timestamp") double eventTimestamp, @com.google.gson.annotations.SerializedName("location") com.mapbox.navigation.core.replay.history.ReplayEventLocation location);
534537
method public double component1();

libnavigation-core/src/main/java/com/mapbox/navigation/core/internal/PredictiveCache.kt

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ object PredictiveCache {
1111
internal val cachedNavigationPredictiveCacheControllers =
1212
mutableSetOf<PredictiveCacheController>()
1313
internal val cachedMapsPredictiveCacheControllers =
14-
mutableMapOf<Any, Pair<TilesetDescriptor, PredictiveCacheController>>()
14+
mutableMapOf<Any, List<Pair<TilesetDescriptor, PredictiveCacheController>>>()
1515
internal val cachedMapsPredictiveCacheControllersTileVariant =
1616
mutableMapOf<Any, MutableMap<String, PredictiveCacheController>>()
1717

1818
internal val navPredictiveCacheLocationOptions =
1919
mutableSetOf<PredictiveCacheLocationOptions>()
20-
internal val mapsPredictiveCacheLocationOptions =
21-
mutableMapOf<Any, Triple<TilesetDescriptor, TileStore, PredictiveCacheLocationOptions>>()
20+
internal val mapsPredictiveCacheLocationOptions = mutableMapOf<Any,
21+
Pair<TileStore, List<Pair<TilesetDescriptor, PredictiveCacheLocationOptions>>>>()
2222
internal val mapsPredictiveCacheLocationOptionsTileVariant =
2323
mutableMapOf<Any, MutableMap<String, Pair<TileStore, PredictiveCacheLocationOptions>>>()
2424

@@ -35,12 +35,11 @@ object PredictiveCache {
3535
createNavigationController(it)
3636
}
3737
mapsOptions.forEach { entry ->
38-
entry.value.let { (descriptor, tileStore, options) ->
39-
createMapsController(
38+
entry.value.let { (tileStore, descriptorsAndOptions) ->
39+
createMapsControllers(
4040
mapboxMap = entry.key,
41-
tilesetDescriptor = descriptor,
4241
tileStore = tileStore,
43-
predictiveCacheLocationOptions = options
42+
descriptorsAndOptions = descriptorsAndOptions
4443
)
4544
}
4645
}
@@ -69,9 +68,7 @@ object PredictiveCache {
6968
}
7069

7170
@Deprecated(
72-
"Use createMapsController(" +
73-
"mapboxMap, tileStore, tilesetDescriptor, predictiveCacheLocationOptions" +
74-
") instead."
71+
"Use createMapsControllers(mapboxMap, tileStore, descriptorsAndOptions) instead."
7572
)
7673
fun createMapsController(
7774
mapboxMap: Any,
@@ -97,23 +94,21 @@ object PredictiveCache {
9794
mapsPredictiveCacheLocationOptionsTileVariant[mapboxMap] = locationOptions
9895
}
9996

100-
fun createMapsController(
97+
fun createMapsControllers(
10198
mapboxMap: Any,
10299
tileStore: TileStore,
103-
tilesetDescriptor: TilesetDescriptor,
104-
predictiveCacheLocationOptions: PredictiveCacheLocationOptions
100+
descriptorsAndOptions: List<Pair<TilesetDescriptor, PredictiveCacheLocationOptions>>
105101
) {
106-
val predictiveCacheController =
107-
MapboxNativeNavigatorImpl.createMapsPredictiveCacheController(
102+
val descriptorsToPredictiveCacheControllers = descriptorsAndOptions.map {
103+
it.first to MapboxNativeNavigatorImpl.createMapsPredictiveCacheController(
108104
tileStore,
109-
tilesetDescriptor,
110-
predictiveCacheLocationOptions
105+
it.first,
106+
it.second
111107
)
108+
}
112109

113-
cachedMapsPredictiveCacheControllers[mapboxMap] =
114-
Pair(tilesetDescriptor, predictiveCacheController)
115-
mapsPredictiveCacheLocationOptions[mapboxMap] =
116-
Triple(tilesetDescriptor, tileStore, predictiveCacheLocationOptions)
110+
cachedMapsPredictiveCacheControllers[mapboxMap] = descriptorsToPredictiveCacheControllers
111+
mapsPredictiveCacheLocationOptions[mapboxMap] = tileStore to descriptorsAndOptions
117112
}
118113

119114
@Deprecated("Will be removed with other TileVariant logic")

0 commit comments

Comments
 (0)