Skip to content

Commit

Permalink
Dependencies bump; Offline SAR improvement; Search 2.8.0 GA (#314)
Browse files Browse the repository at this point in the history
* Dependencies bump; Offline SAR improvement

* Fix ReplaceWith message, suppress deprecation

* Fix offline search test
  • Loading branch information
DzmitryFomchyn authored Feb 13, 2025
1 parent 88100d8 commit 788f24a
Show file tree
Hide file tree
Showing 11 changed files with 121 additions and 116 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
# Changelog for the Mapbox Search SDK for Android

## 2.8.0-SNAPSHOT
## 2.8.0

### New features
- `OfflineSearchResult` can now be of a POI type. `OfflineSearchResultType` has been deprecated, along with the `OfflineSearchResult.type` property. Use `OfflineSearchResult.newType` instead.
- `OfflineSearchEngine.searchAlongRoute(String, Point, List<Point>, OfflineSearchCallback)` has been deprecated. Use an overloaded function that accepts `OfflineSearchAlongRouteOptions` as a parameter instead.

### Experimental API breaking changes
- Properties `EvConnector.id`, `EVSE.uid` are nullable now.
- Property `EvLocation.images` has been removed.
- Now `OfflineSearchAlongRouteOptions` doesn't accept `proximity` as a parameter, search will be performed along the whole route.

### Mapbox dependencies
- Search Native SDK `2.8.0-rc.2`
Expand Down
2 changes: 1 addition & 1 deletion MapboxSearch/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ android.enableJetifier=false
kotlin.code.style=official

# SDK version attributes
VERSION_NAME=2.8.0-SNAPSHOT
VERSION_NAME=2.8.0

# Artifact attributes
mapboxArtifactUserOrg=mapbox
Expand Down
6 changes: 3 additions & 3 deletions MapboxSearch/gradle/versions.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@ ext {

pitest_version = '1.6.7'

mapbox_maps_version = '11.10.0-beta.1'
mapbox_maps_version = '11.10.0-rc.1'
mapbox_turf_version = '6.15.0'

common_sdk_version = '24.10.0-rc.1'
common_sdk_version = '24.10.0'
mapbox_base_version = '0.8.0'

search_native_version = '2.8.0-rc.2'
search_native_version = '2.8.0'

detekt_version = '1.19.0'

Expand Down
13 changes: 5 additions & 8 deletions MapboxSearch/offline/api/api-metalava.txt
Original file line number Diff line number Diff line change
Expand Up @@ -110,20 +110,17 @@ package com.mapbox.search.offline {
}

@com.mapbox.annotation.MapboxExperimental @kotlinx.parcelize.Parcelize public final class OfflineSearchAlongRouteOptions implements android.os.Parcelable {
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? proximity = null, com.mapbox.geojson.Point? origin = null, Integer? limit = null, @com.mapbox.search.common.RestrictedMapboxSearchAPI com.mapbox.search.offline.OfflineEvSearchOptions? evSearchOptions = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? proximity = null, com.mapbox.geojson.Point? origin = null, Integer? limit = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? proximity = null, com.mapbox.geojson.Point? origin = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? proximity = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? origin = null, Integer? limit = null, @com.mapbox.search.common.RestrictedMapboxSearchAPI com.mapbox.search.offline.OfflineEvSearchOptions? evSearchOptions = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? origin = null, Integer? limit = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route, com.mapbox.geojson.Point? origin = null);
ctor public OfflineSearchAlongRouteOptions(java.util.List<com.mapbox.geojson.Point> route);
method public com.mapbox.search.offline.OfflineEvSearchOptions? getEvSearchOptions();
method public Integer? getLimit();
method public com.mapbox.geojson.Point? getOrigin();
method public com.mapbox.geojson.Point? getProximity();
method public java.util.List<com.mapbox.geojson.Point> getRoute();
property public final com.mapbox.search.offline.OfflineEvSearchOptions? evSearchOptions;
property public final Integer? limit;
property public final com.mapbox.geojson.Point? origin;
property public final com.mapbox.geojson.Point? proximity;
property public final java.util.List<com.mapbox.geojson.Point> route;
}

Expand Down Expand Up @@ -159,8 +156,8 @@ package com.mapbox.search.offline {
method public default com.mapbox.search.common.AsyncOperationTask search(String query, com.mapbox.search.offline.OfflineSearchOptions options, com.mapbox.search.offline.OfflineSearchCallback callback);
method public com.mapbox.search.common.AsyncOperationTask searchAddressesNearby(String street, com.mapbox.geojson.Point proximity, double radiusMeters, java.util.concurrent.Executor executor, com.mapbox.search.offline.OfflineSearchCallback callback);
method public default com.mapbox.search.common.AsyncOperationTask searchAddressesNearby(String street, com.mapbox.geojson.Point proximity, double radiusMeters, com.mapbox.search.offline.OfflineSearchCallback callback);
method public default com.mapbox.search.common.AsyncOperationTask searchAlongRoute(String query, com.mapbox.geojson.Point proximity, java.util.List<com.mapbox.geojson.Point> route, java.util.concurrent.Executor executor, com.mapbox.search.offline.OfflineSearchCallback callback);
method public default com.mapbox.search.common.AsyncOperationTask searchAlongRoute(String query, com.mapbox.geojson.Point proximity, java.util.List<com.mapbox.geojson.Point> route, com.mapbox.search.offline.OfflineSearchCallback callback);
method @Deprecated public com.mapbox.search.common.AsyncOperationTask searchAlongRoute(String query, com.mapbox.geojson.Point proximity, java.util.List<com.mapbox.geojson.Point> route, java.util.concurrent.Executor executor, com.mapbox.search.offline.OfflineSearchCallback callback);
method @Deprecated public default com.mapbox.search.common.AsyncOperationTask searchAlongRoute(String query, com.mapbox.geojson.Point proximity, java.util.List<com.mapbox.geojson.Point> route, com.mapbox.search.offline.OfflineSearchCallback callback);
method @com.mapbox.annotation.MapboxExperimental public com.mapbox.search.common.AsyncOperationTask searchAlongRoute(String query, com.mapbox.search.offline.OfflineSearchAlongRouteOptions options, java.util.concurrent.Executor executor, com.mapbox.search.offline.OfflineSearchCallback callback);
method @com.mapbox.annotation.MapboxExperimental public default com.mapbox.search.common.AsyncOperationTask searchAlongRoute(String query, com.mapbox.search.offline.OfflineSearchAlongRouteOptions options, com.mapbox.search.offline.OfflineSearchCallback callback);
method public void selectTileset(String? dataset, String? version);
Expand Down
9 changes: 3 additions & 6 deletions MapboxSearch/offline/api/offline.api
Original file line number Diff line number Diff line change
Expand Up @@ -157,16 +157,14 @@ public final class com/mapbox/search/offline/OfflineSearchAlongRouteOptions : an
public static final field CREATOR Landroid/os/Parcelable$Creator;
public fun <init> (Ljava/util/List;)V
public fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;)V
public fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Lcom/mapbox/geojson/Point;)V
public fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Lcom/mapbox/geojson/Point;Ljava/lang/Integer;)V
public fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Lcom/mapbox/geojson/Point;Ljava/lang/Integer;Lcom/mapbox/search/offline/OfflineEvSearchOptions;)V
public synthetic fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Lcom/mapbox/geojson/Point;Ljava/lang/Integer;Lcom/mapbox/search/offline/OfflineEvSearchOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Ljava/lang/Integer;)V
public fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Ljava/lang/Integer;Lcom/mapbox/search/offline/OfflineEvSearchOptions;)V
public synthetic fun <init> (Ljava/util/List;Lcom/mapbox/geojson/Point;Ljava/lang/Integer;Lcom/mapbox/search/offline/OfflineEvSearchOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun describeContents ()I
public fun equals (Ljava/lang/Object;)Z
public final fun getEvSearchOptions ()Lcom/mapbox/search/offline/OfflineEvSearchOptions;
public final fun getLimit ()Ljava/lang/Integer;
public final fun getOrigin ()Lcom/mapbox/geojson/Point;
public final fun getProximity ()Lcom/mapbox/geojson/Point;
public final fun getRoute ()Ljava/util/List;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
Expand Down Expand Up @@ -247,7 +245,6 @@ public final class com/mapbox/search/offline/OfflineSearchEngine$DefaultImpls {
public static fun search (Lcom/mapbox/search/offline/OfflineSearchEngine;Ljava/lang/String;Lcom/mapbox/search/offline/OfflineSearchOptions;Lcom/mapbox/search/offline/OfflineSearchCallback;)Lcom/mapbox/search/common/AsyncOperationTask;
public static fun searchAddressesNearby (Lcom/mapbox/search/offline/OfflineSearchEngine;Ljava/lang/String;Lcom/mapbox/geojson/Point;DLcom/mapbox/search/offline/OfflineSearchCallback;)Lcom/mapbox/search/common/AsyncOperationTask;
public static fun searchAlongRoute (Lcom/mapbox/search/offline/OfflineSearchEngine;Ljava/lang/String;Lcom/mapbox/geojson/Point;Ljava/util/List;Lcom/mapbox/search/offline/OfflineSearchCallback;)Lcom/mapbox/search/common/AsyncOperationTask;
public static fun searchAlongRoute (Lcom/mapbox/search/offline/OfflineSearchEngine;Ljava/lang/String;Lcom/mapbox/geojson/Point;Ljava/util/List;Ljava/util/concurrent/Executor;Lcom/mapbox/search/offline/OfflineSearchCallback;)Lcom/mapbox/search/common/AsyncOperationTask;
public static fun searchAlongRoute (Lcom/mapbox/search/offline/OfflineSearchEngine;Ljava/lang/String;Lcom/mapbox/search/offline/OfflineSearchAlongRouteOptions;Lcom/mapbox/search/offline/OfflineSearchCallback;)Lcom/mapbox/search/common/AsyncOperationTask;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.mapbox.search.offline

import android.app.Application
import android.util.Log
import androidx.test.platform.app.InstrumentationRegistry
import com.mapbox.bindgen.Expected
import com.mapbox.bindgen.Value
import com.mapbox.common.TileRegion
Expand Down Expand Up @@ -43,9 +41,6 @@ import kotlin.math.abs
@Suppress("LargeClass")
internal class OfflineSearchEngineIntegrationTest {

private val targetApplication: Application
get() = InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as Application

private lateinit var searchEngine: OfflineSearchEngine

private val debugTileStoreObserver = object : TileStoreObserver {
Expand Down Expand Up @@ -90,56 +85,6 @@ internal class OfflineSearchEngineIntegrationTest {
engineReadyCallback.getResultBlocking()
}

@After
fun tearDown() {
// TODO: Clearing the tiles data after a test causes the next test to fail,
// even though we recreate the Search Engine and download the data again.
// clearOfflineData()
tileStore.removeObserver(debugTileStoreObserver)
}

@Test
fun complexForwardReverseTest() {
val listener = BlockingOnIndexChangeListener(1)
searchEngine.addOnIndexChangeListener(listener)

val descriptors = listOf(OfflineSearchEngine.createTilesetDescriptor())

val dcLoadOptions = TileRegionLoadOptions.Builder()
.descriptors(descriptors)
.geometry(MAPBOX_DC_LOCATION)
.acceptExpired(true)
.build()

val loadTilesResult = tileStore.loadTileRegionBlocking(TEST_GROUP_ID, dcLoadOptions)
assertTrue(loadTilesResult.isValue)

val tileRegion = requireNotNull(loadTilesResult.value)
assertEquals(TEST_GROUP_ID, tileRegion.id)
assertTrue(tileRegion.completedResourceCount > 0)
assertEquals(tileRegion.requiredResourceCount, tileRegion.completedResourceCount)

val events = listener.getResultsBlocking()
events.forEach {
val result = (it as? BlockingOnIndexChangeListener.OnIndexChangeResult.Result)
assertNotNull(result)
assertTrue(
"Event type should be ADD, but was ${result!!.event.type}",
result.event.type == OfflineIndexChangeEvent.EventType.ADD
)
}

// Forward geocoding
val searchResult = searchEngine.searchBlocking("1")
assertTrue(searchResult is SearchEngineResult.Results)
assertTrue(searchResult.requireResults().isNotEmpty())

// Reverse geocoding
val reverseResult = searchEngine.reverseGeocodingBlocking(searchResult.requireResults().first().coordinate)
assertTrue(reverseResult is SearchEngineResult.Results)
assertTrue(reverseResult.requireResults().isNotEmpty())
}

private fun loadOfflineData() {
val descriptors = listOf(OfflineSearchEngine.createTilesetDescriptor())

Expand Down Expand Up @@ -185,22 +130,12 @@ internal class OfflineSearchEngineIntegrationTest {
}
}

@Ignore("TODO ignored because we don't clear data after each test case, see tearDown()")
@Test
fun testSearchRequestWithoutAddedRegions() {
val result = searchEngine.searchBlocking("123")
assertTrue(result is SearchEngineResult.Error)
}

@Ignore("TODO ignored because we don't clear data after each test case, see tearDown()")
@Test
fun testReverseGeocodingWithoutAddedRegions() {
val callback = BlockingOfflineSearchCallback()
searchEngine.reverseGeocoding(
OfflineReverseGeoOptions(center = MAPBOX_DC_LOCATION),
callback
)
assertTrue(callback.getResultBlocking() is SearchEngineResult.Error)
@After
fun tearDown() {
// TODO: Clearing the tiles data after a test causes the next test to fail,
// even though we recreate the Search Engine and download the data again.
// clearOfflineData()
tileStore.removeObserver(debugTileStoreObserver)
}

@Test
Expand Down Expand Up @@ -229,6 +164,24 @@ internal class OfflineSearchEngineIntegrationTest {
assertEquals(TEST_GROUP_ID, allTileRegions.first().id)
}

@Ignore("TODO ignored because we don't clear data after each test case, see tearDown()")
@Test
fun testSearchRequestWithoutAddedRegions() {
val result = searchEngine.searchBlocking("123")
assertTrue(result is SearchEngineResult.Error)
}

@Ignore("TODO ignored because we don't clear data after each test case, see tearDown()")
@Test
fun testReverseGeocodingWithoutAddedRegions() {
val callback = BlockingOfflineSearchCallback()
searchEngine.reverseGeocoding(
OfflineReverseGeoOptions(center = MAPBOX_DC_LOCATION),
callback
)
assertTrue(callback.getResultBlocking() is SearchEngineResult.Error)
}

@Ignore("TODO clearing the tiles data after a test causes the next test to fail, see tearDown()")
@Test
fun testDataRemoval() {
Expand Down Expand Up @@ -271,6 +224,21 @@ internal class OfflineSearchEngineIntegrationTest {
assertTrue(error.e.message?.contains("Offline regions not added") == true)
}

@Test
fun complexForwardReverseTest() {
loadOfflineData()

// Forward geocoding
val searchResult = searchEngine.searchBlocking("1")
assertTrue(searchResult is SearchEngineResult.Results)
assertTrue(searchResult.requireResults().isNotEmpty())

// Reverse geocoding
val reverseResult = searchEngine.reverseGeocodingBlocking(searchResult.requireResults().first().coordinate)
assertTrue(reverseResult is SearchEngineResult.Results)
assertTrue(reverseResult.requireResults().isNotEmpty())
}

@Test
fun testSuccessfulSearchEmptyResponse() {
loadOfflineData()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,6 @@ public class OfflineSearchAlongRouteOptions @JvmOverloads public constructor(
*/
public val route: List<Point>,

/**
* Bias the response to favor results that are closer to this location, provided as Point.
*/
public val proximity: Point? = null,

/**
* Search origin point, used to calculate the distance to the search result.
* @see [OfflineSearchResult.distanceMeters]
Expand Down Expand Up @@ -63,7 +58,6 @@ public class OfflineSearchAlongRouteOptions @JvmOverloads public constructor(
other as OfflineSearchAlongRouteOptions

if (route != other.route) return false
if (proximity != other.proximity) return false
if (limit != other.limit) return false
if (origin != other.origin) return false
if (evSearchOptions != other.evSearchOptions) return false
Expand All @@ -76,7 +70,6 @@ public class OfflineSearchAlongRouteOptions @JvmOverloads public constructor(
*/
override fun hashCode(): Int {
var result = route.hashCode()
result = 31 * result + (proximity?.hashCode() ?: 0)
result = 31 * result + (limit ?: 0)
result = 31 * result + (origin?.hashCode() ?: 0)
result = 31 * result + (evSearchOptions?.hashCode() ?: 0)
Expand All @@ -89,7 +82,6 @@ public class OfflineSearchAlongRouteOptions @JvmOverloads public constructor(
override fun toString(): String {
return "OfflineSearchAlongRouteOptions(" +
"route=$route, " +
"proximity=$proximity, " +
"limit=$limit, " +
"origin=$origin, " +
"evSearchOptions=$evSearchOptions" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,12 @@ public interface OfflineSearchEngine {
)

/**
* Deprecated: Use an overloaded function that accepts [OfflineSearchAlongRouteOptions]
* as a parameter instead.
* If you choose to use this function, it is recommended to set the first point of the route
* as the [proximity] for future compatibility. In upcoming SDK updates,
* the semantics of the [proximity] parameter will change.
*
* Performs a search along the supplied [route].
*
* @param query the search query
Expand All @@ -220,21 +226,25 @@ public interface OfflineSearchEngine {
* @param callback search result callback, delivers results on the main thread
* @return [AsyncOperationTask] object which allows to cancel the request.
*/
@OptIn(MapboxExperimental::class)
@Deprecated(
"Deprecated, use an overloading that accepts OfflineSearchAlongRouteOptions as a parameter",
ReplaceWith("searchAlongRoute(query, OfflineSearchAlongRouteOptions(route), executor, callback)"),
)
public fun searchAlongRoute(
query: String,
proximity: Point,
route: List<Point>,
executor: Executor,
callback: OfflineSearchCallback
): AsyncOperationTask = searchAlongRoute(
query = query,
options = OfflineSearchAlongRouteOptions(route, proximity),
executor = executor,
callback = callback,
)
): AsyncOperationTask

/**
* Deprecated: Use an overloaded function that accepts [OfflineSearchAlongRouteOptions]
* as a parameter instead.
* If you choose to use this function, it is recommended to set the first point of the route
* as the [proximity] for future compatibility. In upcoming SDK updates,
* the semantics of the [proximity] parameter will change.
*
* Performs a search along the supplied [route].
*
* @param query the search query
Expand All @@ -243,6 +253,11 @@ public interface OfflineSearchEngine {
* @param callback search result callback, delivers results on the main thread
* @return [AsyncOperationTask] object which allows to cancel the request.
*/
@Deprecated(
"Deprecated, use an overloading that accepts OfflineSearchAlongRouteOptions as a parameter",
ReplaceWith("searchAlongRoute(query, OfflineSearchAlongRouteOptions(route), callback)"),
)
@Suppress("DEPRECATION")
public fun searchAlongRoute(
query: String,
proximity: Point,
Expand Down
Loading

0 comments on commit 788f24a

Please sign in to comment.