diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-08-01 14:53:49 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-08-01 14:53:49 +0200 |
| commit | 2b59f823d60de3063fa6b1c3da206d198f6218d0 (patch) | |
| tree | bede4b9844640abf33ebb90f6605711e6c0d4672 | |
| parent | f4ca8a3c591748b1d49f82b1276617dfcfc31dca (diff) | |
| parent | fdf53e92000cca6b49ae4c17f3e98397e6dca1a3 (diff) | |
| download | mullvadvpn-2b59f823d60de3063fa6b1c3da206d198f6218d0.tar.xz mullvadvpn-2b59f823d60de3063fa6b1c3da206d198f6218d0.zip | |
Merge branch 'blanksplash-screen-on-open-app-droid-1220'
4 files changed, 26 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() 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 23451a9459..3a3bb4b87a 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 @@ -159,6 +159,7 @@ class MullvadVpnService : TalpidVpnService(), ShouldBeOnForegroundProvider { cacheDirectory = cacheDir.absolutePath, apiEndpoint = apiEndpointConfiguration.apiEndpoint() ) + Logger.i("MullvadVpnService: Daemon initialized") } private fun emptyBinder() = |
