yayacal/CHANGELOG.md
2026-06-02 13:29:41 +08:00

12 KiB
Raw Blame History

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_VALUE virtual pages centered at Int.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 primaryContainer for 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

  • ShiftPattern data 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 ColorScheme switching
  • DayCell circular reveal animation with updateTransition for 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

  • ComposeTrace cross-platform trace markers for Perfetto / Systrace analysis
  • graphicsLayer(translationY) replacing offset(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.alpha control (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, and ShiftPattern
  • kotlinx-coroutines-test for coroutine-based ViewModel testing
  • ComposeTrace host test fallback (silently ignores when Trace API is not stubbed)

Documentation

  • CLAUDE.md with project architecture, conventions, and build commands
  • DEVELOPMENT.md with setup, build, test, and Perfetto trace analysis guide
  • COMMENTS.md with commenting and KDoc conventions
  • README.md with 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 MaterialTheme instead 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

  • YaYaTheme introduced 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
  • ComposeTrace cross-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) replacing offset(Dp) to avoid layout passes
  • Aggregated CalendarUiState to reduce Compose recomposition
  • remember stabilization for lambdas and computations
  • Scene-based profile.sh with --all batch 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
  • .editorconfig for ktlint Composable function naming rules
  • Dependency update checker and auto-upgrade tool integration
  • app_icon shrunk to 512×512 and converted to WebP (446KB savings)
  • 152 GIF assets batch-converted to animated WebP format
  • uiTooling moved to debugImplementation; unused @Preview and kotlin-test entries removed
  • sketch library for GIF/WebP display (sketch-compose + sketch-animated-webp)
  • PowerShell performance tracing script (profile.ps1)

Documentation

  • Comprehensive AGENTS.md at every directory level (root, app, core, scripts, etc.)
  • Updated DEVELOPMENT.md with Perfetto trace analysis and emulator launch commands
  • Updated CLAUDE.md to 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 :core module; :app remains a thin shell
  • Removed KMP/CMP plugins, iOS app module, and :shared module
  • androidApp module renamed to app
  • Collapse animation refactored: removed fling velocity threshold, now spring-driven
  • CalendarPagerWeekPager switching uses AnimatedContent for smooth crossfade
  • Year view page year calculation uses settledPage to prevent flicker during swipe
  • ViewModel decoupled from Compose runtime, migrated to StateFlow
  • LunarCache made injectable with extracted repeated computations
  • MenuItem and ToolItem unified to use Card(onClick) pattern
  • Holiday badge null checks simplified to Elvis operator
  • @Suppress annotations 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
  • graphicsLayer optimization 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
  • :shared module and shared/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.