Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 6 additions & 46 deletions src/main/java/com/mapconductor/here/HereMapView.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package com.mapconductor.here

import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.node.Ref
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.here.sdk.mapview.MapProjection as HereMapProjection
import com.here.sdk.mapview.MapRenderMode
import com.here.sdk.mapview.MapView
Expand Down Expand Up @@ -44,7 +40,6 @@ import com.mapconductor.here.raster.HereRasterLayerController
import com.mapconductor.here.raster.HereRasterLayerOverlayRenderer
import java.util.concurrent.atomic.AtomicBoolean
import android.annotation.SuppressLint
import android.view.ViewGroup
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.suspendCancellableCoroutine

Expand Down Expand Up @@ -82,7 +77,6 @@ fun HereMapView(
val scope = remember { HereViewScope() }
val controllerRef = remember { Ref<HereMapViewController>() }
val context = LocalContext.current
val lifecycle = LocalLifecycleOwner.current.lifecycle
val registry = remember { scope.buildRegistry() }
val cameraState = remember { mutableStateOf<MapCameraPositionInterface?>(state.cameraPosition) }
// Capture the desired initial camera before any early camera callbacks can overwrite state.
Expand Down Expand Up @@ -224,46 +218,12 @@ fun HereMapView(
scope = scope,
registry = registry,
onMapLoaded = onMapLoaded,
customDisposableEffect = { _, holderRef ->

// HERE specific DisposableEffect logic
DisposableEffect(lifecycle) {
val stateId = state.id // from BaseMapViewState
val observer =
object : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
// Do not call here to keep the MapView instance
// holderRef.value?.mapView?.onResume()
}

override fun onPause(owner: LifecycleOwner) {
// Do not call here to keep the MapView instance
// holderRef.value?.mapView?.onPause()
}

override fun onDestroy(owner: LifecycleOwner) {
val currentHolder = holderRef.value
if (currentHolder != null) {
val activity = context.findActivity()
if (activity?.isChangingConfigurations == true) {
(currentHolder.mapView.parent as? ViewGroup)?.removeView(currentHolder.mapView)
} else {
// Ensure these calls are safe if mapView might be null or already destroyed
currentHolder.mapView.onPause()
currentHolder.mapView.onDestroy()
// Real teardown: free overlay controllers (tile-server
// routes, marker managers) and cancel the controller scope.
HereMapViewControllerStore.get(stateId)?.destroy()
HereMapViewControllerStore.remove(stateId) // Clean up from your store
}
}
}
}
lifecycle.addObserver(observer)
onDispose {
lifecycle.removeObserver(observer)
}
}
// Created resumed in viewProvider, so paused before it is destroyed. A
// MapView left alive keeps its render loop and, through its listeners,
// the controller with every overlay.
onDestroyMapView = { mapView ->
mapView.onPause()
mapView.onDestroy()
},
// Pass content if it needs to be rendered within the overlay providers in MapViewBase,
// or handle it here if it's specific to HereMapView structure before calling MapViewBase.
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/com/mapconductor/here/HereViewStateImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@ class HereViewState(
cameraPosition: MapCameraPosition = MapCameraPosition.Default,
) : MapViewState<HereMapDesignType>(cameraPosition),
HereViewStateInterface {
private var controller: HereMapViewControllerInterface? = null
// Read through the base so that letting go of the controller there (MapViewBase
// does it when the map is torn down) leaves nothing behind here.
private val controller: HereMapViewControllerInterface?
get() = attachedMapController as? HereMapViewControllerInterface

private var _mapDesignType: HereMapDesignType = mapDesignType

Expand All @@ -43,7 +46,6 @@ class HereViewState(
override fun getMapViewHolder(): HereViewHolder? = super.getMapViewHolder() as? HereViewHolder

internal fun setController(controller: HereMapViewControllerInterface) {
this.controller = controller
// controller.setMapDesignType(_mapDesignType)
attachController(controller)
}
Expand Down
Loading