Commit Graph
70 Commits
Author SHA1 Message Date
Davide FerrariandClaude Opus 4.5 ea80b16623 feat: add Software Versions screen with update history
- 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>
2025-12-21 12:04:08 +01:00
Davide Ferrari 203bacf8dd docs: update ASSETS.md with Glider18 wheel and improved detection 2025-12-21 11:50:45 +01:00
Davide Ferrari d227fa6f72 feat: improve Highland/Juniper detection using wheel type
- 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
2025-12-21 11:50:11 +01:00
Davide Ferrari 441ba763c8 feat: add scale factors for consistent car image sizing
- 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
2025-12-21 11:42:06 +01:00
Davide Ferrari 81e048e65a docs: update ASSETS.md for Model S/X and consistent view 2025-12-21 11:31:24 +01:00
Davide Ferrari b974953cc6 feat: add Model S/X images and fix Highland image sizing
- 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
2025-12-21 11:30:36 +01:00
Davide Ferrari d29313f48c docs: update ASSETS.md to reflect PNG format for all models 2025-12-21 11:23:10 +01:00
Davide FerrariandClaude Opus 4.5 b5e863f13e feat: use transparent PNG for all car 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>
2025-12-21 11:20:07 +01:00
Davide FerrariandClaude Opus 4.5 4ce9c476d0 fix: adjust summary card column weights for better spacing
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>
2025-12-21 11:06:25 +01:00
Davide FerrariandClaude Opus 4.5 8d69e435e2 fix: align summary items in drives screen
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>
2025-12-21 10:58:29 +01:00
Davide FerrariandClaude Opus 4.5 9319e7afad fix: align summary items in charges screen
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>
2025-12-21 10:55:15 +01:00
Davide FerrariandClaude Opus 4.5 db020020dd feat: use Paid icon and currency symbol for all cost displays
- 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>
2025-12-21 10:50:02 +01:00
Davide FerrariandClaude Opus 4.5 9a8cb28a73 feat: add currency symbol to charge cost display
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>
2025-12-21 10:38:34 +01:00
Davide FerrariandClaude Opus 4.5 8cf68e3975 feat: add charge cost to charge detail header card
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>
2025-12-21 10:31:56 +01:00
Davide FerrariandClaude Opus 4.5 887ff49178 feat: extend car color palette to all main cards and navigation
- 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>
2025-12-21 10:26:14 +01:00
Davide FerrariandClaude Opus 4.5 d99dbeefae fix: replace Tesla red accent with neutral grey theme
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>
2025-12-21 10:13:25 +01:00
Davide FerrariandClaude Opus 4.5 9b0ed058b8 feat: dynamic car color palettes for battery card
- 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>
2025-12-21 10:07:44 +01:00
Davide FerrariandClaude Opus 4.5 107d191a3c chore: bump version to 0.2.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v0.2.0
2025-12-20 23:44:39 +01:00
Davide FerrariandClaude Opus 4.5 2b49eb2460 feat: reverse geocode address when no geofence is set
- 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>
2025-12-20 23:34:41 +01:00
Davide FerrariandClaude Opus 4.5 fd578a1013 fix: update quick links icon and order
- Changed Charges icon to ElectricBolt (zap)
- Reordered: Charges, Battery, Drives, Mileage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 23:29:43 +01:00
Davide FerrariandClaude Opus 4.5 d30ee67edf feat: make all maps tappable to open external map app
- 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>
2025-12-20 23:11:36 +01:00
Davide FerrariandClaude Opus 4.5 53aa57c152 feat: make location card tappable to open maps app
- 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>
2025-12-20 23:08:42 +01:00
Davide FerrariandClaude Opus 4.5 db2c1f4adf fix: reduce top padding between title and battery card
Changed top padding from 16dp to 8dp

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 20:39:24 +01:00
Davide FerrariandClaude Opus 4.5 0a8fb8b674 refactor: move status indicators into battery card
- 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>
2025-12-20 20:36:56 +01:00
Davide FerrariandClaude Opus 4.5 117cbb214f fix: increase car image to 210dp, add spacing in header
- 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>
2025-12-20 20:34:06 +01:00
Davide FerrariandClaude Opus 4.5 97e9ace4cb fix: improve dashboard visual consistency
- 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>
2025-12-20 20:28:53 +01:00
Davide FerrariandClaude Opus 4.5 5bd6ff4f49 docs: add ASSETS.md reference to README
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 20:20:43 +01:00
Davide FerrariandClaude Opus 4.5 f028829a21 docs: add comprehensive Tesla car image assets documentation
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>
2025-12-20 20:19:52 +01:00
Davide FerrariandClaude Opus 4.5 4a68f30f70 fix: support Highland/Juniper models in car image feature
- 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>
2025-12-20 20:16:15 +01:00
Davide FerrariandClaude Opus 4.5 7acc5fab3f refactor: improve dashboard layout with car image in battery card
- 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>
2025-12-20 19:18:56 +01:00
Davide FerrariandClaude Opus 4.5 2a0976b36d docs: update README with new features and utility script
- 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>
2025-12-20 18:53:29 +01:00
Davide FerrariandClaude Opus 4.5 ff7be06dda feat: add Tesla 3D car image display on dashboard
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>
2025-12-20 18:52:55 +01:00
Davide FerrariandClaude Opus 4.5 8bcdac4edf build: add release signing config for sideloading
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>
2025-12-20 18:21:36 +01:00
Davide FerrariandClaude Opus 4.5 6da9ea7328 feat: add charge detail screen with map and charts
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>
2025-12-20 17:15:46 +01:00
Davide FerrariandClaude Opus 4.5 b0777a5ff4 feat: add tire pressure display and fix startup race condition
- 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>
2025-12-20 17:00:27 +01:00
Davide FerrariandClaude Opus 4.5 9e48399f45 refactor: consolidate charging info into battery card
- 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>
2025-12-20 16:44:32 +01:00
Davide FerrariandClaude Opus 4.5 8ea87cb3b5 feat: add charging progress bar to battery card
- 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>
2025-12-20 15:56:41 +01:00
Davide FerrariandClaude Opus 4.5 fa7fbaa910 feat: add drive detail screen with map and improve dashboard
- 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>
2025-12-20 15:49:13 +01:00
Davide FerrariandClaude Opus 4.5 af39ff39c8 feat: add unit support based on TeslamateApi configuration
- 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>
2025-12-20 14:59:13 +01:00
Davide FerrariandClaude Opus 4.5 1f17a639aa fix: escape percent sign in battery detail format string
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>
2025-12-20 13:55:54 +01:00
Davide FerrariandClaude Opus 4.5 eb9060804f feat: restructure Mileage to 3-level hierarchy (years->months->days)
- 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>
2025-12-20 12:30:38 +01:00
Davide FerrariandClaude Opus 4.5 a58c5fabf8 fix: correct date parsing and distance field for mileage data
- 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>
2025-12-20 12:13:44 +01:00
Davide FerrariandClaude Opus 4.5 d110f217e7 feat: add Mileage tracking screen with monthly/daily aggregation
- 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>
2025-12-20 12:07:25 +01:00
Davide FerrariandClaude Opus 4.5 f83573f440 feat: add Battery Health screen with degradation tracking
- 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>
2025-12-20 11:48:22 +01:00
Davide FerrariandClaude Opus 4.5 43a6099882 fix: pin quick links to bottom of screen
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>
2025-12-20 11:26:07 +01:00
Davide FerrariandClaude Opus 4.5 4d7226095a refactor: compact quick links at bottom of dashboard
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>
2025-12-20 11:23:43 +01:00
Davide FerrariandClaude Opus 4.5 c35a5f704f feat: auto-refresh dashboard every 5 seconds
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>
2025-12-14 20:06:15 +01:00
Davide FerrariandClaude Opus 4.5 e95070dfdd fix: improve battery card visual indicators
- 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>
2025-12-14 20:01:36 +01:00
Davide FerrariandClaude Opus 4.5 e2bcfc9902 chore: remove debug log statements from repository
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 19:54:46 +01:00
Davide FerrariandClaude Opus 4.5 d05b41db2a fix: distinguish plugged in vs actively charging in dashboard
- 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>
2025-12-14 19:45:48 +01:00