Skip to content

Commit 4f1eb41

Browse files
committed
Allow for downstream upgrades
1 parent 8d9aace commit 4f1eb41

File tree

7 files changed

+108
-20
lines changed

7 files changed

+108
-20
lines changed

android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/testing/CarJavaInterfaceChecker.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.mapbox.maps.MapboxExperimental;
1515
import com.mapbox.maps.ResourceOptions;
1616
import com.mapbox.maps.ScreenCoordinate;
17+
import com.mapbox.maps.extension.androidauto.CarMapSurfaceOwner;
1718
import com.mapbox.maps.extension.androidauto.MapboxCarMap;
1819
import com.mapbox.maps.extension.androidauto.DefaultMapboxCarMapGestureHandler;
1920
import com.mapbox.maps.extension.androidauto.MapboxCarMapEx;
@@ -24,8 +25,13 @@
2425
@MapboxExperimental
2526
class CarJavaInterfaceChecker {
2627

27-
void constructors(MapInitOptions mapInitOptions) {
28-
MapboxCarMap mapboxCarMap = new MapboxCarMap();
28+
void constructorMapboxCarMap(MapInitOptions mapInitOptions) {
29+
new MapboxCarMap();
30+
}
31+
32+
void constructorsCarMapSurfaceOwner(MapboxCarMapGestureHandler gestures) {
33+
new CarMapSurfaceOwner();
34+
new CarMapSurfaceOwner(gestures);
2935
}
3036

3137
void getters(MapboxCarMap mapboxCarMap) {

extension-androidauto/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Mapbox welcomes participation and contributions from everyone.
1111
* Change `MapboxCarMapObserver` to an java interface so default methods can be added without breaking java backwards compatibility. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1648))
1212
* Change `MapboxCarMap#getEdgeInsets()` to `mapboxCarMap.getVisibleEdgeInsets()` with the addition of `mapboxCarMap.getStableEdgeInsets()`. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1648))
1313
* Add `MapboxCarMapObserver#onStableAreaChanged` to support all the available functions from the SurfaceCallback. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1648))
14+
* Add support for intercepting the `SurfaceCallback#onClick` when using `MapboxCarMap.prepareSurfaceCallback`. ([#1683](https://github.com/mapbox/mapbox-maps-android/pull/1683)])
1415

1516
## Bug fixes 🐞
1617

extension-androidauto/api/extension-androidauto.api

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@ public class com/mapbox/maps/extension/androidauto/DefaultMapboxCarMapGestureHan
77

88
public final class com/mapbox/maps/extension/androidauto/MapboxCarMap {
99
public fun <init> ()V
10-
public final fun clearObservers ()V
10+
public final fun clearObservers ()Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
1111
public final fun getCarContext ()Landroidx/car/app/CarContext;
1212
public final fun getCarMapSurface ()Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;
1313
public final fun getMapInitOptions ()Lcom/mapbox/maps/MapInitOptions;
1414
public final fun getStableArea ()Landroid/graphics/Rect;
1515
public final fun getStableEdgeInsets ()Lcom/mapbox/maps/EdgeInsets;
1616
public final fun getVisibleArea ()Landroid/graphics/Rect;
1717
public final fun getVisibleEdgeInsets ()Lcom/mapbox/maps/EdgeInsets;
18+
public final fun prepareSurfaceCallback (Landroidx/car/app/CarContext;Lcom/mapbox/maps/MapInitOptions;)Landroidx/car/app/SurfaceCallback;
1819
public final fun registerObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
19-
public final fun setGestureHandler (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;)V
20+
public final fun setGestureHandler (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
2021
public final fun setup (Landroidx/car/app/CarContext;Lcom/mapbox/maps/MapInitOptions;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
21-
public final fun unregisterObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)V
22+
public final fun unregisterObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
2223
}
2324

2425
public final class com/mapbox/maps/extension/androidauto/MapboxCarMapEx {

extension-androidauto/api/metalava.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@ package com.mapbox.maps.extension.androidauto {
77

88
@com.mapbox.maps.MapboxExperimental public final class MapboxCarMap {
99
ctor public MapboxCarMap();
10-
method public void clearObservers();
10+
method public com.mapbox.maps.extension.androidauto.MapboxCarMap clearObservers();
1111
method public androidx.car.app.CarContext getCarContext();
1212
method public com.mapbox.maps.extension.androidauto.MapboxCarMapSurface? getCarMapSurface();
1313
method public com.mapbox.maps.MapInitOptions getMapInitOptions();
1414
method public android.graphics.Rect? getStableArea();
1515
method public com.mapbox.maps.EdgeInsets? getStableEdgeInsets();
1616
method public android.graphics.Rect? getVisibleArea();
1717
method public com.mapbox.maps.EdgeInsets? getVisibleEdgeInsets();
18+
method @com.mapbox.maps.MapboxExperimental public androidx.car.app.SurfaceCallback prepareSurfaceCallback(androidx.car.app.CarContext carContext, com.mapbox.maps.MapInitOptions mapInitOptions);
1819
method public com.mapbox.maps.extension.androidauto.MapboxCarMap registerObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);
19-
method public void setGestureHandler(com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler? gestureHandler);
20+
method public com.mapbox.maps.extension.androidauto.MapboxCarMap setGestureHandler(com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler? gestureHandler);
2021
method public com.mapbox.maps.extension.androidauto.MapboxCarMap setup(androidx.car.app.CarContext carContext, com.mapbox.maps.MapInitOptions mapInitOptions);
21-
method public void unregisterObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);
22+
method public com.mapbox.maps.extension.androidauto.MapboxCarMap unregisterObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);
2223
property public final androidx.car.app.CarContext carContext;
2324
property public final com.mapbox.maps.extension.androidauto.MapboxCarMapSurface? carMapSurface;
2425
property public final com.mapbox.maps.MapInitOptions mapInitOptions;

extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/CarMapSurfaceOwner.kt

+47-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.car.app.SurfaceCallback
66
import androidx.car.app.SurfaceContainer
77
import com.mapbox.maps.EdgeInsets
88
import com.mapbox.maps.MapInitOptions
9+
import com.mapbox.maps.MapSurface
910
import com.mapbox.maps.MapboxExperimental
1011
import com.mapbox.maps.ScreenCoordinate
1112
import com.mapbox.maps.logI
@@ -17,8 +18,8 @@ import java.util.concurrent.CopyOnWriteArraySet
1718
* Maintains the surface state for [MapboxCarMap].
1819
*/
1920
@MapboxExperimental
20-
internal class CarMapSurfaceOwner(
21-
var gestureHandler: MapboxCarMapGestureHandler? = DefaultMapboxCarMapGestureHandler()
21+
internal class CarMapSurfaceOwner @JvmOverloads constructor(
22+
internal var gestureHandler: MapboxCarMapGestureHandler? = DefaultMapboxCarMapGestureHandler()
2223
) : SurfaceCallback {
2324

2425
internal var mapboxCarMapSurface: MapboxCarMapSurface? = null
@@ -38,14 +39,14 @@ internal class CarMapSurfaceOwner(
3839

3940
private val carMapObservers = CopyOnWriteArraySet<MapboxCarMapObserver>()
4041

41-
fun setup(carContext: CarContext, mapInitOptions: MapInitOptions) = apply {
42+
internal fun setup(carContext: CarContext, mapInitOptions: MapInitOptions) = apply {
4243
this.carContext = carContext
4344
this.mapInitOptions = mapInitOptions
4445
}
4546

46-
fun isSetup(): Boolean = this::carContext.isInitialized && this::mapInitOptions.isInitialized
47+
internal fun isSetup(): Boolean = this::carContext.isInitialized && this::mapInitOptions.isInitialized
4748

48-
fun registerObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
49+
internal fun registerObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
4950
carMapObservers.add(mapboxCarMapObserver)
5051
logI(TAG, "registerObserver + 1 = ${carMapObservers.size}")
5152

@@ -62,17 +63,23 @@ internal class CarMapSurfaceOwner(
6263
}
6364
}
6465

65-
fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
66+
internal fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
6667
carMapObservers.remove(mapboxCarMapObserver)
6768
mapboxCarMapSurface?.let { mapboxCarMapObserver.onDetached(it) }
6869
logI(TAG, "unregisterObserver - 1 = ${carMapObservers.size}")
6970
}
7071

71-
fun clearObservers() {
72+
internal fun clearObservers() {
7273
this.mapboxCarMapSurface?.let { surface -> carMapObservers.forEach { it.onDetached(surface) } }
7374
carMapObservers.clear()
7475
}
7576

77+
/**
78+
* Prepares the [MapSurface] and notifies any registered observers that the map has been attached
79+
* with [MapboxCarMapObserver.onAttached].
80+
*
81+
* @see SurfaceCallback.onSurfaceAvailable
82+
*/
7683
override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
7784
logI(TAG, "onSurfaceAvailable $surfaceContainer")
7885
surfaceContainer.surface?.let { surface ->
@@ -101,6 +108,12 @@ internal class CarMapSurfaceOwner(
101108
}
102109
}
103110

111+
/**
112+
* Destroys the resources used by [MapSurface] and notifies any registered observers that the map
113+
* has been detached with [MapboxCarMapObserver.onDetached].
114+
*
115+
* @see SurfaceCallback.onSurfaceDestroyed
116+
*/
104117
override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) {
105118
logI(TAG, "onSurfaceDestroyed")
106119
val detachSurface = this.mapboxCarMapSurface
@@ -111,6 +124,12 @@ internal class CarMapSurfaceOwner(
111124
detachSurface?.let { carMapObservers.forEach { it.onDetached(detachSurface) } }
112125
}
113126

127+
/**
128+
* Notifies any registered observers that the visible area has changed with
129+
* [MapboxCarMapObserver.onVisibleAreaChanged].
130+
*
131+
* @see SurfaceCallback.onVisibleAreaChanged
132+
*/
114133
override fun onVisibleAreaChanged(visibleArea: Rect) {
115134
logI(TAG, "onVisibleAreaChanged visibleArea:$visibleArea")
116135
this.visibleArea = visibleArea
@@ -128,6 +147,12 @@ internal class CarMapSurfaceOwner(
128147
}
129148
}
130149

150+
/**
151+
* Notifies any registered observers that the visible area has changed with
152+
* [MapboxCarMapObserver.onStableAreaChanged].
153+
*
154+
* @see SurfaceCallback.onStableAreaChanged
155+
*/
131156
override fun onStableAreaChanged(stableArea: Rect) {
132157
logI(TAG, "onStableAreaChanged stableArea:$stableArea")
133158
this.stableEdgeInsets = stableArea.edgeInsets()
@@ -140,18 +165,33 @@ internal class CarMapSurfaceOwner(
140165
}
141166
}
142167

168+
/**
169+
* Forwards the gesture to the [MapboxCarMapGestureHandler.onScroll].
170+
*
171+
* @see SurfaceCallback.onScroll
172+
*/
143173
override fun onScroll(distanceX: Float, distanceY: Float) {
144174
logI(TAG, "onScroll $distanceX, $distanceY")
145175
val carMapSurface = mapboxCarMapSurface ?: return
146176
gestureHandler?.onScroll(carMapSurface, visibleCenter, distanceX, distanceY)
147177
}
148178

179+
/**
180+
* Forwards the gesture to the [MapboxCarMapGestureHandler.onFling].
181+
*
182+
* @see SurfaceCallback.onFling
183+
*/
149184
override fun onFling(velocityX: Float, velocityY: Float) {
150185
logI(TAG, "onFling $velocityX, $velocityY")
151186
val carMapSurface = mapboxCarMapSurface ?: return
152187
gestureHandler?.onFling(carMapSurface, velocityX, velocityY)
153188
}
154189

190+
/**
191+
* Forwards the gesture to the [MapboxCarMapGestureHandler.onScale].
192+
*
193+
* @see SurfaceCallback.onScale
194+
*/
155195
override fun onScale(focusX: Float, focusY: Float, scaleFactor: Float) {
156196
logI(TAG, "onScroll $focusX, $focusY, $scaleFactor")
157197
val carMapSurface = mapboxCarMapSurface ?: return

extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMap.kt

+24-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.graphics.Rect
44
import androidx.car.app.AppManager
55
import androidx.car.app.CarContext
66
import androidx.car.app.Session
7+
import androidx.car.app.SurfaceCallback
78
import androidx.lifecycle.Lifecycle
89
import com.mapbox.maps.EdgeInsets
910
import com.mapbox.maps.MapInitOptions
@@ -71,11 +72,29 @@ class MapboxCarMap {
7172
carContext: CarContext,
7273
mapInitOptions: MapInitOptions,
7374
) = apply {
75+
val surfaceCallback = prepareSurfaceCallback(carContext, mapInitOptions)
76+
carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)
77+
}
78+
79+
/**
80+
* Instead of using [setup], this function allows you to create your own [SurfaceCallback] and
81+
* forward the calls to the returned [SurfaceCallback]. This makes it possible for you to adopt
82+
* new api versions or intercept the calls and continue to use the [MapboxCarMap] as designed.
83+
*
84+
* This may be a temporary solution, while androidx.car.app:app:1.3.0 is rolling out
85+
* [SurfaceCallback.onClick]. If there is no use for this function in the future, it will be
86+
* removed.
87+
*/
88+
@MapboxExperimental
89+
fun prepareSurfaceCallback(
90+
carContext: CarContext,
91+
mapInitOptions: MapInitOptions
92+
): SurfaceCallback {
7493
check(mapInitOptions.context is CarContext) {
75-
"You must setup the MapboxCarMap MapInitOptions with a CarContext"
94+
"You must set up the MapboxCarMap MapInitOptions with a CarContext"
7695
}
7796
carMapSurfaceOwner.setup(carContext, mapInitOptions)
78-
carContext.getCarService(AppManager::class.java).setSurfaceCallback(carMapSurfaceOwner)
97+
return carMapSurfaceOwner
7998
}
8099

81100
/**
@@ -123,14 +142,14 @@ class MapboxCarMap {
123142
/**
124143
* @param mapboxCarMapObserver the instance used in [registerObserver]
125144
*/
126-
fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
145+
fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) = apply {
127146
carMapSurfaceOwner.unregisterObserver(mapboxCarMapObserver)
128147
}
129148

130149
/**
131150
* Optional function to clear all observers registered through [registerObserver]
132151
*/
133-
fun clearObservers() {
152+
fun clearObservers() = apply {
134153
carMapSurfaceOwner.clearObservers()
135154
}
136155

@@ -140,7 +159,7 @@ class MapboxCarMap {
140159
* interface, or override the [DefaultMapboxCarMapGestureHandler], or set to null to disable
141160
* gesture handling.
142161
*/
143-
fun setGestureHandler(gestureHandler: MapboxCarMapGestureHandler?) {
162+
fun setGestureHandler(gestureHandler: MapboxCarMapGestureHandler?) = apply {
144163
carMapSurfaceOwner.gestureHandler = gestureHandler
145164
}
146165
}

extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/MapboxCarMapTest.kt

+20
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,26 @@ class MapboxCarMapTest {
7676
assertTrue(surfaceCallbackSlot.isCaptured)
7777
}
7878

79+
@Test
80+
fun `setup will call setSurfaceCallback`() {
81+
MapboxCarMap().setup(carContext, mapInitOptions)
82+
83+
val appManager = carContext.getCarService(AppManager::class.java)
84+
verify(exactly = 1) {
85+
appManager.setSurfaceCallback(any())
86+
}
87+
}
88+
89+
@Test
90+
fun `prepareSurfaceCallback does not call setSurfaceCallback`() {
91+
MapboxCarMap().prepareSurfaceCallback(carContext, mapInitOptions)
92+
93+
val appManager = carContext.getCarService(AppManager::class.java)
94+
verify(exactly = 0) {
95+
appManager.setSurfaceCallback(any())
96+
}
97+
}
98+
7999
@Test
80100
fun `carMapSurface is valid after onSurfaceAvailable`() {
81101
val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)

0 commit comments

Comments
 (0)