summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-09-02 11:25:10 +0200
committerDavid Göransson <david.goransson@mullvad.net>2025-09-02 11:25:10 +0200
commit51621e6faf71b83937b115b1b281eb9aa9816679 (patch)
tree8504f0c90c0b23c7bb591056bfd51e2ef7ee5186 /android/lib
parenteb6671a1d7801f8e10411fbd022679066249ed39 (diff)
parentaa0b4882bec6a3bd87228b5e538eeb37ead9af7a (diff)
downloadmullvadvpn-51621e6faf71b83937b115b1b281eb9aa9816679.tar.xz
mullvadvpn-51621e6faf71b83937b115b1b281eb9aa9816679.zip
Merge branch 'rework-map-lifecycle'
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/map/build.gradle.kts3
-rw-r--r--android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt81
-rw-r--r--android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt16
3 files changed, 69 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..2e7627c962 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,15 @@
package net.mullvad.mullvadvpn.lib.map
+import androidx.compose.animation.core.LinearEasing
+import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.infiniteRepeatable
+import androidx.compose.animation.core.rememberInfiniteTransition
+import androidx.compose.animation.core.tween
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.tooling.preview.Preview
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
@@ -14,6 +17,40 @@ import net.mullvad.mullvadvpn.lib.map.data.MapViewState
import net.mullvad.mullvadvpn.lib.map.data.Marker
import net.mullvad.mullvadvpn.lib.map.internal.MapGLSurfaceView
import net.mullvad.mullvadvpn.lib.model.LatLong
+import net.mullvad.mullvadvpn.lib.model.Latitude
+import net.mullvad.mullvadvpn.lib.model.Longitude
+
+@Preview
+@Composable
+fun MapPreview() {
+ val infinite = rememberInfiniteTransition()
+ val spin =
+ infinite.animateFloat(
+ 0f,
+ 360f,
+ infiniteRepeatable(animation = tween(30000, easing = LinearEasing)),
+ )
+
+ Map(
+ modifier = Modifier,
+ cameraLocation =
+ CameraPosition(
+ LatLong(Latitude(0f), Longitude.fromFloat(spin.value)),
+ 2f,
+ verticalBias = 0.5f,
+ ),
+ markers = emptyList(),
+ globeColors =
+ GlobeColors(
+ // Green
+ landColor = Color(0xFF26513C),
+ // Blue
+ oceanColor = Color(0xFF161E50),
+ // Darker green
+ contourColor = Color(0xFF1B3626),
+ ),
+ )
+}
@Composable
fun Map(
@@ -51,33 +88,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