Compare commits

...

10 Commits

Author SHA1 Message Date
96e3bff877 Show as much of a month event title as fits (#164)
Drop the ellipsis from month-view chips and let the title run to the chip
edge. softWrap goes off with it, or a clipped line would break at the last
whole word and show less title than before.
2026-08-10 18:55:01 +02:00
2f3980f3c4 2.19.0 — drag to reschedule, bulk delete from search, onboarding wizard
Bumps versionName to 2.19.0 (code 21900), which is what triggers the
release when this branch merges to main.

Closes #68
Closes #80
Closes #123
Closes #163
2026-08-10 18:25:15 +02:00
a1582d5a91 Merge main into release/v2.19.0
# Conflicts:
#	app/src/main/java/de/jeanlucmakiola/calendula/ui/day/DayScreen.kt
#	app/src/main/java/de/jeanlucmakiola/calendula/ui/week/WeekScreen.kt
2026-08-10 18:09:56 +02:00
Jean-Luc Makiolas Weblate Bot
25e3640ba0 Translations update from Weblate (#170)
Translations update from [Weblate](https://weblate.dev.jeanlucmakiola.de) for [Calendula/Strings](https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/).

Current translation status:

![Weblate translation status](https://weblate.dev.jeanlucmakiola.de/widget/calendula/strings/horizontal-auto.svg)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Admin <business@jeanlucmakiola.de>
Co-authored-by: Sup99999 <alelmnour1o234@proton.me>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Pedro <pedrolojo@gmail.com>
Co-authored-by: Bernardo Krzysczak <berkrz@proton.me>
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/170
2026-08-10 18:04:24 +02:00
3f85bac74e chore(deps): update ksp monorepo to v2.3.10 (#137)
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 / play (push) Has been skipped
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Has been skipped
Renovate / renovate (push) Successful in 3m9s
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/137
2026-08-08 13:51:11 +02:00
5b83b9da73 fix(deps): update kotlinx-coroutines monorepo to v1.11.0 (#160)
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 7s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Has been skipped
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Has been skipped
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/160
2026-08-08 13:50:44 +02:00
3c8c555b94 fix(deps): update hiltnavigationcompose to v1.4.0 (#159)
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 7s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Has been skipped
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Has been skipped
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/159
2026-08-08 13:50:15 +02:00
a6a6c0c714 fix(deps): update documentfile to v1.1.0 (#157)
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 8s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Has been skipped
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Has been skipped
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/157
2026-08-08 13:48:29 +02:00
Jean-Luc Makiola
66dbdc8913 2.18.1 — create at the tapped hour after a zoom (#155)
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 9s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Successful in 14m28s
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Successful in 1m4s
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/155
2026-08-06 20:09:50 +02:00
Jean-Luc Makiolas Weblate Bot
6a125b7c73 Translations update from Weblate (#136)
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 32s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Has been skipped
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Has been skipped
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/136
2026-08-06 19:40:09 +02:00
33 changed files with 246 additions and 11 deletions

View File

@@ -7,6 +7,74 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Changed
- Month-view event titles no longer end in an ellipsis. The "…" took the width
of a couple of characters and told you nothing you couldn't already see, so
the title now simply runs to the edge of its chip — a few more letters per
cell, which is often the difference between two events you can tell apart and
two you can't ([#164]).
## [2.19.0] — 2026-08-10
### Added
- **Drag an event to reschedule it.** Press and hold an event in the month,
week or day view and drop it on another time or day — the only way to move an
appointment used to be opening it and editing its start and end by hand. The
block follows your finger, the timeline scrolls when you carry it to an edge,
and the event's length is preserved: a 90-minute meeting dropped on 09:00 ends
at 10:30. In week and day view the drop snaps to 15-minute steps; in month
view it moves the event to the day you dropped it on and leaves the time
alone. A confirmation names the new slot and offers **Undo** wherever the move
can be taken back in one step. Events you can't edit — read-only calendars, and
birthdays and anniversaries mirrored from your contacts — can't be picked up.
Rescheduling isn't pointer-only: a screen reader gets a **Move…** action on
every event that can be moved ([#68]).
- Dragging a **recurring** event asks what it should apply to, the same *this
event / this and following / all events* choice a save does. Where moving the
whole series would change which weekday it falls on, the rule is rewritten to
match — a weekly Monday event dropped on a Wednesday becomes a weekly
Wednesday event. Where it can't be rewritten safely, the prompt says so and
offers to move just the one occurrence, rather than quietly leaving the
series behind ([#68]).
- **Delete several search results at once.** Long-press a hit in search to enter
selection mode, tap the rest (or **Select all**), and delete the lot in one
action — finding and removing, say, every leftover event with the same title
no longer means opening them one at a time. Recurring hits in the batch ask
once for the whole selection instead of once each, results on read-only
calendars can't be selected, and the deletion is confirmed before it runs
([#80]).
### Changed
- **First launch is now a short wizard** instead of a single permission screen.
It counts its steps, each one can be stepped back out of, and beyond granting
calendar access it offers two things worth deciding once: turning on automatic
backup — chosen inline, folder picker and all, since events that live only on
the phone are lost with it — and choosing which view Calendula opens on, with
a live preview of the month, week, day and agenda layouts rather than four
names in a list. Both are skippable, everything chosen is changeable in
Settings afterwards, and the backup step is offered only where nothing
writable is being synced anywhere. Existing installs are not re-onboarded —
revoking and re-granting the calendar permission later does not restart the
wizard ([#163]).
- The one-time notice about calendars switched off for this device is now a step
in the flow rather than a dialog thrown over the app on first open.
### Fixed
- Removed the deprecated `statusBarColor` / `navigationBarColor` theme
attributes the Play Console flags on Android 15 and up, where they no longer
do anything. The launch backdrop now picks its status-bar icons from the
light/dark resource instead, so they stay legible over it either way
([#123]).
## [2.18.1] — 2026-08-06
### Fixed
- Tapping an empty slot in week or day view creates the event at the hour you
tapped, after the timeline has been zoomed. Pinching the day taller or shorter
— or changing **Hour height** in Settings — left the tap still being measured
against the old spacing, so the new event landed at some other hour entirely
([#148]).
## [2.18.0] — 2026-07-31
### Added
@@ -1323,3 +1391,9 @@ automatically, with zero telemetry and no internet permission.
[#57]: https://codeberg.org/jlmakiola/calendula/issues/57
[#56]: https://codeberg.org/jlmakiola/calendula/issues/56
[#114]: https://codeberg.org/jlmakiola/calendula/issues/114
[#148]: https://codeberg.org/jlmakiola/calendula/issues/148
[#68]: https://codeberg.org/jlmakiola/calendula/issues/68
[#80]: https://codeberg.org/jlmakiola/calendula/issues/80
[#123]: https://codeberg.org/jlmakiola/calendula/issues/123
[#163]: https://codeberg.org/jlmakiola/calendula/issues/163
[#164]: https://codeberg.org/jlmakiola/calendula/issues/164

View File

@@ -28,8 +28,8 @@ android {
// which builds this version and then creates the matching vX.Y.Z tag +
// release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 +
// PATCH from versionName, e.g. 2.7.2 -> 20702). See docs/RELEASING.md.
versionCode = 21800
versionName = "2.18.0"
versionCode = 21900
versionName = "2.19.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

View File

@@ -76,6 +76,18 @@ fun TimelineScale.hourHeight(viewportHeight: Dp): Dp = when (this) {
.coerceAtLeast(fillHourHeight(viewportHeight))
}
/**
* The minute of the day a tap [offsetY] px down a timeline column means, snapped
* to the hour it landed in.
*
* [hourPx] must be the hour height the column is drawing at *now* — a tap
* detector that captured it when it was installed maps taps to a pre-pinch grid
* (#148). A zero or negative height (a viewport measured at nothing) has no grid
* to read, so it answers midnight rather than dividing by it.
*/
fun tappedMinuteOfDay(offsetY: Float, hourPx: Float): Int =
if (hourPx <= 0f) 0 else (offsetY / hourPx).toInt().coerceIn(0, 23) * 60
/**
* Shortest an event block may render, as a fraction of an hour. Blocks keep a
* floor so a 15-minute event stays tappable, but the floor scales with the hour

View File

@@ -46,6 +46,7 @@ import androidx.compose.runtime.key
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.snapshotFlow
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
@@ -117,6 +118,7 @@ import de.jeanlucmakiola.calendula.ui.common.formatMinuteOfDay
import de.jeanlucmakiola.calendula.ui.common.GUTTER_WIDTH
import de.jeanlucmakiola.calendula.ui.common.HourGutter
import de.jeanlucmakiola.calendula.ui.common.hourSeparatorLines
import de.jeanlucmakiola.calendula.ui.common.tappedMinuteOfDay
import de.jeanlucmakiola.calendula.ui.week.TimedBlock
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
@@ -623,6 +625,12 @@ private fun DayColumnCard(
LaunchedEffect(blocks, dragController.settling) {
dragController.noteGrid(date, blocks)
}
// The tap detector outlives the composition that installed it — a pinch or a
// Settings change moves the hour height without restarting it — so it reads
// the height and the callback through state handles instead of capturing
// them, or taps land on the scale the column had before the zoom (#148).
val currentHourPx = rememberUpdatedState(hourPx)
val currentOnCreateAt = rememberUpdatedState(onCreateAt)
Card(
// Plain rectangular column — the soft corners come from the outer
// rounded scroll viewport, so inner rounding would look odd at the edges.
@@ -643,8 +651,10 @@ private fun DayColumnCard(
// only fires on the column background. Snaps to the tapped hour.
.pointerInput(date) {
detectTapGestures { offset ->
val hour = (offset.y / hourPx).toInt().coerceIn(0, 23)
onCreateAt(date, hour * 60)
currentOnCreateAt.value(
date,
tappedMinuteOfDay(offset.y, currentHourPx.value),
)
}
},
) {

View File

@@ -2356,7 +2356,12 @@ private fun MonthBar(
text = title,
style = MaterialTheme.typography.labelSmall,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
// No "…" (#164): the chip is narrow enough that the ellipsis costs a
// couple of readable characters. softWrap is off with it — left on,
// a clipped line breaks at the last whole word instead of running to
// the chip's edge, which reads as *less* title, not more.
overflow = TextOverflow.Clip,
softWrap = false,
color = eventInk(fill),
)
}

View File

@@ -52,6 +52,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.snapshotFlow
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
@@ -128,6 +129,7 @@ import de.jeanlucmakiola.calendula.ui.common.GUTTER_CONTENT_START_INSET
import de.jeanlucmakiola.calendula.ui.common.GUTTER_WIDTH
import de.jeanlucmakiola.calendula.ui.common.HourGutter
import de.jeanlucmakiola.calendula.ui.common.hourSeparatorLines
import de.jeanlucmakiola.calendula.ui.common.tappedMinuteOfDay
import de.jeanlucmakiola.calendula.ui.common.rememberCalendarSlideSpec
import de.jeanlucmakiola.calendula.ui.common.next
import de.jeanlucmakiola.floret.time.isoWeekNumber
@@ -771,6 +773,12 @@ private fun DayColumnCard(
LaunchedEffect(blocks, dragController.settling) {
dragController.noteGrid(date, blocks)
}
// The tap detector outlives the composition that installed it — a pinch or a
// Settings change moves the hour height without restarting it — so it reads
// the height and the callback through state handles instead of capturing
// them, or taps land on the scale the column had before the zoom (#148).
val currentHourPx = rememberUpdatedState(hourPx)
val currentOnCreateAt = rememberUpdatedState(onCreateAt)
Card(
// Plain rectangular columns — the soft corners come from the outer
// rounded scroll viewport, so inner rounding would look odd at the edges.
@@ -790,8 +798,10 @@ private fun DayColumnCard(
// blocks are consumed by their own handler first. Snaps to hour.
.pointerInput(date) {
detectTapGestures { offset ->
val hour = (offset.y / hourPx).toInt().coerceIn(0, 23)
onCreateAt(date, hour * 60)
currentOnCreateAt.value(
date,
tappedMinuteOfDay(offset.y, currentHourPx.value),
)
}
},
) {

View File

@@ -491,4 +491,5 @@
<item quantity="many">Importando %d eventos</item>
<item quantity="other">Importando %d eventos</item>
</plurals>
<string name="settings_soften_colors">Armoniza los colores del calendario</string>
</resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="backup_interval_units">
<item>Minutes</item>
<item>Hours</item>
<item>Days</item>
<item>Weeks</item>
</string-array>
</resources>

View File

@@ -126,4 +126,24 @@ class TimelineScaleTest {
assertThat(parseTimelineScale(stored)).isEqualTo(TimelineScale.Regular)
}
}
@Test
fun `a tap creates at the hour it landed in, at whatever scale`() {
// Same point on the same column reads as a different hour once the
// timeline has been pinched — which is the whole of #148: the tap has to
// be measured against the height the column is drawing at now.
assertThat(tappedMinuteOfDay(offsetY = 500f, hourPx = 100f)).isEqualTo(5 * 60)
assertThat(tappedMinuteOfDay(offsetY = 500f, hourPx = 50f)).isEqualTo(10 * 60)
// Within an hour it snaps back to that hour's start.
assertThat(tappedMinuteOfDay(offsetY = 599f, hourPx = 100f)).isEqualTo(5 * 60)
}
@Test
fun `a tap outside the day stays inside it`() {
assertThat(tappedMinuteOfDay(offsetY = -20f, hourPx = 56f)).isEqualTo(0)
assertThat(tappedMinuteOfDay(offsetY = 99_999f, hourPx = 56f)).isEqualTo(23 * 60)
// A viewport measured at nothing has no grid to read — midnight, not a
// division by zero.
assertThat(tappedMinuteOfDay(offsetY = 500f, hourPx = 0f)).isEqualTo(0)
}
}

View File

@@ -0,0 +1,2 @@
إصلاحات
• عرض الأسبوع واليوم: النقر على مساحة فارغة يُنشئ الحدث في الساعة التي نقرت عليها، حتى بعد تكبير شريط الوقت أو تغيير ارتفاع الساعة.

View File

@@ -0,0 +1,6 @@
جديد
• اسحب الحدث لتغيير وقته أو يومه: اضغط عليه مطولاً في عرض الشهر أو الأسبوع أو اليوم ثم أفلته في المكان الجديد. في الأحداث المتكررة يُسأل عن نطاق النقل.
• احذف عدة نتائج بحث دفعة واحدة: اضغط مطولاً على نتيجة لبدء التحديد، ثم احذفها معاً.
تغييرات
• أصبح التشغيل الأول معالجاً قصيراً. يمكنه أيضاً تفعيل النسخ الاحتياطي التلقائي واختيار العرض الافتتاحي، وكلاهما مع معاينة.

View File

@@ -0,0 +1,2 @@
Behoben
• Wochen- und Tagesansicht: Ein Tippen auf einen freien Bereich legt den Termin jetzt zur angetippten Uhrzeit an auch nachdem die Zeitleiste gezoomt oder die Stundenhöhe geändert wurde.

View File

@@ -0,0 +1,6 @@
Neu
• Termine per Drag & Drop verschieben: in der Monats-, Wochen- oder Tagesansicht lange gedrückt halten und zu einer anderen Zeit oder einem anderen Tag ablegen. Bei Serienterminen wird nachgefragt, wofür sie gilt.
• Mehrere Suchergebnisse auf einmal löschen: langer Druck auf einen Treffer startet die Auswahl.
Geändert
• Der erste Start ist jetzt ein kurzer Assistent. Er kann auch die automatische Sicherung einrichten und dich die Startansicht wählen lassen beides mit Vorschau.

View File

@@ -0,0 +1,2 @@
Fixed
• Week and day view: tapping an empty slot now creates the event at the hour you tapped, even after zooming the timeline or changing the hour height.

View File

@@ -0,0 +1,6 @@
New
• Drag an event to reschedule it — press and hold it in month, week or day view and drop it on another time or day. Recurring events ask what the move applies to.
• Delete several search results at once: long-press a hit to start selecting, then delete them in one action.
Changed
• First launch is now a short wizard. It can also set up automatic backup and let you pick the view Calendula opens on, both with previews.

View File

@@ -0,0 +1,2 @@
Fixed
• Week and day view: tapping an empty slot now creates the event at the hour you tapped, even after zooming the timeline or changing the hour height.

View File

@@ -0,0 +1,6 @@
New
• Drag an event to reschedule it — press and hold it in month, week or day view and drop it on another time or day. Recurring events ask what the move applies to.
• Delete several search results at once: long-press a hit to start selecting, then delete them in one action.
Changed
• First launch is now a short wizard. It can also set up automatic backup and let you pick the view Calendula opens on, both with previews.

View File

@@ -0,0 +1,2 @@
Corregido
• Vista de semana y día: al tocar un hueco libre, el evento se crea a la hora que has tocado, incluso después de ampliar la línea de tiempo o cambiar la altura de la hora.

View File

@@ -0,0 +1,6 @@
Novedades
• Arrastra un evento para cambiarlo de hora o de día: mantenlo pulsado en la vista de mes, semana o día y suéltalo donde quieras. En los eventos periódicos se pregunta a qué afecta el cambio.
• Elimina varios resultados de búsqueda a la vez: mantén pulsado un resultado para empezar a seleccionar.
Cambios
• El primer inicio es ahora un breve asistente. También puede activar la copia de seguridad automática y dejarte elegir la vista inicial, ambas con vista previa.

View File

@@ -0,0 +1,2 @@
Corrigé
• Vues Semaine et Jour : appuyer sur un créneau vide crée désormais l'événement à l'heure touchée, même après avoir zoomé sur la grille ou modifié la hauteur d'une heure.

View File

@@ -0,0 +1,6 @@
Nouveautés
• Déplacez un événement par glisser-déposer : appuyez longuement dessus en vue mois, semaine ou jour, puis déposez-le à une autre heure ou un autre jour. Pour un événement récurrent, la portée du déplacement est demandée.
• Supprimez plusieurs résultats de recherche d'un coup : un appui long lance la sélection.
Modifié
• Le premier lancement est désormais un court assistant. Il peut aussi activer la sauvegarde automatique et vous laisser choisir la vue d'ouverture, avec aperçu.

View File

@@ -0,0 +1,2 @@
Corretto
• Vista settimana e giorno: toccando uno spazio libero l'evento viene creato all'ora toccata, anche dopo aver ingrandito la linea temporale o cambiato l'altezza dell'ora.

View File

@@ -0,0 +1,6 @@
Novità
• Trascina un evento per spostarlo a un altro orario o giorno: tienilo premuto nella vista mese, settimana o giorno e rilascialo. Per gli eventi ricorrenti viene chiesto a cosa si applica lo spostamento.
• Elimina più risultati di ricerca in una volta: tieni premuto un risultato per iniziare a selezionare.
Modifiche
• Il primo avvio è ora una breve procedura guidata. Può anche attivare il backup automatico e farti scegliere la vista iniziale, entrambi con anteprima.

View File

@@ -0,0 +1,2 @@
Poprawki
• Widok tygodnia i dnia: dotknięcie pustego miejsca tworzy teraz wydarzenie o dotkniętej godzinie, także po powiększeniu osi czasu lub zmianie wysokości godziny.

View File

@@ -0,0 +1,6 @@
Nowości
• Przeciągnij wydarzenie, aby zmienić jego godzinę lub dzień: przytrzymaj je w widoku miesiąca, tygodnia lub dnia i upuść w nowym miejscu. Przy wydarzeniach cyklicznych pojawi się pytanie, czego dotyczy zmiana.
• Usuwaj wiele wyników wyszukiwania naraz: przytrzymaj wynik, aby rozpocząć zaznaczanie.
Zmiany
• Pierwsze uruchomienie to teraz krótki kreator. Może też włączyć automatyczną kopię zapasową i pozwolić wybrać widok startowy oba z podglądem.

View File

@@ -0,0 +1,6 @@
Novidades
• Arraste um evento para outro horário ou dia: mantenha-o pressionado na visualização de mês, semana ou dia e solte-o onde quiser. Em eventos recorrentes, você escolhe a que a alteração se aplica.
• Exclua vários resultados da busca de uma vez: mantenha um resultado pressionado para começar a selecionar.
Alterações
• A primeira execução agora é um breve assistente. Ele também pode ativar o backup automático e deixar você escolher a visualização inicial, ambos com prévia.

View File

@@ -0,0 +1,2 @@
Corrigido
• Vista de semana e de dia: tocar num espaço livre cria o evento à hora tocada, mesmo depois de ampliar a linha temporal ou alterar a altura da hora.

View File

@@ -0,0 +1,6 @@
Novidades
• Arraste um evento para outra hora ou dia: mantenha-o premido na vista de mês, semana ou dia e largue-o onde quiser. Nos eventos recorrentes, é perguntado a que se aplica a alteração.
• Elimine vários resultados de pesquisa de uma vez: mantenha um resultado premido para começar a selecionar.
Alterações
• O primeiro arranque é agora um breve assistente. Também pode ativar a cópia de segurança automática e deixá-lo escolher a vista inicial, ambas com pré-visualização.

View File

@@ -0,0 +1,2 @@
Исправлено
• Вид недели и дня: нажатие на свободное место создаёт событие на выбранный час — в том числе после масштабирования шкалы времени или изменения высоты часа.

View File

@@ -0,0 +1,6 @@
Новое
• Перетащите событие, чтобы перенести его: удерживайте его в режиме месяца, недели или дня и отпустите на другом времени или дне. Для повторяющихся событий будет предложено выбрать, к чему применить перенос.
• Удаляйте несколько результатов поиска сразу: удержите результат, чтобы начать выделение.
Изменения
• Первый запуск теперь короткий мастер. Он также может включить автоматическое резервное копирование и дать выбрать стартовый вид — и то и другое с предпросмотром.

View File

@@ -0,0 +1,2 @@
修复
• 周视图和日视图:点按空白处会在所点的时间创建事件,即使在缩放时间轴或更改小时高度之后也是如此。

View File

@@ -0,0 +1,6 @@
新增
• 拖动事件即可改期:在月、周或日视图中长按事件,拖到其他时间或日期后放开。重复事件会询问此次移动的适用范围。
• 一次删除多条搜索结果:长按某条结果进入选择模式,然后一并删除。
变更
• 首次启动改为简短的向导。它还可以帮你开启自动备份,并选择打开时显示的视图,两者均有预览。

View File

@@ -1,7 +1,7 @@
[versions]
agp = "9.2.1"
kotlin = "2.3.21"
ksp = "2.3.9"
ksp = "2.3.10"
hilt = "2.59.2"
coreKtx = "1.19.0"
appcompat = "1.7.1"
@@ -19,15 +19,15 @@ truth = "1.4.5"
androidxJunit = "1.3.0"
espressoCore = "3.7.0"
kotlinxDatetime = "0.7.0"
kotlinxCoroutines = "1.10.2"
kotlinxCoroutines = "1.11.0"
turbine = "1.2.1"
hiltNavigationCompose = "1.3.0"
hiltNavigationCompose = "1.4.0"
lifecycleCompose = "2.10.0"
androidxTestRules = "1.7.0"
# Glance: 1.1.1 is the latest stable (1.2.0 is still rc, 1.3.0 alpha).
glance = "1.1.1"
work = "2.10.1"
documentfile = "1.0.1"
documentfile = "1.1.0"
[libraries]
# AndroidX core