Skip to content

Commit

Permalink
App state check for disconnected resolution (#1730)
Browse files Browse the repository at this point in the history
* App state check for disconnected resolution

* Changelogs update

---------

Co-authored-by: Milan Cerovsky <[email protected]>
  • Loading branch information
HonzaR and Milan-Cerovsky authored Jan 14, 2025
1 parent 9b88b56 commit db983c6
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this application adheres to [Semantic Versioning](https://semver.org/spec/v2

## [Unreleased]

### Fixed
- The Disconnected popup trigger when the app is backgrounded has been fixed

## [1.3.2 (829)] - 2025-01-10

### Changed
Expand Down
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ dependencies {
implementation(libs.kotlin.stdlib)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.androidx.lifecycle.process)
implementation(libs.zcash.sdk) // just to configure logging
implementation(projects.crashAndroidLib)
implementation(projects.preferenceApiLib)
Expand Down
12 changes: 11 additions & 1 deletion app/src/main/java/co/electriccoin/zcash/app/ZcashApplication.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package co.electriccoin.zcash.app

import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.ProcessLifecycleOwner
import co.electriccoin.zcash.crash.android.GlobalCrashReporter
import co.electriccoin.zcash.di.coreModule
import co.electriccoin.zcash.di.dataSourceModule
Expand All @@ -10,6 +12,7 @@ import co.electriccoin.zcash.di.viewModelModule
import co.electriccoin.zcash.preference.StandardPreferenceProvider
import co.electriccoin.zcash.spackle.StrictModeCompat
import co.electriccoin.zcash.spackle.Twig
import co.electriccoin.zcash.ui.common.provider.ApplicationStateProvider
import co.electriccoin.zcash.ui.common.repository.FlexaRepository
import co.electriccoin.zcash.ui.preference.StandardPreferenceKeys
import kotlinx.coroutines.launch
Expand All @@ -18,10 +21,10 @@ import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin

@Suppress("unused")
class ZcashApplication : CoroutineApplication() {
private val standardPreferenceProvider by inject<StandardPreferenceProvider>()
private val flexaRepository by inject<FlexaRepository>()
private val applicationStateProvider: ApplicationStateProvider by inject()

override fun onCreate() {
super.onCreate()
Expand All @@ -43,6 +46,13 @@ class ZcashApplication : CoroutineApplication() {
)
}

// Observe the application process lifecycle
ProcessLifecycleOwner.get().lifecycle.addObserver(
LifecycleEventObserver { _, event ->
applicationStateProvider.setApplicationState(event)
}
)

// Since analytics will need disk IO internally, we want this to be registered after strict
// mode is configured to ensure none of that IO happens on the main thread
configureAnalytics()
Expand Down
3 changes: 3 additions & 0 deletions docs/whatsNew/WHATS_NEW_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ directly impact users rather than highlighting other key architectural updates.*

## [Unreleased]

### Fixed
- The Disconnected popup trigger when the app is backgrounded has been fixed

## [1.3.2 (829)] - 2025-01-10

### Changed
Expand Down
3 changes: 3 additions & 0 deletions docs/whatsNew/WHATS_NEW_ES.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ directly impact users rather than highlighting other key architectural updates.*

## [Unreleased]

### Fixed
- The Disconnected popup trigger when the app is backgrounded has been fixed

## [1.3.2 (829)] - 2025-01-10

### Cambiado
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ dependencyResolutionManagement {
library("androidx-fragment-compose", "androidx.fragment:fragment-compose:$androidxFragmentVersion")
library("androidx-lifecycle-livedata", "androidx.lifecycle:lifecycle-livedata-ktx:$androidxLifecycleVersion")
library("androidx-lifecycle-compose", "androidx.lifecycle:lifecycle-runtime-compose:$androidxLifecycleVersion")
library("androidx-lifecycle-process", "androidx.lifecycle:lifecycle-process:$androidxLifecycleVersion")
library("androidx-navigation-compose", "androidx.navigation:navigation-compose:$androidxNavigationComposeVersion")
library("androidx-profileinstaller", "androidx.profileinstaller:profileinstaller:$androidxProfileInstallerVersion")
library("androidx-security-crypto", "androidx.security:security-crypto-ktx:$androidxSecurityCryptoVersion")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import co.electriccoin.zcash.ui.common.provider.AddressBookProvider
import co.electriccoin.zcash.ui.common.provider.AddressBookProviderImpl
import co.electriccoin.zcash.ui.common.provider.AddressBookStorageProvider
import co.electriccoin.zcash.ui.common.provider.AddressBookStorageProviderImpl
import co.electriccoin.zcash.ui.common.provider.ApplicationStateProvider
import co.electriccoin.zcash.ui.common.provider.ApplicationStateProviderImpl
import co.electriccoin.zcash.ui.common.provider.GetDefaultServersProvider
import co.electriccoin.zcash.ui.common.provider.GetMonetarySeparatorProvider
import co.electriccoin.zcash.ui.common.provider.GetVersionInfoProvider
Expand Down Expand Up @@ -33,4 +35,5 @@ val providerModule =
factoryOf(::SelectedAccountUUIDProviderImpl) bind SelectedAccountUUIDProvider::class
singleOf(::PersistableWalletProviderImpl) bind PersistableWalletProvider::class
singleOf(::SynchronizerProviderImpl) bind SynchronizerProvider::class
singleOf(::ApplicationStateProviderImpl) bind ApplicationStateProvider::class
}
13 changes: 13 additions & 0 deletions ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ import co.electriccoin.zcash.ui.NavigationTargets.SUPPORT
import co.electriccoin.zcash.ui.NavigationTargets.WHATS_NEW
import co.electriccoin.zcash.ui.common.compose.LocalNavController
import co.electriccoin.zcash.ui.common.model.SerializableAddress
import co.electriccoin.zcash.ui.common.provider.ApplicationStateProvider
import co.electriccoin.zcash.ui.common.provider.isInForeground
import co.electriccoin.zcash.ui.configuration.ConfigurationEntries
import co.electriccoin.zcash.ui.configuration.RemoteConfig
import co.electriccoin.zcash.ui.design.animation.ScreenAnimation.enterTransition
Expand Down Expand Up @@ -102,6 +104,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
import org.koin.android.ext.android.inject
import org.koin.compose.koinInject

// TODO [#1297]: Consider: Navigation passing complex data arguments different way
Expand Down Expand Up @@ -409,6 +412,8 @@ private fun MainActivity.NavigationHome(
navController: NavHostController,
backStack: NavBackStackEntry
) {
val applicationStateProvider: ApplicationStateProvider by inject()

WrapHome(
goScan = { navController.navigateJustOnce(ScanNavigationArgs(ScanNavigationArgs.DEFAULT)) },
sendArguments =
Expand All @@ -432,11 +437,19 @@ private fun MainActivity.NavigationHome(

val sdkStatus = walletViewModel.currentWalletSnapshot.collectAsStateWithLifecycle().value?.status

val currentAppState = applicationStateProvider.state.collectAsStateWithLifecycle().value

if (isEnoughSpace == false) {
Twig.info { "Not enough free space" }
navController.navigateJustOnce(NOT_ENOUGH_SPACE)
} else if (Synchronizer.Status.DISCONNECTED == sdkStatus) {
Twig.info { "Disconnected state received from Synchronizer" }

if (!currentAppState.isInForeground()) {
Twig.info { "Disconnected state received but omitted as the app is not in foreground" }
return
}

WrapDisconnected(
goChooseServer = {
navController.navigateJustOnce(CHOOSE_SERVER)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package co.electriccoin.zcash.ui.common.provider

import androidx.lifecycle.Lifecycle
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.last
import kotlinx.coroutines.flow.update

interface ApplicationStateProvider {
val state: StateFlow<Lifecycle.Event?>

suspend fun getApplicationState(): Lifecycle.Event?

fun setApplicationState(newState: Lifecycle.Event)
}

class ApplicationStateProviderImpl : ApplicationStateProvider {
private val _state = MutableStateFlow<Lifecycle.Event?>(null)

override val state = _state.asStateFlow()

override suspend fun getApplicationState(): Lifecycle.Event? {
return _state.last()
}

override fun setApplicationState(newState: Lifecycle.Event) {
_state.update { newState }
}
}

fun Lifecycle.Event?.isInForeground(): Boolean =
this == Lifecycle.Event.ON_RESUME ||
this == Lifecycle.Event.ON_START

0 comments on commit db983c6

Please sign in to comment.