Commit Graph
61 Commits
Author SHA1 Message Date
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
Davide Ferrari 84b75d5f87 fix: added clarifications 2025-12-14 19:40:28 +01:00
Davide FerrariandClaude Opus 4.5 ceb5ae3cc9 fix: use RFC3339 date format for API date filtering
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>
2025-12-14 19:36:05 +01:00
Davide FerrariandClaude Opus 4.5 b6b6fa889f fix: fetch all charges and drives (API defaults to 100)
- 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>
2025-12-14 19:17:14 +01:00
Davide FerrariandClaude Opus 4.5 86fa2f8807 fix: correct DriveModels JSON structure to match TeslamateApi
- 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>
2025-12-14 19:06:35 +01:00
Davide FerrariandClaude Opus 4.5 6d5fb3542a feat: add Drives screen with trip history
- 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>
2025-12-14 19:01:00 +01:00
Davide FerrariandClaude Opus 4.5 b9059dfa5c refactor: remove Climate card (temps now in status bar)
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>
2025-12-14 18:49:58 +01:00
Davide FerrariandClaude Opus 4.5 2c899299f3 feat: add temperatures to status indicators row
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>
2025-12-14 18:47:35 +01:00
Davide FerrariandClaude Opus 4.5 dd1530ae8e feat: compact status indicators in dashboard
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>
2025-12-14 18:41:08 +01:00
Davide FerrariandClaude Opus 4.5 b5e4480ee1 feat: add currency selection for charge costs
- 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>
2025-12-14 18:28:54 +01:00