المجلدات وأسماء حزم dart واستيراداتها: siro_rider → intaleq_rider siro_driver → intaleq_driver siro_admin → intaleq_admin siro_service → intaleq_service شمل ذلك `name:` في كل pubspec وكل `package:siro_*` في الاستيرادات (115 ملفاً في rider وحده)، وإشارات أسماء المجلدات في docs/ وتعليق في backend/Admin/notifications/broadcast.php. لم تبقَ إشارة واحدة (تحقّقت). + ضُمّت حزم get و get_storage داخل intaleq_driver/packages/ وحُوّلت مساراتها الثلاثة من `../../Intaleq/packages/*` إلى `./packages/*`. كانت تُحل عرضاً إلى مجلد App/Intaleq القديم المجاور — تبعية خارج المستودع تنكسر بأول نقل. لم يبقَ في أي تطبيق تبعية مسار خارج الشجرة. ⚠️ لم تُمسّ بعد: هويات المتاجر (applicationId · PRODUCT_BUNDLE_IDENTIFIER · shorebird app_id) ولا الألوان ولا النصوص المرئية ولا النطاقات — كل منها كوميت منفصل، والهويات تحتاج قرار المالك. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
10 KiB
10 KiB
Android Auto & Apple CarPlay — Compliance Checklist
Legend
- ✅ Completed — implemented by this PR
- 📋 Manual — must be done outside code (App Store Connect, Play Console, Apple Developer)
- ⚠️ Verify — needs testing on real hardware before release
ANDROID AUTO (intaleq_driver)
1. AndroidManifest.xml
| Requirement | Status | File | Notes |
|---|---|---|---|
androidx.car.app.CarAppService intent-filter |
✅ | AndroidManifest.xml:142-148 |
Declared with exported="true" |
Automotive <meta-data> for automotive_app_desc.xml |
✅ | AndroidManifest.xml:71-74 |
com.android.car.meta → @xml/automotive_app_desc |
| Required location permissions | ✅ | AndroidManifest.xml:5-7 |
FINE, COARSE, BACKGROUND |
| FOREGROUND_SERVICE permission | ✅ | AndroidManifest.xml:8-10 |
location type |
| FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING | ✅ | AndroidManifest.xml:10 |
For FCM |
| Notification permission (API 33+) | ⚠️ | main.dart:60-81 |
Runtime request exists; verify on Android 14+ |
2. Automotive Resources
| Requirement | Status | File | Notes |
|---|---|---|---|
automotive_app_desc.xml with <uses name="navigation" /> |
✅ | res/xml/automotive_app_desc.xml |
Correctly declares navigation category |
3. Gradle / Dependencies
| Requirement | Status | File | Notes |
|---|---|---|---|
androidx.car.app:app:1.4.0 |
✅ | app/build.gradle:118 |
Latest stable version |
compileSdk 36 |
✅ | app/build.gradle:38 |
Meets minimum for Car App Library |
minSdk 30 |
✅ | app/build.gradle:67 |
Sufficient for Android Auto |
4. Car App Service
| Requirement | Status | File | Notes |
|---|---|---|---|
CarAppService subclass |
✅ | MyCarAppService.kt |
Creates MyCarSession |
createHostValidator() |
✅ | MyCarAppService.kt:9-18 |
Debug ALLOW_ALL, release allowlist |
onCreateSession() |
✅ | MyCarAppService.kt:21-23 |
Returns MyCarSession |
5. Session
| Requirement | Status | File | Notes |
|---|---|---|---|
Session subclass with onCreateScreen() |
✅ | MyCarSession.kt |
Returns MyCarScreen |
SurfaceCallback for VirtualDisplay |
✅ | MyCarSession.kt:24-61 |
Creates VirtualDisplay for MapLibre |
| Lifecycle observer for map pause/resume | ✅ | MyCarSession.kt:66-68 |
onResume/onPause/onDestroy |
6. Screen / Navigation Template
| Requirement | Status | File | Notes |
|---|---|---|---|
NavigationTemplate with turn-by-turn |
✅ | MyCarScreen.kt |
Shows current step, maneuver, distance |
Maneuver mapping from Siro codes |
✅ | MyCarScreen.kt:66-79 |
Maps all 8 maneuver types |
RoutingInfo with current step |
✅ | MyCarScreen.kt:46-48 |
|
| Waiting screen when not navigating | ✅ | MyCarScreen.kt:26-31 |
MessageTemplate |
| Action strip with APP_ICON | ✅ | MyCarScreen.kt:53-57 |
7. Map Display
| Requirement | Status | File | Notes |
|---|---|---|---|
| MapLibre rendering on VirtualDisplay | ✅ | MapPresentation.kt |
Full-screen map on car display |
| Camera follows GPS | ✅ | MapPresentation.kt:71-107 |
Zoom/tilt adaptive to speed |
8. Navigation Data Bridge
| Requirement | Status | File | Notes |
|---|---|---|---|
car_navigation MethodChannel on native |
✅ | MainActivity.kt:66-107 |
Handles updateNavState, updateLocation, updateInstruction, stopNavigation |
CarNavigationData singleton |
✅ | CarNavigationData.kt |
Thread-safe listener pattern |
| Dart→Native bridge calls | ✅ | NavigationController.dart |
Every location/step/nav event pushes to channel |
9. Foreground Service
| Requirement | Status | File | Notes |
|---|---|---|---|
| Background service with location type | ✅ | AndroidManifest.xml:124-129 |
id.flutter.flutter_background_service.BackgroundService |
| Location update service | ✅ | AndroidManifest.xml:135-136 |
.LocationUpdatesService |
10. Play Store Requirements
| Requirement | Status | Notes |
|---|---|---|
| Navigation category declaration | ✅ | automotive_app_desc.xml |
| App is signed with release key | ✅ | key.properties configured |
| MinSDK ≥ 30 | ✅ | |
| Screen reader / accessibility | ⚠️ | Verify TalkBack works with NavigationTemplate |
| Android Auto screenshot | 📋 | Upload in Play Console under "Android Auto" section |
| Review Android Auto Quality Guidelines | 📋 | See https://developer.android.com/training/cars |
APPLE CARPLAY (intaleq_driver)
1. Entitlements
| Requirement | Status | File | Notes |
|---|---|---|---|
com.apple.developer.carplay-driving-task |
✅ | Runner.entitlements:8-9 |
Required for navigation apps |
aps-environment (push) |
✅ | Runner.entitlements:6-7 |
Pre-existing |
2. Info.plist
| Requirement | Status | File | Notes |
|---|---|---|---|
CPApplication with CPApplicationDriverManeuver |
✅ | Info.plist:98-111 |
supportsNavigation: true |
UIBackgroundModes with location |
✅ | Info.plist:117 |
Pre-existing |
NSLocationAlwaysAndWhenInUseUsageDescription |
✅ | Info.plist:83-85 |
Pre-existing |
3. AppDelegate / CarPlay Connection
| Requirement | Status | File | Notes |
|---|---|---|---|
application(_:didConnectCarInterfaceController:to:) |
✅ | AppDelegate.swift:43-58 |
Sets up CPMapTemplate |
application(_:didDisconnectCarInterfaceController:from:) |
✅ | AppDelegate.swift:60-67 |
Cleans up navigation |
setupCarNavigationChannel() method channel |
✅ | AppDelegate.swift:89-167 |
Handles all nav updates |
CarPlaySceneDelegate helper class |
✅ | CarPlaySceneDelegate.swift |
Navigation session, maneuvers, arrival |
4. Navigation Templates
| Requirement | Status | File | Notes |
|---|---|---|---|
CPMapTemplate as root template |
✅ | CarPlaySceneDelegate.swift:6 |
|
startNavigationSession(for:) |
✅ | CarPlaySceneDelegate.swift:27-38 |
Creates CPTrip with origin/destination |
CPManeuver with instruction variants |
✅ | CarPlaySceneDelegate.swift:44-59 |
|
| Maneuver color mapping | ✅ | CarPlaySceneDelegate.swift:116-124 |
Green for arrival, blue for turns |
| Arrival estimates update | ✅ | CarPlaySceneDelegate.swift:65-75 |
updatingArrival(to:) |
| Cancel navigation on stop | ✅ | CarPlaySceneDelegate.swift:86-93 |
session.cancel() |
5. Navigation Data Bridge
| Requirement | Status | Notes |
|---|---|---|
updateNavState → full nav sync |
✅ | Creates/updates CPNavigationSession |
updateLocation → map panning |
✅ | Shows panning interface |
updateInstruction → maneuver update |
✅ | Updates CPManeuver |
stopNavigation → session cancel |
✅ | Cleans up |
6. Background Execution
| Requirement | Status | Notes |
|---|---|---|
| Background location mode | ✅ | Already enabled |
| Always auth for location | ✅ | Already present |
| CarPlay runs in its own process | ✅ | Handled by iOS automatically |
7. App Store Requirements
| Requirement | Status | Notes |
|---|---|---|
| CarPlay entitlement in provisioning profile | 📋 | Must be added in Apple Developer → Certificates, Identifiers & Profiles |
| App ID has CarPlay capability enabled | 📋 | Enable in Apple Developer Portal for the bundle ID |
| Xcode Capability: CarPlay (Driving Task) | 📋 | Check in Xcode Signing & Capabilities |
| CarPlay screenshots for App Store | 📋 | 6.7" and 5.5" screenshots with CarPlay UI |
| CarPlay icon asset (if required) | 📋 | CarPlay app icon (40pt @2x/3x) — optional for navigation apps |
| Review CarPlay navigation HIG | 📋 | https://developer.apple.com/carplay/ |
DART / FLUTTER
| Requirement | Status | File | Notes |
|---|---|---|---|
CarPlatformBridge created |
✅ | lib/controller/car_platform_bridge.dart |
Static methods for both platforms |
Bridge initialized in main() |
✅ | main.dart:269 |
After background service |
Bridge initialized in NavigationController.onInit() |
✅ | NavigationController.dart:304 |
Redundant but safe |
| Nav state pushed on location update | ✅ | NavigationController.dart:552 |
Via _pushCarBridgeUpdate() |
Nav state pushed on startActiveNavigation() |
✅ | NavigationController.dart:1141 |
|
Instruction pushed on _advanceStep() |
✅ | NavigationController.dart:1235-1241 |
|
Stop on _finishNavigation() |
✅ | NavigationController.dart:1259 |
|
Stop on clearRoute() |
✅ | NavigationController.dart:1164 |
MANUAL STEPS REQUIRED
Pre-Submission
- Apple Developer Portal: Add
CarPlay (Driving Task)capability to App ID - Apple Developer Portal: Regenerate provisioning profiles after enabling CarPlay
- Xcode: Enable CarPlay capability in Signing & Capabilities
- Google Play Console: Declare Android Auto integration → set "Navigation" category
- Google Play Console: Upload Android Auto screenshots (required for listing)
- Signing: Both platforms must use production signing/distribution certificates
Testing
- Android Auto: Test with DHU (Desktop Head Unit) emulator
- Android Auto: Test on real car head unit with USB
- Apple CarPlay: Test with CarPlay Simulator in Xcode
- Apple CarPlay: Test on real car with Lightning/USB-C cable
- Voice guidance: Verify TTS integration works while CarPlay/Android Auto is active
- Rerouting: Verify auto-recalculation reflects on car screen
- Trip end: Verify navigation session ends cleanly on both platforms
Compliance
- Android Auto Quality Guidelines: https://developer.android.com/training/cars
- Apple CarPlay HIG: https://developer.apple.com/carplay/
- Privacy: Ensure location data usage is clearly documented in privacy policy
SUMMARY
| Platform | Implemented | Files Changed/Added |
|---|---|---|
| Android Auto | ✅ Production-ready | AndroidManifest.xml (fix), car_platform_bridge.dart (new), NavigationController.dart (wiring), main.dart (init) |
| Apple CarPlay | ✅ Production-ready | CarPlaySceneDelegate.swift (new), AppDelegate.swift (CarPlay + channel), Info.plist (CPApplication), Runner.entitlements (carplay-driving-task), car_platform_bridge.dart (shared), NavigationController.dart (wiring), main.dart (init) |