# DiPlay 0.2.13 — public preview This release improves wireless startup and recovery, USB transport switching, CarPlay layout and dashboard rendering. It also adds Traditional Chinese and optional experiments for buffered music, a side panel and DiLink 3 call controls. Install the mobile APK on an **Android 9+ head unit (API 28+)** that permits APK installation. The mobile release is **0.2.13, versionCode 32**, targeting **API 37**. Core CarPlay uses local authentication; optional vehicle integration requires compatible firmware and, where indicated, authorized local network ADB. These changes do not establish support for every BYD model, aftermarket head unit, iPhone or iOS version. [Download website](https://shihabal3amri.github.io/DiPlay/) · [Release and assets](https://github.com/shihabal3amri/DiPlay/releases/tag/v0.2.13) · [Full source comparison](https://github.com/shihabal3amri/DiPlay/compare/v0.2.12...v0.2.13) This preview includes all **35 merged contributions since v0.2.12**, including reviewed and repaired #313, #314 and #317. ## Connection and wireless reliability - **Wi-Fi Direct on Android 9:** the connection choice is now retained and uses the legacy group-creation path with credentials read from the actual group. Channel selection depends on a working firmware API. Android 9 cannot report the negotiated frequency, so its requested channel remains **unverified**; system-default selection reports channel 0. Cleanup removes the owned active group without deleting persistent system profiles. Android 10+ retains its modern group path and frequency verification. [#282](https://github.com/shihabal3amri/DiPlay/pull/282) - **More reachable hotspot addresses:** Wi-Fi Direct and hotspot backends prefer a usable IPv4 endpoint, with current scoped IPv6 as fallback. A bounded wait no longer reuses an address that disappeared while waiting for IPv4. Same LAN discovery continues to cover both families. [#283](https://github.com/shihabal3amri/DiPlay/pull/283) - **Less radio contention in Auto:** beside a 5 GHz station connection, automatic Wi-Fi Direct selection tries an eligible remembered/aligned channel, then explicit 2.4 GHz choices before other 5 GHz and system-default fallbacks. Cached unpinned defaults no longer bypass that order. A manually chosen channel remains explicit; **Auto does not guarantee a band or eliminate stutter**. [#309](https://github.com/shihabal3amri/DiPlay/pull/309) - **Wireless startup without Android NSD:** interface-bound mDNS no longer asks for an unused Android NSD service. This removes the reported null-service startup crash; selecting the system-NSD path still requires that service and reports a clear failure if absent. [#313](https://github.com/shihabal3amri/DiPlay/pull/313) - **Rendered-session handoff fallback:** when Bluetooth handoff times out without tunneled iAP2, an AirPlay session is retained only after a rendered video frame, and its bootstrap connection is released. No-video sessions still fail and clean up; fallback is reported separately from a tunnel-ready session. [#258](https://github.com/shihabal3amri/DiPlay/pull/258) - **Experimental hotspot join repair:** an explicit Check/Apply/Restore flow can configure the tested Apple device-information element on eligible **Android 13+, user-configured, 5 GHz-only hotspots**. It requires supported APIs, plain authorized localhost ADB, a disabled hotspot and no active CarPlay session. A complete private backup, integrity checks, durable recovery state and ownership checks protect restoration. Default/non-user, mixed-band, conflicting or unverified configurations are refused. The user confirms mutations and restarts the hotspot. This is not an automatic startup action or a general auto-join guarantee. [#251](https://github.com/shihabal3amri/DiPlay/pull/251) - **USB attachment during wireless CarPlay:** transport changes happen within the existing activity, retiring wireless resources and requesting wired/VPN prerequisites. Permission setup verifies each grant, preserves other accessibility services and cancels pending work when its screen closes. [#268](https://github.com/shihabal3amri/DiPlay/pull/268) - **USBMUX replies with four-byte trailers:** validated payload-bearing TCP replies receive the same narrow trailer handling as handshake replies. Split/coalesced reads preserve payloads, while malformed headers remain rejected. This addresses the captured framing failure; it does not prove full wired interoperability on every device. [#298](https://github.com/shihabal3amri/DiPlay/pull/298) - **Devices without Android USB service:** wireless/local startup can proceed without eagerly constructing the USB helper. Wired and USB/CH341 paths report a failure when their required service is absent. This fixes that constructor crash; the separate reported black-screen/decoder problem remains unresolved. [#300](https://github.com/shihabal3amri/DiPlay/pull/300) ## CarPlay display and layout - **Live dock and split-screen view areas:** choose Driver's side or Bottom and switch between those fixed dock choices without reconnecting. Optional view areas let CarPlay redraw for a supported split window; per-orientation window measurements are learned for later connections. Switching to or from Automatic reconnects. [#246](https://github.com/shihabal3amri/DiPlay/pull/246) - **Optional rotation without reconnecting:** a square canvas carries landscape and portrait view areas, with Smoother and Sharper choices. Video and touch mapping follow the selected area. Larger squares cost more encoding/decoding work, custom safe areas do not apply to this canvas, and a session started in split screen keeps the plain-canvas path. [#277](https://github.com/shihabal3amri/DiPlay/pull/277) - **Selected-decoder square check:** when a square is rejected only by one listed side limit but fits the listed pixel budget, DiPlay asks the same selected decoder to configure it. Rejection falls back to a supported size; a different decoder cannot approve the request. [#284](https://github.com/shihabal3amri/DiPlay/pull/284) - **Side panel next to CarPlay, experimental and off by default:** enable it in Display and performance for the next connection, then show/hide it from the session menu. It displays a clock and available battery/range data beside CarPlay. Rotation or split-screen transitions close the panel; refresh work stops with its host. [#245](https://github.com/shihabal3amri/DiPlay/pull/245) - **DiLink 4 cluster casting and calibration:** choosing the DiLink 4 ADB cluster route preserves native casting mode instead of issuing DiLink 3 mode commands. The safe-area editor can show a preview before connecting, and closes its preview-only window on dismissal. Contributor confirmation covers a 2022 Seal/DiLink 4/Android 10 setup, rather than every Seal or Qin firmware. [#260](https://github.com/shihabal3amri/DiPlay/pull/260) - **Live DiLink 4 cluster picture controls:** brightness, contrast, saturation, warmth, Show original and Reset also apply to the cluster texture; listeners close with the view. This extends manual picture adjustment and does not diagnose the underlying intermittent color issue. [#265](https://github.com/shihabal3amri/DiPlay/pull/265) ## Dashboard, vehicle data and wheel controls - **Recent turn card across a wireless replacement:** a teardown NoRouteSet no longer immediately erases the dashboard overlay or refreshes its age. Arrival, explicit shutdown and wired disconnect clear it; the retained instruction expires after its existing two-minute stale window. [#304](https://github.com/shihabal3amri/DiPlay/pull/304) - **Finer dashboard map scale:** the optional 125% stream choice requests more pixels so the dashboard map shows smaller details. Existing Standard/Larger/Largest choices remain available; extra stream size can increase decoder work. [#306](https://github.com/shihabal3amri/DiPlay/pull/306) - **DiLink 3 cluster entry:** use the tested full-then-half projection sequence on the existing serial worker. Each reply is checked; refusal, cancellation or interruption attempts stock-mode compensation immediately. Failed restoration keeps the recovery journal and blocks new mutations. The author's sequence was verified on a GCC Han/DiLink 3. [#296](https://github.com/shihabal3amri/DiPlay/pull/296) - **Battery protocol fallback:** when `ro.car.protocol` is empty, read `sys.car.protocol`. Known CAN/CANFD firmware can supply battery/range again; unknown protocols still produce no reading. [#285](https://github.com/shihabal3amri/DiPlay/pull/285) - **Wheel-service recovery:** with dashboard zoom or joystick enabled, DiPlay can restore an unbound accessibility service after a grace period using already-authorized ADB. It rechecks eligibility and binding, preserves other services and shows no new authorization prompt. [#297](https://github.com/shihabal3amri/DiPlay/pull/297) - **DiLink 3 call controls and dashboard call card, experimental:** two independent settings, **CarPlay call keys (experimental)** and **CarPlay calls on the dashboard**, remain **off by default**. Controls cover the opt-in call/voice/media keys; the separate ADB output supplies caller, state and timer. Vehicle writes require an initialized watcher acknowledgment, unique session ownership and retryable cleanup. Pristine cancellation performs no idle writes, and unchanged calls/failed ends get only one automatic retry. Target-car answer/end/decline, audio/microphone routing, display and restoration still need release-testing feedback. Restore uses the author's stock-BYD-CarPlay idle values, not a snapshot of arbitrary prior vehicle state. [#243](https://github.com/shihabal3amri/DiPlay/pull/243) ## Audio and input - **Observed Siri microphone clock:** correct RTP timestamps for the captured `0x20000000` 24 kHz CarPlay Siri stream while capture/encoding stay at 48 kHz. Telephony and unobserved Opus formats retain 48 kHz timestamps. This targets the supplied packet pattern and contributor results, rather than claiming every Siri issue is fixed. [#295](https://github.com/shihabal3amri/DiPlay/pull/295) - **Buffered music, experimental and off by default:** **Settings → Display and performance → Buffered music (experimental)** reconnects CarPlay and offers AAC-LC music buffering to supporting apps such as Apple Music. The bounded byte/frame queue includes renderer preload, applies TCP backpressure and accepts only the control session's peer. Pause, flush, close and session replacement are serialized; retired sessions cannot affect the replacement renderer. Other apps can keep their normal stream. It is not lossless, cannot compensate for a continuously slower-than-audio link, and the corrected build still needs physical pause/seek/navigation/call/Siri testing. [#308](https://github.com/shihabal3amri/DiPlay/pull/308) - **Prompt touch-event delivery:** enable TCP_NODELAY on the event channel to avoid Nagle withholding small touch writes. Contributor runs showed reduced worst sampled touch-to-next-frame intervals; these were separate manual runs and do not prove a fixed end-to-end latency, one packet per touch or TCP ACK timing. [#311](https://github.com/shihabal3amri/DiPlay/pull/311) ## Settings, appearance and language - Ambient-light threshold/delay controls appear only for **Automatic (ambient light)**. Other day/night modes keep their saved values, and picture adjustments remain available. This is a settings-visibility fix, not a sensor behavior change. [#239](https://github.com/shihabal3amri/DiPlay/pull/239) - Full-size multi-window home screens use their actual window dimensions instead of forcing the compact card. Settings gain clearer section icons, low-density borders, button contrast and audio-control spacing. [#252](https://github.com/shihabal3amri/DiPlay/pull/252) - Shared menu widgets preserve saved preferences and bounded values. Opening full settings discards the session preview first; returning reloads saved choices instead of allowing an old draft to overwrite them. [#281](https://github.com/shihabal3amri/DiPlay/pull/281) - Edit the CarPlay car-button icon/name from the main settings page. It applies at the next connection, including automatic reconnect; an unavailable image picker produces a message instead of crashing. [#302](https://github.com/shihabal3amri/DiPlay/pull/302) - Waiting/cluster placeholders gain a light appearance and a 300 ms cluster transition that preserves older SurfaceView decoder surfaces. [#305](https://github.com/shihabal3amri/DiPlay/pull/305) - The main CarPlay waiting screen follows the active CarPlay day/night setting and repaints when it changes, so night reconnects use the dark placeholder. The dashboard placeholder retains its separate theme logic. [#317](https://github.com/shihabal3amri/DiPlay/pull/317) - Add **Traditional Chinese (Taiwan)** as the seventh app language and in Android 13+ per-app language selection. Taiwan/Hong Kong/Macao use the same Taiwan translation; explicit Hant/Hans script tags take precedence over regional defaults. Android 9–12 retain their saved-language path. A Traditional Chinese website edition is also prepared for this release. Translation originates from @jay900604's contribution and was completed/integrated by @yeukchan777-glitch. [#314](https://github.com/shihabal3amri/DiPlay/pull/314) - Correct the Simplified Chinese wording for using the vehicle's own hotspot. [#286](https://github.com/shihabal3amri/DiPlay/pull/286) ## Documentation and maintenance - The multilingual download/reporting website groundwork was published for **0.2.12**. The 0.2.13 website/release update, including a seventh Traditional Chinese edition, is separate release maintenance; this contribution is not a new APK feature. [#240](https://github.com/shihabal3amri/DiPlay/pull/240) - Add the smooth-wireless guide and clearer square-canvas help, preserving contributor measurements and their device-specific limits. Channel policy and diagnostic counters are described without performance guarantees. This is documentation/static help text, not another radio algorithm. [#310](https://github.com/shihabal3amri/DiPlay/pull/310) - Make buffered-audio retirement tests deterministic with a nonblocking observer and explicit controlled callback release. Runtime code and APIs are unchanged; no tests were removed or disabled. [#312](https://github.com/shihabal3amri/DiPlay/pull/312) - Source maintenance also makes the earlier 0.2.12 fixes and review corrections explicit: [2fc876e](https://github.com/shihabal3amri/DiPlay/commit/2fc876e578eba3905a5b873e3c2dbd74f498433a). ## Updating and reporting problems Use the official mobile release APK for the same package/variant you already installed. In-place updating preserves settings and pairing records when its signing certificate matches your existing installation. The APK certificate was verified against the published 0.2.12 APK and matches, so the same public package can be updated in place. If a problem remains, reproduce it on **0.2.13**, including the first connection attempt through the failure, then: 1. Open **Settings → Diagnostics → Save diagnostic report**. 2. Android 10+ normally saves the TXT file in **Downloads/DiPlay**. Android 9 opens the document picker. **Choose save location** is also available; if the picker or public storage is unavailable, DiPlay falls back to its app-specific external directory or private storage, with the destination identified in the confirmation. 3. Use **View report** or **Share** in that confirmation. If no sharing app is available, the report view allows selecting/copying its text. Nothing is uploaded automatically. 4. Review the report for personal information, then attach the readable `.txt` to the matching [existing issue](https://github.com/shihabal3amri/DiPlay/issues) or [create an issue](https://github.com/shihabal3amri/DiPlay/issues/new/choose). Include car/head-unit model, exact firmware/DiLink/Android, iPhone/iOS, connection backend, relevant settings, reproduction steps and failure time. Do not post hotspot passwords or private authentication files. Android 9 Wi-Fi Direct, model-specific cluster routing, hotspot repair and the optional call/audio paths remain dependent on firmware capabilities. Contributor hardware results describe their stated setups; they do not establish that all Qin/Seal/Han/Tang or general stutter, decoder, Siri and old-iOS reports are solved. ## Validation and release identity This public preview is not Apple-certified. It uses the same experimental accessory identity recovered from public Carlinkit firmware as 0.2.12; its runtime private key is extractable from the APK, and future iOS acceptance remains uncertain. The separate Android release-signing key is not bundled. Private identity/signing inputs remain excluded from Git and the source archive; see [BUILD.md](BUILD.md) and the existing notices. - The production-signed APK was built from clean source commit [`6fb0fa4a09e77a84a437da5159147a6f6141ed61`](https://github.com/shihabal3amri/DiPlay/commit/6fb0fa4a09e77a84a437da5159147a6f6141ed61), tree `2065f45e57475d4dc51b9b9cd1f955ad3faccdec`. Its embedded Git revision matches that commit. Subsequent release preparation changes documentation and reconciles merge history; application code and build inputs remain unchanged. The tag and source ZIP identify the final release commit. - Complete integrated source validation checked **1,487 unit cases: 1,486 passed, zero failures/errors and one existing macOS wildcard-bind assumption skip** (815 shared, 668 common, four Home). The merged #313/#314/#317 application tree matches this tested tree; all three exact PR heads passed GitHub Android checks before merging. - Mobile, Home, map-host and Automotive identity-free source-only debug builds and lint passed. Lint has zero errors/fatal findings; existing warnings remain (18 mobile, five Home, two map-host, four Automotive). Production mobile release build/lint passed with four existing warnings. - APK: **`DiPlay-0.2.13.apk`**, 38,512,753 bytes; package **`com.shihab.diplay`**, version **0.2.13**, versionCode **32**, minimum SDK **28**, target SDK **37**, not debuggable. Traditional Chinese resources are packaged. - APK SHA-256: `aed9eac786e7c0e80a2929dc2f0c2e1d0df318ca8fd83ae7c2988a98bb4cd7e6`. The public certificate SHA-256 is `87b38b12788dcb202a961215f2572e30ec2dc9d8ef4bc070d05f77e49291a363` and matches the published 0.2.12 APK. - The two intentionally selected runtime authentication assets match 0.2.12 byte for byte. No Android signing keystore or extra credential container is packaged. Manifest permissions and native-library entries are unchanged; rebuilt project native libraries differ only in their validated GNU build-ID descriptors. - Public-tree and source-archive checks exclude runtime identities, signing keys, private directories and build outputs from Git and the corresponding source ZIP. Release assets include the APK, tagged source ZIP and **`SHA256SUMS.txt`**. Publication checks require uploaded bytes, checksums, release notes and the tag/source commit to match the verified local artifacts. - Experimental-feature hardware acceptance still needs release feedback; no new maintainer vehicle test of the complete corrected build is claimed. ## Contributors Thanks to [@romanchukg-cloud](https://github.com/romanchukg-cloud), [@sa3eedo12](https://github.com/sa3eedo12), [@serein-morii](https://github.com/serein-morii), [@aloaiza-dev](https://github.com/aloaiza-dev), [@lpcheng1208](https://github.com/lpcheng1208), [@yanwuu](https://github.com/yanwuu), [@band-wa](https://github.com/band-wa), [@ojjj13](https://github.com/ojjj13), [@chemharuka](https://github.com/chemharuka), [@a88883284](https://github.com/a88883284), [@mohammed-just](https://github.com/mohammed-just), [@yeukchan777-glitch](https://github.com/yeukchan777-glitch), [@jay900604](https://github.com/jay900604) and [@shihabal3amri](https://github.com/shihabal3amri), plus the reporters who supplied reproducible logs and vehicle tests. Original feature authors and their commits are retained; maintainer review repairs and integration checks are described with the affected behavior above.