diff --git a/android/app/src/main/java/updated/mysterium/vpn/ui/provider/ProviderViewModel.kt b/android/app/src/main/java/updated/mysterium/vpn/ui/provider/ProviderViewModel.kt index df070d5c..2b99ba7b 100644 --- a/android/app/src/main/java/updated/mysterium/vpn/ui/provider/ProviderViewModel.kt +++ b/android/app/src/main/java/updated/mysterium/vpn/ui/provider/ProviderViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.* +import updated.mysterium.vpn.core.DeferredNode import updated.mysterium.vpn.core.MysteriumCoreService import updated.mysterium.vpn.model.manual.connect.ProviderState import updated.mysterium.vpn.model.notification.NotificationChannels @@ -37,6 +38,7 @@ class ProviderViewModel(useCaseProvider: UseCaseProvider) : ViewModel() { private var coreService: MysteriumCoreService? = null private val connectionUseCase = useCaseProvider.connection() private lateinit var appNotificationManager: AppNotificationManager + private var deferredNode = DeferredNode() val handler = CoroutineExceptionHandler { _, exception -> Log.i(TAG, exception.localizedMessage ?: exception.toString()) @@ -50,6 +52,9 @@ class ProviderViewModel(useCaseProvider: UseCaseProvider) : ViewModel() { appNotificationManager = notificationManager coreService = deferredMysteriumCoreService.await() + // Restart a node in case of app crash (on activity restore), thus regaining control of the node + startDeferredNode() + val initialState = ProviderState( active = getIsProvider(), ) @@ -94,7 +99,22 @@ class ProviderViewModel(useCaseProvider: UseCaseProvider) : ViewModel() { } } - private suspend fun getIsProvider(): Boolean { + private suspend fun startDeferredNode() { + if (deferredNode.startedOrStarting()) { + coreService?.getDeferredNode()?.let { + deferredNode = it + } + } else { + coreService?.let { + deferredNode.start(it) + } + } + + connectionUseCase.initDeferredNode(deferredNode) + connectionUseCase.getIdentity() + } + + private fun getIsProvider(): Boolean { coreService?.let { return it.isProviderActive() }