Skip to content

Commit 4737b2e

Browse files
Release references to native objects when destoy() called (#7856) (#7858)
* Release references to native objects when destoy() called * Rename changelog files
1 parent 459a17e commit 4737b2e

File tree

21 files changed

+391
-381
lines changed

21 files changed

+391
-381
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ check-kotlin-lint:
5252
&& $(call run-gradle-tasks,$(ANDROIDAUTO_MODULES),ktlint) \
5353
&& $(call run-gradle-tasks,$(APPLICATION_MODULES),ktlint)
5454

55+
.PHONY: format-kotlin-lint
56+
format-kotlin-lint:
57+
$(call run-gradle-tasks,$(CORE_MODULES),ktlintFormat) \
58+
&& $(call run-gradle-tasks,$(UI_MODULES),ktlintFormat) \
59+
&& $(call run-gradle-tasks,$(ANDROIDAUTO_MODULES),ktlintFormat) \
60+
&& $(call run-gradle-tasks,$(APPLICATION_MODULES),ktlintFormat)
61+
5562
.PHONY: check-android-lint
5663
check-android-lint:
5764
$(call run-gradle-tasks,$(CORE_MODULES),lint) \
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Fixed an issue where native memory was not being properly released after the `MapboxNavigation` object was destroyed.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- The `PredictiveCacheController(PredictiveCacheOptions)` constructor is now deprecated. Use `PredictiveCacheController(MapboxNavigation, PredictiveCacheOptions)` instead.

libnavigation-core/src/androidTest/java/com/mapbox/navigation/core/trip/service/ArtificialDriverTest.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.mapbox.navigation.core.replay.history.mapToLocation
1313
import com.mapbox.navigation.core.replay.route.ReplayRouteMapper
1414
import com.mapbox.navigation.core.test.R
1515
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigator
16-
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigatorImpl
1716
import com.mapbox.navigator.NavigationStatus
1817
import com.mapbox.navigator.NavigationStatusOrigin
1918
import com.mapbox.navigator.NavigatorObserver
@@ -43,19 +42,20 @@ class ArtificialDriverTest {
4342
@Ignore("test sometimes fails because of https://mapbox.atlassian.net/browse/NN-418")
4443
fun nativeNavigatorFollowsArtificialDriverWithoutReroutes() =
4544
runBlocking<Unit>(Dispatchers.Main) {
46-
withNavigators { mapboxNavigation, nativeNavigator ->
45+
withNavigators { mapboxNavigation ->
4746
mapboxNavigation.historyRecorder.startRecording()
4847
val testRoute = getTestRoute()
4948
val events = createArtificialLocationUpdates(testRoute)
50-
val setRoutesResult =
51-
nativeNavigator.setRoutes(testRoute, reason = SetRoutesReason.NEW_ROUTE)
49+
val setRoutesResult = mapboxNavigation.navigator
50+
.setRoutes(testRoute, reason = SetRoutesReason.NEW_ROUTE)
5251
assertTrue("result is $setRoutesResult", setRoutesResult.isValue)
5352
val statusesTracking = async<List<NavigationStatus>> {
54-
nativeNavigator.collectStatuses(untilRouteState = RouteState.COMPLETE)
53+
mapboxNavigation.navigator
54+
.collectStatuses(untilRouteState = RouteState.COMPLETE)
5555
}
5656

5757
for (location in events.map { it.location.mapToLocation() }) {
58-
assertTrue(nativeNavigator.updateLocation(location.toFixLocation()))
58+
assertTrue(mapboxNavigation.navigator.updateLocation(location.toFixLocation()))
5959
}
6060

6161
val states = statusesTracking.await()
@@ -113,7 +113,7 @@ fun MapboxNativeNavigator.statusUpdates(): Flow<OnStatusUpdateParameters> {
113113
}
114114

115115
private suspend fun withNavigators(
116-
block: suspend (MapboxNavigation, MapboxNativeNavigator) -> Unit
116+
block: suspend (MapboxNavigation) -> Unit
117117
) {
118118
val context = InstrumentationRegistry.getInstrumentation().targetContext
119119
val mapboxNavigation = MapboxNavigationProvider.create(
@@ -122,7 +122,7 @@ private suspend fun withNavigators(
122122
.build()
123123
)
124124
try {
125-
block(mapboxNavigation, MapboxNativeNavigatorImpl)
125+
block(mapboxNavigation)
126126
} finally {
127127
mapboxNavigation.onDestroy()
128128
}

libnavigation-core/src/androidTest/java/com/mapbox/navigation/core/trip/service/NativeNavigatorCallbackOrderTest.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import com.mapbox.navigation.core.MapboxNavigation
1616
import com.mapbox.navigation.core.MapboxNavigationProvider
1717
import com.mapbox.navigation.core.test.R
1818
import com.mapbox.navigation.core.tests.activity.TripServiceActivity
19-
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigatorImpl
2019
import com.mapbox.navigation.testing.ui.BaseTest
2120
import com.mapbox.navigation.testing.ui.utils.runOnMainSync
2221
import com.mapbox.navigator.FixLocation
@@ -72,11 +71,7 @@ internal class NativeNavigatorCallbackOrderTest :
7271
)
7372
// starts raw location updates - otherwise we don't get onStatus calls
7473
mapboxNavigation.startTripSession()
75-
val nativeNavigatorField = mapboxNavigation.javaClass.getDeclaredField("navigator")
76-
nativeNavigatorField.isAccessible = true
77-
val nativeNavigatorImpl =
78-
nativeNavigatorField.get(mapboxNavigation) as MapboxNativeNavigatorImpl
79-
nativeNavigatorField.isAccessible = false
74+
val nativeNavigatorImpl = mapboxNavigation.navigator
8075
val navigatorField = nativeNavigatorImpl.javaClass.getDeclaredField("navigator")
8176
navigatorField.isAccessible = true
8277
navigator = navigatorField.get(nativeNavigatorImpl) as Navigator

libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ class MapboxNavigation @VisibleForTesting internal constructor(
266266

267267
private val mainJobController = threadController.getMainScopeAndRootJob()
268268
private val directionsSession: DirectionsSession
269-
private var navigator: MapboxNativeNavigator
270269
private var historyRecorderHandles: NavigatorLoader.HistoryRecorderHandles
271270
private val tripService: TripService
272271
private val tripSession: TripSession
@@ -348,6 +347,11 @@ class MapboxNavigation @VisibleForTesting internal constructor(
348347
private var rerouteController: InternalRerouteController?
349348
private val defaultRerouteController: InternalRerouteController
350349

350+
private var _navigator: MapboxNativeNavigator?
351+
352+
internal val navigator: MapboxNativeNavigator
353+
get() = _navigator ?: error("MapboxNavigation is destroyed")
354+
351355
/**
352356
* [NavigationVersionSwitchObserver] is notified when navigation switches tiles version.
353357
*/
@@ -492,7 +496,7 @@ class MapboxNavigation @VisibleForTesting internal constructor(
492496
is NavigationRouter -> LegacyNavigationRouterAdapter(result)
493497
else -> LegacyNavigationRouterAdapter(LegacyRouterAdapter(result))
494498
}
495-
navigator = NavigationComponentProvider.createNativeNavigator(
499+
_navigator = NavigationComponentProvider.createNativeNavigator(
496500
cacheHandle,
497501
config,
498502
historyRecorderHandles.composite,
@@ -1299,6 +1303,8 @@ class MapboxNavigation @VisibleForTesting internal constructor(
12991303
}
13001304
resetAdasisMessageObserver()
13011305

1306+
_navigator = null
1307+
13021308
isDestroyed = true
13031309
hasInstance = false
13041310
}

libnavigation-core/src/main/java/com/mapbox/navigation/core/NavigationComponentProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ internal object NavigationComponentProvider {
4343
historyRecorderComposite: HistoryRecorderHandle?,
4444
accessToken: String,
4545
router: RouterInterface?,
46-
): MapboxNativeNavigator = MapboxNativeNavigatorImpl.create(
46+
): MapboxNativeNavigator = MapboxNativeNavigatorImpl(
4747
cacheHandle,
4848
config,
4949
historyRecorderComposite,

libnavigation-core/src/main/java/com/mapbox/navigation/core/internal/PredictiveCache.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package com.mapbox.navigation.core.internal
33
import com.mapbox.common.TileStore
44
import com.mapbox.common.TilesetDescriptor
55
import com.mapbox.navigation.base.options.PredictiveCacheLocationOptions
6-
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigatorImpl
6+
import com.mapbox.navigation.core.MapboxNavigation
77
import com.mapbox.navigator.PredictiveCacheController
88

9-
object PredictiveCache {
9+
class PredictiveCache(private val mapboxNavigation: MapboxNavigation) {
1010

1111
internal val cachedNavigationPredictiveCacheControllers =
1212
mutableSetOf<PredictiveCacheController>()
@@ -22,9 +22,9 @@ object PredictiveCache {
2222
internal val mapsPredictiveCacheLocationOptionsTileVariant =
2323
mutableMapOf<Any, MutableMap<String, Pair<TileStore, PredictiveCacheLocationOptions>>>()
2424

25-
fun init() {
25+
init {
2626
// recreate controllers with the same options but with a new navigator instance
27-
MapboxNativeNavigatorImpl.setNativeNavigatorRecreationObserver {
27+
mapboxNavigation.navigator.setNativeNavigatorRecreationObserver {
2828
val navOptions = navPredictiveCacheLocationOptions.toSet()
2929
val mapsOptions = mapsPredictiveCacheLocationOptions.toMap()
3030
val mapsOptionsTileVariant = mapsPredictiveCacheLocationOptionsTileVariant.toMap()
@@ -61,7 +61,7 @@ object PredictiveCache {
6161
) {
6262
navPredictiveCacheLocationOptions.add(predictiveCacheLocationOptions)
6363
val predictiveCacheController =
64-
MapboxNativeNavigatorImpl.createNavigationPredictiveCacheController(
64+
mapboxNavigation.navigator.createNavigationPredictiveCacheController(
6565
predictiveCacheLocationOptions
6666
)
6767
cachedNavigationPredictiveCacheControllers.add(predictiveCacheController)
@@ -77,7 +77,7 @@ object PredictiveCache {
7777
predictiveCacheLocationOptions: PredictiveCacheLocationOptions
7878
) {
7979
val predictiveCacheController =
80-
MapboxNativeNavigatorImpl.createMapsPredictiveCacheControllerTileVariant(
80+
mapboxNavigation.navigator.createMapsPredictiveCacheControllerTileVariant(
8181
tileStore,
8282
tileVariant,
8383
predictiveCacheLocationOptions
@@ -100,7 +100,7 @@ object PredictiveCache {
100100
descriptorsAndOptions: List<Pair<TilesetDescriptor, PredictiveCacheLocationOptions>>
101101
) {
102102
val descriptorsToPredictiveCacheControllers = descriptorsAndOptions.map {
103-
it.first to MapboxNativeNavigatorImpl.createMapsPredictiveCacheController(
103+
it.first to mapboxNavigation.navigator.createMapsPredictiveCacheController(
104104
tileStore,
105105
it.first,
106106
it.second

libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import com.mapbox.navigation.core.trip.service.TripService
2929
import com.mapbox.navigation.core.trip.session.eh.EHorizonObserver
3030
import com.mapbox.navigation.core.trip.session.eh.EHorizonSubscriptionManager
3131
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigator
32-
import com.mapbox.navigation.navigator.internal.MapboxNativeNavigatorImpl
3332
import com.mapbox.navigation.navigator.internal.utils.calculateRemainingWaypoints
3433
import com.mapbox.navigation.navigator.internal.utils.getCurrentLegDestination
3534
import com.mapbox.navigation.utils.internal.JobControl
@@ -64,7 +63,7 @@ import java.util.concurrent.CopyOnWriteArraySet
6463
internal class MapboxTripSession(
6564
override val tripService: TripService,
6665
private val tripSessionLocationEngine: TripSessionLocationEngine,
67-
private val navigator: MapboxNativeNavigator = MapboxNativeNavigatorImpl,
66+
private val navigator: MapboxNativeNavigator,
6867
private val threadController: ThreadController,
6968
private val eHorizonSubscriptionManager: EHorizonSubscriptionManager
7069
) : TripSession {

libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/eh/GraphAccessor.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class GraphAccessor internal constructor(
3434
* @return list of Points representing edge shape
3535
*/
3636
fun getEdgeShape(edgeId: Long): List<Point>? {
37-
return navigator.graphAccessor?.getEdgeShape(edgeId)
37+
return navigator.graphAccessor.getEdgeShape(edgeId)
3838
}
3939

4040
/**
@@ -45,7 +45,7 @@ class GraphAccessor internal constructor(
4545
* @return EHorizonEdgeMetadata
4646
*/
4747
fun getEdgeMetadata(edgeId: Long): EHorizonEdgeMetadata? {
48-
return navigator.graphAccessor?.getEdgeMetadata(edgeId)?.let {
48+
return navigator.graphAccessor.getEdgeMetadata(edgeId)?.let {
4949
EHorizonFactory.buildEHorizonEdgeMetadata(it)
5050
}
5151
}
@@ -55,7 +55,7 @@ class GraphAccessor internal constructor(
5555
* If any of path edges is not accessible, returns null.
5656
*/
5757
fun getPathShape(graphPath: EHorizonGraphPath): List<Point>? {
58-
return navigator.graphAccessor?.getPathShape(
58+
return navigator.graphAccessor.getPathShape(
5959
EHorizonFactory.buildNativeGraphPath(graphPath)
6060
)
6161
}
@@ -65,7 +65,7 @@ class GraphAccessor internal constructor(
6565
* If position's edge is not accessible, returns null.
6666
*/
6767
fun getGraphPositionCoordinate(graphPosition: EHorizonGraphPosition): Point? {
68-
return navigator.graphAccessor?.getPositionCoordinate(
68+
return navigator.graphAccessor.getPositionCoordinate(
6969
EHorizonFactory.buildNativeGraphPosition(graphPosition)
7070
)
7171
}
@@ -75,7 +75,7 @@ class GraphAccessor internal constructor(
7575
*/
7676
@ExperimentalPreviewMapboxNavigationAPI
7777
fun getAdasisEdgeAttributes(edgeId: Long): AdasEdgeAttributes? {
78-
return navigator.graphAccessor?.getAdasAttributes(edgeId)?.let {
78+
return navigator.graphAccessor.getAdasAttributes(edgeId)?.let {
7979
AdasEdgeAttributes.createFromNativeObject(it)
8080
}
8181
}

0 commit comments

Comments
 (0)