Skip to content

Commit fbeb65a

Browse files
committed
Replace deprecated maker usage in NavigationMapboxMap with SymbolManager
1 parent 1900e48 commit fbeb65a

File tree

7 files changed

+141
-61
lines changed

7 files changed

+141
-61
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ dependencies {
8787
// Mapbox Navigation SDK
8888
implementation project(':libandroid-navigation-ui')
8989
implementation dependenciesList.mapboxMapSdk
90-
implementation dependenciesList.searchSdk
90+
implementation dependenciesList.mapboxSearchSdk
9191

9292
// Support libraries
9393
implementation dependenciesList.supportAppcompatV7

gradle/dependencies.gradle

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,33 @@ ext {
88
]
99

1010
version = [
11-
mapboxMapSdk : '7.0.1',
12-
mapboxSdkServices : '4.3.0',
13-
mapboxEvents : '4.2.0',
14-
mapboxNavigator : '4.0.0',
15-
searchSdk : '0.1.0-SNAPSHOT',
16-
autoValue : '1.5.4',
17-
autoValueParcel : '0.2.5',
18-
junit : '4.12',
19-
supportLibVersion : '28.0.0',
20-
constraintLayout : '1.1.3',
21-
mockito : '2.23.4',
22-
hamcrest : '2.0.0.0',
23-
errorprone : '2.3.1',
24-
butterknife : '8.8.1',
25-
leakCanaryVersion : '1.6.3',
26-
timber : '4.7.1',
27-
testRunnerVersion : '1.0.1',
28-
espressoVersion : '3.0.2',
29-
spoonRunner : '1.6.2',
30-
commonsIO : '2.6',
31-
robolectric : '4.1',
32-
lifecycle : '1.1.1',
33-
picasso : '2.71828',
34-
gmsLocation : '16.0.0',
35-
kotlinStdLib : '1.2.61',
36-
ankoCommon : '0.10.0'
11+
mapboxMapSdk : '7.0.1',
12+
mapboxSdkServices : '4.3.0',
13+
mapboxEvents : '4.2.0',
14+
mapboxNavigator : '4.0.0',
15+
mapboxAnnotationPlugin : '0.4.0',
16+
mapboxSearchSdk : '0.1.0-SNAPSHOT',
17+
autoValue : '1.5.4',
18+
autoValueParcel : '0.2.5',
19+
junit : '4.12',
20+
supportLibVersion : '28.0.0',
21+
constraintLayout : '1.1.3',
22+
mockito : '2.23.4',
23+
hamcrest : '2.0.0.0',
24+
errorprone : '2.3.1',
25+
butterknife : '8.8.1',
26+
leakCanaryVersion : '1.6.3',
27+
timber : '4.7.1',
28+
testRunnerVersion : '1.0.1',
29+
espressoVersion : '3.0.2',
30+
spoonRunner : '1.6.2',
31+
commonsIO : '2.6',
32+
robolectric : '4.1',
33+
lifecycle : '1.1.1',
34+
picasso : '2.71828',
35+
gmsLocation : '16.0.0',
36+
kotlinStdLib : '1.2.61',
37+
ankoCommon : '0.10.0'
3738
]
3839

3940
dependenciesList = [
@@ -43,7 +44,8 @@ ext {
4344
mapboxSdkTurf : "com.mapbox.mapboxsdk:mapbox-sdk-turf:${version.mapboxSdkServices}",
4445
mapboxEvents : "com.mapbox.mapboxsdk:mapbox-android-telemetry:${version.mapboxEvents}",
4546
mapboxNavigator : "com.mapbox.navigator:mapbox-navigation-native:${version.mapboxNavigator}",
46-
searchSdk : "com.mapbox.mapboxsdk:mapbox-search-android:${version.searchSdk}",
47+
mapboxAnnotationPlugin : "com.mapbox.mapboxsdk:mapbox-android-plugin-annotation-v7:${version.mapboxAnnotationPlugin}",
48+
mapboxSearchSdk : "com.mapbox.mapboxsdk:mapbox-search-android:${version.mapboxSearchSdk}",
4749

4850
// Kotlin
4951
kotlinStdLib : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${version.kotlinStdLib}",

libandroid-navigation-ui/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ dependencies {
4545
// Navigation SDK
4646
api project(':libandroid-navigation')
4747

48-
// Mapbox Map SDK
48+
// Mapbox Maps SDK
4949
implementation dependenciesList.mapboxMapSdk
50+
implementation dependenciesList.mapboxAnnotationPlugin
5051

5152
// Support libraries
5253
implementation dependenciesList.supportDesign

libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/ThemeSwitcher.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.SharedPreferences;
55
import android.content.res.Configuration;
66
import android.content.res.TypedArray;
7+
import android.graphics.Bitmap;
78
import android.graphics.drawable.Drawable;
89
import android.preference.PreferenceManager;
910
import android.support.annotation.NonNull;
@@ -12,8 +13,7 @@
1213
import android.util.AttributeSet;
1314
import android.util.TypedValue;
1415

15-
import com.mapbox.mapboxsdk.annotations.Icon;
16-
import com.mapbox.mapboxsdk.annotations.IconFactory;
16+
import com.mapbox.mapboxsdk.utils.BitmapUtils;
1717
import com.mapbox.services.android.navigation.v5.navigation.NavigationConstants;
1818

1919
/**
@@ -39,16 +39,16 @@ public static int retrieveThemeColor(Context context, int resId) {
3939
}
4040

4141
/**
42-
* Returns a map marker {@link Icon} based on the current theme setting.
42+
* Returns a map marker {@link Bitmap} based on the current theme setting.
4343
*
44-
* @param context to retrieve an instance of {@link IconFactory}
45-
* @return {@link Icon} map marker dark or light
44+
* @param context to retrieve the drawable for the given resource ID
45+
* @return {@link Bitmap} map marker dark or light
4646
*/
47-
public static Icon retrieveThemeMapMarker(Context context) {
47+
public static Bitmap retrieveThemeMapMarker(Context context) {
4848
TypedValue destinationMarkerResId = resolveAttributeFromId(context, R.attr.navigationViewDestinationMarker);
4949
int markerResId = destinationMarkerResId.resourceId;
50-
IconFactory iconFactory = IconFactory.getInstance(context);
51-
return iconFactory.fromResource(markerResId);
50+
Drawable markerDrawable = ContextCompat.getDrawable(context, markerResId);
51+
return BitmapUtils.getBitmapFromDrawable(markerDrawable);
5252
}
5353

5454
/**
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.mapbox.services.android.navigation.ui.v5.map;
2+
3+
import android.support.annotation.NonNull;
4+
5+
import com.mapbox.geojson.Point;
6+
import com.mapbox.mapboxsdk.geometry.LatLng;
7+
import com.mapbox.mapboxsdk.plugins.annotation.Symbol;
8+
import com.mapbox.mapboxsdk.plugins.annotation.SymbolManager;
9+
import com.mapbox.mapboxsdk.plugins.annotation.SymbolOptions;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
class MapSymbolManager {
15+
16+
static final String MAPBOX_NAVIGATION_MARKER_NAME = "mapbox-navigation-marker";
17+
private final List<Symbol> mapMarkersSymbols = new ArrayList<>();
18+
private final SymbolManager symbolManager;
19+
20+
MapSymbolManager(SymbolManager symbolManager) {
21+
this.symbolManager = symbolManager;
22+
}
23+
24+
void addMarkerFor(Point position) {
25+
SymbolOptions options = createSymbolOptionsFor(position);
26+
Symbol markerSymbol = symbolManager.create(options);
27+
mapMarkersSymbols.add(markerSymbol);
28+
}
29+
30+
void removeAllMarkerSymbols() {
31+
for (Symbol markerSymbol : mapMarkersSymbols) {
32+
symbolManager.delete(markerSymbol);
33+
}
34+
}
35+
36+
@NonNull
37+
private SymbolOptions createSymbolOptionsFor(Point position) {
38+
LatLng markerPosition = new LatLng(position.latitude(),
39+
position.longitude());
40+
return new SymbolOptions()
41+
.withLatLng(markerPosition)
42+
.withIconImage(MAPBOX_NAVIGATION_MARKER_NAME);
43+
}
44+
}

libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/map/NavigationMapboxMap.java

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.annotation.SuppressLint;
44
import android.content.Context;
5+
import android.graphics.Bitmap;
56
import android.graphics.PointF;
67
import android.location.Location;
78
import android.os.Bundle;
@@ -13,9 +14,6 @@
1314

1415
import com.mapbox.api.directions.v5.models.DirectionsRoute;
1516
import com.mapbox.geojson.Point;
16-
import com.mapbox.mapboxsdk.annotations.Icon;
17-
import com.mapbox.mapboxsdk.annotations.Marker;
18-
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
1917
import com.mapbox.mapboxsdk.geometry.LatLng;
2018
import com.mapbox.mapboxsdk.location.LocationComponent;
2119
import com.mapbox.mapboxsdk.location.LocationComponentOptions;
@@ -24,6 +22,7 @@
2422
import com.mapbox.mapboxsdk.maps.MapView;
2523
import com.mapbox.mapboxsdk.maps.MapboxMap;
2624
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
25+
import com.mapbox.mapboxsdk.plugins.annotation.SymbolManager;
2726
import com.mapbox.mapboxsdk.style.sources.Source;
2827
import com.mapbox.mapboxsdk.style.sources.VectorSource;
2928
import com.mapbox.services.android.navigation.ui.v5.NavigationSnapshotReadyCallback;
@@ -34,9 +33,9 @@
3433
import com.mapbox.services.android.navigation.ui.v5.route.OnRouteSelectionChangeListener;
3534
import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation;
3635

37-
import java.util.ArrayList;
3836
import java.util.List;
3937

38+
import static com.mapbox.services.android.navigation.ui.v5.map.MapSymbolManager.MAPBOX_NAVIGATION_MARKER_NAME;
4039
import static com.mapbox.services.android.navigation.v5.navigation.NavigationConstants.NAVIGATION_MINIMUM_MAP_ZOOM;
4140

4241
/**
@@ -59,10 +58,10 @@ public class NavigationMapboxMap {
5958
private static final String TRAFFIC_LAYER_ID = "traffic";
6059
private static final int[] ZERO_MAP_PADDING = {0, 0, 0, 0};
6160
private static final double NAVIGATION_MAXIMUM_MAP_ZOOM = 18d;
62-
private final List<Marker> mapMarkers = new ArrayList<>();
6361
private MapboxMap mapboxMap;
6462
private LocationComponent locationComponent;
6563
private MapPaddingAdjustor mapPaddingAdjustor;
64+
private MapSymbolManager mapSymbolManager;
6665
private MapLayerInteractor layerInteractor;
6766
private MapWayName mapWayName;
6867
private NavigationMapRoute mapRoute;
@@ -80,6 +79,7 @@ public NavigationMapboxMap(@NonNull MapView mapView, @NonNull MapboxMap mapboxMa
8079
this.mapboxMap = mapboxMap;
8180
initializeLocationComponent(mapView, mapboxMap);
8281
initializeMapPaddingAdjustor(mapView, mapboxMap);
82+
initializeMapSymbolManager(mapView, mapboxMap);
8383
initializeMapLayerInteractor(mapboxMap);
8484
initializeWayname(mapboxMap, mapPaddingAdjustor);
8585
initializeRoute(mapView, mapboxMap);
@@ -128,8 +128,7 @@ public NavigationMapboxMap(@NonNull MapView mapView, @NonNull MapboxMap mapboxMa
128128
* @param position the point at which the marker will be placed
129129
*/
130130
public void addMarker(Context context, Point position) {
131-
Marker marker = createMarkerFromIcon(context, position);
132-
mapMarkers.add(marker);
131+
mapSymbolManager.addMarkerFor(position);
133132
}
134133

135134
/**
@@ -139,7 +138,7 @@ public void addMarker(Context context, Point position) {
139138
* if no markers have been added.
140139
*/
141140
public void clearMarkers() {
142-
removeAllMarkers();
141+
mapSymbolManager.removeAllMarkerSymbols();
143142
}
144143

145144
/**
@@ -567,6 +566,13 @@ private void initializeMapPaddingAdjustor(MapView mapView, MapboxMap mapboxMap)
567566
mapPaddingAdjustor = new MapPaddingAdjustor(mapView, mapboxMap);
568567
}
569568

569+
private void initializeMapSymbolManager(MapView mapView, MapboxMap mapboxMap) {
570+
Bitmap markerBitmap = ThemeSwitcher.retrieveThemeMapMarker(mapView.getContext());
571+
mapboxMap.getStyle().addImage(MAPBOX_NAVIGATION_MARKER_NAME, markerBitmap);
572+
SymbolManager symbolManager = new SymbolManager(mapView, mapboxMap, mapboxMap.getStyle());
573+
mapSymbolManager = new MapSymbolManager(symbolManager);
574+
}
575+
570576
private void initializeMapLayerInteractor(MapboxMap mapboxMap) {
571577
layerInteractor = new MapLayerInteractor(mapboxMap);
572578
}
@@ -633,22 +639,6 @@ private void removeFpsListenersFromCamera() {
633639
mapCamera.removeOnTrackingModeChangedListener(mapFpsDelegate);
634640
}
635641

636-
@NonNull
637-
private Marker createMarkerFromIcon(Context context, Point position) {
638-
LatLng markerPosition = new LatLng(position.latitude(),
639-
position.longitude());
640-
Icon markerIcon = ThemeSwitcher.retrieveThemeMapMarker(context);
641-
return mapboxMap.addMarker(new MarkerOptions()
642-
.position(markerPosition)
643-
.icon(markerIcon));
644-
}
645-
646-
private void removeAllMarkers() {
647-
for (Marker marker : mapMarkers) {
648-
mapboxMap.removeMarker(marker);
649-
}
650-
}
651-
652642
private void updateMapWaynameWithLocation(Location location) {
653643
LatLng latLng = new LatLng(location);
654644
PointF mapPoint = mapboxMap.getProjection().toScreenLocation(latLng);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.mapbox.services.android.navigation.ui.v5.map;
2+
3+
import com.mapbox.geojson.Point;
4+
import com.mapbox.mapboxsdk.plugins.annotation.Symbol;
5+
import com.mapbox.mapboxsdk.plugins.annotation.SymbolManager;
6+
import com.mapbox.mapboxsdk.plugins.annotation.SymbolOptions;
7+
8+
import org.junit.Test;
9+
10+
import static org.mockito.ArgumentMatchers.any;
11+
import static org.mockito.Mockito.mock;
12+
import static org.mockito.Mockito.verify;
13+
import static org.mockito.Mockito.when;
14+
15+
public class MapSymbolManagerTest {
16+
17+
@Test
18+
public void addMarkerFor_symbolManagerAddsOptions() {
19+
SymbolManager symbolManager = mock(SymbolManager.class);
20+
Symbol symbol = mock(Symbol.class);
21+
when(symbolManager.create(any(SymbolOptions.class))).thenReturn(symbol);
22+
MapSymbolManager mapSymbolManager = new MapSymbolManager(symbolManager);
23+
Point position = Point.fromLngLat(1.2345, 1.3456);
24+
25+
mapSymbolManager.addMarkerFor(position);
26+
27+
verify(symbolManager).create(any(SymbolOptions.class));
28+
}
29+
30+
@Test
31+
public void removeAllMarkerSymbols_previouslyAddedMarkersRemoved() {
32+
SymbolManager symbolManager = mock(SymbolManager.class);
33+
Symbol symbol = mock(Symbol.class);
34+
when(symbolManager.create(any(SymbolOptions.class))).thenReturn(symbol);
35+
MapSymbolManager mapSymbolManager = new MapSymbolManager(symbolManager);
36+
Point position = Point.fromLngLat(1.2345, 1.3456);
37+
mapSymbolManager.addMarkerFor(position);
38+
39+
mapSymbolManager.removeAllMarkerSymbols();
40+
41+
verify(symbolManager).delete(symbol);
42+
}
43+
}

0 commit comments

Comments
 (0)