Skip to content

Commit 334ef1d

Browse files
committed
Allow for downstream upgrades
1 parent c015c41 commit 334ef1d

File tree

6 files changed

+95
-10
lines changed

6 files changed

+95
-10
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
@@ -8,6 +8,7 @@ Mapbox welcomes participation and contributions from everyone.
88
* Add `MapboxCarMapSessionInstaller` and `MapboxCarMapScreenInstaller` for simpler setup. ([#1603](https://github.com/mapbox/mapbox-maps-android/pull/1603))
99
* Add `Session.mapboxMapInstaller` and `Screen.mapboxMapInstaller` extension functions to create the installers. ([#1603](https://github.com/mapbox/mapbox-maps-android/pull/1603))
1010
* Change `MapboxCarMapGestureHandler` to an java interface so default methods can be added without breaking java backwards compatibility. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1670))
11+
* Add support for intercepting the `SurfaceCallback#onClick` with an experimental method `MapboxCarMap.setupWithCustomCallback`.
1112

1213
## Bug fixes 🐞
1314

extension-androidauto/api/extension-androidauto.api

+14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
public final class com/mapbox/maps/extension/androidauto/CarMapSurfaceOwner : androidx/car/app/SurfaceCallback {
2+
public fun <init> ()V
3+
public fun <init> (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;)V
4+
public synthetic fun <init> (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
5+
public fun onFling (FF)V
6+
public fun onScale (FFF)V
7+
public fun onScroll (FF)V
8+
public fun onStableAreaChanged (Landroid/graphics/Rect;)V
9+
public fun onSurfaceAvailable (Landroidx/car/app/SurfaceContainer;)V
10+
public fun onSurfaceDestroyed (Landroidx/car/app/SurfaceContainer;)V
11+
public fun onVisibleAreaChanged (Landroid/graphics/Rect;)V
12+
}
13+
114
public class com/mapbox/maps/extension/androidauto/DefaultMapboxCarMapGestureHandler : com/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler {
215
public fun <init> ()V
316
public fun onFling (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;FF)V
@@ -16,6 +29,7 @@ public final class com/mapbox/maps/extension/androidauto/MapboxCarMap {
1629
public final fun registerObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
1730
public final fun setGestureHandler (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;)V
1831
public final fun setup (Landroidx/car/app/CarContext;Lcom/mapbox/maps/MapInitOptions;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;
32+
public final fun setupWithCustomCallback (Landroidx/car/app/CarContext;Lcom/mapbox/maps/MapInitOptions;)Lcom/mapbox/maps/extension/androidauto/CarMapSurfaceOwner;
1933
public final fun unregisterObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)V
2034
}
2135

extension-androidauto/api/metalava.txt

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
// Signature format: 3.0
22
package com.mapbox.maps.extension.androidauto {
33

4+
@com.mapbox.maps.MapboxExperimental public final class CarMapSurfaceOwner implements androidx.car.app.SurfaceCallback {
5+
ctor public CarMapSurfaceOwner(com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler? gestureHandler = com.mapbox.maps.extension.androidauto.DefaultMapboxCarMapGestureHandler());
6+
}
7+
48
@com.mapbox.maps.MapboxExperimental public class DefaultMapboxCarMapGestureHandler implements com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler {
59
ctor public DefaultMapboxCarMapGestureHandler();
610
}
@@ -16,6 +20,7 @@ package com.mapbox.maps.extension.androidauto {
1620
method public com.mapbox.maps.extension.androidauto.MapboxCarMap registerObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);
1721
method public void setGestureHandler(com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler? gestureHandler);
1822
method public com.mapbox.maps.extension.androidauto.MapboxCarMap setup(androidx.car.app.CarContext carContext, com.mapbox.maps.MapInitOptions mapInitOptions);
23+
method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.androidauto.CarMapSurfaceOwner setupWithCustomCallback(androidx.car.app.CarContext carContext, com.mapbox.maps.MapInitOptions mapInitOptions);
1924
method public void unregisterObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);
2025
property public final androidx.car.app.CarContext carContext;
2126
property public final com.mapbox.maps.extension.androidauto.MapboxCarMapSurface? carMapSurface;

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

+44-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+
class CarMapSurfaceOwner @JvmOverloads constructor(
22+
internal var gestureHandler: MapboxCarMapGestureHandler? = DefaultMapboxCarMapGestureHandler()
2223
) : SurfaceCallback {
2324

2425
internal var mapboxCarMapSurface: MapboxCarMapSurface? = null
@@ -35,14 +36,14 @@ internal class CarMapSurfaceOwner(
3536

3637
private val carMapObservers = CopyOnWriteArraySet<MapboxCarMapObserver>()
3738

38-
fun setup(carContext: CarContext, mapInitOptions: MapInitOptions) = apply {
39+
internal fun setup(carContext: CarContext, mapInitOptions: MapInitOptions) = apply {
3940
this.carContext = carContext
4041
this.mapInitOptions = mapInitOptions
4142
}
4243

43-
fun isSetup(): Boolean = this::carContext.isInitialized && this::mapInitOptions.isInitialized
44+
internal fun isSetup(): Boolean = this::carContext.isInitialized && this::mapInitOptions.isInitialized
4445

45-
fun registerObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
46+
internal fun registerObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
4647
carMapObservers.add(mapboxCarMapObserver)
4748
logI(TAG, "registerObserver + 1 = ${carMapObservers.size}")
4849

@@ -55,17 +56,23 @@ internal class CarMapSurfaceOwner(
5556
}
5657
}
5758

58-
fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
59+
internal fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) {
5960
carMapObservers.remove(mapboxCarMapObserver)
6061
mapboxCarMapSurface?.let { mapboxCarMapObserver.onDetached(it) }
6162
logI(TAG, "unregisterObserver - 1 = ${carMapObservers.size}")
6263
}
6364

64-
fun clearObservers() {
65+
internal fun clearObservers() {
6566
this.mapboxCarMapSurface?.let { surface -> carMapObservers.forEach { it.onDetached(surface) } }
6667
carMapObservers.clear()
6768
}
6869

70+
/**
71+
* Prepares the [MapSurface] and notifies any registered observers that the map has been attached
72+
* with [MapboxCarMapObserver.onAttached].
73+
*
74+
* @see SurfaceCallback.onSurfaceAvailable
75+
*/
6976
override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
7077
logI(TAG, "onSurfaceAvailable $surfaceContainer")
7178
surfaceContainer.surface?.let { surface ->
@@ -94,6 +101,12 @@ internal class CarMapSurfaceOwner(
94101
}
95102
}
96103

104+
/**
105+
* Destroys the resources used by [MapSurface] and notifies any registered observers that the map
106+
* has been detached with [MapboxCarMapObserver.onDetached].
107+
*
108+
* @see SurfaceCallback.onSurfaceDestroyed
109+
*/
97110
override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) {
98111
logI(TAG, "onSurfaceDestroyed")
99112
val detachSurface = this.mapboxCarMapSurface
@@ -104,6 +117,12 @@ internal class CarMapSurfaceOwner(
104117
detachSurface?.let { carMapObservers.forEach { it.onDetached(detachSurface) } }
105118
}
106119

120+
/**
121+
* Notifies any registered observers that the visible area has changed with
122+
* [MapboxCarMapObserver.onVisibleAreaChanged].
123+
*
124+
* @see SurfaceCallback.onVisibleAreaChanged
125+
*/
107126
override fun onVisibleAreaChanged(visibleArea: Rect) {
108127
logI(TAG, "onVisibleAreaChanged visibleArea:$visibleArea")
109128
this.visibleArea = visibleArea
@@ -121,22 +140,40 @@ internal class CarMapSurfaceOwner(
121140
}
122141
}
123142

143+
/**
144+
* @see SurfaceCallback.onStableAreaChanged
145+
*/
124146
override fun onStableAreaChanged(stableArea: Rect) {
125147
// Have not found a need for this.
126148
}
127149

150+
/**
151+
* Forwards the gesture to the [MapboxCarMapGestureHandler.onScroll].
152+
*
153+
* @see SurfaceCallback.onScroll
154+
*/
128155
override fun onScroll(distanceX: Float, distanceY: Float) {
129156
logI(TAG, "onScroll $distanceX, $distanceY")
130157
val carMapSurface = mapboxCarMapSurface ?: return
131158
gestureHandler?.onScroll(carMapSurface, visibleCenter, distanceX, distanceY)
132159
}
133160

161+
/**
162+
* Forwards the gesture to the [MapboxCarMapGestureHandler.onFling].
163+
*
164+
* @see SurfaceCallback.onFling
165+
*/
134166
override fun onFling(velocityX: Float, velocityY: Float) {
135167
logI(TAG, "onFling $velocityX, $velocityY")
136168
val carMapSurface = mapboxCarMapSurface ?: return
137169
gestureHandler?.onFling(carMapSurface, velocityX, velocityY)
138170
}
139171

172+
/**
173+
* Forwards the gesture to the [MapboxCarMapGestureHandler.onScale].
174+
*
175+
* @see SurfaceCallback.onScale
176+
*/
140177
override fun onScale(focusX: Float, focusY: Float, scaleFactor: Float) {
141178
logI(TAG, "onScroll $focusX, $focusY, $scaleFactor")
142179
val carMapSurface = mapboxCarMapSurface ?: return

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

+23-1
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
@@ -72,12 +73,33 @@ class MapboxCarMap {
7273
mapInitOptions: MapInitOptions,
7374
) = apply {
7475
check(mapInitOptions.context is CarContext) {
75-
"You must setup the MapboxCarMap MapInitOptions with a CarContext"
76+
"You must set up the MapboxCarMap MapInitOptions with a CarContext"
7677
}
7778
carMapSurfaceOwner.setup(carContext, mapInitOptions)
7879
carContext.getCarService(AppManager::class.java).setSurfaceCallback(carMapSurfaceOwner)
7980
}
8081

82+
/**
83+
* Instead of using [setup], this function allows you to create your own [SurfaceCallback] and
84+
* forward the calls to the [CarMapSurfaceOwner]. This makes it possible for you to adopt new
85+
* api versions and continue to use the [MapboxCarMap] as designed.
86+
*
87+
* This is a temporary solution, while androidx.car.app:app:1.3.0 is rolling out
88+
* [SurfaceCallback.onClick]. If there is no use for this function in the future, it will be
89+
* removed.
90+
*/
91+
@MapboxExperimental
92+
fun setupWithCustomCallback(
93+
carContext: CarContext,
94+
mapInitOptions: MapInitOptions
95+
): CarMapSurfaceOwner {
96+
check(mapInitOptions.context is CarContext) {
97+
"You must set up the MapboxCarMap MapInitOptions with a CarContext"
98+
}
99+
carMapSurfaceOwner.setup(carContext, mapInitOptions)
100+
return carMapSurfaceOwner
101+
}
102+
81103
/**
82104
* Returns the current [MapboxCarMapSurface]. It is recommended to use [registerObserver] and
83105
* [MapboxCarMapObserver] to attach and detach your customizations.

0 commit comments

Comments
 (0)