summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2024-06-26 13:24:33 +0200
committerAlbin <albin@mullvad.net>2024-06-26 13:24:33 +0200
commitf511be6302af0f17e1cb1dd3de727938f32c7f01 (patch)
tree962cec1a268ed739783e020f2acec79a345456d2
parentac70101c713139244221889a61e96ecf9a56c9c6 (diff)
parenta4fbed079435932febfb3314918b1d2c2744fc7c (diff)
downloadmullvadvpn-f511be6302af0f17e1cb1dd3de727938f32c7f01.tar.xz
mullvadvpn-f511be6302af0f17e1cb1dd3de727938f32c7f01.zip
Merge branch 'replace-default-logging-tool-with-kermit-droid-704'
-rw-r--r--android/app/build.gradle.kts1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/ChangelogDataProvider.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt4
-rw-r--r--android/buildSrc/src/main/kotlin/Dependencies.kt1
-rw-r--r--android/buildSrc/src/main/kotlin/Versions.kt1
-rw-r--r--android/gradle/verification-metadata.xml64
-rw-r--r--android/lib/common/src/main/kotlin/net/mullvad/mullvadvpn/lib/common/constant/LogTag.kt3
-rw-r--r--android/lib/daemon-grpc/build.gradle.kts1
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt5
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/LogInterceptor.kt5
-rw-r--r--android/lib/map/build.gradle.kts6
-rw-r--r--android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/GLHelper.kt6
-rw-r--r--android/lib/shared/build.gradle.kts1
-rw-r--r--android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt4
-rw-r--r--android/lib/talpid/build.gradle.kts3
-rw-r--r--android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt5
-rw-r--r--android/service/build.gradle.kts1
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt24
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/ForegroundNotificationManager.kt11
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/LogTest.kt24
-rw-r--r--android/test/common/build.gradle.kts1
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt10
-rw-r--r--android/test/e2e/build.gradle.kts1
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt3
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt5
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt33
-rw-r--r--android/test/mockapi/build.gradle.kts1
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/Extensions.kt5
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt10
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt6
-rw-r--r--android/tile/build.gradle.kts1
-rw-r--r--android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt9
33 files changed, 179 insertions, 93 deletions
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index 8e523ecb39..3e99a3c7ab 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -339,6 +339,7 @@ dependencies {
ksp(Dependencies.Compose.destinationsKsp)
implementation(Dependencies.jodaTime)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Koin.core)
implementation(Dependencies.Koin.android)
implementation(Dependencies.Koin.compose)
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt
index 04ccb1cddc..617f538e87 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt
@@ -1,19 +1,22 @@
package net.mullvad.mullvadvpn
import android.app.Application
+import co.touchlab.kermit.Logger
+import co.touchlab.kermit.Severity
import net.mullvad.mullvadvpn.di.appModule
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
-/**
- * In Android, separate instances of the application class (MullvadApplication) will be instantiated
- * for each process. That also means that a only common logic should be placed here.
- */
+private const val LOG_TAG = "mullvad"
+
class MullvadApplication : Application() {
override fun onCreate() {
super.onCreate()
- // Used to create/start separate DI graphs for each process. Avoid non-common classes etc.
+ Logger.setTag(LOG_TAG)
+ if (!BuildConfig.DEBUG) {
+ Logger.setMinSeverity(Severity.Info)
+ }
startKoin { androidContext(this@MullvadApplication) }
loadKoinModules(listOf(appModule))
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/ChangelogDataProvider.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/ChangelogDataProvider.kt
index c1dc72ebfe..d4e3957f94 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/ChangelogDataProvider.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/ChangelogDataProvider.kt
@@ -1,7 +1,7 @@
package net.mullvad.mullvadvpn.util
import android.content.res.AssetManager
-import android.util.Log
+import co.touchlab.kermit.Logger
import java.io.IOException
private const val CHANGELOG_FILE = "en-US/default.txt"
@@ -12,7 +12,7 @@ class ChangelogDataProvider(private var assets: AssetManager) : IChangelogDataPr
return try {
assets.open(CHANGELOG_FILE).bufferedReader().use { it.readText() }
} catch (ex: IOException) {
- Log.e("mullvad", "Unable to read bundled changelog file.")
+ Logger.e("Unable to read bundled changelog file.")
EMPTY_DEFAULT_STRING_WHEN_UNABLE_TO_READ_CHANGELOG
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
index 3c24cba6d6..1e9a335951 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
@@ -1,8 +1,8 @@
package net.mullvad.mullvadvpn.viewmodel
-import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
+import co.touchlab.kermit.Logger
import java.net.InetAddress
import java.net.UnknownHostException
import kotlinx.coroutines.CoroutineDispatcher
@@ -259,7 +259,7 @@ class VpnSettingsViewModel(
return try {
map { InetAddress.getByName(it) }
} catch (ex: UnknownHostException) {
- Log.e("mullvad", "Error parsing the DNS address list.")
+ Logger.e("Error parsing the DNS address list.")
emptyList()
}
}
diff --git a/android/buildSrc/src/main/kotlin/Dependencies.kt b/android/buildSrc/src/main/kotlin/Dependencies.kt
index 26b1a03753..2b5a2c430a 100644
--- a/android/buildSrc/src/main/kotlin/Dependencies.kt
+++ b/android/buildSrc/src/main/kotlin/Dependencies.kt
@@ -11,6 +11,7 @@ object Dependencies {
"de.mannodermaus.junit5:android-test-extensions:${Versions.Android.junit}"
const val junitAndroidTestRunner =
"de.mannodermaus.junit5:android-test-runner:${Versions.Android.junit}"
+ const val kermit = "co.touchlab:kermit:${Versions.kermit}"
const val konsist = "com.lemonappdev:konsist:${Versions.konsist}"
const val leakCanary = "com.squareup.leakcanary:leakcanary-android:${Versions.leakCanary}"
const val mockkWebserver = "com.squareup.okhttp3:mockwebserver:${Versions.mockWebserver}"
diff --git a/android/buildSrc/src/main/kotlin/Versions.kt b/android/buildSrc/src/main/kotlin/Versions.kt
index 24f9425478..592bfeaef5 100644
--- a/android/buildSrc/src/main/kotlin/Versions.kt
+++ b/android/buildSrc/src/main/kotlin/Versions.kt
@@ -3,6 +3,7 @@ object Versions {
const val jodaTime = "2.12.7"
const val junit = "5.10.2"
const val jvmTarget = "17"
+ const val kermit = "2.0.4"
const val konsist = "0.14.0"
const val kotlin = "1.9.24"
const val kotlinCompilerExtensionVersion = "1.5.14"
diff --git a/android/gradle/verification-metadata.xml b/android/gradle/verification-metadata.xml
index 7a0c2d60cc..e9aad2d9fa 100644
--- a/android/gradle/verification-metadata.xml
+++ b/android/gradle/verification-metadata.xml
@@ -1876,6 +1876,70 @@
<sha256 value="7cb296df197dbd0e31206b88691b7fe1731e1dc6bcf4e0228f432f32d126ff73" origin="Generated by Gradle"/>
</artifact>
</component>
+ <component group="co.touchlab" name="kermit" version="2.0.4">
+ <artifact name="kermit-2.0.4.module">
+ <sha256 value="7372faf3b7eec441e035783945b2df68aed2d81973653c176b2bccbd7509c163" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-metadata-2.0.4.jar">
+ <sha256 value="e1626b72b856c82ee8e7e4fa47da0f4a73e6557a5c288532be409449b5574604" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-android" version="2.0.4">
+ <artifact name="kermit-android-2.0.4.module">
+ <sha256 value="5ff4cd4b242cfc26951bd205f64d7e8db7fd347239fe08472cb50b7e4c22fa35" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-release.aar">
+ <sha256 value="328ff1193b273cd78feda107faa72e9579bad1006c06d89b1229d54c76836389" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-android-debug" version="2.0.4">
+ <artifact name="kermit-android-debug-2.0.4.module">
+ <sha256 value="96d8b24df55f669bdcd4b08220b7be7e475943b34272d06037500cf692085dda" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-debug.aar">
+ <sha256 value="920fe5b89885d008789bf7b2f988b32b0d494d226d17ffbe3d164feed16acb08" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-core" version="2.0.4">
+ <artifact name="kermit-core-2.0.4.module">
+ <sha256 value="0808c6f3f9bbb3a3af22bffd1fe20629db5d2b83cdd3735c16efb7c663a272bf" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-core-metadata-2.0.4.jar">
+ <sha256 value="ca561345823286541331691c25d9439b628303adb9fd3b570c8deda657dc3d58" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-core-android" version="2.0.4">
+ <artifact name="kermit-core-android-2.0.4.module">
+ <sha256 value="6edb8a88b429cfda8da931ad9c76c4a22d31dd92e2613bf63c43ba346ea9c838" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-core-release.aar">
+ <sha256 value="d32048f982256fb27e339ec16581bed0fc65ea6008ff5984b1f9e1dbf948955f" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-core-android-debug" version="2.0.4">
+ <artifact name="kermit-core-android-debug-2.0.4.module">
+ <sha256 value="b9e9f5da2b7878d06f845a1f86816e2510be22a7f745ef37bb7d1819d6a20d98" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-core-debug.aar">
+ <sha256 value="820c6968ecc6aaf95beaab76a06423e6bf662c877689c45fc3b84b1b93742faf" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-core-jvm" version="2.0.4">
+ <artifact name="kermit-core-jvm-2.0.4.jar">
+ <sha256 value="53736211edeeed3cdbc3b96b8b27de7faf50aeb731e1fff92a0e4472505d24ba" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-core-jvm-2.0.4.module">
+ <sha256 value="c58d66eeb916881e49ca1fcf96d5bb16ce8afb562b12e83b055a51a33185ef29" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
+ <component group="co.touchlab" name="kermit-jvm" version="2.0.4">
+ <artifact name="kermit-jvm-2.0.4.jar">
+ <sha256 value="bdde9a1f3d02d205c56c133617d7c99dc5768bc85c7b84e697c87da10715ab77" origin="Generated by Gradle"/>
+ </artifact>
+ <artifact name="kermit-jvm-2.0.4.module">
+ <sha256 value="91f1e67346ed6609d2eda33532d53e9249ca095779c286ce282f3e693fb6a350" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
<component group="co.touchlab" name="stately-concurrency" version="2.0.5">
<artifact name="stately-concurrency-2.0.5.module">
<sha256 value="51c46777cb554277aa9b56f41dd108bd000e2ef9ae38fc4af2d2378254555aef" origin="Generated by Gradle"/>
diff --git a/android/lib/common/src/main/kotlin/net/mullvad/mullvadvpn/lib/common/constant/LogTag.kt b/android/lib/common/src/main/kotlin/net/mullvad/mullvadvpn/lib/common/constant/LogTag.kt
deleted file mode 100644
index d2ae3f1871..0000000000
--- a/android/lib/common/src/main/kotlin/net/mullvad/mullvadvpn/lib/common/constant/LogTag.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package net.mullvad.mullvadvpn.lib.common.constant
-
-const val TAG = "mullvad"
diff --git a/android/lib/daemon-grpc/build.gradle.kts b/android/lib/daemon-grpc/build.gradle.kts
index ff5d75aa16..840de57984 100644
--- a/android/lib/daemon-grpc/build.gradle.kts
+++ b/android/lib/daemon-grpc/build.gradle.kts
@@ -59,6 +59,7 @@ dependencies {
implementation(project(Dependencies.Mullvad.talpidLib))
implementation(Dependencies.jodaTime)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Kotlin.stdlib)
implementation(Dependencies.KotlinX.coroutinesCore)
implementation(Dependencies.KotlinX.coroutinesAndroid)
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
index 10c2406850..d088ffc77a 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
@@ -1,13 +1,13 @@
package net.mullvad.mullvadvpn.lib.daemon.grpc
import android.net.LocalSocketAddress
-import android.util.Log
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensure
import arrow.optics.copy
import arrow.optics.dsl.index
import arrow.optics.typeclasses.Index
+import co.touchlab.kermit.Logger
import com.google.protobuf.BoolValue
import com.google.protobuf.Empty
import com.google.protobuf.StringValue
@@ -38,7 +38,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import mullvad_daemon.management_interface.ManagementInterface
import mullvad_daemon.management_interface.ManagementServiceGrpcKt
-import net.mullvad.mullvadvpn.lib.common.constant.TAG
import net.mullvad.mullvadvpn.lib.daemon.grpc.mapper.fromDomain
import net.mullvad.mullvadvpn.lib.daemon.grpc.mapper.toDomain
import net.mullvad.mullvadvpn.lib.daemon.grpc.util.LogInterceptor
@@ -204,7 +203,7 @@ class ManagementService(
launch {
grpc.eventsListen(Empty.getDefaultInstance()).collect { event ->
if (extensiveLogging) {
- Log.d(TAG, "Event: $event")
+ Logger.v("Event: $event")
}
@Suppress("WHEN_ENUM_CAN_BE_NULL_IN_JAVA")
when (event.eventCase) {
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/LogInterceptor.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/LogInterceptor.kt
index fde87ecdd5..b01b0266b7 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/LogInterceptor.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/LogInterceptor.kt
@@ -1,12 +1,11 @@
package net.mullvad.mullvadvpn.lib.daemon.grpc.util
-import android.util.Log
+import co.touchlab.kermit.Logger
import io.grpc.CallOptions
import io.grpc.Channel
import io.grpc.ClientCall
import io.grpc.ClientInterceptor
import io.grpc.MethodDescriptor
-import net.mullvad.mullvadvpn.lib.common.constant.TAG
internal class LogInterceptor : ClientInterceptor {
override fun <ReqT : Any?, RespT : Any?> interceptCall(
@@ -14,7 +13,7 @@ internal class LogInterceptor : ClientInterceptor {
callOptions: CallOptions?,
next: Channel?
): ClientCall<ReqT, RespT> {
- Log.d(TAG, "Intercepted call: ${method?.fullMethodName}")
+ Logger.v("Intercepted call: ${method?.fullMethodName}")
return next!!.newCall(method, callOptions)
}
}
diff --git a/android/lib/map/build.gradle.kts b/android/lib/map/build.gradle.kts
index 7ca04c16da..f4606de5bd 100644
--- a/android/lib/map/build.gradle.kts
+++ b/android/lib/map/build.gradle.kts
@@ -35,12 +35,10 @@ android {
}
dependencies {
-
- //Model
implementation(project(Dependencies.Mullvad.modelLib))
+ implementation(Dependencies.AndroidX.lifecycleRuntimeKtx)
implementation(Dependencies.Compose.ui)
implementation(Dependencies.Compose.foundation)
-
- implementation(Dependencies.AndroidX.lifecycleRuntimeKtx)
+ implementation(Dependencies.kermit)
}
diff --git a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/GLHelper.kt b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/GLHelper.kt
index e416988d8d..b60dc83c7f 100644
--- a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/GLHelper.kt
+++ b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/internal/GLHelper.kt
@@ -2,8 +2,8 @@ package net.mullvad.mullvadvpn.lib.map.internal
import android.opengl.GLES20
import android.opengl.Matrix
-import android.util.Log
import androidx.compose.ui.graphics.Color
+import co.touchlab.kermit.Logger
import java.nio.Buffer
import java.nio.ByteBuffer
import java.nio.FloatBuffer
@@ -31,7 +31,7 @@ internal fun initShaderProgram(vsSource: String, fsSource: String): Int {
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linked, 0)
if (linked[0] == GLES20.GL_FALSE) {
val infoLog = GLES20.glGetProgramInfoLog(program)
- Log.e("GLHelper", "Could not link program: $infoLog")
+ Logger.e("Could not link program: $infoLog")
GLES20.glDeleteProgram(program)
error("Could not link program with vsSource: $vsSource and fsSource: $fsSource")
}
@@ -54,7 +54,7 @@ private fun loadShader(type: Int, shaderCode: String): Int {
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0)
if (compiled[0] == GLES20.GL_FALSE) {
val infoLog = GLES20.glGetShaderInfoLog(shader)
- Log.e("GLHelper", "Could not compile shader $type:$infoLog")
+ Logger.e("Could not compile shader $type:$infoLog")
GLES20.glDeleteShader(shader)
error("Could not compile shader with shaderCode: $shaderCode")
diff --git a/android/lib/shared/build.gradle.kts b/android/lib/shared/build.gradle.kts
index 88b5cfb3c9..a1bf4a9c75 100644
--- a/android/lib/shared/build.gradle.kts
+++ b/android/lib/shared/build.gradle.kts
@@ -32,6 +32,7 @@ dependencies {
implementation(project(Dependencies.Mullvad.modelLib))
implementation(Dependencies.Arrow.core)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Kotlin.stdlib)
implementation(Dependencies.KotlinX.coroutinesAndroid)
implementation(Dependencies.jodaTime)
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt b/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt
index 1c971e8069..29f91b43f1 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt
+++ b/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt
@@ -1,7 +1,7 @@
package net.mullvad.mullvadvpn.lib.shared
-import android.util.Log
import arrow.core.Either
+import co.touchlab.kermit.Logger
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -36,7 +36,7 @@ class DeviceRepository(
managementService.getDeviceList(accountNumber)
suspend fun updateDevice() {
- Log.d("mullvad", "Update device")
+ Logger.i("Update device")
managementService.updateDevice()
}
}
diff --git a/android/lib/talpid/build.gradle.kts b/android/lib/talpid/build.gradle.kts
index 00409f9482..b8426e3a81 100644
--- a/android/lib/talpid/build.gradle.kts
+++ b/android/lib/talpid/build.gradle.kts
@@ -27,7 +27,8 @@ android {
dependencies {
implementation(project(Dependencies.Mullvad.modelLib))
+ implementation(Dependencies.AndroidX.lifecycleService)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Kotlin.stdlib)
implementation(Dependencies.KotlinX.coroutinesAndroid)
- implementation(Dependencies.AndroidX.lifecycleService)
}
diff --git a/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt b/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
index e89c841d25..2a854f7e5c 100644
--- a/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
+++ b/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
@@ -1,8 +1,8 @@
package net.mullvad.talpid
import android.os.ParcelFileDescriptor
-import android.util.Log
import androidx.annotation.CallSuper
+import co.touchlab.kermit.Logger
import java.net.Inet4Address
import java.net.Inet6Address
import java.net.InetAddress
@@ -106,8 +106,7 @@ open class TalpidVpnService : LifecycleVpnService() {
// since apps then may leak DNS requests.
// https://issuetracker.google.com/issues/337961996
if (invalidDnsServerAddresses.size == config.dnsServers.size) {
- Log.w(
- "mullvad",
+ Logger.w(
"All DNS servers invalid or non set, using fallback DNS server to " +
"minimize leaks, dnsServers.isEmpty(): ${config.dnsServers.isEmpty()}"
)
diff --git a/android/service/build.gradle.kts b/android/service/build.gradle.kts
index 2dcedca5d8..0927cde58b 100644
--- a/android/service/build.gradle.kts
+++ b/android/service/build.gradle.kts
@@ -60,6 +60,7 @@ dependencies {
implementation(Dependencies.AndroidX.coreKtx)
implementation(Dependencies.AndroidX.lifecycleService)
implementation(Dependencies.Arrow.core)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Koin.android)
implementation(Dependencies.Koin.core)
implementation(Dependencies.Kotlin.stdlib)
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
index 8d806500c8..23451a9459 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
@@ -6,10 +6,10 @@ import android.content.Intent
import android.os.Binder
import android.os.Build
import android.os.IBinder
-import android.util.Log
import androidx.core.content.getSystemService
import androidx.lifecycle.lifecycleScope
import arrow.atomic.AtomicInt
+import co.touchlab.kermit.Logger
import java.io.File
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
@@ -23,7 +23,6 @@ import net.mullvad.mullvadvpn.lib.common.constant.BuildTypes
import net.mullvad.mullvadvpn.lib.common.constant.GRPC_SOCKET_FILE_NAMED_ARGUMENT
import net.mullvad.mullvadvpn.lib.common.constant.KEY_CONNECT_ACTION
import net.mullvad.mullvadvpn.lib.common.constant.KEY_DISCONNECT_ACTION
-import net.mullvad.mullvadvpn.lib.common.constant.TAG
import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService
import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration
import net.mullvad.mullvadvpn.lib.endpoint.getApiEndpointConfigurationExtras
@@ -65,7 +64,7 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
override fun onCreate() {
super.onCreate()
- Log.d(TAG, "MullvadVpnService: onCreate")
+ Logger.i("MullvadVpnService: onCreate")
loadKoinModules(listOf(vpnServiceModule, apiEndpointModule))
with(getKoin()) {
@@ -102,8 +101,7 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- Log.d(
- TAG,
+ Logger.i(
"onStartCommand (intent=$intent, action=${intent?.action}, flags=$flags, startId=$startId)"
)
@@ -113,7 +111,7 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
// where the service would potentially otherwise be too slow running `startForeground`.
when {
keyguardManager.isKeyguardLocked -> {
- Log.d(TAG, "Keyguard is locked, ignoring command")
+ Logger.i("Keyguard is locked, ignoring command")
}
intent.isFromSystem() || intent?.action == KEY_CONNECT_ACTION -> {
// Only show on foreground if we have permission
@@ -132,10 +130,10 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
override fun onBind(intent: Intent?): IBinder {
bindCount.incrementAndGet()
- Log.d(TAG, "onBind: $intent")
+ Logger.i("onBind: $intent")
if (intent.isFromSystem()) {
- Log.d(TAG, "onBind from system")
+ Logger.i("onBind from system")
_shouldBeOnForeground.update { true }
}
@@ -179,14 +177,14 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
// Foreground?
if (intent.isFromSystem()) {
- Log.d(TAG, "onUnbind from system")
+ Logger.i("onUnbind from system")
_shouldBeOnForeground.update { false }
}
if (count == 0) {
- Log.d(TAG, "No one bound to the service, stopSelf()")
+ Logger.i("No one bound to the service, stopSelf()")
lifecycleScope.launch {
- Log.d(TAG, "Waiting for disconnected state")
+ Logger.i("Waiting for disconnected state")
// TODO This needs reworking, we should not wait for the disconnected state, what we
// want is the notification of disconnected to go out before we start shutting down
connectionProxy.tunnelState
@@ -197,7 +195,7 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
.first()
if (bindCount.get() == 0) {
- Log.d(TAG, "Stopping service")
+ Logger.i("Stopping service")
stopSelf()
}
}
@@ -206,7 +204,7 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider {
}
override fun onDestroy() {
- Log.d(TAG, "MullvadVpnService: onDestroy")
+ Logger.i("MullvadVpnService: onDestroy")
managementService.stop()
// Shutting down the daemon gracefully
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/ForegroundNotificationManager.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/ForegroundNotificationManager.kt
index d65cb7255c..613c6cdbef 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/ForegroundNotificationManager.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/ForegroundNotificationManager.kt
@@ -4,10 +4,9 @@ import android.app.Service
import android.content.pm.ServiceInfo
import android.net.VpnService
import android.os.Build
-import android.util.Log
+import co.touchlab.kermit.Logger
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
-import net.mullvad.mullvadvpn.lib.common.constant.TAG
import net.mullvad.mullvadvpn.lib.model.Notification
import net.mullvad.mullvadvpn.lib.model.NotificationChannel
import net.mullvad.mullvadvpn.lib.model.NotificationTunnelState
@@ -25,10 +24,10 @@ class ForegroundNotificationManager(
scope.launch {
foregroundProvider.shouldBeOnForeground.collect {
if (it) {
- Log.d(TAG, "Starting foreground")
+ Logger.i("Starting foreground")
notifyForeground(getTunnelStateNotificationOrDefault())
} else {
- Log.d(TAG, "Stopping foreground")
+ Logger.i("Stopping foreground")
vpnService.stopForeground(Service.STOP_FOREGROUND_DETACH)
}
}
@@ -51,12 +50,12 @@ class ForegroundNotificationManager(
if (VpnService.prepare(vpnService) != null) {
// Got connect/disconnect intent, but we don't have permission to go in foreground.
// tunnel state will return permission and we will eventually get stopped by system.
- Log.d(TAG, "Did not start foreground: VPN permission not granted")
+ Logger.i("Did not start foreground: VPN permission not granted")
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
- Log.d(TAG, "Starting foreground UPSIDE_DOWN_CAKE")
+ Logger.i("Starting foreground UPSIDE_DOWN_CAKE")
vpnService.startForeground(
tunnelStateNotificationProvider.notificationId.value,
androidNotification,
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/LogTest.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/LogTest.kt
new file mode 100644
index 0000000000..1c46c322df
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/LogTest.kt
@@ -0,0 +1,24 @@
+package net.mullvad.mullvadvpn.test.arch
+
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.verify.assertFalse
+import java.util.stream.Stream
+import org.junit.jupiter.api.DynamicTest
+import org.junit.jupiter.api.TestFactory
+
+class LogTest {
+ @TestFactory
+ fun `ensure no usage of disallowed loggers`(): Stream<DynamicTest> =
+ DISALLOWED_LOGGER_PACKAGE_NAMES.stream().map { disallowedLoggerPackageName ->
+ val testName = "ensure no usage of: $disallowedLoggerPackageName"
+ DynamicTest.dynamicTest(testName) {
+ Konsist.scopeFromProject().imports.assertFalse { import ->
+ import.name == disallowedLoggerPackageName
+ }
+ }
+ }
+
+ companion object {
+ private val DISALLOWED_LOGGER_PACKAGE_NAMES = listOf("android.util.Log")
+ }
+}
diff --git a/android/test/common/build.gradle.kts b/android/test/common/build.gradle.kts
index df9dea41ab..84a7a46c9c 100644
--- a/android/test/common/build.gradle.kts
+++ b/android/test/common/build.gradle.kts
@@ -48,6 +48,7 @@ dependencies {
implementation(Dependencies.AndroidX.testRules)
implementation(Dependencies.AndroidX.testUiAutomator)
implementation(Dependencies.junitEngine)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Kotlin.stdlib)
androidTestUtil(Dependencies.AndroidX.testOrchestrator)
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt
index 9138982a43..2018714e09 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt
@@ -7,9 +7,9 @@ import android.os.Build
import android.os.Environment
import android.os.Environment.DIRECTORY_PICTURES
import android.provider.MediaStore
-import android.util.Log
import androidx.annotation.RequiresApi
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import co.touchlab.kermit.Logger
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
@@ -22,7 +22,7 @@ import org.junit.jupiter.api.extension.TestWatcher
class CaptureScreenshotOnFailedTestRule(private val testTag: String) : TestWatcher {
override fun testFailed(context: ExtensionContext, cause: Throwable) {
- Log.d(testTag, "Capturing screenshot of failed test: " + context.requiredTestMethod.name)
+ Logger.d("Capturing screenshot of failed test: " + context.requiredTestMethod.name)
val timestamp = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)
val screenshotName = "$timestamp-${context.requiredTestMethod.name}.jpeg"
captureScreenshot(testTag, screenshotName)
@@ -71,12 +71,12 @@ class CaptureScreenshotOnFailedTestRule(private val testTag: String) : TestWatch
try {
this.compress(Bitmap.CompressFormat.JPEG, 50, it!!)
} catch (e: IOException) {
- Log.e(testTag, "Unable to store screenshot: ${e.message}")
+ Logger.e("Unable to store screenshot: ${e.message}")
}
}
contentResolver.update(uri, contentValues, null, null)
} else {
- Log.e(testTag, "Unable to store screenshot")
+ Logger.e("Unable to store screenshot")
}
}
@@ -101,7 +101,7 @@ class CaptureScreenshotOnFailedTestRule(private val testTag: String) : TestWatch
try {
this.compress(Bitmap.CompressFormat.JPEG, 50, outputStream)
} catch (e: IOException) {
- Log.e(testTag, "Unable to store screenshot: ${e.message}")
+ Logger.e("Unable to store screenshot: ${e.message}")
}
}
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
diff --git a/android/test/e2e/build.gradle.kts b/android/test/e2e/build.gradle.kts
index ce80697240..f7afe1b3af 100644
--- a/android/test/e2e/build.gradle.kts
+++ b/android/test/e2e/build.gradle.kts
@@ -134,6 +134,7 @@ dependencies {
implementation(Dependencies.AndroidX.testRules)
implementation(Dependencies.AndroidX.testUiAutomator)
implementation(Dependencies.androidVolley)
+ implementation(Dependencies.kermit)
implementation(Dependencies.junitAndroidTestExtensions)
implementation(Dependencies.junitApi)
implementation(Dependencies.junitAndroidTestCore)
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt
index f4979258f2..160ef52468 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt
@@ -5,6 +5,7 @@ import android.content.Context
import android.os.Build
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
+import co.touchlab.kermit.Logger
import de.mannodermaus.junit5.extensions.GrantPermissionExtension
import net.mullvad.mullvadvpn.test.common.interactor.AppInteractor
import net.mullvad.mullvadvpn.test.common.rule.CaptureScreenshotOnFailedTestRule
@@ -34,6 +35,8 @@ abstract class EndToEndTest(private val infra: String) {
@BeforeEach
fun setup() {
+ Logger.setTag(LOG_TAG)
+
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
targetContext = InstrumentationRegistry.getInstrumentation().targetContext
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt
index f79f78e03b..6bacf15a3a 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt
@@ -1,8 +1,7 @@
package net.mullvad.mullvadvpn.test.e2e.misc
-import android.util.Log
import androidx.test.platform.app.InstrumentationRegistry
-import net.mullvad.mullvadvpn.test.e2e.constant.LOG_TAG
+import co.touchlab.kermit.Logger
import net.mullvad.mullvadvpn.test.e2e.constant.VALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY
import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument
import net.mullvad.mullvadvpn.test.e2e.interactor.MullvadAccountInteractor
@@ -12,7 +11,7 @@ import org.junit.jupiter.api.extension.ExtensionContext
class CleanupAccountTestRule : BeforeEachCallback {
override fun beforeEach(context: ExtensionContext) {
- Log.d(LOG_TAG, "Cleaning up account before test: ${context.requiredTestMethod.name}")
+ Logger.d("Cleaning up account before test: ${context.requiredTestMethod.name}")
val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
val validTestAccountNumber =
InstrumentationRegistry.getArguments()
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt
index 78f5e967e0..a72f27a3ef 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt
@@ -1,8 +1,8 @@
package net.mullvad.mullvadvpn.test.e2e.misc
import android.content.Context
-import android.util.Log
import androidx.test.services.events.TestEventException
+import co.touchlab.kermit.Logger
import com.android.volley.Request
import com.android.volley.toolbox.JsonArrayRequest
import com.android.volley.toolbox.JsonObjectRequest
@@ -13,7 +13,6 @@ import net.mullvad.mullvadvpn.test.e2e.constant.ACCOUNT_URL
import net.mullvad.mullvadvpn.test.e2e.constant.AUTH_URL
import net.mullvad.mullvadvpn.test.e2e.constant.CONN_CHECK_URL
import net.mullvad.mullvadvpn.test.e2e.constant.DEVICE_LIST_URL
-import net.mullvad.mullvadvpn.test.e2e.constant.LOG_TAG
import net.mullvad.mullvadvpn.test.e2e.constant.PARTNER_ACCOUNT_URL
import org.json.JSONArray
import org.json.JSONObject
@@ -23,19 +22,19 @@ class SimpleMullvadHttpClient(context: Context) {
private val queue = Volley.newRequestQueue(context)
fun removeAllDevices(accountNumber: String) {
- Log.v(LOG_TAG, "Remove all devices")
+ Logger.v("Remove all devices")
val token = login(accountNumber)
val devices = getDeviceList(token)
devices.forEach { removeDevice(token, it) }
- Log.v(LOG_TAG, "All devices removed")
+ Logger.v("All devices removed")
}
fun login(accountNumber: String): String {
- Log.v(LOG_TAG, "Attempt login with account token: $accountNumber")
+ Logger.v("Attempt login with account token: $accountNumber")
val json = JSONObject().apply { put("account_number", accountNumber) }
return sendSimpleSynchronousRequest(Request.Method.POST, AUTH_URL, json)!!.let { response ->
response.getString("access_token").also { accessToken ->
- Log.v(LOG_TAG, "Successfully logged in and received access token: $accessToken")
+ Logger.v("Successfully logged in and received access token: $accessToken")
}
}
}
@@ -59,7 +58,7 @@ class SimpleMullvadHttpClient(context: Context) {
}
fun getDeviceList(accessToken: String): List<String> {
- Log.v(LOG_TAG, "Get devices")
+ Logger.v("Get devices")
val response =
sendSimpleSynchronousRequestArray(
@@ -74,14 +73,14 @@ class SimpleMullvadHttpClient(context: Context) {
.toList()
.also {
it.map { jsonObject -> jsonObject.getString("name") }
- .also { deviceNames -> Log.v(LOG_TAG, "Devices received: $deviceNames") }
+ .also { deviceNames -> Logger.v("Devices received: $deviceNames") }
}
.map { it.getString("id") }
.toList()
}
fun removeDevice(token: String, deviceId: String) {
- Log.v(LOG_TAG, "Remove device: $deviceId")
+ Logger.v("Remove device: $deviceId")
sendSimpleSynchronousRequestString(
method = Request.Method.DELETE,
url = "$DEVICE_LIST_URL/$deviceId",
@@ -122,11 +121,9 @@ class SimpleMullvadHttpClient(context: Context) {
}
queue.add(request)
return try {
- future.get().also { response ->
- Log.v(LOG_TAG, "Json object request response: $response")
- }
+ future.get().also { response -> Logger.v("Json object request response: $response") }
} catch (e: Exception) {
- Log.v(LOG_TAG, "Json object request error: ${e.message}")
+ Logger.v("Json object request error: ${e.message}")
throw TestEventException(REQUEST_ERROR_MESSAGE)
}
}
@@ -153,9 +150,9 @@ class SimpleMullvadHttpClient(context: Context) {
}
queue.add(request)
return try {
- future.get().also { response -> Log.v(LOG_TAG, "String request response: $response") }
+ future.get().also { response -> Logger.v("String request response: $response") }
} catch (e: Exception) {
- Log.v(LOG_TAG, "String request error: ${e.message}")
+ Logger.v("String request error: ${e.message}")
throw TestEventException(REQUEST_ERROR_MESSAGE)
}
}
@@ -180,11 +177,9 @@ class SimpleMullvadHttpClient(context: Context) {
}
queue.add(request)
return try {
- future.get().also { response ->
- Log.v(LOG_TAG, "Json array request response: $response")
- }
+ future.get().also { response -> Logger.v("Json array request response: $response") }
} catch (e: Exception) {
- Log.v(LOG_TAG, "Json array request error: ${e.message}")
+ Logger.v("Json array request error: ${e.message}")
throw TestEventException(REQUEST_ERROR_MESSAGE)
}
}
diff --git a/android/test/mockapi/build.gradle.kts b/android/test/mockapi/build.gradle.kts
index 10fd4ca99d..69991d24bb 100644
--- a/android/test/mockapi/build.gradle.kts
+++ b/android/test/mockapi/build.gradle.kts
@@ -78,6 +78,7 @@ dependencies {
implementation(Dependencies.AndroidX.testRunner)
implementation(Dependencies.AndroidX.testRules)
implementation(Dependencies.AndroidX.testUiAutomator)
+ implementation(Dependencies.kermit)
implementation(Dependencies.jodaTime)
implementation(Dependencies.junitAndroidTestExtensions)
implementation(Dependencies.junitApi)
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/Extensions.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/Extensions.kt
index 7eb096b499..356cacb97e 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/Extensions.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/Extensions.kt
@@ -1,7 +1,6 @@
package net.mullvad.mullvadvpn.test.mockapi
-import android.util.Log
-import net.mullvad.mullvadvpn.test.mockapi.constant.LOG_TAG
+import co.touchlab.kermit.Logger
import okhttp3.mockwebserver.MockResponse
import okio.Buffer
import org.json.JSONException
@@ -15,7 +14,7 @@ fun Buffer.getAccountNumber(): String? {
return try {
JSONObject(readUtf8()).getString("account_number")
} catch (ex: JSONException) {
- Log.e(LOG_TAG, "Unable to parse account number")
+ Logger.e("Unable to parse account number")
ex.printStackTrace()
null
}
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt
index abb4813a33..3539bad0fa 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt
@@ -1,13 +1,12 @@
package net.mullvad.mullvadvpn.test.mockapi
-import android.util.Log
+import co.touchlab.kermit.Logger
import net.mullvad.mullvadvpn.test.mockapi.constant.ACCOUNT_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.AUTH_TOKEN_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.CREATE_ACCOUNT_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.DEVICES_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ACCESS_TOKEN
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ID_1
-import net.mullvad.mullvadvpn.test.mockapi.constant.LOG_TAG
import net.mullvad.mullvadvpn.test.mockapi.util.accessTokenJsonResponse
import net.mullvad.mullvadvpn.test.mockapi.util.accountCreationJson
import net.mullvad.mullvadvpn.test.mockapi.util.accountInfoJson
@@ -34,7 +33,7 @@ class MockApiDispatcher : Dispatcher() {
private var cachedPubKeyFromAppUnderTest: String? = null
override fun dispatch(request: RecordedRequest): MockResponse {
- Log.d(LOG_TAG, "Request: $request (body=${request.body.peek().readUtf8()})")
+ Logger.d("Request: $request (body=${request.body.peek().readUtf8()})")
return when (request.path ?: "") {
AUTH_TOKEN_URL_PATH -> handleLoginRequest(request.body)
DEVICES_URL_PATH -> {
@@ -70,7 +69,7 @@ class MockApiDispatcher : Dispatcher() {
}
}
}.also { response ->
- Log.d(LOG_TAG, "Response: $response (body=${response.getBody()?.peek()?.readUtf8()})")
+ Logger.d("Response: $response (body=${response.getBody()?.peek()?.readUtf8()})")
}
}
@@ -89,8 +88,7 @@ class MockApiDispatcher : Dispatcher() {
.toString()
)
} else {
- Log.e(
- LOG_TAG,
+ Logger.e(
"Unexpected account number (expected=$expectedAccountNumber was=$accountNumber)"
)
MockResponse().setResponseCode(400)
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt
index 02e53a09d9..74a47f3c3d 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt
@@ -3,9 +3,9 @@ package net.mullvad.mullvadvpn.test.mockapi
import android.Manifest.permission.READ_EXTERNAL_STORAGE
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
import android.content.Context
-import android.util.Log
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
+import co.touchlab.kermit.Logger
import de.mannodermaus.junit5.extensions.GrantPermissionExtension
import java.net.InetAddress
import net.mullvad.mullvadvpn.lib.endpoint.CustomApiEndpointConfiguration
@@ -37,13 +37,15 @@ abstract class MockApiTest {
@BeforeEach
open fun setup() {
+ Logger.setTag(LOG_TAG)
+
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
targetContext = InstrumentationRegistry.getInstrumentation().targetContext
app = AppInteractor(device, targetContext, PACKAGE_NAME)
mockWebServer.start()
- Log.d(LOG_TAG, "Mocked web server started using port: ${mockWebServer.port}")
+ Logger.d("Mocked web server started using port: ${mockWebServer.port}")
endpoint = createEndpoint(mockWebServer.port)
}
diff --git a/android/tile/build.gradle.kts b/android/tile/build.gradle.kts
index 0b2aab45f5..ecd1884e2d 100644
--- a/android/tile/build.gradle.kts
+++ b/android/tile/build.gradle.kts
@@ -36,6 +36,7 @@ dependencies {
implementation(Dependencies.Koin.android)
implementation(Dependencies.AndroidX.appcompat)
+ implementation(Dependencies.kermit)
implementation(Dependencies.Kotlin.stdlib)
implementation(Dependencies.KotlinX.coroutinesAndroid)
}
diff --git a/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt b/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt
index f796690f18..aef6f3505e 100644
--- a/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt
+++ b/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt
@@ -8,7 +8,7 @@ import android.net.VpnService
import android.os.Build
import android.service.quicksettings.Tile
import android.service.quicksettings.TileService
-import android.util.Log
+import co.touchlab.kermit.Logger
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.Job
import kotlinx.coroutines.MainScope
@@ -23,7 +23,6 @@ import kotlinx.coroutines.withTimeoutOrNull
import net.mullvad.mullvadvpn.lib.common.constant.KEY_CONNECT_ACTION
import net.mullvad.mullvadvpn.lib.common.constant.KEY_DISCONNECT_ACTION
import net.mullvad.mullvadvpn.lib.common.constant.MAIN_ACTIVITY_CLASS
-import net.mullvad.mullvadvpn.lib.common.constant.TAG
import net.mullvad.mullvadvpn.lib.common.constant.VPN_SERVICE_CLASS
import net.mullvad.mullvadvpn.lib.common.util.SdkUtils
import net.mullvad.mullvadvpn.lib.common.util.SdkUtils.setSubtitleIfSupported
@@ -73,7 +72,7 @@ class MullvadTileService : TileService() {
if (isUnlockStatusPropagated) {
toggleTunnel()
} else {
- Log.e("mullvad", "Unable to toggle tunnel state")
+ Logger.e("Unable to toggle tunnel state")
}
}
}
@@ -92,7 +91,7 @@ class MullvadTileService : TileService() {
val isSetup = VpnService.prepare(applicationContext) == null
// TODO This logic should be more advanced, we should ensure user has an account setup etc.
if (!isSetup) {
- Log.d(TAG, "TileService: VPN service not setup, starting main activity")
+ Logger.i("TileService: VPN service not setup, starting main activity")
val intent =
Intent().apply {
@@ -106,7 +105,7 @@ class MullvadTileService : TileService() {
startActivityAndCollapseCompat(intent)
return
} else {
- Log.d(TAG, "TileService: VPN service is setup")
+ Logger.i("TileService: VPN service is setup")
}
val intent =
Intent().apply {