diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-08-01 13:51:18 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-08-01 13:52:30 +0200 |
| commit | 8351f4459e4c94253e308611564f7b0063e6b446 (patch) | |
| tree | 206606f1fd9bd7861a39f557117facc921aefbde /android | |
| parent | f4ca8a3c591748b1d49f82b1276617dfcfc31dca (diff) | |
| download | mullvadvpn-8351f4459e4c94253e308611564f7b0063e6b446.tar.xz mullvadvpn-8351f4459e4c94253e308611564f7b0063e6b446.zip | |
Fix splash screen freeze
Diffstat (limited to 'android')
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() |
