Display warning message if account notifications are enabled and background sync is disabled

This commit is contained in:
Shinokuni 2024-07-25 13:23:22 +02:00
parent dc55d2115f
commit e721463f9c
3 changed files with 48 additions and 8 deletions

View File

@ -50,7 +50,7 @@ val composeAppModule = module {
AccountCredentialsScreenModel(accountType, mode, get())
}
factory { (account: Account) -> NotificationsScreenModel(account, get()) }
factory { (account: Account) -> NotificationsScreenModel(account, get(), get()) }
factory { PreferencesScreenModel(get()) }

View File

@ -20,20 +20,20 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import cafe.adriel.voyager.koin.getScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.readrops.app.R
import com.readrops.app.more.preferences.PreferencesScreen
import com.readrops.app.util.components.AndroidScreen
import com.readrops.app.util.components.ThreeDotsMenu
import com.readrops.app.util.components.dialog.TwoChoicesDialog
import com.readrops.app.util.theme.MediumSpacer
import com.readrops.app.util.theme.spacing
import com.readrops.db.entities.account.Account
@ -47,13 +47,26 @@ class NotificationsScreen(val account: Account) : AndroidScreen() {
val navigator = LocalNavigator.currentOrThrow
val screenModel = getScreenModel<NotificationsScreenModel> { parametersOf(account) }
var isDropDownMenuExpanded by remember { mutableStateOf(false) }
val state by screenModel.state.collectAsStateWithLifecycle()
val topAppBarScrollBehavior =
TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
if (state.showBackgroundSyncDialog) {
TwoChoicesDialog(
title = stringResource(id = R.string.auto_synchro_disabled),
text = stringResource(id = R.string.enable_auto_synchro_text),
icon = painterResource(id = R.drawable.ic_sync),
confirmText = stringResource(id = R.string.open),
dismissText = stringResource(id = R.string.cancel),
onDismiss = { screenModel.setBackgroundSyncDialogState(false) },
onConfirm = {
screenModel.setBackgroundSyncDialogState(false)
navigator.push(PreferencesScreen())
}
)
}
Scaffold(
topBar = {
TopAppBar(
@ -106,7 +119,13 @@ class NotificationsScreen(val account: Account) : AndroidScreen() {
Switch(
checked = state.isNotificationsEnabled,
onCheckedChange = { screenModel.setAccountNotificationsState(it) }
onCheckedChange = {
screenModel.setAccountNotificationsState(it)
if (it) {
screenModel.setBackgroundSyncDialogState(true)
}
}
)
}

View File

@ -2,6 +2,7 @@ package com.readrops.app.notifications
import cafe.adriel.voyager.core.model.StateScreenModel
import cafe.adriel.voyager.core.model.screenModelScope
import com.readrops.app.util.Preferences
import com.readrops.db.Database
import com.readrops.db.entities.account.Account
import com.readrops.db.pojo.FeedWithFolder
@ -13,6 +14,7 @@ import kotlinx.coroutines.launch
class NotificationsScreenModel(
private val account: Account,
private val database: Database,
private val preferences: Preferences,
private val dispatcher: CoroutineDispatcher = Dispatchers.IO
) : StateScreenModel<NotificationsState>(NotificationsState(isNotificationsEnabled = account.isNotificationsEnabled)) {
@ -30,6 +32,13 @@ class NotificationsScreenModel(
mutableState.update { it.copy(feedsWithFolder = feedsWithFolder) }
}
}
screenModelScope.launch(dispatcher) {
preferences.backgroundSynchronization.flow
.collect { sync ->
mutableState.update { it.copy(isBackGroundSyncEnabled = sync != "manual") }
}
}
}
fun setAccountNotificationsState(enabled: Boolean) {
@ -50,11 +59,23 @@ class NotificationsScreenModel(
}
}
fun setBackgroundSyncDialogState(visible: Boolean) {
when {
visible && !state.value.isBackGroundSyncEnabled -> {
mutableState.update { it.copy(showBackgroundSyncDialog = visible) }
}
!visible -> {
mutableState.update { it.copy(showBackgroundSyncDialog = visible) }
}
}
}
}
data class NotificationsState(
val isNotificationsEnabled: Boolean = false,
val feedsWithFolder: List<FeedWithFolder> = emptyList()
val feedsWithFolder: List<FeedWithFolder> = emptyList(),
val showBackgroundSyncDialog: Boolean = false,
val isBackGroundSyncEnabled: Boolean = false
) {
val allFeedNotificationsEnabled