Skip to content

Commit 4f70849

Browse files
committed
NAVAND-960: allow different PredictiveCacheLocationOptions for different zooms
1 parent 687f6ba commit 4f70849

File tree

10 files changed

+455
-120
lines changed

10 files changed

+455
-120
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: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,31 @@ 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. If [Builder.predictiveCacheMapsOptionsList] was used,
18+
* returns first element from [predictiveCacheMapsOptionsList].
19+
* @deprecated use predictiveCacheMapsOptionsList instead to provide different
20+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
21+
*/
22+
@Deprecated("Use predictiveCacheMapsOptionsList")
23+
val predictiveCacheMapsOptions: PredictiveCacheMapsOptions =
24+
predictiveCacheMapsOptionsList.first()
25+
1426
/**
1527
* Get a builder to customize a subset of current options.
1628
*/
1729
fun toBuilder(): Builder = Builder().apply {
1830
predictiveCacheNavigationOptions(predictiveCacheNavigationOptions)
19-
predictiveCacheMapsOptions(predictiveCacheMapsOptions)
31+
predictiveCacheMapsOptionsList(predictiveCacheMapsOptionsList)
2032
}
2133

2234
/**
@@ -29,7 +41,7 @@ class PredictiveCacheOptions private constructor(
2941
other as PredictiveCacheOptions
3042

3143
if (predictiveCacheNavigationOptions != other.predictiveCacheNavigationOptions) return false
32-
if (predictiveCacheMapsOptions != other.predictiveCacheMapsOptions) return false
44+
if (predictiveCacheMapsOptionsList != other.predictiveCacheMapsOptionsList) return false
3345

3446
return true
3547
}
@@ -39,7 +51,7 @@ class PredictiveCacheOptions private constructor(
3951
*/
4052
override fun hashCode(): Int {
4153
var result = predictiveCacheNavigationOptions.hashCode()
42-
result = 31 * result + predictiveCacheMapsOptions.hashCode()
54+
result = 31 * result + predictiveCacheMapsOptionsList.hashCode()
4355
return result
4456
}
4557

@@ -49,16 +61,18 @@ class PredictiveCacheOptions private constructor(
4961
override fun toString(): String {
5062
return "PredictiveCacheOptions(" +
5163
"predictiveCacheNavigationOptions=$predictiveCacheNavigationOptions, " +
52-
"predictiveCacheMapsOptions=$predictiveCacheMapsOptions" +
64+
"predictiveCacheMapsOptionsList=$predictiveCacheMapsOptionsList" +
5365
")"
5466
}
5567

5668
/**
5769
* Build a new [PredictiveCacheOptions].
5870
*/
5971
class Builder {
60-
private var predictiveCacheNavigationOptions: PredictiveCacheNavigationOptions? = null
61-
private var predictiveCacheMapsOptions: PredictiveCacheMapsOptions? = null
72+
private var predictiveCacheNavigationOptions =
73+
PredictiveCacheNavigationOptions.Builder().build()
74+
private var predictiveCacheMapsOptionsList =
75+
listOf(PredictiveCacheMapsOptions.Builder().build())
6276

6377
/**
6478
* Predictive cache Navigation related options.
@@ -71,17 +85,40 @@ class PredictiveCacheOptions private constructor(
7185

7286
/**
7387
* Predictive cache Maps related options.
88+
* @deprecated use predictiveCacheMapsOptionsList instead to provide different
89+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
7490
*/
91+
@Deprecated(
92+
"Use predictiveCacheMapsOptionsList",
93+
ReplaceWith("predictiveCacheMapsOptionsList(listOf(predictiveCacheMapsOptions))")
94+
)
7595
fun predictiveCacheMapsOptions(
7696
predictiveCacheMapsOptions: PredictiveCacheMapsOptions
77-
): Builder = apply { this.predictiveCacheMapsOptions = predictiveCacheMapsOptions }
97+
): Builder = predictiveCacheMapsOptionsList(listOf(predictiveCacheMapsOptions))
98+
99+
/**
100+
* List of predictive cache Maps related options ([PredictiveCacheMapsOptions]).
101+
* Use this instead of [predictiveCacheMapsOptions] so that you can specify different
102+
* [PredictiveCacheLocationOptions]s for different zoom level ranges.
103+
*
104+
* @throws IllegalArgumentException if [predictiveCacheMapsOptionsList] is empty.
105+
*/
106+
@Throws(IllegalArgumentException::class)
107+
fun predictiveCacheMapsOptionsList(
108+
predictiveCacheMapsOptionsList: List<PredictiveCacheMapsOptions>
109+
): Builder = apply {
110+
if (predictiveCacheMapsOptionsList.isEmpty()) {
111+
throw IllegalArgumentException("predictiveCacheMapsOptionsList must not be empty")
112+
}
113+
this.predictiveCacheMapsOptionsList = predictiveCacheMapsOptionsList.toList()
114+
}
78115

79116
/**
80117
* Build [PredictiveCacheOptions].
81118
*/
82119
fun build(): PredictiveCacheOptions = PredictiveCacheOptions(
83-
predictiveCacheNavigationOptions ?: PredictiveCacheNavigationOptions.Builder().build(),
84-
predictiveCacheMapsOptions ?: PredictiveCacheMapsOptions.Builder().build(),
120+
predictiveCacheNavigationOptions,
121+
predictiveCacheMapsOptionsList
85122
)
86123
}
87124
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+
predictiveCacheMapsOptionsList(
26+
listOf(
27+
PredictiveCacheMapsOptions.Builder().apply {
28+
predictiveCacheLocationOptions(
29+
PredictiveCacheLocationOptions.Builder().apply {
30+
currentLocationRadiusInMeters(100)
31+
routeBufferRadiusInMeters(2)
32+
destinationLocationRadiusInMeters(15)
33+
}.build()
34+
)
35+
minZoom(1)
36+
maxZoom(3)
37+
}.build(),
38+
PredictiveCacheMapsOptions.Builder().apply {
39+
predictiveCacheLocationOptions(
40+
PredictiveCacheLocationOptions.Builder().apply {
41+
currentLocationRadiusInMeters(200)
42+
routeBufferRadiusInMeters(3)
43+
destinationLocationRadiusInMeters(18)
44+
}.build()
45+
)
46+
minZoom(7)
47+
maxZoom(9)
48+
}.build(),
49+
)
50+
)
51+
}
52+
53+
@Test
54+
override fun trigger() {
55+
// trigger, see KDoc
56+
}
57+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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 PredictiveCacheOptionsDeprecatedBuilderTest :
8+
BuilderTest<PredictiveCacheOptions, PredictiveCacheOptions.Builder>() {
9+
10+
override fun getImplementationClass(): KClass<PredictiveCacheOptions> =
11+
PredictiveCacheOptions::class
12+
13+
override fun getFilledUpBuilder(): PredictiveCacheOptions.Builder =
14+
PredictiveCacheOptions.Builder().apply {
15+
predictiveCacheNavigationOptions(
16+
PredictiveCacheNavigationOptions.Builder().apply {
17+
predictiveCacheLocationOptions(
18+
PredictiveCacheLocationOptions.Builder().apply {
19+
currentLocationRadiusInMeters(300)
20+
routeBufferRadiusInMeters(50)
21+
destinationLocationRadiusInMeters(20)
22+
}.build()
23+
)
24+
}.build()
25+
)
26+
predictiveCacheMapsOptions(
27+
PredictiveCacheMapsOptions.Builder().apply {
28+
predictiveCacheLocationOptions(
29+
PredictiveCacheLocationOptions.Builder().apply {
30+
currentLocationRadiusInMeters(100)
31+
routeBufferRadiusInMeters(2)
32+
destinationLocationRadiusInMeters(15)
33+
}.build()
34+
)
35+
minZoom(1)
36+
maxZoom(3)
37+
}.build()
38+
)
39+
}
40+
41+
@Test
42+
override fun trigger() {
43+
// trigger, see KDoc
44+
}
45+
}
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
}

0 commit comments

Comments
 (0)