diff options
| author | David Göransson <david.goransson@mullvad.net> | 2025-08-29 13:17:48 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-09-02 11:24:26 +0200 |
| commit | 65ca7ff8870518b2547bf5d5e3aeede8a807e799 (patch) | |
| tree | a7728d9fde325f22d421ca31b570687af31c73e1 | |
| parent | eb6671a1d7801f8e10411fbd022679066249ed39 (diff) | |
| download | mullvadvpn-65ca7ff8870518b2547bf5d5e3aeede8a807e799.tar.xz mullvadvpn-65ca7ff8870518b2547bf5d5e3aeede8a807e799.zip | |
Refactor map lifecycle implementation
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 |
