Skip to content

Commit 9ae03db

Browse files
authored
AccountSettings: make enable flag for sync intervals explicit (#1156)
1 parent 042dd3f commit 9ae03db

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsModel.kt

+19-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import android.provider.CalendarContract
66
import androidx.lifecycle.ViewModel
77
import androidx.lifecycle.viewModelScope
88
import at.bitfire.davdroid.R
9+
import at.bitfire.davdroid.db.AppDatabase
910
import at.bitfire.davdroid.db.Credentials
11+
import at.bitfire.davdroid.db.Service
1012
import at.bitfire.davdroid.settings.AccountSettings
1113
import at.bitfire.davdroid.settings.SettingsManager
1214
import at.bitfire.davdroid.sync.TasksAppManager
@@ -26,17 +28,16 @@ import kotlinx.coroutines.flow.StateFlow
2628
import kotlinx.coroutines.flow.asStateFlow
2729
import kotlinx.coroutines.launch
2830
import kotlinx.coroutines.withContext
29-
import java.util.logging.Logger
3031

3132
@HiltViewModel(assistedFactory = AccountSettingsModel.Factory::class)
3233
class AccountSettingsModel @AssistedInject constructor(
3334
@Assisted val account: Account,
3435
private val accountSettingsFactory: AccountSettings.Factory,
3536
@ApplicationContext val context: Context,
36-
private val logger: Logger,
37+
db: AppDatabase,
3738
private val settings: SettingsManager,
3839
private val syncWorkerManager: SyncWorkerManager,
39-
tasksAppManager: TasksAppManager
40+
private val tasksAppManager: TasksAppManager
4041
): ViewModel(), SettingsManager.OnChangeListener {
4142

4243
@AssistedFactory
@@ -46,8 +47,11 @@ class AccountSettingsModel @AssistedInject constructor(
4647

4748
// settings
4849
data class UiState(
50+
val hasContactsSync: Boolean = false,
4951
val syncIntervalContacts: Long? = null,
52+
val hasCalendarsSync: Boolean = false,
5053
val syncIntervalCalendars: Long? = null,
54+
val hasTasksSync: Boolean = false,
5155
val syncIntervalTasks: Long? = null,
5256

5357
val syncWifiOnly: Boolean = false,
@@ -67,7 +71,9 @@ class AccountSettingsModel @AssistedInject constructor(
6771
private val _uiState = MutableStateFlow(UiState())
6872
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
6973

70-
private val tasksProvider = tasksAppManager.currentProvider()
74+
private val serviceDao = db.serviceDao()
75+
private val tasksProvider
76+
get() = tasksAppManager.currentProvider()
7177

7278
/**
7379
* Only acquire account settings on a worker thread!
@@ -94,10 +100,16 @@ class AccountSettingsModel @AssistedInject constructor(
94100
}
95101

96102
private suspend fun reload() = withContext(Dispatchers.Default) {
97-
logger.info("Reloading settings")
103+
val hasContactsSync = serviceDao.getByAccountAndType(account.name, Service.TYPE_CARDDAV) != null
104+
val hasCalendarSync = serviceDao.getByAccountAndType(account.name, Service.TYPE_CALDAV) != null
105+
val hasTasksSync = hasCalendarSync && tasksProvider != null
106+
98107
_uiState.value = UiState(
108+
hasContactsSync = hasContactsSync,
99109
syncIntervalContacts = accountSettings.getSyncInterval(context.getString(R.string.address_books_authority)),
110+
hasCalendarsSync = hasCalendarSync,
100111
syncIntervalCalendars = accountSettings.getSyncInterval(CalendarContract.AUTHORITY),
112+
hasTasksSync = hasTasksSync,
101113
syncIntervalTasks = tasksProvider?.let { accountSettings.getSyncInterval(it.authority) },
102114

103115
syncWifiOnly = accountSettings.getSyncWifiOnly(),
@@ -220,8 +232,8 @@ class AccountSettingsModel @AssistedInject constructor(
220232
*
221233
* @param authority authority to re-sync
222234
* @param fullResync whether sync shall download all events again
223-
* (_true_: sets [Syncer.SYNC_EXTRAS_FULL_RESYNC],
224-
* _false_: sets [Syncer.SYNC_EXTRAS_RESYNC])
235+
* (_true_: sets [at.bitfire.davdroid.sync.worker.BaseSyncWorker.FULL_RESYNC],
236+
* _false_: sets [BaseSyncWorker.RESYNC])
225237
*/
226238
private fun resync(authority: String, fullResync: Boolean) {
227239
val resync =

app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt

+27-6
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,13 @@ fun AccountSettingsScreen(
8484
// Sync settings
8585
canAccessWifiSsid = canAccessWifiSsid,
8686
onSyncWifiOnlyPermissionsAction = onNavWifiPermissionsScreen,
87+
hasContactsSync = uiState.hasContactsSync,
8788
contactsSyncInterval = uiState.syncIntervalContacts,
8889
onUpdateContactsSyncInterval = model::updateContactsSyncInterval,
90+
hasCalendarsSync = uiState.hasCalendarsSync,
8991
calendarSyncInterval = uiState.syncIntervalCalendars,
9092
onUpdateCalendarSyncInterval = model::updateCalendarSyncInterval,
93+
hasTasksSync = uiState.hasTasksSync,
9194
tasksSyncInterval = uiState.syncIntervalTasks,
9295
onUpdateTasksSyncInterval = model::updateTasksSyncInterval,
9396
syncOnlyOnWifi = uiState.syncWifiOnly,
@@ -127,10 +130,13 @@ fun AccountSettingsScreen(
127130
// Sync settings
128131
canAccessWifiSsid: Boolean,
129132
onSyncWifiOnlyPermissionsAction: () -> Unit,
133+
hasContactsSync: Boolean,
130134
contactsSyncInterval: Long?,
131135
onUpdateContactsSyncInterval: ((Long) -> Unit) = {},
136+
hasCalendarsSync: Boolean,
132137
calendarSyncInterval: Long?,
133138
onUpdateCalendarSyncInterval: ((Long) -> Unit) = {},
139+
hasTasksSync: Boolean,
134140
tasksSyncInterval: Long?,
135141
onUpdateTasksSyncInterval: ((Long) -> Unit) = {},
136142
syncOnlyOnWifi: Boolean,
@@ -199,10 +205,13 @@ fun AccountSettingsScreen(
199205
// Sync settings
200206
canAccessWifiSsid = canAccessWifiSsid,
201207
onSyncWifiOnlyPermissionsAction = onSyncWifiOnlyPermissionsAction,
208+
hasContactsSync = hasContactsSync,
202209
contactsSyncInterval = contactsSyncInterval,
203210
onUpdateContactsSyncInterval = onUpdateContactsSyncInterval,
211+
hasCalendarsSync = hasCalendarsSync,
204212
calendarSyncInterval = calendarSyncInterval,
205213
onUpdateCalendarSyncInterval = onUpdateCalendarSyncInterval,
214+
hasTasksSync = hasTasksSync,
206215
taskSyncInterval = tasksSyncInterval,
207216
onUpdateTaskSyncInterval = onUpdateTasksSyncInterval,
208217
syncOnlyOnWifi = syncOnlyOnWifi,
@@ -228,7 +237,7 @@ fun AccountSettingsScreen(
228237

229238
// CardDav Settings
230239
contactGroupMethod = contactGroupMethod,
231-
onUpdateContactGroupMethod = onUpdateContactGroupMethod,
240+
onUpdateContactGroupMethod = onUpdateContactGroupMethod
232241
)
233242
}
234243
}
@@ -241,10 +250,13 @@ fun AccountSettings_FromModel(
241250
// Sync settings
242251
canAccessWifiSsid: Boolean,
243252
onSyncWifiOnlyPermissionsAction: () -> Unit,
253+
hasContactsSync: Boolean,
244254
contactsSyncInterval: Long?,
245255
onUpdateContactsSyncInterval: ((Long) -> Unit) = {},
256+
hasCalendarsSync: Boolean,
246257
calendarSyncInterval: Long?,
247258
onUpdateCalendarSyncInterval: ((Long) -> Unit) = {},
259+
hasTasksSync: Boolean,
248260
taskSyncInterval: Long?,
249261
onUpdateTaskSyncInterval: ((Long) -> Unit) = {},
250262
syncOnlyOnWifi: Boolean,
@@ -276,10 +288,13 @@ fun AccountSettings_FromModel(
276288
SyncSettings(
277289
canAccessWifiSsid = canAccessWifiSsid,
278290
onSyncWifiOnlyPermissionsAction = onSyncWifiOnlyPermissionsAction,
291+
hasContactsSync = hasContactsSync,
279292
contactsSyncInterval = contactsSyncInterval,
280293
onUpdateContactsSyncInterval = onUpdateContactsSyncInterval,
294+
hasCalendarsSync = hasCalendarsSync,
281295
calendarSyncInterval = calendarSyncInterval,
282296
onUpdateCalendarSyncInterval = onUpdateCalendarSyncInterval,
297+
hasTasksSync = hasTasksSync,
283298
taskSyncInterval = taskSyncInterval,
284299
onUpdateTaskSyncInterval = onUpdateTaskSyncInterval,
285300
syncOnlyOnWifi = syncOnlyOnWifi,
@@ -320,10 +335,13 @@ fun AccountSettings_FromModel(
320335
fun SyncSettings(
321336
canAccessWifiSsid: Boolean,
322337
onSyncWifiOnlyPermissionsAction: () -> Unit,
338+
hasContactsSync: Boolean,
323339
contactsSyncInterval: Long?,
324340
onUpdateContactsSyncInterval: ((Long) -> Unit) = {},
341+
hasCalendarsSync: Boolean,
325342
calendarSyncInterval: Long?,
326343
onUpdateCalendarSyncInterval: ((Long) -> Unit) = {},
344+
hasTasksSync: Boolean,
327345
taskSyncInterval: Long?,
328346
onUpdateTaskSyncInterval: ((Long) -> Unit) = {},
329347
syncOnlyOnWifi: Boolean,
@@ -338,21 +356,21 @@ fun SyncSettings(
338356
Text(stringResource(R.string.settings_sync))
339357
}
340358

341-
if (contactsSyncInterval != null)
359+
if (hasContactsSync)
342360
SyncIntervalSetting(
343361
icon = Icons.Default.Contacts,
344362
name = R.string.settings_sync_interval_contacts,
345363
syncInterval = contactsSyncInterval,
346364
onUpdateSyncInterval = onUpdateContactsSyncInterval
347365
)
348-
if (calendarSyncInterval != null)
366+
if (hasCalendarsSync)
349367
SyncIntervalSetting(
350368
icon = Icons.Default.Event,
351369
name = R.string.settings_sync_interval_calendars,
352370
syncInterval = calendarSyncInterval,
353371
onUpdateSyncInterval = onUpdateCalendarSyncInterval
354372
)
355-
if (taskSyncInterval != null)
373+
if (hasTasksSync)
356374
SyncIntervalSetting(
357375
icon = Icons.Outlined.Task,
358376
name = R.string.settings_sync_interval_tasks,
@@ -431,15 +449,15 @@ fun SyncSettings(
431449
fun SyncIntervalSetting(
432450
icon: ImageVector,
433451
@StringRes name: Int,
434-
syncInterval: Long,
452+
syncInterval: Long?,
435453
onUpdateSyncInterval: (Long) -> Unit
436454
) {
437455
var showSyncIntervalDialog by remember { mutableStateOf(false) }
438456
Setting(
439457
icon = icon,
440458
name = stringResource(name),
441459
summary =
442-
if (syncInterval == AccountSettings.SYNC_INTERVAL_MANUALLY)
460+
if (syncInterval == null || syncInterval == AccountSettings.SYNC_INTERVAL_MANUALLY)
443461
stringResource(R.string.settings_sync_summary_manually)
444462
else
445463
stringResource(R.string.settings_sync_summary_periodically, syncInterval / 60),
@@ -693,10 +711,13 @@ fun AccountSettingsScreen_Preview() {
693711
// Sync settings
694712
canAccessWifiSsid = true,
695713
onSyncWifiOnlyPermissionsAction = {},
714+
hasContactsSync = true,
696715
contactsSyncInterval = 80000L,
697716
onUpdateContactsSyncInterval = {},
717+
hasCalendarsSync = true,
698718
calendarSyncInterval = 50000L,
699719
onUpdateCalendarSyncInterval = {},
720+
hasTasksSync = true,
700721
tasksSyncInterval = 900000L,
701722
onUpdateTasksSyncInterval = {},
702723
syncOnlyOnWifi = true,

0 commit comments

Comments
 (0)