From 898ab6ed2a2c5d072dec2d81ba2f275de1a3511b Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Sat, 7 Dec 2024 12:34:44 +0100 Subject: [PATCH] AccountSettings: make enable flag for sync intervals explicit --- .../ui/account/AccountSettingsModel.kt | 26 +++++++++++---- .../ui/account/AccountSettingsScreen.kt | 33 +++++++++++++++---- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsModel.kt index a2935c91c..d9ea160cc 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsModel.kt @@ -6,7 +6,9 @@ import android.provider.CalendarContract import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import at.bitfire.davdroid.R +import at.bitfire.davdroid.db.AppDatabase import at.bitfire.davdroid.db.Credentials +import at.bitfire.davdroid.db.Service import at.bitfire.davdroid.settings.AccountSettings import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.sync.TasksAppManager @@ -26,17 +28,16 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.util.logging.Logger @HiltViewModel(assistedFactory = AccountSettingsModel.Factory::class) class AccountSettingsModel @AssistedInject constructor( @Assisted val account: Account, private val accountSettingsFactory: AccountSettings.Factory, @ApplicationContext val context: Context, - private val logger: Logger, + db: AppDatabase, private val settings: SettingsManager, private val syncWorkerManager: SyncWorkerManager, - tasksAppManager: TasksAppManager + private val tasksAppManager: TasksAppManager ): ViewModel(), SettingsManager.OnChangeListener { @AssistedFactory @@ -46,8 +47,11 @@ class AccountSettingsModel @AssistedInject constructor( // settings data class UiState( + val hasContactsSync: Boolean = false, val syncIntervalContacts: Long? = null, + val hasCalendarsSync: Boolean = false, val syncIntervalCalendars: Long? = null, + val hasTasksSync: Boolean = false, val syncIntervalTasks: Long? = null, val syncWifiOnly: Boolean = false, @@ -67,7 +71,9 @@ class AccountSettingsModel @AssistedInject constructor( private val _uiState = MutableStateFlow(UiState()) val uiState: StateFlow = _uiState.asStateFlow() - private val tasksProvider = tasksAppManager.currentProvider() + private val serviceDao = db.serviceDao() + private val tasksProvider + get() = tasksAppManager.currentProvider() /** * Only acquire account settings on a worker thread! @@ -94,10 +100,16 @@ class AccountSettingsModel @AssistedInject constructor( } private suspend fun reload() = withContext(Dispatchers.Default) { - logger.info("Reloading settings") + val hasContactsSync = serviceDao.getByAccountAndType(account.name, Service.TYPE_CARDDAV) != null + val hasCalendarSync = serviceDao.getByAccountAndType(account.name, Service.TYPE_CALDAV) != null + val hasTasksSync = hasCalendarSync && tasksProvider != null + _uiState.value = UiState( + hasContactsSync = hasContactsSync, syncIntervalContacts = accountSettings.getSyncInterval(context.getString(R.string.address_books_authority)), + hasCalendarsSync = hasCalendarSync, syncIntervalCalendars = accountSettings.getSyncInterval(CalendarContract.AUTHORITY), + hasTasksSync = hasTasksSync, syncIntervalTasks = tasksProvider?.let { accountSettings.getSyncInterval(it.authority) }, syncWifiOnly = accountSettings.getSyncWifiOnly(), @@ -220,8 +232,8 @@ class AccountSettingsModel @AssistedInject constructor( * * @param authority authority to re-sync * @param fullResync whether sync shall download all events again - * (_true_: sets [Syncer.SYNC_EXTRAS_FULL_RESYNC], - * _false_: sets [Syncer.SYNC_EXTRAS_RESYNC]) + * (_true_: sets [at.bitfire.davdroid.sync.worker.BaseSyncWorker.FULL_RESYNC], + * _false_: sets [BaseSyncWorker.RESYNC]) */ private fun resync(authority: String, fullResync: Boolean) { val resync = diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt index 3989be692..a9c040358 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt @@ -84,10 +84,13 @@ fun AccountSettingsScreen( // Sync settings canAccessWifiSsid = canAccessWifiSsid, onSyncWifiOnlyPermissionsAction = onNavWifiPermissionsScreen, + hasContactsSync = uiState.hasContactsSync, contactsSyncInterval = uiState.syncIntervalContacts, onUpdateContactsSyncInterval = model::updateContactsSyncInterval, + hasCalendarsSync = uiState.hasCalendarsSync, calendarSyncInterval = uiState.syncIntervalCalendars, onUpdateCalendarSyncInterval = model::updateCalendarSyncInterval, + hasTasksSync = uiState.hasTasksSync, tasksSyncInterval = uiState.syncIntervalTasks, onUpdateTasksSyncInterval = model::updateTasksSyncInterval, syncOnlyOnWifi = uiState.syncWifiOnly, @@ -127,10 +130,13 @@ fun AccountSettingsScreen( // Sync settings canAccessWifiSsid: Boolean, onSyncWifiOnlyPermissionsAction: () -> Unit, + hasContactsSync: Boolean, contactsSyncInterval: Long?, onUpdateContactsSyncInterval: ((Long) -> Unit) = {}, + hasCalendarsSync: Boolean, calendarSyncInterval: Long?, onUpdateCalendarSyncInterval: ((Long) -> Unit) = {}, + hasTasksSync: Boolean, tasksSyncInterval: Long?, onUpdateTasksSyncInterval: ((Long) -> Unit) = {}, syncOnlyOnWifi: Boolean, @@ -199,10 +205,13 @@ fun AccountSettingsScreen( // Sync settings canAccessWifiSsid = canAccessWifiSsid, onSyncWifiOnlyPermissionsAction = onSyncWifiOnlyPermissionsAction, + hasContactsSync = hasContactsSync, contactsSyncInterval = contactsSyncInterval, onUpdateContactsSyncInterval = onUpdateContactsSyncInterval, + hasCalendarsSync = hasCalendarsSync, calendarSyncInterval = calendarSyncInterval, onUpdateCalendarSyncInterval = onUpdateCalendarSyncInterval, + hasTasksSync = hasTasksSync, taskSyncInterval = tasksSyncInterval, onUpdateTaskSyncInterval = onUpdateTasksSyncInterval, syncOnlyOnWifi = syncOnlyOnWifi, @@ -228,7 +237,7 @@ fun AccountSettingsScreen( // CardDav Settings contactGroupMethod = contactGroupMethod, - onUpdateContactGroupMethod = onUpdateContactGroupMethod, + onUpdateContactGroupMethod = onUpdateContactGroupMethod ) } } @@ -241,10 +250,13 @@ fun AccountSettings_FromModel( // Sync settings canAccessWifiSsid: Boolean, onSyncWifiOnlyPermissionsAction: () -> Unit, + hasContactsSync: Boolean, contactsSyncInterval: Long?, onUpdateContactsSyncInterval: ((Long) -> Unit) = {}, + hasCalendarsSync: Boolean, calendarSyncInterval: Long?, onUpdateCalendarSyncInterval: ((Long) -> Unit) = {}, + hasTasksSync: Boolean, taskSyncInterval: Long?, onUpdateTaskSyncInterval: ((Long) -> Unit) = {}, syncOnlyOnWifi: Boolean, @@ -276,10 +288,13 @@ fun AccountSettings_FromModel( SyncSettings( canAccessWifiSsid = canAccessWifiSsid, onSyncWifiOnlyPermissionsAction = onSyncWifiOnlyPermissionsAction, + hasContactsSync = hasContactsSync, contactsSyncInterval = contactsSyncInterval, onUpdateContactsSyncInterval = onUpdateContactsSyncInterval, + hasCalendarsSync = hasCalendarsSync, calendarSyncInterval = calendarSyncInterval, onUpdateCalendarSyncInterval = onUpdateCalendarSyncInterval, + hasTasksSync = hasTasksSync, taskSyncInterval = taskSyncInterval, onUpdateTaskSyncInterval = onUpdateTaskSyncInterval, syncOnlyOnWifi = syncOnlyOnWifi, @@ -320,10 +335,13 @@ fun AccountSettings_FromModel( fun SyncSettings( canAccessWifiSsid: Boolean, onSyncWifiOnlyPermissionsAction: () -> Unit, + hasContactsSync: Boolean, contactsSyncInterval: Long?, onUpdateContactsSyncInterval: ((Long) -> Unit) = {}, + hasCalendarsSync: Boolean, calendarSyncInterval: Long?, onUpdateCalendarSyncInterval: ((Long) -> Unit) = {}, + hasTasksSync: Boolean, taskSyncInterval: Long?, onUpdateTaskSyncInterval: ((Long) -> Unit) = {}, syncOnlyOnWifi: Boolean, @@ -338,21 +356,21 @@ fun SyncSettings( Text(stringResource(R.string.settings_sync)) } - if (contactsSyncInterval != null) + if (hasContactsSync) SyncIntervalSetting( icon = Icons.Default.Contacts, name = R.string.settings_sync_interval_contacts, syncInterval = contactsSyncInterval, onUpdateSyncInterval = onUpdateContactsSyncInterval ) - if (calendarSyncInterval != null) + if (hasCalendarsSync) SyncIntervalSetting( icon = Icons.Default.Event, name = R.string.settings_sync_interval_calendars, syncInterval = calendarSyncInterval, onUpdateSyncInterval = onUpdateCalendarSyncInterval ) - if (taskSyncInterval != null) + if (hasTasksSync) SyncIntervalSetting( icon = Icons.Outlined.Task, name = R.string.settings_sync_interval_tasks, @@ -431,7 +449,7 @@ fun SyncSettings( fun SyncIntervalSetting( icon: ImageVector, @StringRes name: Int, - syncInterval: Long, + syncInterval: Long?, onUpdateSyncInterval: (Long) -> Unit ) { var showSyncIntervalDialog by remember { mutableStateOf(false) } @@ -439,7 +457,7 @@ fun SyncIntervalSetting( icon = icon, name = stringResource(name), summary = - if (syncInterval == AccountSettings.SYNC_INTERVAL_MANUALLY) + if (syncInterval == null || syncInterval == AccountSettings.SYNC_INTERVAL_MANUALLY) stringResource(R.string.settings_sync_summary_manually) else stringResource(R.string.settings_sync_summary_periodically, syncInterval / 60), @@ -693,10 +711,13 @@ fun AccountSettingsScreen_Preview() { // Sync settings canAccessWifiSsid = true, onSyncWifiOnlyPermissionsAction = {}, + hasContactsSync = true, contactsSyncInterval = 80000L, onUpdateContactsSyncInterval = {}, + hasCalendarsSync = true, calendarSyncInterval = 50000L, onUpdateCalendarSyncInterval = {}, + hasTasksSync = true, tasksSyncInterval = 900000L, onUpdateTasksSyncInterval = {}, syncOnlyOnWifi = true,