# DiPlay 0.2.21 — 2026-10-17 Public preview for compatible BYD Android head units. Android 7.0+ (API 24) is now the minimum; Android 7.0–8.1 still needs vehicle testing. This update fixes the music lag that 0.2.20 introduced, lets wired CarPlay recover by itself, stops DiPlay closing when the microphone is used on older head units, hands the BYD dashboard back to the car when CarPlay ends, and adds Italian and several options that are off by default. ## Highlights - Music plays in step with the iPhone again. On 0.2.20, pause, skip and track changes could come seconds late, the speed could wobble, and a skip could replay the end of the previous song; the music clock adjustment no longer lets music pile up. [#814](https://github.com/shihabal3amri/DiPlay/pull/814) - Wired CarPlay recovers by itself: it starts a new attempt when the iPhone accepts the start request but never opens CarPlay, no longer waits forever after **Disconnect**, and no longer drops a connection that has already recovered. [#907](https://github.com/shihabal3amri/DiPlay/pull/907), [#841](https://github.com/shihabal3amri/DiPlay/pull/841), [#876](https://github.com/shihabal3amri/DiPlay/pull/876) - DiPlay no longer closes when the iPhone's microphone is used on head units without Android's own Opus encoder, and music comes back after a call or a short interruption. [#866](https://github.com/shihabal3amri/DiPlay/pull/866), [#804](https://github.com/shihabal3amri/DiPlay/pull/804) - Wireless CarPlay says why it cannot start, stops asking about the car hotspot on Android 13 after **Cancel**, finds a car hotspot on interfaces such as `eth0.3`, and **Save and reconnect** works again for USB drivers. [#824](https://github.com/shihabal3amri/DiPlay/pull/824), [#795](https://github.com/shihabal3amri/DiPlay/pull/795), [#893](https://github.com/shihabal3amri/DiPlay/pull/893), [#885](https://github.com/shihabal3amri/DiPlay/pull/885), [#853](https://github.com/shihabal3amri/DiPlay/pull/853) - On BYD head units, the dashboard is handed back to the car when CarPlay ends, DiPlay no longer closes from the DiYou desktop card, the call popup can be hidden on Android 10+, and DiLink 7.0 offers DiPlay the wide side of its split screen. [#909](https://github.com/shihabal3amri/DiPlay/pull/909), [#827](https://github.com/shihabal3amri/DiPlay/pull/827), [#845](https://github.com/shihabal3amri/DiPlay/pull/845), [#875](https://github.com/shihabal3amri/DiPlay/pull/875) - DiPlay installs on Android 7.0 and is available in Italian. New options, all off by default: temporary system bars, black rounded corners, a play/pause wheel key, double press for Siri, importing the car hotspot details, a home-screen bubble, and the car's own music rhythm. [#847](https://github.com/shihabal3amri/DiPlay/pull/847), [#863](https://github.com/shihabal3amri/DiPlay/pull/863), [#818](https://github.com/shihabal3amri/DiPlay/pull/818), [#811](https://github.com/shihabal3amri/DiPlay/pull/811), [#823](https://github.com/shihabal3amri/DiPlay/pull/823), [#813](https://github.com/shihabal3amri/DiPlay/pull/813), [#769](https://github.com/shihabal3amri/DiPlay/pull/769), [#844](https://github.com/shihabal3amri/DiPlay/pull/844), [#695](https://github.com/shihabal3amri/DiPlay/pull/695), [#908](https://github.com/shihabal3amri/DiPlay/pull/908) ## Installation - DiPlay installs on Android 7.0. Android refused the APK there (`INSTALL_FAILED_OLDER_SDK`), so a Digma Optima 1022N tablet ran DiPlay only after its build.prop claimed Android 7.1 ([#840](https://github.com/shihabal3amri/DiPlay/issues/840)). Android 7.1 and later are unchanged. No BYD head unit on Android 7.0 has been checked, so DiPlay's BYD DiLink 1.0 settings-screen workaround stays limited to Android 7.1. Not yet tested on a real Android 7.0 head unit. [#847](https://github.com/shihabal3amri/DiPlay/pull/847) - DiPlay is now available in Italian, chosen under **Settings → Language** or following the system language. Thanks to @gabrielerandazzo. [#863](https://github.com/shihabal3amri/DiPlay/pull/863) ## Connection setup and recovery - When wireless CarPlay cannot start, the CarPlay screen names the reason: "Hotspot network is not ready" when the car hotspot never comes up, or "The iPhone did not connect to CarPlay in time". Once the automatic retries stop, it adds "Automatic retries stopped. Check the connection and retry manually." The screen used to say **Getting CarPlay ready…** between and after retries, as if DiPlay were still connecting ([#809](https://github.com/shihabal3amri/DiPlay/issues/809)). A car hotspot DiPlay cannot use (off, on the other band, or no access to start it) is not retried, and the screen now says so instead of "Connection interrupted. Retrying…". [#824](https://github.com/shihabal3amri/DiPlay/pull/824) - When the wireless permissions were refused, the CarPlay screen names what is missing: Location, Nearby devices (Bluetooth or nearby Wi‑Fi devices), or, for anything else such as Android 17's local network access, a line to check DiPlay's app permissions. After a refusal the screen used to stay on "Getting CarPlay ready…" ([#290](https://github.com/shihabal3amri/DiPlay/issues/290)). It checks again when DiPlay returns from Android's settings. [#795](https://github.com/shihabal3amri/DiPlay/pull/795) - On BYD DiLink 1.0 (Android 7.1), the Bluetooth and car hotspot buttons open BYD's own Bluetooth and hotspot screens. The settings app there answers sixty standard settings actions with only "多媒体系统不支持此操作" (this operation is not supported), so the buttons showed that message instead of a settings screen. Where no screen can be found, DiPlay says to open the setting from the car's settings app. Other Android versions are unchanged. [#794](https://github.com/shihabal3amri/DiPlay/pull/794) - DiPlay warns again that the car hotspot is off when it really is. Since 0.2.20, tapping **Connect** on "Car hotspot is off" makes DiPlay trust the driver over Android's report, for firmware that reports its hotspot off while it is on ([#604](https://github.com/shihabal3amri/DiPlay/issues/604)). A BYD Han EV 2020 (DiLink 2.0) keeps its hotspot switch on but starts the hotspot only when its own hotspot page opens, so every attempt then retried for a minute without a hotspot ([#809](https://github.com/shihabal3amri/DiPlay/issues/809)). When an attempt finds no hotspot and Android still reports it off, DiPlay now drops that choice, and the next attempt says the hotspot is off. [#827](https://github.com/shihabal3amri/DiPlay/pull/827) - DiPlay no longer closes when it opens CarPlay from BYD's DiYou desktop card (DiLink 5.0). Android refused to start the CarPlay screen in its own task there (`There is no running activity in rootTask`), which has happened since 0.2.12 ([#463](https://github.com/shihabal3amri/DiPlay/issues/463)). DiPlay now opens the screen in a new task instead, and logs a second refusal rather than closing. Pending in-car acceptance. [#827](https://github.com/shihabal3amri/DiPlay/pull/827) - **Import the car hotspot details (experimental)** (**Settings → Connection**, in the car hotspot setup), off by default: DiPlay copies the name and password the car's hotspot already uses, so the driver does not type them. If the car's details cannot be read, DiPlay offers to write its own details to the car instead, only after a confirmation, and phones already using the car hotspot may have to enter the new password. It works on Android 7.1 directly and on Android 11 and later through DiPlay's network ADB access. Android 8 to 10 do not allow it, so the switch is not shown there. A WPA3 hotspot is left unchanged. Pending in-car acceptance. [#769](https://github.com/shihabal3amri/DiPlay/pull/769) - Wired CarPlay no longer waits forever when the iPhone ignores DiPlay's request to switch to CarPlay mode, for example after **Disconnect** with the cable still plugged in ([#335](https://github.com/shihabal3amri/DiPlay/issues/335), [#610](https://github.com/shihabal3amri/DiPlay/issues/610)). After 10 s without the iPhone re-appearing, DiPlay looks at it again and continues with the mode it is in. [#841](https://github.com/shihabal3amri/DiPlay/pull/841) - A wired connection that recovers by itself after an error is no longer torn down by the retry that error scheduled. On a Seal 06 DM-i (DiLink 5.0), a second CarPlay mode request failed while the iPhone was already switching, the switch completed, and the retry then dropped the working session ([#873](https://github.com/shihabal3amri/DiPlay/issues/873)). A connection that is lost again before the retry still restarts. [#876](https://github.com/shihabal3amri/DiPlay/pull/876) - On Android 13 and later, when DiPlay is set to Wi-Fi Direct and the car hotspot is on, Android asks the driver to turn the hotspot off. Answering **Cancel** used to bring the question back every few seconds. DiPlay now stops and says "The car hotspot is on, and Wi-Fi Direct cannot start beside it", with a hint to turn the hotspot off or use the built-in car hotspot mode, and asks again only on **Retry connection**. [#893](https://github.com/shihabal3amri/DiPlay/pull/893) - DiPlay finds a car hotspot that runs on a network interface Android does not report as a Wi-Fi hotspot, such as `eth0.3` on a 2023 Lynk & Co 03 ([#573](https://github.com/shihabal3amri/DiPlay/issues/573)). That interface can also be entered by hand in the car hotspot details (**Hotspot interface (optional)**). Head units whose hotspot Android reports are unchanged. Pending in-car acceptance. [#885](https://github.com/shihabal3amri/DiPlay/pull/885) - When Bluetooth is still turning on, DiPlay waits up to 3 s for it instead of stopping wireless CarPlay at once ([#750](https://github.com/shihabal3amri/DiPlay/issues/750)), and the report includes the Bluetooth adapter state. [#822](https://github.com/shihabal3amri/DiPlay/pull/822) - **Save and reconnect** in the CarPlay quick menu works again for drivers on USB who never set up a car hotspot. It checked the empty hotspot details, refused to save, and showed the error on another page of the menu, so the button seemed to do nothing ([#848](https://github.com/shihabal3amri/DiPlay/issues/848)). The hotspot details are now checked only when they or the wireless switch change, and a refused save opens the page with the error. [#853](https://github.com/shihabal3amri/DiPlay/pull/853) - Wired CarPlay no longer stays on "connecting" forever when the iPhone accepts the start request but never opens CarPlay ([#889](https://github.com/shihabal3amri/DiPlay/issues/889), [#890](https://github.com/shihabal3amri/DiPlay/issues/890)). That happened after reopening DiPlay with the cable still plugged in, and on a first attempt on an Android 9 head unit, and only a replug recovered it. DiPlay now waits at most 30 s, the same as wireless (working head units open CarPlay 2–13 s after the request), then starts a new attempt itself. The report then counts what arrived from the iPhone on the USB network link. Pending in-car acceptance. [#907](https://github.com/shihabal3amri/DiPlay/pull/907) ## Display - **Temporary system bars (5 seconds)** in the CarPlay quick menu (**Display → Fullscreen**), off by default: swiping up with the quick-menu finger count shows the hidden status and navigation bars for five seconds, for example to reach the climate controls, without changing CarPlay's size or reconnecting ([#754](https://github.com/shihabal3amri/DiPlay/issues/754)). Swiping down still opens the quick menu. Some firmware may ignore the request. [#818](https://github.com/shihabal3amri/DiPlay/pull/818) - **Black rounded corners** in the CarPlay quick menu (**Safe area**) paints the screen corners black, at 12, 24, 36 or 48 dp, so rounded CarPlay corners no longer show the wallpaper colour ([#586](https://github.com/shihabal3amri/DiPlay/issues/586), [#635](https://github.com/shihabal3amri/DiPlay/issues/635)). **iPhone mask (experimental)** asks the iPhone for its own corner mask and draws it, and falls back to 24 dp when the iPhone sends none; it applies at the next connection and is not yet tested with a real iPhone. Off by default. [#811](https://github.com/shihabal3amri/DiPlay/pull/811) - The description of **Turn CarPlay with the screen without reconnecting** now says that a CarPlay screenshot taken on the iPhone shows the whole square picture, including the part the screen does not show ([#839](https://github.com/shihabal3amri/DiPlay/issues/839)). [#864](https://github.com/shihabal3amri/DiPlay/pull/864) - On BYD head units with the DiLink 7.0 interface, DiPlay can be opened in the wide side of the split screen. It declares the split-screen support BYD's own apps declare, and DiLink offers it the 70 % side, not the narrow 30 % one. Other head units ignore the declaration. Thanks to @crazyurus. [#875](https://github.com/shihabal3amri/DiPlay/pull/875) ## Audio, calls and Siri - Music no longer plays seconds behind the iPhone. In 0.2.20 the music clock adjustment ([#788](https://github.com/shihabal3amri/DiPlay/pull/788)) measured only the audio buffered in Android, so on head units where that buffer stays below DiPlay's start level it slowed music to its 1.5 % limit, and the rest piled up undecoded: up to 192 packets, about 4 s, on a DiLink 3.0 ([#806](https://github.com/shihabal3amri/DiPlay/issues/806)) and over USB on a Qualcomm head unit ([#719](https://github.com/shihabal3amri/DiPlay/issues/719)). A track change, pause or skip was heard seconds late. DiPlay now counts the music waiting to be decoded, does not learn the head unit's clock from such a backlog, and skips stale music only when more than 1.5 s stays queued for another 1.5 s. Pending in-car acceptance. [#814](https://github.com/shihabal3amri/DiPlay/pull/814) - Music that stopped after a call or another app's short interruption comes back when the iPhone starts playing again. Some head units never tell DiPlay that the interruption ended, so DiPlay kept its music muted. It now asks Android for audio focus again when the iPhone starts playing, and only unmutes when Android grants it. Pending in-car acceptance. [#804](https://github.com/shihabal3amri/DiPlay/pull/804) - DiPlay no longer closes when the iPhone's microphone is used on head units without Android's own Opus encoder (Android 9 and earlier). The software Opus encoder reported a failed internal check as an error that DiPlay did not catch, which ended the app while recording a WhatsApp voice message ([#865](https://github.com/shihabal3amri/DiPlay/issues/865)) and, likely, when Siri started on an Android 8.1 tablet ([#720](https://github.com/shihabal3amri/DiPlay/issues/720)). Such a failure now costs one 20 ms audio frame. [#866](https://github.com/shihabal3amri/DiPlay/pull/866) - Navigation guidance attenuation now lowers the guidance audio itself instead of the Android track volume, which a DiLink 3.0 head unit ignored ([#719](https://github.com/shihabal3amri/DiPlay/issues/719)). [#841](https://github.com/shihabal3amri/DiPlay/pull/841) - **Hide BYD call popup (experimental)** is offered on BYD head units running Android 10 and later, not only on Android 12L. [#845](https://github.com/shihabal3amri/DiPlay/pull/845) - The setting for the phone, hang-up, Siri and media keys during CarPlay calls is now named **CarPlay call, Siri and media keys (experimental)**, and its description says what each key does. [#842](https://github.com/shihabal3amri/DiPlay/pull/842) ## Dashboard - On BYD head units, DiPlay hands the instrument cluster back to the car 15 s after CarPlay's cluster map stops, for example when the driver leaves with the iPhone. It used to keep its window on the cluster, and when the car stopped DiPlay soon after, a 2023 Song Plus (DiLink 3.0) showed BYD's "instrument simple mode running" until the head unit restarted ([#883](https://github.com/shihabal3amri/DiPlay/issues/883), [#803](https://github.com/shihabal3amri/DiPlay/issues/803)). The next CarPlay map takes the cluster again, and a quicker reconnect keeps it. DiLink 5.1's own cluster layers are unchanged. Pending in-car acceptance. [#909](https://github.com/shihabal3amri/DiPlay/pull/909) ## Home screen and ambient lighting - **Home-screen bubble (experimental)** (**Settings → Advanced**), off by default: on head units whose launcher shows only its own cards, there was no way to open DiPlay from the home screen ([#650](https://github.com/shihabal3amri/DiPlay/issues/650)). DiPlay now draws its icon as a bubble over the home screen. A tap opens CarPlay, or DiPlay's settings when CarPlay is not connected. A drag moves the bubble, and holding it locks its place. It hides while a DiPlay screen is open. It uses the "display over other apps" permission DiPlay already asks for the dashboard map card. [#844](https://github.com/shihabal3amri/DiPlay/pull/844) - **Car's own music rhythm** (**Settings → Advanced → Ambient lighting**), off by default: on BYD head units, the car's own ambient-light music rhythm follows CarPlay music, with the colours and effects set in the car's ambient-light menu, where its music rhythm must be on ([#550](https://github.com/shihabal3amri/DiPlay/issues/550)). BYD starts the rhythm only for its own music apps, so DiPlay asks the car's audio service for it under the name of BYD's media centre (`com.byd.mediacenter`). Where the head unit refuses that call from an app, DiPlay makes it through its network ADB access. The rhythm stops when CarPlay music pauses or the session ends. Tested on a 2024 Tang (DiLink 5, Android 12L). [#695](https://github.com/shihabal3amri/DiPlay/pull/695) - **Send music data to the car's rhythm (older head units)** (**Settings → Advanced → Ambient lighting**, with **Car's own music rhythm** on), off by default: on head units such as a 2023 Han (DiLink 3.0), the car's own rhythm starts but the lamps stay dark, because the car makes no spectrum of its own for CarPlay music. DiPlay now sends the played music's 16 frequency bands to the car's lamp controller through its network ADB access, so the car's rhythm, including the passenger dash, follows the music. Tested in the car with synthetic bands. [#908](https://github.com/shihabal3amri/DiPlay/pull/908) ## Wheel keys - **Play/pause key on the wheel** (**Settings → Vehicle → Wheel keys**), off by default, makes a spare steering-wheel or keyboard key play and pause CarPlay music, for cars with no play/pause button ([#815](https://github.com/shihabal3amri/DiPlay/issues/815)). Keys that remotes and the car already use (navigation, Home, Back, volume, voice and media keys) cannot be assigned. During a call, or without a CarPlay session, the key does what it did before. [#823](https://github.com/shihabal3amri/DiPlay/pull/823) - **Double press for Siri** (**Settings → Vehicle → Wheel keys**, with the Siri key assigned), off by default: the assigned Siri key opens Siri only on a double press, and both presses still reach the car, so a key that already does something in the car keeps doing it. Siri opens after the second release and an adjustable delay (300 ms by default), so the car's own assistant can close first; the double-press interval is adjustable too (600 ms by default). It works through the wheel-key service when the car's assistant takes the screen, and through the CarPlay window otherwise. [#813](https://github.com/shihabal3amri/DiPlay/pull/813) ## Diagnostics - The crash record in the report keeps up to six of DiPlay's own stack frames after the first twelve. A crash inside an Android call filled the first twelve with Android's frames, so the record from [#463](https://github.com/shihabal3amri/DiPlay/issues/463) did not show which DiPlay code made the call. [#827](https://github.com/shihabal3amri/DiPlay/pull/827) - While DiPlay waits for the iPhone over USB, the report lists the USB devices Android sees, as `vid:pid node`, once and again only when the list changes (`wired iPhone not listed by Android; USB devices=[…]`). `iPhone USB device not present` alone could not tell a port that Android does not see at all, such as a charge-only port, from a cable or iPhone problem ([#763](https://github.com/shihabal3amri/DiPlay/issues/763)). [#830](https://github.com/shihabal3amri/DiPlay/pull/830) - With **Allow reporting wheel speed** on, the report gets one line a minute saying how many location updates reached the iPhone, how many carried a GPS position and how many carried wheel speed, and the last wheel speed. It shows where wheel speed stops in a tunnel ([#807](https://github.com/shihabal3amri/DiPlay/issues/807)). [#862](https://github.com/shihabal3amri/DiPlay/pull/862) ## Updating and reporting problems Install the official APK over the previous public release to preserve settings and pairing records. The package remains `com.shihab.diplay`; release packaging verifies the existing signing certificate. Source builds omit runtime authentication assets by default; see [building from source](BUILD.md). Reproduce remaining problems on **0.2.21**, then open **Settings → Diagnostics → Save diagnostic report**. Android 10+ normally saves to **Downloads/DiPlay**; on Android 7.0–9, DiPlay asks for storage access and saves there too. If it is unavailable, follow the save confirmation and use **View report** or **Share**. Review the `.txt` and attach it to a matching [existing issue](https://github.com/shihabal3amri/DiPlay/issues) or [new issue](https://github.com/shihabal3amri/DiPlay/issues/new/choose). Connection reports require the diagnostic log. Reports are not uploaded automatically. Include car/head unit, Android/DiLink and full firmware, iPhone/iOS, USB or wireless mode, relevant settings, reproduction steps and failure time. See [validation](VALIDATION.md) for automated checks. No new maintainer vehicle test of the complete release is claimed. The entries marked "Pending in-car acceptance", Android 7.0, the wired start limit, the dashboard hand-back and the options that are off by default need current in-car feedback; test optional features while parked. Thanks to the contributors of the 31 pull requests in this release, and to the users supplying diagnostic reports and vehicle feedback.