- Add SoftwareVersionsScreen showing historic software updates
- Each version shows install date and duration installed
- Trophy badge highlights the longest-installed version
- Date filter chips: Last 6 months, Last year, All time
- Navigate by tapping Software item in Vehicle Info card
- Clickable InfoItem with visual feedback (primary color)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Glider18 and Nova18 to Highland M3 wheel patterns
- Add HIGHLAND_M3_WHEEL_TYPES set for detection
- Add JUNIPER_MY_WHEEL_TYPES set for detection
- Update determineModelVariant to check wheel type as well as color
- Now correctly detects Highland M3 with common colors (e.g., Pearl White)
when using Highland-only wheels like Glider18 or Photon18
- Add getScaleFactor() to CarImageResolver for model-specific scaling
- Scale Highland M3 by 1.35x, Juniper MY by 1.25x, Model X by 1.4x
- Apply scale factors in DashboardScreen and PalettePreviewScreen
- Add Pearl White Model Y Legacy to palette preview for comparison
- Use STUD_3QTR view for all compositor requests for consistent car sizing
- Add Model S and Model X to asset fetcher (10 new images)
- Update CarImageResolver to support Model S/X
- Add Model Y Legacy, Juniper, Model S, and Model X to palette preview screen
- Total assets now: 73 images
Update Tesla compositor to use bkba_opt=1 for Highland/Juniper models,
which returns transparent PNGs instead of opaque JPEGs.
Changes:
- fetch_tesla_assets.py: Set NEW_BKBA_OPT=1, output .png for all models
- CarImageResolver.kt: Remove .jpg extension logic, use .png everywhere
- Re-downloaded all 63 car images as transparent PNGs
The bkba_opt parameter controls background transparency:
- bkba_opt=1: Transparent PNG (now used for all)
- bkba_opt=2: Opaque JPEG with background
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use asymmetric weights (1.2f left, 0.8f right) to reduce empty
space on the right side of summary cards in Charges and Drives.
Battery and Mileage screens use different layouts that don't
need this adjustment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>