All checks were successful
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 6s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Successful in 16m19s
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Successful in 2m29s
Renovate / renovate (push) Successful in 3m1s
Release branch for 2.19.1. Merging this cuts the release — versionName is bumped to 2.19.1 (versionCode 21901), which is what release.yaml picks up. ### What's in it - **Drag to reschedule can be turned off** (#173). Settings → Views → *Drag to reschedule*, on by default. Turned off, no event block in the month, week or day view registers a drag gesture. The gate is `EventMoveScope.dragEnabled` rather than the scope itself, so the screen-reader "Move event" action — which only opens the edit form — stays available either way. The setting reads as off until the stored value has actually loaded, so a cold start can't hand out a drag before the preference is known. ### Release prep - CHANGELOG 2.19.1 section written. - Per-version "What's New" hand-written for all 12 store locales (`ar`, `de-DE`, `en-GB`, `en-US`, `es-ES`, `fr-FR`, `it-IT`, `pl-PL`, `pt-BR`, `pt-PT`, `ru-RU`, `zh-CN`). - `lint test assembleDebug` and `check_translations.py` green locally. - main is one commit ahead (Weblate #175, translations only) and merges clean — not merged into the branch, it comes along with this one. Closes #173 Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/176
71 lines
2.8 KiB
Kotlin
71 lines
2.8 KiB
Kotlin
package de.jeanlucmakiola.calendula.ui
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.viewModelScope
|
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
|
import de.jeanlucmakiola.calendula.data.prefs.SettingsPrefs
|
|
import de.jeanlucmakiola.calendula.ui.common.CalendarView
|
|
import de.jeanlucmakiola.calendula.ui.common.IMPLEMENTED_VIEWS
|
|
import kotlinx.coroutines.flow.SharingStarted
|
|
import kotlinx.coroutines.flow.StateFlow
|
|
import kotlinx.coroutines.flow.map
|
|
import kotlinx.coroutines.flow.stateIn
|
|
import javax.inject.Inject
|
|
|
|
/**
|
|
* Supplies [CalendarHost] with the user's default startup view (M1). Held as a
|
|
* nullable [StateFlow] so the host can wait for DataStore's first emission before
|
|
* seeding its view back stack — rendering nothing for that first frame rather
|
|
* than flashing the old hard-coded Week view and then correcting it.
|
|
*/
|
|
@HiltViewModel
|
|
class CalendarHostViewModel @Inject constructor(
|
|
prefs: SettingsPrefs,
|
|
) : ViewModel() {
|
|
|
|
val defaultView: StateFlow<CalendarView?> = prefs.defaultView.stateIn(
|
|
scope = viewModelScope,
|
|
started = SharingStarted.WhileSubscribed(5_000L),
|
|
initialValue = null,
|
|
)
|
|
|
|
/** Views the top-bar quick-switch pill cycles through, in the user's order (#24). */
|
|
val quickSwitchViews: StateFlow<List<CalendarView>> = prefs.quickSwitchConfig
|
|
.map { it.cycle }
|
|
.stateIn(
|
|
scope = viewModelScope,
|
|
started = SharingStarted.WhileSubscribed(5_000L),
|
|
initialValue = IMPLEMENTED_VIEWS,
|
|
)
|
|
|
|
/** Order of the views in the navigation drawer (#24); every view always shown. */
|
|
val drawerViewOrder: StateFlow<List<CalendarView>> = prefs.drawerViewOrder
|
|
.stateIn(
|
|
scope = viewModelScope,
|
|
started = SharingStarted.WhileSubscribed(5_000L),
|
|
initialValue = IMPLEMENTED_VIEWS,
|
|
)
|
|
|
|
/** Whether each view's jump-to-today control lives in the top bar, not the FAB (#60). */
|
|
val todayButtonInToolbar: StateFlow<Boolean> = prefs.todayButtonInToolbar
|
|
.stateIn(
|
|
scope = viewModelScope,
|
|
started = SharingStarted.WhileSubscribed(5_000L),
|
|
initialValue = false,
|
|
)
|
|
|
|
/**
|
|
* Whether events may be dragged to another slot to reschedule them (#68, #173).
|
|
* Off until the stored value arrives, even though the preference itself defaults
|
|
* on: the wrong guess costs an enabled user a gesture for the few frames a cold
|
|
* start takes to read DataStore, but re-arms the one thing a disabled user
|
|
* switched off to be rid of.
|
|
*/
|
|
val dragToReschedule: StateFlow<Boolean> = prefs.dragToReschedule
|
|
.stateIn(
|
|
scope = viewModelScope,
|
|
started = SharingStarted.WhileSubscribed(5_000L),
|
|
initialValue = false,
|
|
)
|
|
}
|