Apply same alignment fix as charges screen - use equal weight
distribution for summary items.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use equal weight distribution for summary items so they align
properly on the left, with room to expand on the right.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace AttachMoney icon with Paid (coin) icon for consistency
- Add currency symbol to Cost stats card (total and per kWh)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fetch currency from settings and display it with the cost value
in the charge detail header card.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Display cost prominently alongside energy added in the LocationHeaderCard,
on the right side of the same row for easy comparison.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add exteriorColor parameter to navigation routes
- Propagate exteriorColor from Dashboard to all screens
- Update ChargesScreen SummaryCard to use car color palette
- Update DrivesScreen SummaryCard to use car color palette
- Update BatteryScreen cards (Capacity, Degradation, Range) to use palette
- Update MileageScreen YearlyChartCard and SummaryRow to use palette
- Update DateFilterChips on Charges/Drives screens to use palette
- Detail screens now receive exteriorColor for future use
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The base theme now uses cool grey colors instead of Tesla red,
so all screens have a consistent neutral look that doesn't clash
with the car-specific battery card palette.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add CarColorPalette with per-car-color theming
- Disable Material You dynamic colors (use app theme only)
- Battery card now adapts to car exterior color
- Light mode: White uses warm grey, Black uses darker grey
- Dark mode: Blue-grey for white, warm brown for black
- Semantic colors (green/orange/red) remain fixed for status
- Add palette preview screen for debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add NominatimApi for OpenStreetMap reverse geocoding
- Add GeocodingRepository with caching to avoid repeated API calls
- Update DashboardViewModel to fetch address when geofence is null
- Display resolved address in LocationCard (priority: geofence > address > coordinates)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dashboard location card: opens geo: URI at car coordinates
- Drive detail map: opens Google Maps with route from start to end
- Charge detail map: opens geo: URI at charge location
- Dashboard now shows coordinates when car is not at a saved location
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Entire location card is now clickable to open default maps app
- Show coordinates when car is not at a saved location (geofence)
- Small map preview is also tappable
- Location card now shows even without a geofence name
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Moved status row (state, lock, temperatures) from TopAppBar to BatteryCard
- TopAppBar now only shows car name and settings icon
- Added top padding to status row inside card
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increased car image height from 160dp to 210dp
- Added 4dp spacing between car name and status indicators row
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Status icon now changes based on state:
- Plug icon when charging/plugged
- Green dot when online
- Bedtime icon when asleep/suspended/offline
- Battery card now has fixed height (no layout shift when charging)
- Progress bar always visible (blue when idle, green when charging)
- Reduced car image height from 200dp to 160dp
- Reduced top padding in battery card
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Document all compositor API details, color/wheel mappings, gotchas,
and lookup tables for future maintenance when Tesla changes their API.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update fetch_tesla_assets.py to use both old and new compositor APIs
- Add Highland Model 3 (m3h, m3hp) and Juniper Model Y (myj) support
- Remove invalid placeholder images for non-existent color/wheel combos
- Update CarImageResolver with proper model variant detection
- Add trimBadging parameter to detect Performance variants
- Download 63 valid images (down from 80 with placeholders)
Compositor endpoints:
- Old: /v1/compositor/ for legacy Model 3/Y (pre-2024/2025)
- New: /configurator/compositor for Highland/Juniper with $-prefixed options
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move status indicators (state, lock, temps) to top bar under car name
- Integrate car image into battery card at the top
- Make battery percentage smaller (headlineMedium instead of displaySmall)
- Enlarge car image (200dp height)
- Consolidate range and limit display into compact row
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add 3D car image, charge details, dark mode to feature list
- Add osmdroid to tech stack
- Document fetch_tesla_assets.py utility script
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Display Tesla car renders that match the vehicle's actual configuration
(model, color, wheels) based on data from TeslamateAPI.
- Add CarExterior model to parse exterior_color, wheel_type from API
- Create CarImageResolver to map TeslamateAPI values to compositor codes
- Download 80 pre-rendered car images (Model 3 & Y, 10 colors, various wheels)
- Add Python asset fetching script using Tesla compositor API
- Display car image at top of dashboard
The car image is dynamically selected based on:
- Model (3, Y)
- Exterior color (MidnightSilver -> PMNG, etc.)
- Wheel type (Pinwheel18CapKit -> W38B, etc.)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add signing configuration using debug keystore to enable
building signed release APKs for sideloading and testing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a detailed view for charge sessions similar to drive details:
- Location header with address, date/time, duration, and energy summary
- OpenStreetMap showing charge location
- Stats sections: Energy, Battery, Power, Charger (voltage/current), Temperature, Cost
- Charts: Power, Voltage, Current, Temperature, and Battery Level profiles
- Update ChargeModels to match actual API response structure
- Add navigation from charges list to charge detail
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add TpmsDetails model for tire pressure data from API
- Display tire pressures in Vehicle Info card with visual layout
- Show FL/FR/RL/RR pressures with car icon in center
- Highlight tire pressures in warning color when TPMS warning active
- Fix dashboard startup race condition that briefly showed error
- Show loading screen while car status loads after cars list
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace "remaining" text with clock icon for time display
- Add kWh added in the middle of the charging info row
- Remove separate ChargingCard as battery card now has all charging info
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Show horizontal progress bar only when car is charging
- Solid green for current charge level
- Dimmed green for area between current level and charge limit
- Display charging power (kW) and time remaining below the bar
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add DriveDetailScreen with OpenStreetMap route visualization
- Show drive statistics: speed, power, battery, elevation, temperature
- Add interactive charts for speed, power, battery, and elevation profiles
- Fix DriveModels to match API response structure (drive_details field)
- Add small location map to dashboard Location card
- Make dashboard quick link cards fill horizontal space equally
- Add osmdroid dependency for OpenStreetMap integration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Units data class with unit_of_length, unit_of_pressure, unit_of_temperature
- Update repository to return CarStatusWithUnits containing both status and units
- Create UnitFormatter utility for metric/imperial conversions (distance, temp, pressure, speed, efficiency)
- Update DashboardScreen to use UnitFormatter for temperature, range, and odometer display
- Update ViewModels to pass units through state
The app now respects TeslamateApi's unit configuration (km/mi, °C/°F, bar/psi)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The '%' after battery level was being interpreted as a format specifier
by .format(), causing MissingFormatArgumentException crash
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Level 1: Year overview with lifetime totals and yearly bar chart
- Level 2: Year detail with monthly breakdown (slides in on year tap)
- Level 3: Month detail with daily breakdown (existing, unchanged)
- Add YearlyMileage data class and aggregateByYear function
- Update ViewModel state to track selectedYear separately from selectedMonth
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use OffsetDateTime to parse dates with timezone offsets (+01:00)
- Fix distance JSON field name from 'distance' to 'odometer_distance'
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add MileageViewModel with drive data aggregation by year/month/day
- Add MileageScreen with summary stats, bar chart, and month list
- Add month detail overlay with daily breakdown and trip list
- Add Mileage quick link to Dashboard navigation
- Support year selection and pull-to-refresh
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create BatteryViewModel and BatteryScreen with health overview
- Show capacity (original vs current), rated efficiency
- Display estimated degradation percentage with progress bar
- Show capacity loss in kWh and percentage
- Display range (new vs current) and range loss
- Add Battery Detail screen overlay with current status and range info
- Fix BatteryModels.kt to match actual TeslamateApi response structure
- Add Battery quick link to dashboard navigation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move quick links outside scrollable area so they're always visible
at the bottom of the dashboard regardless of content height.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace full-width navigation cards with compact icon+label buttons
styled similar to Home Assistant's "Devices and services" page.
Aligned to left with space reserved for 2 additional future links.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add polling mechanism to automatically fetch car status every 5 seconds,
keeping the dashboard UI up to date without manual refresh.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Only show charging bolt icon when actively charging, not just plugged in
- Change battery color thresholds: red < 20%, yellow < 40%, neutral otherwise
- Add warning icon when battery level > 90%
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add chargingState and isCharging accessors to CarStatus
- Update ChargingCard to show "Plugged In" with EvStation icon when not charging
- Show charging state (e.g., "stopped", "complete") in parentheses
- Display different stats: charging shows power/added/time left; plugged in shows charge limit/added
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The TeslamateApi parseDateParam function expects RFC3339 format
with time component (2024-12-07T00:00:00Z), not date-only format.
- Start date: append T00:00:00Z
- End date: append T23:59:59Z
- Pass dates directly to load functions to avoid race conditions
- Remove unused DateTimeFormatter
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add page and show query parameters to getCharges and getDrives
- Set show=50000 to fetch all results instead of default 100
- This fixes date filtering and shows correct totals in summary
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add DrivesData wrapper class for nested data.drives structure
- Update field names: id -> drive_id, use nested objects
- Add DriveOdometerDetails, DriveBatteryDetails, DriveRange classes
- Add convenience accessors for backward compatibility
- Update repository to extract drives from data.drives
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create DrivesViewModel with date filtering and summary stats
- Create DrivesScreen with card-based layout matching Charges design
- Add drive history with distance, duration, max speed, and battery usage
- Add navigation route and card from Dashboard
- Support date filtering (Last 7/30/90 days, Last year, All time)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Temperatures are already displayed in the status indicators row,
making the separate Climate card redundant.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move state/lock indicators to left, add inside/outside temps on right.
Creates a compact info bar: "Asleep 🔒Locked ... 🌡23° 🌡14°"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace large State and Locked cards with compact right-aligned
indicators showing icons with small text (e.g., "Asleep", "Locked").
Saves vertical space and improves dashboard density.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Currency data class with 38 currencies sorted by global usage
(based on BIS Triennial Survey and SWIFT data)
- Add currency setting to SettingsDataStore (default: EUR)
- Add currency dropdown in Settings screen under "Display Settings"
- Display selected currency symbol in Charges screen
(summary cards and individual charge items)
- Update SettingsViewModelTest for new parameter
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>