Releases: lvalen91/Carlink
2.1.0
Reworked Log File Export, will use createDocument instead of relying on the share sheet. This will use the Documents/Files App that Android comes with. This will ensure export is successful and users can export directly to a USB without worrying about File Managers not having access etc.
Forgot to add the code about curved/cutout displays which carlink_native has. I forgot to test that
I Attempted to bring this project audio performance similar to now main focus project. Kotlin Carlink
Audio Support
Audio Support now added.
- Approve Microphone access
- Two Carlink apps will appear, one is the true app the other is the 'media source'. AAOS will allow this app to be selected.
If your phone was actively connected to Bluetooth. Go into the respective settings and disable or remove the phone and vehicle from their know devices. Vehicle might default to Phone as audio source while Phone is sending Audio via CarPlay resulting in no audio or not able to play media.
v1.9.0
Significant changes have been made across the project.
Here's what changed:
- Set minSDK to 32 (Android 12L)
This change simplified the codebase significantly by eliminating legacy compatibility code for older Android versions.
- Fixed heartbeat timing drift issue
Heartbeat timing drift was causing the adapter to loop and rendering the app unusable. Instead of occurring precisely every two seconds, heartbeats would drift to 2.3, then 2.8, then 3 seconds, and so on.
The root cause was that the code started the two-second timer after each heartbeat completed. Due to platform latency (Intel Atom processor) and USB I/O operations from multiple processes, the heartbeat would gradually drift outside the stable timing window required by the adapter.
An additional issue was that adapter initialization sent configuration values before the heartbeat process started. This compounded the drift problem because the adapter would be configured without an active heartbeat running. The initialization sequence has been corrected: on reconnection, the heartbeat now starts first, followed by configuration.
- Status page improvements
Condensed similar information and removed irrelevant entries. Added the specific adapter raw message hex that each status field gets its information.
- Added immersive mode toggle (disabled by default)
The app now defaults to non-immersive mode, but users can enable full-screen immersive mode if they want. Some vehicles require access to persistent UI elements (status bars, navigation, climate controls) for proper vehicle control integration.
Note: The CPC200-CCPA adapter firmware does not support Safe Area (+drawsUIOutsideSafeArea) for projection. On displays with cutouts, curves, or non-rectangular shapes, certain projected areas may fall outside the viewable screen. While Android Auto and Apple CarPlay natively support safe area definitions to avoid rendering UI elements in unusable regions, the adapter firmware lacks this capability. The Carlinkit Adapter firmware performs a very basic iAP2 / AOAP handshake with the Smartphone.
- Switched from MediaQuery to LayoutBuilder (credit: MotoInsight fork)
Earlier versions, the app grabbed the display's full resolution during adapter initialization to fix scaling issues. This worked perfectly when immersive mode was the only option I wanted.
However, after adding the immersive/non-immersive toggle, scaling broke in non-immersive mode. The solution was to switch from MediaQuery to LayoutBuilder, which dynamically responds to available viewport space. Video projection and touch point coordinates now scale correctly in both display modes.
- Added file logging system
Many vehicle manufacturers restrict or completely disable ADB access in their Android Automotive OS implementations. To address this, the app now includes a file logging system that saves logs to app-specific storage, which users can share via their preferred file manager.
Due to MediaStore storage limitations (apps cannot access other apps' files or privileged storage), the Android Share sheet is used to export log files. As long as your file manager registers with the Android Share sheet, you can export logs to your desired location.
File manager behavior varies. In some cases, files transfer successfully but don't appear immediately in the file manager's UI. Once the file is handed to the selected app, its visibility depends on that app's implementation. Results range from seamless to frustrating depending on your file manager.
- Material Design 3 theming
Applied Material 3 Design guidelines and theming consistently throughout the app UI.
- Android Auto Support
Figured out how Android Auto Works. Since Android Auto as designed by Google only allows very specific resolutions for its Projection video stream. boxSettings in Sendable.dart now checks the resolutions and decides which of the three AA resolutions to configure for. boxSettings had resolution values specific for Android Auto and not for CarPlay. CarPlay UI seemingly scales A LOT better in comparison, Android Auto does not. There are Android Auto App developer options to enable up to 4K, but I did not test this by forcing 4K in Sendable for the boxSettings. Google documentation states that Vehicle manufactures should avoid upscaling the AA video feed, preferring to downscale. Since I did not test forcing anything above 1920x1080, it might upscale on some displays.
- General bug fixes and code refinements, and things I forgot.
Code refinement was almost entirely running Flutter Analysis, ktlint, and detekt until they stopped yelling at me.
Note: Testing is performed on the AAOS emulator in Android Studio and my personal vehicle. All fixes address issues I've personally encountered. You're welcome to fork this project and do with it as you please.
!! Claude was used heavily throughout this project !!

V1.6.0
V 1.5.0
- Audio Support: (too unstable) Safely disabled audio data processing while preserving foundation for future expansion
- File I/O Removal: Removed file writer functionality without affecting core CarPlay/Android Auto communication
- Video Optimization: Research-validated H.264 video processing improvements:
- Dynamic resolution-aware buffer pool sizing (6-20 buffers based on display resolution)
- Proper YUV420 frame buffer calculations
- Fixed critical CarPlay streaming initialization issue
- Hardware Alignment: Optimized for gminfo3.7 specs (Intel Atom x7-A3960, 2400x960@60fps)
- Future-Proof: Compatible with 2025 automotive display standards (7"-48" screens)
- Build Artifacts: Cleaned all temporary files, build directories, and cache for GitHub

