nordiccalendar

A simple Material 3 native calendar app fitting my personal requirements
git clone git://archive.git.mtrnord.blog/MTRNord/nordiccalendar.git
Log | Files | Refs | README | LICENSE

commit 50fc855b1003d110569e23b40d4475391594483d
parent 3ec05bcefdd5614c48cb6e638531124d9b70947c
Author: MTRNord <MTRNord@users.noreply.github.com>
Date:   Mon, 28 Jul 2025 19:10:00 +0200

Fix range selection

Diffstat:
M.gitignore | 2++
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/components/SidebarDrawer.kt | 2+-
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/screens/CalendarScreen.kt | 35+++++++++++++++++++----------------
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/viewmodels/CalendarViewModel.kt | 69+++++++++++++++++++++++++++++++++------------------------------------
4 files changed, 55 insertions(+), 53 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -13,3 +13,4 @@ .externalNativeBuild .cxx local.properties +.idea/ +\ No newline at end of file diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/components/SidebarDrawer.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/components/SidebarDrawer.kt @@ -126,7 +126,7 @@ fun SidebarDrawer( modifier = Modifier.fillMaxWidth(), colors = NavigationDrawerItemDefaults.colors() ) - if (selectedCalendars.value !== null && !selectedCalendars.value!!.isEmpty()) { + if (selectedCalendars.value !== null && calendars?.value?.isEmpty() == false) { Spacer(Modifier.height(16.dp)) HorizontalDivider(Modifier, DividerDefaults.Thickness, DividerDefaults.color) Spacer(Modifier.height(8.dp)) diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/screens/CalendarScreen.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/screens/CalendarScreen.kt @@ -78,12 +78,6 @@ fun CalendarScreen( val events = remember(calendarViewModel) { calendarViewModel.events }.collectAsState(initial = emptyList()) - val startMillis = remember(calendarViewModel) { - calendarViewModel.startMillis - } - val endMillis = remember(calendarViewModel) { - calendarViewModel.endMillis - } val isRefreshing = remember(calendarViewModel) { calendarViewModel.isRefreshing }.collectAsState(initial = false) @@ -113,8 +107,7 @@ fun CalendarScreen( // DateRangeHeader sollte direkt unter den Tabs stehen, IMMER sichtbar DateRangeHeader( selectedTab = selectedTab, - startMillis = startMillis, - endMillis = endMillis, + calendarViewModel = calendarViewModel, onPrev = { when (selectedTab) { 0 -> calendarViewModel.prevMonth() @@ -333,20 +326,30 @@ fun CalendarTabBar(selectedTab: Int, onTabSelected: (Int) -> Unit) { @Composable fun DateRangeHeader( selectedTab: Int, - startMillis: Long, - endMillis: Long, + calendarViewModel: CalendarViewModel, onPrev: () -> Unit, onNext: () -> Unit, onToday: () -> Unit ) { + val startMillis = remember(calendarViewModel) { + calendarViewModel.startMillis + }.collectAsState(initial = System.currentTimeMillis()) + val endMillis = remember(calendarViewModel) { + calendarViewModel.endMillis + }.collectAsState(initial = System.currentTimeMillis()) val dateFormat = when (selectedTab) { 0, 1 -> SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()) 2 -> SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()) else -> SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()) } val rangeText = when (selectedTab) { - 0, 1 -> dateFormat.format(Date(startMillis)) + " – " + dateFormat.format(Date(endMillis)) - 2 -> dateFormat.format(Date(startMillis)) + 0, 1 -> dateFormat.format(Date(startMillis.value)) + " – " + dateFormat.format( + Date( + endMillis.value + ) + ) + + 2 -> dateFormat.format(Date(startMillis.value)) else -> "" } val isToday = when (selectedTab) { @@ -354,8 +357,8 @@ fun DateRangeHeader( val cal = Calendar.getInstance() val todayMonth = cal.get(Calendar.MONTH) val todayYear = cal.get(Calendar.YEAR) - val startCal = Calendar.getInstance().apply { timeInMillis = startMillis } - val endCal = Calendar.getInstance().apply { timeInMillis = endMillis } + val startCal = Calendar.getInstance().apply { timeInMillis = startMillis.value } + val endCal = Calendar.getInstance().apply { timeInMillis = endMillis.value } startCal.get(Calendar.MONTH) == todayMonth && startCal.get(Calendar.YEAR) == todayYear && endCal.get(Calendar.MONTH) == todayMonth && @@ -365,12 +368,12 @@ fun DateRangeHeader( 1 -> { val cal = Calendar.getInstance() val today = cal.timeInMillis - today >= startMillis && today <= endMillis + today >= startMillis.value && today <= endMillis.value } 2 -> { val cal = Calendar.getInstance() - val startDay = Calendar.getInstance().apply { timeInMillis = startMillis } + val startDay = Calendar.getInstance().apply { timeInMillis = startMillis.value } cal.get(Calendar.YEAR) == startDay.get(Calendar.YEAR) && cal.get(Calendar.DAY_OF_YEAR) == startDay.get(Calendar.DAY_OF_YEAR) } diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/viewmodels/CalendarViewModel.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/viewmodels/CalendarViewModel.kt @@ -24,10 +24,10 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { private val _selectedTab = MutableStateFlow(0) val selectedTab: StateFlow<Int> = _selectedTab.asStateFlow() - var startMillis: Long = getDefaultStartMillis(0) - private set - var endMillis: Long = getDefaultEndMillis(0) - private set + private val _startMillis = MutableStateFlow(getDefaultStartMillis(0)) + val startMillis: StateFlow<Long> = _startMillis.asStateFlow() + private val _endMillis = MutableStateFlow(getDefaultEndMillis(0)) + val endMillis: StateFlow<Long> = _endMillis.asStateFlow() init { loadCalendars() @@ -52,8 +52,8 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { fun setTab(tab: Int) { _selectedTab.value = tab - startMillis = getDefaultStartMillis(tab) - endMillis = getDefaultEndMillis(tab) + _startMillis.value = getDefaultStartMillis(tab) + _endMillis.value = getDefaultEndMillis(tab) updateEvents() } @@ -124,14 +124,11 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { viewModelScope.launch { isRefreshing.value = true try { - val tab = _selectedTab.value - startMillis = getDefaultStartMillis(tab) - endMillis = getDefaultEndMillis(tab) val selectedIds = _calendars.value.filter { it.selected }.map { it.id } _events.value = repository.getEventsForCalendars( selectedIds, - startMillis, - endMillis + _startMillis.value, + _endMillis.value ) } finally { isRefreshing.value = false @@ -141,60 +138,60 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { fun nextDay() { if (_selectedTab.value != 2) return - val cal = java.util.Calendar.getInstance().apply { timeInMillis = startMillis } + val cal = java.util.Calendar.getInstance().apply { timeInMillis = _startMillis.value } cal.add(java.util.Calendar.DAY_OF_MONTH, 1) - startMillis = cal.timeInMillis + _startMillis.value = cal.timeInMillis cal.set(java.util.Calendar.HOUR_OF_DAY, 23) cal.set(java.util.Calendar.MINUTE, 59) cal.set(java.util.Calendar.SECOND, 59) - endMillis = cal.timeInMillis + _endMillis.value = cal.timeInMillis updateEvents() } fun prevDay() { if (_selectedTab.value != 2) return - val cal = java.util.Calendar.getInstance().apply { timeInMillis = startMillis } + val cal = java.util.Calendar.getInstance().apply { timeInMillis = _startMillis.value } cal.add(java.util.Calendar.DAY_OF_MONTH, -1) - startMillis = cal.timeInMillis + _startMillis.value = cal.timeInMillis cal.set(java.util.Calendar.HOUR_OF_DAY, 23) cal.set(java.util.Calendar.MINUTE, 59) cal.set(java.util.Calendar.SECOND, 59) - endMillis = cal.timeInMillis + _endMillis.value = cal.timeInMillis updateEvents() } fun nextWeek() { if (_selectedTab.value != 1) return - val cal = java.util.Calendar.getInstance().apply { timeInMillis = startMillis } + val cal = java.util.Calendar.getInstance().apply { timeInMillis = _startMillis.value } cal.add(java.util.Calendar.WEEK_OF_YEAR, 1) - startMillis = cal.timeInMillis + _startMillis.value = cal.timeInMillis cal.add(java.util.Calendar.DAY_OF_WEEK, 6) cal.set(java.util.Calendar.HOUR_OF_DAY, 23) cal.set(java.util.Calendar.MINUTE, 59) cal.set(java.util.Calendar.SECOND, 59) - endMillis = cal.timeInMillis + _endMillis.value = cal.timeInMillis updateEvents() } fun prevWeek() { if (_selectedTab.value != 1) return - val cal = java.util.Calendar.getInstance().apply { timeInMillis = startMillis } + val cal = java.util.Calendar.getInstance().apply { timeInMillis = _startMillis.value } cal.add(java.util.Calendar.WEEK_OF_YEAR, -1) - startMillis = cal.timeInMillis + _startMillis.value = cal.timeInMillis cal.add(java.util.Calendar.DAY_OF_WEEK, 6) cal.set(java.util.Calendar.HOUR_OF_DAY, 23) cal.set(java.util.Calendar.MINUTE, 59) cal.set(java.util.Calendar.SECOND, 59) - endMillis = cal.timeInMillis + _endMillis.value = cal.timeInMillis updateEvents() } fun nextMonth() { if (_selectedTab.value != 0) return - val cal = java.util.Calendar.getInstance().apply { timeInMillis = startMillis } + val cal = java.util.Calendar.getInstance().apply { timeInMillis = _startMillis.value } cal.add(java.util.Calendar.MONTH, 1) cal.set(java.util.Calendar.DAY_OF_MONTH, 1) - startMillis = cal.timeInMillis + _startMillis.value = cal.timeInMillis cal.set( java.util.Calendar.DAY_OF_MONTH, cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH) @@ -202,16 +199,16 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { cal.set(java.util.Calendar.HOUR_OF_DAY, 23) cal.set(java.util.Calendar.MINUTE, 59) cal.set(java.util.Calendar.SECOND, 59) - endMillis = cal.timeInMillis + _endMillis.value = cal.timeInMillis updateEvents() } fun prevMonth() { if (_selectedTab.value != 0) return - val cal = java.util.Calendar.getInstance().apply { timeInMillis = startMillis } + val cal = java.util.Calendar.getInstance().apply { timeInMillis = _startMillis.value } cal.add(java.util.Calendar.MONTH, -1) cal.set(java.util.Calendar.DAY_OF_MONTH, 1) - startMillis = cal.timeInMillis + _startMillis.value = cal.timeInMillis cal.set( java.util.Calendar.DAY_OF_MONTH, cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH) @@ -219,20 +216,20 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { cal.set(java.util.Calendar.HOUR_OF_DAY, 23) cal.set(java.util.Calendar.MINUTE, 59) cal.set(java.util.Calendar.SECOND, 59) - endMillis = cal.timeInMillis + _endMillis.value = cal.timeInMillis updateEvents() } - + fun setTodayWeek() { if (_selectedTab.value != 1) return val cal = java.util.Calendar.getInstance() - startMillis = cal.apply { + _startMillis.value = cal.apply { set(java.util.Calendar.DAY_OF_WEEK, firstDayOfWeek) set(java.util.Calendar.HOUR_OF_DAY, 0) set(java.util.Calendar.MINUTE, 0) set(java.util.Calendar.SECOND, 0) }.timeInMillis - endMillis = cal.apply { + _endMillis.value = cal.apply { add(java.util.Calendar.DAY_OF_WEEK, 6) set(java.util.Calendar.HOUR_OF_DAY, 23) set(java.util.Calendar.MINUTE, 59) @@ -244,13 +241,13 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { fun setTodayMonth() { if (_selectedTab.value != 0) return val cal = java.util.Calendar.getInstance() - startMillis = cal.apply { + _startMillis.value = cal.apply { set(java.util.Calendar.DAY_OF_MONTH, 1) set(java.util.Calendar.HOUR_OF_DAY, 0) set(java.util.Calendar.MINUTE, 0) set(java.util.Calendar.SECOND, 0) }.timeInMillis - endMillis = cal.apply { + _endMillis.value = cal.apply { set( java.util.Calendar.DAY_OF_MONTH, getActualMaximum(java.util.Calendar.DAY_OF_MONTH) @@ -265,12 +262,12 @@ class CalendarViewModel(app: Application) : AndroidViewModel(app) { fun setTodayDay() { if (_selectedTab.value != 2) return val cal = java.util.Calendar.getInstance() - startMillis = cal.apply { + _startMillis.value = cal.apply { set(java.util.Calendar.HOUR_OF_DAY, 0) set(java.util.Calendar.MINUTE, 0) set(java.util.Calendar.SECOND, 0) }.timeInMillis - endMillis = cal.apply { + _endMillis.value = cal.apply { set(java.util.Calendar.HOUR_OF_DAY, 23) set(java.util.Calendar.MINUTE, 59) set(java.util.Calendar.SECOND, 59)