Skip to content

Commit 1189c36

Browse files
committed
Refactor to new module
1 parent 33a0610 commit 1189c36

File tree

33 files changed

+344
-142
lines changed

33 files changed

+344
-142
lines changed

android/app/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ dependencies {
320320
implementation(project(Dependencies.Mullvad.talpidLib))
321321
implementation(project(Dependencies.Mullvad.themeLib))
322322
implementation(project(Dependencies.Mullvad.paymentLib))
323+
implementation(project(Dependencies.Mullvad.mapLib))
323324

324325
// Play implementation
325326
playImplementation(project(Dependencies.Mullvad.billingLib))

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt

+17-10
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,6 @@ import net.mullvad.mullvadvpn.compose.destinations.DeviceRevokedDestination
5454
import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination
5555
import net.mullvad.mullvadvpn.compose.destinations.SelectLocationDestination
5656
import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination
57-
import net.mullvad.mullvadvpn.compose.map.Map
58-
import net.mullvad.mullvadvpn.compose.map.data.LatLng
59-
import net.mullvad.mullvadvpn.compose.map.data.Latitude
60-
import net.mullvad.mullvadvpn.compose.map.data.Longitude
61-
import net.mullvad.mullvadvpn.compose.map.data.Marker
62-
import net.mullvad.mullvadvpn.compose.map.data.MarkerType
63-
import net.mullvad.mullvadvpn.compose.map.data.gothenburgLatLng
6457
import net.mullvad.mullvadvpn.compose.state.ConnectUiState
6558
import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR
6659
import net.mullvad.mullvadvpn.compose.test.CONNECT_BUTTON_TEST_TAG
@@ -70,11 +63,15 @@ import net.mullvad.mullvadvpn.compose.test.SCROLLABLE_COLUMN_TEST_TAG
7063
import net.mullvad.mullvadvpn.compose.test.SELECT_LOCATION_BUTTON_TEST_TAG
7164
import net.mullvad.mullvadvpn.compose.transitions.HomeTransition
7265
import net.mullvad.mullvadvpn.lib.common.util.openAccountPageInBrowser
66+
import net.mullvad.mullvadvpn.lib.map.Map
7367
import net.mullvad.mullvadvpn.lib.theme.AppTheme
7468
import net.mullvad.mullvadvpn.lib.theme.Dimens
7569
import net.mullvad.mullvadvpn.lib.theme.color.AlphaScrollbar
7670
import net.mullvad.mullvadvpn.lib.theme.color.AlphaTopBar
7771
import net.mullvad.mullvadvpn.model.GeoIpLocation
72+
import net.mullvad.mullvadvpn.model.LatLng
73+
import net.mullvad.mullvadvpn.model.Latitude
74+
import net.mullvad.mullvadvpn.model.Longitude
7875
import net.mullvad.mullvadvpn.model.TunnelState
7976
import net.mullvad.mullvadvpn.util.appendHideNavOnPlayBuild
8077
import net.mullvad.mullvadvpn.viewmodel.ConnectViewModel
@@ -326,15 +323,25 @@ fun ConnectScreen(
326323
}
327324
}
328325

329-
fun TunnelState.toMarker(location: GeoIpLocation?): Marker? {
326+
fun TunnelState.toMarker(location: GeoIpLocation?): net.mullvad.mullvadvpn.lib.map.data.Marker? {
330327
if (location == null) return null
331328
return when (this) {
332-
is TunnelState.Connected -> Marker(location.toLatLng(), MarkerType.SECURE)
329+
is TunnelState.Connected ->
330+
net.mullvad.mullvadvpn.lib.map.data.Marker(
331+
location.toLatLng(),
332+
net.mullvad.mullvadvpn.lib.map.data.MarkerType.SECURE
333+
)
333334
is TunnelState.Connecting -> null
334-
is TunnelState.Disconnected -> Marker(location.toLatLng(), MarkerType.UNSECURE)
335+
is TunnelState.Disconnected ->
336+
net.mullvad.mullvadvpn.lib.map.data.Marker(
337+
location.toLatLng(),
338+
net.mullvad.mullvadvpn.lib.map.data.MarkerType.UNSECURE
339+
)
335340
is TunnelState.Disconnecting -> null
336341
is TunnelState.Error -> null
337342
}
338343
}
339344

340345
fun GeoIpLocation.toLatLng() = LatLng(Latitude(latitude.toFloat()), Longitude(longitude.toFloat()))
346+
347+
val gothenburgLatLng = LatLng(Latitude(57.7065f), Longitude(11.967f))

android/app/src/test/kotlin/net/mullvad/mullvadvpn/compose/map/data/LatLngTest.kt

-31
This file was deleted.

android/buildSrc/src/main/kotlin/Dependencies.kt

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ object Dependencies {
9999
const val commonTestLib = ":lib:common-test"
100100
const val billingLib = ":lib:billing"
101101
const val paymentLib = ":lib:payment"
102+
const val mapLib = ":lib:map"
102103
}
103104

104105
object Plugin {

android/config/detekt.yml

+1
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,7 @@ style:
761761
excludeImportStatements: true
762762
excludeCommentStatements: false
763763
excludeRawStrings: true
764+
ignoreAnnotated: ['Test']
764765
MayBeConst:
765766
active: true
766767
ModifierOrder:

android/lib/map/build.gradle.kts

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
plugins {
2+
id(Dependencies.Plugin.kotlinAndroidId)
3+
id(Dependencies.Plugin.androidLibraryId)
4+
}
5+
6+
android {
7+
namespace = "net.mullvad.mullvadvpn.lib.map"
8+
compileSdk = Versions.Android.compileSdkVersion
9+
10+
defaultConfig {
11+
minSdk = Versions.Android.minSdkVersion
12+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
13+
}
14+
15+
compileOptions {
16+
sourceCompatibility = JavaVersion.VERSION_17
17+
targetCompatibility = JavaVersion.VERSION_17
18+
}
19+
20+
kotlinOptions {
21+
jvmTarget = Versions.jvmTarget
22+
}
23+
24+
buildFeatures { compose = true }
25+
26+
composeOptions { kotlinCompilerExtensionVersion = Versions.kotlinCompilerExtensionVersion }
27+
28+
lint {
29+
lintConfig = file("${rootProject.projectDir}/config/lint.xml")
30+
abortOnError = true
31+
warningsAsErrors = true
32+
}
33+
}
34+
35+
dependencies {
36+
37+
//Model
38+
implementation(project(Dependencies.Mullvad.modelLib))
39+
40+
implementation(Dependencies.Compose.ui)
41+
implementation(Dependencies.Compose.foundation)
42+
43+
implementation(Dependencies.AndroidX.lifecycleRuntimeKtx)
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.mullvad.mullvadvpn.lib.map
2+
3+
import androidx.test.platform.app.InstrumentationRegistry
4+
import androidx.test.ext.junit.runners.AndroidJUnit4
5+
6+
import org.junit.Test
7+
import org.junit.runner.RunWith
8+
9+
import org.junit.Assert.*
10+
11+
/**
12+
* Instrumented test, which will execute on an Android device.
13+
*
14+
* See [testing documentation](http://d.android.com/tools/testing).
15+
*/
16+
@RunWith(AndroidJUnit4::class)
17+
class ExampleInstrumentedTest {
18+
@Test
19+
fun useAppContext() {
20+
// Context of the app under test.
21+
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22+
assertEquals("net.mullvad.mullvadvpn.lib.map.test", appContext.packageName)
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
</manifest>

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/Map.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.mullvad.mullvadvpn.compose.map
1+
package net.mullvad.mullvadvpn.lib.map
22

33
import android.util.Log
44
import androidx.compose.animation.core.Animatable
@@ -10,14 +10,13 @@ import androidx.compose.runtime.LaunchedEffect
1010
import androidx.compose.runtime.remember
1111
import androidx.compose.ui.Modifier
1212
import kotlinx.coroutines.launch
13-
import net.mullvad.mullvadvpn.compose.map.data.LatLng
14-
import net.mullvad.mullvadvpn.compose.map.data.Latitude
15-
import net.mullvad.mullvadvpn.compose.map.data.Longitude
16-
import net.mullvad.mullvadvpn.compose.map.data.MapViewState
17-
import net.mullvad.mullvadvpn.compose.map.data.Marker
18-
import net.mullvad.mullvadvpn.compose.map.data.MarkerType
19-
import net.mullvad.mullvadvpn.compose.map.internal.MapGLShader
20-
import net.mullvad.mullvadvpn.compose.util.rememberPrevious
13+
import net.mullvad.mullvadvpn.lib.map.data.MapViewState
14+
import net.mullvad.mullvadvpn.lib.map.data.Marker
15+
import net.mullvad.mullvadvpn.lib.map.data.MarkerType
16+
import net.mullvad.mullvadvpn.lib.map.internal.MapGLShader
17+
import net.mullvad.mullvadvpn.model.LatLng
18+
import net.mullvad.mullvadvpn.model.Latitude
19+
import net.mullvad.mullvadvpn.model.Longitude
2120

2221
@Composable
2322
fun Map(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package net.mullvad.mullvadvpn.lib.map
2+
3+
/*
4+
* Code snippet taken from:
5+
* https://stackoverflow.com/questions/67801939/get-previous-value-of-state-in-composable-jetpack-compose
6+
*/
7+
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.MutableState
10+
import androidx.compose.runtime.SideEffect
11+
import androidx.compose.runtime.remember
12+
13+
// TODO this file was copied for now and should be removed/broken out to a new module
14+
@Composable
15+
fun <T> rememberPrevious(
16+
current: T,
17+
shouldUpdate: (prev: T?, curr: T) -> Boolean = { a: T?, b: T -> a != b },
18+
): T? {
19+
val ref = rememberRef<T>()
20+
21+
// launched after render, so the current render will have the old value anyway
22+
SideEffect {
23+
if (shouldUpdate(ref.value, current)) {
24+
ref.value = current
25+
}
26+
}
27+
28+
return ref.value
29+
}
30+
31+
@Composable
32+
private fun <T> rememberRef(): MutableState<T?> {
33+
// for some reason it always recreated the value with vararg keys,
34+
// leaving out the keys as a parameter for remember for now
35+
return remember {
36+
object : MutableState<T?> {
37+
override var value: T? = null
38+
39+
override fun component1(): T? = value
40+
41+
override fun component2(): (T?) -> Unit = { value = it }
42+
}
43+
}
44+
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/data/MapViewState.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/data/MapViewState.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package net.mullvad.mullvadvpn.compose.map.data
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import net.mullvad.mullvadvpn.model.LatLng
24

35
class MapViewState(
46
val zoom: Float,

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/data/Marker.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/data/Marker.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package net.mullvad.mullvadvpn.compose.map.data
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import net.mullvad.mullvadvpn.model.LatLng
24

35
data class Marker(val latLng: LatLng, val type: MarkerType, val size: Float = 0.02f)
46

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal
1+
package net.mullvad.mullvadvpn.lib.map.internal
22

33
const val VERTEX_COMPONENT_SIZE = 3
44
const val COLOR_COMPONENT_SIZE = 4
55

66
const val MATRIX_SIZE = 16
7-
8-
const val COMPLETE_ANGLE = 360f

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/internal/GLHelper.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/GLHelper.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal
1+
package net.mullvad.mullvadvpn.lib.map.internal
22

33
import android.opengl.GLES20
44
import android.opengl.Matrix
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal
1+
package net.mullvad.mullvadvpn.lib.map.internal
22

33
data class IndexBufferWithLength(val indexBuffer: Int, val length: Int)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/internal/MapGLRenderer.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLRenderer.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal
1+
package net.mullvad.mullvadvpn.lib.map.internal
22

33
import android.content.res.Resources
44
import android.opengl.GLES20
@@ -8,10 +8,11 @@ import androidx.compose.ui.graphics.Color
88
import javax.microedition.khronos.egl.EGLConfig
99
import javax.microedition.khronos.opengles.GL10
1010
import kotlin.math.tan
11-
import net.mullvad.mullvadvpn.compose.map.data.MapViewState
12-
import net.mullvad.mullvadvpn.compose.map.data.MarkerType
13-
import net.mullvad.mullvadvpn.compose.map.internal.shapes.Globe
14-
import net.mullvad.mullvadvpn.compose.map.internal.shapes.LocationMarker
11+
import net.mullvad.mullvadvpn.lib.map.data.MapViewState
12+
import net.mullvad.mullvadvpn.lib.map.data.MarkerType
13+
import net.mullvad.mullvadvpn.lib.map.internal.shapes.Globe
14+
import net.mullvad.mullvadvpn.lib.map.internal.shapes.LocationMarker
15+
import net.mullvad.mullvadvpn.model.COMPLETE_ANGLE
1516

1617
class MapGLRenderer(private val resources: Resources, private val mapConfig: MapConfig) :
1718
GLSurfaceView.Renderer {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/internal/MapGLSurfaceView.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/MapGLSurfaceView.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal
1+
package net.mullvad.mullvadvpn.lib.map.internal
22

33
import android.annotation.SuppressLint
44
import android.content.Context
55
import android.opengl.GLSurfaceView
66
import androidx.compose.ui.graphics.Color
7-
import net.mullvad.mullvadvpn.compose.map.data.MapViewState
8-
import net.mullvad.mullvadvpn.compose.map.internal.shapes.GlobeColors
9-
import net.mullvad.mullvadvpn.compose.map.internal.shapes.LocationMarkerColors
7+
import net.mullvad.mullvadvpn.lib.map.data.MapViewState
8+
import net.mullvad.mullvadvpn.lib.map.internal.shapes.GlobeColors
9+
import net.mullvad.mullvadvpn.lib.map.internal.shapes.LocationMarkerColors
1010

1111
@SuppressLint("ViewConstructor")
1212
class MapGLSurfaceView(context: Context, mapConfig: MapConfig) : GLSurfaceView(context) {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/internal/ShaderComposable.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/ShaderComposable.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal
1+
package net.mullvad.mullvadvpn.lib.map.internal
22

33
import android.util.Log
44
import androidx.compose.runtime.Composable
@@ -9,7 +9,7 @@ import androidx.compose.ui.platform.LocalLifecycleOwner
99
import androidx.compose.ui.viewinterop.AndroidView
1010
import androidx.lifecycle.Lifecycle
1111
import androidx.lifecycle.LifecycleEventObserver
12-
import net.mullvad.mullvadvpn.compose.map.data.MapViewState
12+
import net.mullvad.mullvadvpn.lib.map.data.MapViewState
1313

1414
@Composable
1515
fun MapGLShader(modifier: Modifier = Modifier, mapViewState: MapViewState) {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/map/internal/shapes/Globe.kt android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/shapes/Globe.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
package net.mullvad.mullvadvpn.compose.map.internal.shapes
1+
package net.mullvad.mullvadvpn.lib.map.internal.shapes
22

33
import android.content.res.Resources
44
import android.opengl.GLES20
55
import android.opengl.Matrix
66
import androidx.compose.ui.graphics.Color
77
import java.nio.ByteBuffer
8-
import net.mullvad.mullvadvpn.compose.map.internal.IndexBufferWithLength
9-
import net.mullvad.mullvadvpn.compose.map.internal.VERTEX_COMPONENT_SIZE
10-
import net.mullvad.mullvadvpn.compose.map.internal.initArrayBuffer
11-
import net.mullvad.mullvadvpn.compose.map.internal.initIndexBuffer
12-
import net.mullvad.mullvadvpn.compose.map.internal.initShaderProgram
13-
import net.mullvad.mullvadvpn.compose.map.internal.toFloatArray
14-
import net.mullvad.mullvadvpn.R
8+
import net.mullvad.mullvadvpn.lib.map.internal.IndexBufferWithLength
9+
import net.mullvad.mullvadvpn.lib.map.internal.VERTEX_COMPONENT_SIZE
10+
import net.mullvad.mullvadvpn.lib.map.internal.initArrayBuffer
11+
import net.mullvad.mullvadvpn.lib.map.internal.initIndexBuffer
12+
import net.mullvad.mullvadvpn.lib.map.internal.initShaderProgram
13+
import net.mullvad.mullvadvpn.lib.map.internal.toFloatArray
14+
import net.mullvad.mullvadvpn.lib.map.R
1515

1616
data class GlobeColors(
1717
val landColor: Color,

0 commit comments

Comments
 (0)