12 KiB
12 KiB
Changelog
All notable changes to the YaYa project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.0 - 2026-05-20
Added
Project Foundation
- Kotlin Multiplatform project setup targeting Android and iOS with Compose Multiplatform
- Two-module architecture:
:shared(UI + business logic) and:androidApp(thin Android shell) - AGP 9.2.1, Gradle 9.5.1, Kotlin 2.3.21, JVM target 17
- Compile SDK / target SDK 37, minimum SDK 24
- Version catalog at
gradle/libs.versions.toml - Dynamic version name generation:
baseVersion + git hash + buildDate
Calendar Core Views
- Month View: 6x7 day grid with dynamic row count (4/5/6 weeks) based on actual month shape
- Week View: Single-week horizontal pager activated by collapsing the month view
- Year View: 4x3 mini-month grid with swipe-based year navigation and Hero Zoom transition
- Infinite Paging:
Int.MAX_VALUEvirtual pages centered atInt.MAX_VALUE / 2, enabling boundless month/week/year navigation - ISO 8601 week numbering with Monday as the first day of the week
- Today indicator with border outline; selected-today state uses
primaryContainerfor softer visual treatment - Non-current-month days are grayed out for visual clarity
- Auto-select today (if within range) or first day / Monday on page changes
- Click month header to jump back to today
- Cross-month week selection: intelligently selects the appropriate date based on swipe direction
Collapse / Expand Animation
- Drag-driven month-to-week collapse gesture on the calendar grid
- Spring-based snap animation that auto-settles to the nearest state on release
- Two-phase whole-block slide-up collapse animation with fade-out for non-selected rows
- Dynamic drag range computed from actual visual height change for 1:1 finger tracking
- Fling velocity threshold (800 dp/s) for quick swipe snap
- Collapse threshold set to 8% for easy fold/unfold triggering
- Pull-down gesture to expand from collapsed week view back to month view
- Week pager cross-fade transition to eliminate blank gaps during page switches
Chinese Calendar (Lunar)
- Lunar date display below each day number (using
tyme4kt), showing month name on the first day of each lunar month - Twenty-four solar terms (节气) annotations
- Traditional lunar festivals (春节, 端午, 中秋, etc.)
- Western solar festivals
- Legal holiday and compensatory workday badges (休/班) in the top-right corner
- Priority-based annotation display: legal holidays > lunar festivals > solar terms > solar festivals > lunar day
Personal Shift Scheduling
ShiftPatterndata model with anchor date + cyclic sequence for periodic work/rest schedules- Independent from public holidays
- Work/Rest capsule badge display on DayCell
- Configurable legal holiday overlay toggle (default off)
- Shift status tips in the bottom card
Visual Design & Animations
- Material 3 dynamic color scheme
- System dark theme support with automatic light/dark
ColorSchemeswitching - DayCell circular reveal animation with
updateTransitionfor smooth state transitions - Month header slide + fade transition when month/week number changes
- Page fade-in/fade-out transitions on CalendarPager and WeekPager
- GIF elastic entrance animation on switch
- 152 GIF assets displayed randomly based on selected date seed
- Custom app icon resources for all densities and platforms (PNG + WebP)
Bottom Card
- Draggable bottom info card with drag handle
- Selected date relative day description (今天, 昨天, 明天, N天前/后)
- Gregorian and lunar date details
- Shift status tips (WORK / OFF)
- Random GIF display (140dp height)
Navigation & Pages
- About screen with app icon, name, dynamic version, and open-source license entry
- Licenses screen listing all third-party dependency licenses
- Floating Action Button (FAB) with zoom-animated menu and scrim close
- Page navigation with direction-aware slide + fade transitions
- Android 13+ Predictive Back gesture with follow-finger displacement/scale animation
- BackHandler expect/actual for cross-platform back gesture interception
Performance Optimizations
ComposeTracecross-platform trace markers for Perfetto / Systrace analysisgraphicsLayer(translationY)replacingoffset(Dp)to avoid per-frame layout passes- SolarDay static cache to eliminate repeated object creation during pager switches
- MiniMonth pure Canvas rendering: eliminated 96 Text component measurement overhead
- Year view / month view coexistence in composition tree with
Modifier.alphacontrol (avoiding whole-tree destruction) - Precomputed dp-to-px conversions and TextLayoutResult caches
- Pager cache optimized (
beyondViewportPageCount = 0)
Build & Testing
- R8 code shrinking and resource optimization with ProGuard rules
- ABI filtering (
arm64-v8a,armeabi-v7a) - App Bundle language/density/ABI splits
- Unit tests for
CalendarViewModel,CalendarUtils, andShiftPattern kotlinx-coroutines-testfor coroutine-based ViewModel testing- ComposeTrace host test fallback (silently ignores when Trace API is not stubbed)
Documentation
CLAUDE.mdwith project architecture, conventions, and build commandsDEVELOPMENT.mdwith setup, build, test, and Perfetto trace analysis guideCOMMENTS.mdwith commenting and KDoc conventionsREADME.mdwith feature overview and tech stack
Changed
- Row padding increased from 4dp to 6dp for better touch targets
- Selected-state animation duration reduced from 250ms to 150ms for snappier feedback
- Weekday header moved out of pager to remain fixed across page swipes
- Card gap spacing animates with collapse progress (24dp expanded → 12dp collapsed)
- Year view title bar displays lunar干支+生肖 year (e.g., 「丙午马年」) with a "今年" button for quick return
- FAB fixed to bottom-left of screen instead of tracking BottomCard height
- Menu scrim changed to fully transparent without fade animation
Fixed
- First-frame flicker by deferring row height until measured
- Calendar height jitter when collapsing to week view
- Swipe interpolation discontinuity during month transitions
- Collapse drag not tracking finger (now uses dynamic dragRange)
- BottomCard positioning during collapse animation
- Flash when expanding after navigating months in collapsed state
- Week number baseline alignment stability during AnimatedContent transitions
- Year view stale year display on enter
- Year view missing scale animation on first launch
- "Today" button title bar jitter: replaced conditional rendering with alpha fade
- Folded state cross-month date not grayed out in week view
- Theme switching transparency issues by adding explicit background colors
- Predictive back gesture failure and end-of-animation flash on certain devices
- Back animation residual transition eliminated with
snapTo - Icon colors now adapt to
MaterialThemeinstead of hardcoded white
Removed
- MonthHeader click-to-toggle-year-view (replaced by FAB menu)
- Year view arrow navigation (replaced by swipe gesture)
- Shift badge background circle for lighter visual weight
- Default ripple effect on DayCell (replaced by circular reveal animation)
- Aliyun Maven mirrors (switched back to Maven Central / Google)
- Unused Compose runtime ProGuard keep rules
1.1.0 - 2026-06-02
Added
Date Checker Tool
- New "Date Checker" tool page accessible from FAB → Tools menu for tracking item expiration dates
- Swipe-to-delete with animated removal and staggered enter/exit animations
- Expired status display with visual indicators
- Auto-scroll and highlight animation for new entries
Tools Page
- New "Tools" entry in FAB menu linking to a dedicated tools landing page
- Date Checker as the first tool module
Theme & Visual
YaYaThemeintroduced and applied to all Activities for unified theming- Legal holiday badges now display with colored background and continuous edge rounded corners
- Holiday badge wave-scale entrance animation
- Personal shift badges redesigned with light circle background + centered text
- Shift badge circular base to avoid overlapping with selection ring
Year ↔ Month View Transition
- BottomCard slide-in animation and fade effect during year/month view transitions
- Month→year view no longer forces collapse state to expand
Performance
- LunarCache LRU cache for lunar/solar term calculations with startup pre-computation
- Macrobenchmark module with automated Baseline Profile generation
- Baseline Profile covering date checker, shift settings, tools page, and core calendar scenarios
ComposeTracecross-platform trace markers for Perfetto/Systrace- SolarDay static cache to eliminate repeated object creation
- MiniMonth pure Canvas rendering eliminating 96 Text measurement overhead
graphicsLayer(translationY)replacingoffset(Dp)to avoid layout passes- Aggregated
CalendarUiStateto reduce Compose recomposition rememberstabilization for lambdas and computations- Scene-based
profile.shwith--allbatch mode for 15 automated trace scenarios - Perfetto trace analysis script (
analyze-trace.sh) - Trace build type for release + retained trace markers
Build & Tooling
- Spotless 8.5.1 code formatter with ktlint integration
.editorconfigfor ktlint Composable function naming rules- Dependency update checker and auto-upgrade tool integration
app_iconshrunk to 512×512 and converted to WebP (446KB savings)- 152 GIF assets batch-converted to animated WebP format
uiToolingmoved todebugImplementation; unused@Previewandkotlin-testentries removedsketchlibrary for GIF/WebP display (sketch-compose+sketch-animated-webp)- PowerShell performance tracing script (
profile.ps1)
Documentation
- Comprehensive
AGENTS.mdat every directory level (root, app, core, scripts, etc.) - Updated
DEVELOPMENT.mdwith Perfetto trace analysis and emulator launch commands - Updated
CLAUDE.mdto reflect pure Android project structure
Changed
- Project migrated from Kotlin Multiplatform (KMP/CMP) to pure Android (
:app+:core) - All Compose UI and business logic consolidated into
:coremodule;:appremains a thin shell - Removed KMP/CMP plugins, iOS app module, and
:sharedmodule androidAppmodule renamed toapp- Collapse animation refactored: removed fling velocity threshold, now spring-driven
CalendarPager↔WeekPagerswitching usesAnimatedContentfor smooth crossfade- Year view page year calculation uses
settledPageto prevent flicker during swipe - ViewModel decoupled from Compose runtime, migrated to
StateFlow LunarCachemade injectable with extracted repeated computations- MenuItem and ToolItem unified to use
Card(onClick)pattern - Holiday badge null checks simplified to Elvis operator
@Suppressannotations cleaned up with deprecated API replacements- Removed unnecessary P0 code (custom combine, dead StateFlow, duplicate grid algorithms, runBlocking)
- Removed debug logging from LicensesScreen and BottomCard
Fixed
- Lunar first-day month name no longer appends redundant "月" suffix
- Year view stale year display on enter
- Year view page year flicker during swipe transitions
- Collapse animation flicker when switching between CalendarPager and WeekPager
- Folded state cross-month dates not grayed out in week view
- Date checker swipe-to-delete state misalignment and deprecation warning
- Shared element transition animation loss after year view page change
- Night mode theme transparency issues with explicit background colors
- Predictive back gesture failure and end-of-animation flash on certain devices
- Back animation residual transition eliminated with
snapTo - Fast swipe collapse/expand failure, now uses progress threshold detection
graphicsLayeroptimization reverted due to excessive GPU compositing overhead on real devices- Reverted shared element transitions in favor of zoom + fade animation
Removed
- iOS app module (
iosApp/) and all related Xcode project files :sharedmodule andshared/build.gradle.kts- Shared element transition animations (replaced by zoom + fade)
- Year/month scroll wheel picker with haptic feedback (reverted)
- Aliyun Maven mirrors (switched to Maven Central / Google)
- Unused Compose runtime ProGuard keep rules
- Temporary performance monitoring logs (trace markers retained)
[Unreleased]
- No unreleased changes at this time.