summaryrefslogtreecommitdiffhomepage
path: root/android/lib/map
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-08-29 13:17:48 +0200
committerDavid Göransson <david.goransson@mullvad.net>2025-09-02 11:24:26 +0200
commit65ca7ff8870518b2547bf5d5e3aeede8a807e799 (patch)
treea7728d9fde325f22d421ca31b570687af31c73e1 /android/lib/map
parenteb6671a1d7801f8e10411fbd022679066249ed39 (diff)
downloadmullvadvpn-65ca7ff8870518b2547bf5d5e3aeede8a807e799.tar.xz
mullvadvpn-65ca7ff8870518b2547bf5d5e3aeede8a807e799.zip
Refactor map lifecycle implementation
Diffstat (limited to 'android/lib/map')
-rw-r--r--android/lib/map/build.gradle.kts3
-rw-r--r--android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt40
-rw-r--r--android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt16
3 files changed, 28 insertions, 31 deletions
diff --git a/android/lib/map/build.gradle.kts b/android/lib/map/build.gradle.kts
index 347adb4d31..bc43c56bce 100644
--- a/android/lib/map/build.gradle.kts
+++ b/android/lib/map/build.gradle.kts
@@ -43,5 +43,8 @@ dependencies {
implementation(libs.androidx.lifecycle.runtime)
implementation(libs.compose.ui)
implementation(libs.compose.foundation)
+ // UI tooling
+ implementation(libs.compose.ui.tooling.preview)
+ debugImplementation(libs.compose.ui.tooling)
implementation(libs.kermit)
}
diff --git a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt
index 05b8d59701..f590637bbb 100644
--- a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt
+++ b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt
@@ -1,12 +1,8 @@
package net.mullvad.mullvadvpn.lib.map
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import net.mullvad.mullvadvpn.lib.map.data.CameraPosition
import net.mullvad.mullvadvpn.lib.map.data.GlobeColors
@@ -51,33 +47,15 @@ fun AnimatedMap(
@Composable
internal fun Map(modifier: Modifier = Modifier, mapViewState: MapViewState) {
- var view: MapGLSurfaceView? = remember { null }
-
val lifeCycleState = LocalLifecycleOwner.current.lifecycle
- DisposableEffect(key1 = lifeCycleState) {
- val observer = LifecycleEventObserver { _, event ->
- when (event) {
- Lifecycle.Event.ON_RESUME -> {
- view?.onResume()
- }
- Lifecycle.Event.ON_PAUSE -> {
- view?.onPause()
- }
- else -> {}
- }
- }
- lifeCycleState.addObserver(observer)
-
- onDispose {
- lifeCycleState.removeObserver(observer)
- view?.onPause()
- view = null
- }
- }
-
- AndroidView(modifier = modifier, factory = { MapGLSurfaceView(it) }) { glSurfaceView ->
- view = glSurfaceView
- glSurfaceView.setData(mapViewState)
- }
+ AndroidView(
+ modifier = modifier,
+ factory = { MapGLSurfaceView(it) },
+ update = { glSurfaceView ->
+ glSurfaceView.lifecycle = lifeCycleState
+ glSurfaceView.setData(mapViewState)
+ },
+ onRelease = { it.lifecycle = null },
+ )
}
diff --git a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt
index 19dd085524..32b8cfe8e3 100644
--- a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt
+++ b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt
@@ -2,12 +2,28 @@ package net.mullvad.mullvadvpn.lib.map.internal
import android.content.Context
import android.opengl.GLSurfaceView
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
import net.mullvad.mullvadvpn.lib.map.BuildConfig
import net.mullvad.mullvadvpn.lib.map.data.MapViewState
internal class MapGLSurfaceView(context: Context) : GLSurfaceView(context) {
private val renderer: MapGLRenderer
+ var lifecycle: Lifecycle? = null
+ set(value) {
+ field?.removeObserver(observer)
+ value?.addObserver(observer)
+ field = value
+ }
+
+ private val observer = LifecycleEventObserver { source, event ->
+ when (event) {
+ Lifecycle.Event.ON_RESUME -> onResume()
+ Lifecycle.Event.ON_PAUSE -> onPause()
+ else -> {}
+ }
+ }
init {
// Create an OpenGL ES 2.0 context