Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0132201cf9 | |||
| b792ddc2f0 | |||
| 440fa57161 | |||
|
|
00b5aeaac7 |
19
CHANGELOG.md
19
CHANGELOG.md
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.2.1] — 2026-06-09
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Regenerated the F-Droid catalog `icon.png` (512x512, both locales) so it
|
||||||
|
is pixel-faithful to the on-device adaptive launcher icon: same slate
|
||||||
|
background (`#5C6B7A`), off-white mark (`#FAF6F0`), and the foreground
|
||||||
|
group transform (`scale 0.5`, pivot `114,108`, translate `2,8`) baked in.
|
||||||
|
- Added `design/icon/calendula_launcher.svg` — the composed full-bleed
|
||||||
|
icon (background + transformed mark) as the single source of truth for
|
||||||
|
store/F-Droid renders.
|
||||||
|
|
||||||
## [0.2.0] — 2026-06-08
|
## [0.2.0] — 2026-06-08
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -19,6 +30,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Unit-Tests für Cursor-Mapping (alle §8-Defensiv-Cases), Repository-Flows mit Turbine, DataStore round-trip
|
- Unit-Tests für Cursor-Mapping (alle §8-Defensiv-Cases), Repository-Flows mit Turbine, DataStore round-trip
|
||||||
- Instrumented smoke test against the real CalendarContract provider
|
- Instrumented smoke test against the real CalendarContract provider
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Redesigned launcher icon: line-art calendar with a stylized "1" inside
|
||||||
|
(kalendae reference) and a small calendula bloom badge in the
|
||||||
|
bottom-right corner. Replaces the simple "1"-only foreground from
|
||||||
|
v0.1.0. Source SVG checked in at `design/icon/calendula_mark.svg`,
|
||||||
|
also used to regenerate the F-Droid catalog `icon.png` (512x512)
|
||||||
|
per locale.
|
||||||
|
|
||||||
## [0.1.1] — 2026-06-08
|
## [0.1.1] — 2026-06-08
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ private fun SuccessContent(state: DebugUiState.Success) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
items(state.calendars, key = { it.id }) { CalendarRow(it) }
|
items(state.calendars, key = { "cal-${it.id}" }) { CalendarRow(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
item { Spacer(Modifier.height(16.dp)) }
|
item { Spacer(Modifier.height(16.dp)) }
|
||||||
@@ -111,7 +111,12 @@ private fun SuccessContent(state: DebugUiState.Success) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
items(state.nextEvents, key = { it.instanceId }) { EventRow(it) }
|
items(
|
||||||
|
state.nextEvents,
|
||||||
|
// Recurring events share Instances._ID across occurrences, so
|
||||||
|
// include the start instant to keep the LazyColumn key unique.
|
||||||
|
key = { "evt-${it.instanceId}-${it.start.toEpochMilliseconds()}" },
|
||||||
|
) { EventRow(it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,95 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Calendula launcher icon foreground.
|
||||||
|
|
||||||
|
Converted from design/icon/calendula_mark.svg (232x232 viewport).
|
||||||
|
Composition: rounded line-art calendar with a stylized "1" inside
|
||||||
|
(referencing kalendae, the Latin word for the first day of the month
|
||||||
|
that is the etymological root of both "calendar" and "calendula"),
|
||||||
|
plus a small Calendula bloom as a badge in the bottom-right corner.
|
||||||
|
|
||||||
|
Strokes render in off-white (#FAF6F0) over the slate background
|
||||||
|
drawable (drawable/ic_launcher_background.xml = @color/ic_launcher_background).
|
||||||
|
The same vector is reused as the <monochrome> slot in the adaptive icon
|
||||||
|
so Android 13+ themed-icon launchers can recolor it from wallpaper.
|
||||||
|
-->
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="108dp"
|
android:width="108dp"
|
||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="108"
|
android:viewportWidth="232"
|
||||||
android:viewportHeight="108">
|
android:viewportHeight="232">
|
||||||
<!--
|
<!--
|
||||||
Stylized "1" centered in the 108x108 viewport.
|
Android adaptive icon spec: 108dp canvas.
|
||||||
Reference: kalendae (the first day of the month) - etymological root
|
|
||||||
of both "Calendar" and "Calendula".
|
Centering Logic:
|
||||||
Color is off-white for high contrast on the slate background.
|
- The calendar body is a 142x142 square centered at (114, 108).
|
||||||
|
- The viewport center is (116, 116).
|
||||||
|
- We use pivot (114, 108) and translate by (2, 8) to align the
|
||||||
|
calendar's geometric center perfectly with the canvas center,
|
||||||
|
ignoring the visual weight of the bloom badge.
|
||||||
|
|
||||||
|
Scale:
|
||||||
|
- Scaled by 0.50 to provide significant padding, preventing a
|
||||||
|
"zoomed in" look on home screens and splash screens.
|
||||||
-->
|
-->
|
||||||
|
<group
|
||||||
|
android:pivotX="114"
|
||||||
|
android:pivotY="108"
|
||||||
|
android:scaleX="0.50"
|
||||||
|
android:scaleY="0.50"
|
||||||
|
android:translateX="2"
|
||||||
|
android:translateY="8">
|
||||||
|
<!-- Calendar body (rounded square with horizontal header divider) -->
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="12"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeLineJoin="round"
|
||||||
|
android:strokeMiterLimit="12"
|
||||||
|
android:pathData="M43,69H185M185,115V63C185,48.64 173.359,37 159,37H69C54.64,37 43,48.64 43,63V153C43,167.359 54.64,179 69,179H124" />
|
||||||
|
<!-- Numeral "1" inside the calendar body -->
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="12"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeLineJoin="round"
|
||||||
|
android:pathData="M103,110L113.999,99V142.428" />
|
||||||
|
<!-- Calendula bloom: 8 petals around a filled center -->
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M163.072,136.714C163.072,142.886 168.214,153.429 170.786,157.929C173.357,153.429 178.5,142.886 178.5,136.714C178.5,130.543 173.357,129 170.786,129C168.214,129 163.072,130.543 163.072,136.714Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M178.5,186.857C178.5,180.686 173.357,170.143 170.786,165.643C168.214,170.143 163.072,180.686 163.072,186.857C163.072,193.029 168.214,194.572 170.786,194.572C173.357,194.572 178.5,193.029 178.5,186.857Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M195.857,154.072C189.686,154.072 179.143,159.214 174.643,161.786C179.143,164.357 189.686,169.5 195.857,169.5C202.029,169.5 203.572,164.357 203.572,161.786C203.572,159.214 202.029,154.072 195.857,154.072Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M145.714,170.008C151.886,170.008 162.429,164.865 166.929,162.294C162.429,159.722 151.886,154.58 145.714,154.58C139.543,154.58 138,159.722 138,162.294C138,164.865 139.543,170.008 145.714,170.008Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M194.768,174.858C190.404,170.494 179.312,166.676 174.312,165.312C175.676,170.312 179.494,181.404 183.858,185.768C188.222,190.132 192.949,187.586 194.768,185.768C196.586,183.949 199.132,179.222 194.768,174.858Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M146.804,149.222C151.168,153.586 162.259,157.404 167.26,158.768C165.896,153.767 162.077,142.676 157.714,138.312C153.35,133.948 148.622,136.494 146.804,138.312C144.986,140.13 142.44,144.858 146.804,149.222Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M183.858,138.312C179.494,142.676 175.676,153.767 174.312,158.768C179.312,157.404 190.404,153.586 194.768,149.222C199.132,144.858 196.586,140.13 194.768,138.312C192.949,136.494 188.222,133.948 183.858,138.312Z" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#FFFAF6F0"
|
||||||
|
android:strokeWidth="8"
|
||||||
|
android:pathData="M157.714,185.768C162.077,181.404 165.896,170.312 167.26,165.312C162.259,166.676 151.168,170.494 146.804,174.858C142.44,179.222 144.986,183.949 146.804,185.768C148.622,187.586 153.35,190.132 157.714,185.768Z" />
|
||||||
|
<!-- Calendula center disc -->
|
||||||
<path
|
<path
|
||||||
android:fillColor="#FFFAF6F0"
|
android:fillColor="#FFFAF6F0"
|
||||||
android:pathData="M51.5,38 L51.5,38 C49.5,40 46.5,41.5 43,42.5 L43,49 C46.2,48.2 49,47 51.5,45.5 L51.5,72 L43.5,72 L43.5,76 L65.5,76 L65.5,72 L57.5,72 L57.5,38 Z" />
|
android:pathData="M170.786,169C174.77,169 178,165.77 178,161.786C178,157.802 174.77,154.572 170.786,154.572C166.802,154.572 163.572,157.802 163.572,161.786C163.572,165.77 166.802,169 170.786,169Z" />
|
||||||
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
34
design/icon/calendula_launcher.svg
Normal file
34
design/icon/calendula_launcher.svg
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<svg width="232" height="232" viewBox="0 0 232 232" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<!--
|
||||||
|
Composed Calendula launcher icon (full-bleed), generated to exactly match the
|
||||||
|
Android adaptive icon defined by:
|
||||||
|
- drawable/ic_launcher_background.xml (solid @color/ic_launcher_background = #5C6B7A)
|
||||||
|
- drawable/ic_launcher_foreground.xml (off-white #FAF6F0 mark from calendula_mark.svg)
|
||||||
|
|
||||||
|
The adaptive foreground group transform (scaleX/Y=0.50, pivot 114,108,
|
||||||
|
translate 2,8) is reproduced here as the SVG transform "translate(59,62) scale(0.5)"
|
||||||
|
because Android applies it as: p' = scale*p + pivot*(1-scale) + translate
|
||||||
|
x' = 0.5*x + 114*0.5 + 2 = 0.5*x + 59
|
||||||
|
y' = 0.5*y + 108*0.5 + 8 = 0.5*y + 62
|
||||||
|
|
||||||
|
This is the single source of truth for the F-Droid / store icon.png renders.
|
||||||
|
-->
|
||||||
|
<rect x="0" y="0" width="232" height="232" fill="#5C6B7A"/>
|
||||||
|
<g transform="translate(59,62) scale(0.5)" fill="none" stroke="#FAF6F0">
|
||||||
|
<!-- Calendar body (rounded square with horizontal header divider) -->
|
||||||
|
<path d="M43 69H185M185 115V63C185 48.64 173.359 37 159 37H69C54.64 37 43 48.64 43 63V153C43 167.359 54.64 179 69 179H124" stroke-width="12" stroke-miterlimit="12" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<!-- Numeral "1" inside the calendar body -->
|
||||||
|
<path d="M103 110L113.999 99V142.428" stroke-width="12" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<!-- Calendula bloom: 8 petals around a filled center -->
|
||||||
|
<path d="M163.072 136.714C163.072 142.886 168.214 153.429 170.786 157.929C173.357 153.429 178.5 142.886 178.5 136.714C178.5 130.543 173.357 129 170.786 129C168.214 129 163.072 130.543 163.072 136.714Z" stroke-width="8"/>
|
||||||
|
<path d="M178.5 186.857C178.5 180.686 173.357 170.143 170.786 165.643C168.214 170.143 163.072 180.686 163.072 186.857C163.072 193.029 168.214 194.572 170.786 194.572C173.357 194.572 178.5 193.029 178.5 186.857Z" stroke-width="8"/>
|
||||||
|
<path d="M195.857 154.072C189.686 154.072 179.143 159.214 174.643 161.786C179.143 164.357 189.686 169.5 195.857 169.5C202.029 169.5 203.572 164.357 203.572 161.786C203.572 159.214 202.029 154.072 195.857 154.072Z" stroke-width="8"/>
|
||||||
|
<path d="M145.714 170.008C151.886 170.008 162.429 164.865 166.929 162.294C162.429 159.722 151.886 154.58 145.714 154.58C139.543 154.58 138 159.722 138 162.294C138 164.865 139.543 170.008 145.714 170.008Z" stroke-width="8"/>
|
||||||
|
<path d="M194.768 174.858C190.404 170.494 179.312 166.676 174.312 165.312C175.676 170.312 179.494 181.404 183.858 185.768C188.222 190.132 192.949 187.586 194.768 185.768C196.586 183.949 199.132 179.222 194.768 174.858Z" stroke-width="8"/>
|
||||||
|
<path d="M146.804 149.222C151.168 153.586 162.259 157.404 167.26 158.768C165.896 153.767 162.077 142.676 157.714 138.312C153.35 133.948 148.622 136.494 146.804 138.312C144.986 140.13 142.44 144.858 146.804 149.222Z" stroke-width="8"/>
|
||||||
|
<path d="M183.858 138.312C179.494 142.676 175.676 153.767 174.312 158.768C179.312 157.404 190.404 153.586 194.768 149.222C199.132 144.858 196.586 140.13 194.768 138.312C192.949 136.494 188.222 133.948 183.858 138.312Z" stroke-width="8"/>
|
||||||
|
<path d="M157.714 185.768C162.077 181.404 165.896 170.312 167.26 165.312C162.259 166.676 151.168 170.494 146.804 174.858C142.44 179.222 144.986 183.949 146.804 185.768C148.622 187.586 153.35 190.132 157.714 185.768Z" stroke-width="8"/>
|
||||||
|
<!-- Calendula center disc (filled, matches foreground <fillColor> slot) -->
|
||||||
|
<path d="M170.786 169C174.77 169 178 165.77 178 161.786C178 157.802 174.77 154.572 170.786 154.572C166.802 154.572 163.572 157.802 163.572 161.786C163.572 165.77 166.802 169 170.786 169Z" fill="#FAF6F0" stroke="none"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |
13
design/icon/calendula_mark.svg
Normal file
13
design/icon/calendula_mark.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<svg width="232" height="232" viewBox="0 0 232 232" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M43 69H185M185 115V63C185 48.64 173.359 37 159 37H69C54.64 37 43 48.64 43 63V153C43 167.359 54.64 179 69 179H124" stroke="black" stroke-width="12" stroke-miterlimit="12" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M103 110L113.999 99V142.428" stroke="black" stroke-width="12" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M163.072 136.714C163.072 142.886 168.214 153.429 170.786 157.929C173.357 153.429 178.5 142.886 178.5 136.714C178.5 130.543 173.357 129 170.786 129C168.214 129 163.072 130.543 163.072 136.714Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M178.5 186.857C178.5 180.686 173.357 170.143 170.786 165.643C168.214 170.143 163.072 180.686 163.072 186.857C163.072 193.029 168.214 194.572 170.786 194.572C173.357 194.572 178.5 193.029 178.5 186.857Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M195.857 154.072C189.686 154.072 179.143 159.214 174.643 161.786C179.143 164.357 189.686 169.5 195.857 169.5C202.029 169.5 203.572 164.357 203.572 161.786C203.572 159.214 202.029 154.072 195.857 154.072Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M145.714 170.008C151.886 170.008 162.429 164.865 166.929 162.294C162.429 159.722 151.886 154.58 145.714 154.58C139.543 154.58 138 159.722 138 162.294C138 164.865 139.543 170.008 145.714 170.008Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M194.768 174.858C190.404 170.494 179.312 166.676 174.312 165.312C175.676 170.312 179.494 181.404 183.858 185.768C188.222 190.132 192.949 187.586 194.768 185.768C196.586 183.949 199.132 179.222 194.768 174.858Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M146.804 149.222C151.168 153.586 162.259 157.404 167.26 158.768C165.896 153.767 162.077 142.676 157.714 138.312C153.35 133.948 148.622 136.494 146.804 138.312C144.986 140.13 142.44 144.858 146.804 149.222Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M183.858 138.312C179.494 142.676 175.676 153.767 174.312 158.768C179.312 157.404 190.404 153.586 194.768 149.222C199.132 144.858 196.586 140.13 194.768 138.312C192.949 136.494 188.222 133.948 183.858 138.312Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M157.714 185.768C162.077 181.404 165.896 170.312 167.26 165.312C162.259 166.676 151.168 170.494 146.804 174.858C142.44 179.222 144.986 183.949 146.804 185.768C148.622 187.586 153.35 190.132 157.714 185.768Z" stroke="black" stroke-width="8"/>
|
||||||
|
<path d="M170.786 169C174.77 169 178 165.77 178 161.786C178 157.802 174.77 154.572 170.786 154.572C166.802 154.572 163.572 157.802 163.572 161.786C163.572 165.77 166.802 169 170.786 169Z" fill="black" stroke="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 16 KiB |
13
gradle/gradle-daemon-jvm.properties
Normal file
13
gradle/gradle-daemon-jvm.properties
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#This file is generated by updateDaemonJvm
|
||||||
|
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/491f83666ae7f4d6ebb28fee72ebb035/redirect
|
||||||
|
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/0d1a1acdc708062093673f65aa9aba4b/redirect
|
||||||
|
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/491f83666ae7f4d6ebb28fee72ebb035/redirect
|
||||||
|
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/0d1a1acdc708062093673f65aa9aba4b/redirect
|
||||||
|
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7083b89563e7ce20943037b8cd2b8cc2/redirect
|
||||||
|
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/060bbb778a1f55ea705fdebd2ccfeab9/redirect
|
||||||
|
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/491f83666ae7f4d6ebb28fee72ebb035/redirect
|
||||||
|
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/0d1a1acdc708062093673f65aa9aba4b/redirect
|
||||||
|
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/d09679dc60fe5aa05ef7d03efdefac20/redirect
|
||||||
|
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/ed4e3bf2f5e7c5d9aabc4cbd8acd555e/redirect
|
||||||
|
toolchainVendor=JETBRAINS
|
||||||
|
toolchainVersion=21
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[versions]
|
[versions]
|
||||||
agp = "9.1.1"
|
agp = "9.2.1"
|
||||||
kotlin = "2.3.21"
|
kotlin = "2.3.21"
|
||||||
ksp = "2.3.9"
|
ksp = "2.3.9"
|
||||||
hilt = "2.59.2"
|
hilt = "2.59.2"
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ pluginManagement {
|
|||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
plugins {
|
||||||
|
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
|
||||||
|
}
|
||||||
|
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
|
|||||||
Reference in New Issue
Block a user