Skip to content

Commit f90a47b

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

File tree

11 files changed

+456
-121
lines changed

11 files changed

+456
-121
lines changed

LICENSE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Mapbox Navigation Android SDK
55

66
Copyright ©2022 - 2023 Mapbox, Inc. All rights reserved.
77

8-
The software and files in this repository (collectively, "Software") are licensed under the Mapbox TOS for use only with the relevant Mapbox product(s) listed at www.mapbox.com/pricing. This license allows developers with a current active Mapbox account to use and modify the authorized portions of the Software as needed for use only with the relevant Mapbox product(s) through their Mapbox account in accordance with the Mapbox TOS. This license terminates automatically if a developer no longer has a Mapbox account in good standing or breaches the Mapbox TOS. For the license terms, please see the Mapbox TOS at https://www.mapbox.com/legal/tos/ which incorporates the Mapbox Product Terms at www.mapbox.com/legal/service-terms. If this Software is a SDK, modifications that change or interfere with marked portions of the code related to billing, accounting, or data collection are not authorized and the SDK sends limited de-identified location and usage data which is used in accordance with the Mapbox TOS. [Updated 2023-01]
8+
The software and files in this repository (collectively, "Software") are licensed under the Mapbox TOS for use only with the relevant Mapbox product(s) listed at www.mapbox.com/pricing. This license allows developers with a current active Mapbox account to use and modify the authorized portions of the Software as needed for use only with the relevant Mapbox product(s) through their Mapbox account in accordance with the Mapbox TOS. This license terminates automatically if a developer no longer has a Mapbox account in good standing or breaches the Mapbox TOS. For the license terms, please see the Mapbox TOS at https://www.mapbox.com/legal/tos/ which incorporates the Mapbox Product Terms at www.mapbox.com/legal/service-terms. If this Software is a SDK, modifications that change or interfere with marked portions of the code related to billing, accounting, or data collection are not authorized and the SDK sends limited de-identified location and usage data which is used in accordance with the Mapbox TOS. [Updated 2023-02]
99

1010
---------------------------------------
1111
Mapbox Navigation uses portions of the Gradle License Plugin.
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)