summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-08-01 13:51:18 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-08-01 13:52:30 +0200
commit8351f4459e4c94253e308611564f7b0063e6b446 (patch)
tree206606f1fd9bd7861a39f557117facc921aefbde /android
parentf4ca8a3c591748b1d49f82b1276617dfcfc31dca (diff)
downloadmullvadvpn-8351f4459e4c94253e308611564f7b0063e6b446.tar.xz
mullvadvpn-8351f4459e4c94253e308611564f7b0063e6b446.zip
Fix splash screen freeze
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt19
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt5
3 files changed, 25 insertions, 1 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt
index 9827c45a92..ac54689c35 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt
@@ -9,6 +9,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTagsAsResourceId
import androidx.navigation.NavHostController
+import co.touchlab.kermit.Logger
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.generated.NavGraphs
import com.ramcosta.composedestinations.generated.destinations.ChangelogDestination
@@ -56,6 +57,7 @@ fun MullvadApp() {
// Globally handle daemon dropped connection with NoDaemonScreen
LaunchedEffectCollect(serviceVm.uiSideEffect) {
+ Logger.i { "DaemonScreenEvent: $it" }
when (it) {
DaemonScreenEvent.Show ->
navigator.navigate(NoDaemonDestination) { launchSingleTop = true }
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
index d4bcf3776a..a4ae131139 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
@@ -10,11 +10,15 @@ import androidx.core.view.WindowCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.compose.screen.MullvadApp
import net.mullvad.mullvadvpn.di.paymentModule
import net.mullvad.mullvadvpn.di.uiModule
import net.mullvad.mullvadvpn.lib.common.util.SdkUtils.requestNotificationPermissionIfMissing
+import net.mullvad.mullvadvpn.lib.daemon.grpc.GrpcConnectivityState
+import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService
import net.mullvad.mullvadvpn.lib.intent.IntentProvider
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.repository.PrivacyDisclaimerRepository
@@ -40,6 +44,7 @@ class MainActivity : ComponentActivity(), AndroidScopeComponent {
private val privacyDisclaimerRepository by inject<PrivacyDisclaimerRepository>()
private val serviceConnectionManager by inject<ServiceConnectionManager>()
private val splashCompleteRepository by inject<SplashCompleteRepository>()
+ private val managementService by inject<ManagementService>()
private var isReadyNextDraw: Boolean = false
@@ -79,6 +84,20 @@ class MainActivity : ComponentActivity(), AndroidScopeComponent {
}
}
+ override fun onRestoreInstanceState(savedInstanceState: Bundle) {
+ super.onRestoreInstanceState(savedInstanceState)
+ lifecycleScope.launch {
+ if (privacyDisclaimerRepository.hasAcceptedPrivacyDisclosure()) {
+ // If service is to be started wait for it to be connected before dismissing Splash
+ // screen
+ managementService.connectionState
+ .filter { it is GrpcConnectivityState.Ready }
+ .first()
+ }
+ splashCompleteRepository.onSplashCompleted()
+ }
+ }
+
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
intentProvider.setStartIntent(intent)
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 191b791421..8b67ef4628 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
@@ -32,6 +32,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
+import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
@@ -147,9 +148,10 @@ class ManagementService(
channel
.connectivityFlow()
.map(ConnectivityState::toDomain)
+ .onEach { Logger.i("ManagementService connection state: $it") }
.stateIn(scope, SharingStarted.Eagerly, channel.getState(false).toDomain())
- private val grpc =
+ private val grpc by lazy {
ManagementServiceGrpcKt.ManagementServiceCoroutineStub(channel)
.withExecutor(Dispatchers.IO.asExecutor())
.let {
@@ -158,6 +160,7 @@ class ManagementService(
} else it
}
.withWaitForReady()
+ }
private val _mutableDeviceState = MutableStateFlow<ModelDeviceState?>(null)
val deviceState: Flow<ModelDeviceState> = _mutableDeviceState.filterNotNull()