Patch for the SAIC MG4 (EH32 LL firmware) head unit that:
- Fixes missing DAB+ station artwork on the stock launcher home screen.
- Adds automatic radio resume when the car starts — the radio plays again on its own, without opening the app.
- Keeps live metadata (artwork, text) flowing to the launcher even while paused.
Virgin Radio artwork displayed live on the launcher home screen — song title included.
This is not optional. The radio runs as a system service that is already loaded in memory; the new APK only takes effect once the head unit restarts. After installing, reboot the unit (hold the Home button ~20 s until the screen turns off and it restarts). Until you reboot, you will keep running the old version and may think the patch "did nothing".
On the stock MG4 head unit, when you listen to a DAB+ station that broadcasts artwork (station logo, album cover, show image…), the image appears correctly inside the radio app — but the launcher home screen always shows a generic placeholder instead of the actual artwork.
After this patch, the artwork appears directly on the launcher home screen, along with the station name and current song title, without having to open the radio app.
⏱️ Be patient with the image — 10–60 s is normal. DAB+ stations only push their slideshow image periodically (typically every 10–30 s), and reception conditions add delay. So after a fresh start or a station change, the artwork can take anywhere from ~10 to ~60 seconds to appear or update, depending on signal quality and how often that particular station transmits images. A few stations send no images at all — this is rare, but when it happens there is nothing the patch can do. The per-station cache (below) makes already-seen stations show instantly.
If the radio was playing when you switched the car off, it now starts playing again automatically the next time you start the car — no need to open the radio app or press play.
- Controlled by an on-screen toggle added to the FM and DAB pages ("Auto-resume: ON / OFF"). Default is ON.
- If you manually paused the radio before switching off, it stays paused on the next start (your choice is respected).
- Works for both FM/AM and DAB+.
The "REPRISE AUTO : ON" toggle added at the bottom-left of the radio page.
How it works: at boot the car asks the radio to load as the active media source but in a muted / paused state (this is the stock behaviour — it's why the station name shows on the launcher but no sound plays). The patch intercepts that moment and, when auto-resume is enabled and the radio was playing at shutdown, routes it through the radio's normal tune-and-play path instead, so audio actually starts.
On the stock firmware, pausing the radio makes the launcher home screen freeze or drop the now-playing card — the artwork and text stop updating until you press play again.
After this patch, when you pause the radio the artwork, song/programme text (DAB+ DLS) and FM RDS text keep updating live on the launcher, exactly as if it were playing. Only the audio is muted.
How it works: pausing only mutes the audio — the tuner stays tuned and keeps decoding metadata. The stock code, however, called MediaSession.setActive(false) on pause, which removes the session from the system's active media session and stops the launcher from receiving further updates. The patch keeps the session active while paused (state still reported as PAUSED, so the play/pause button stays correct), so live metadata keeps reaching the launcher.
DAB+ stations only broadcast their slideshow image every 10–30 seconds. Without caching, you'd have to wait up to half a minute each time you switch stations for the image to appear on the launcher.
This patch also remembers the last image received for each station and restores it immediately the next time you tune to that station, so the artwork is visible right away. (The first time you ever hear a station, you still have to wait for its first broadcast — see the 10–60 s note above.)
Some stations broadcast rectangular images with side bars (e.g. France Info). When the bars are a single uniform colour the patch center-crops to a clean square; otherwise it letterboxes the image onto a square canvas. Either way images fit the launcher widget correctly without distortion.
The stock radio app receives slideshow bitmaps via onDabSlideShowChanged() in RadioService$DabTunerCallback and forwards them to its own UI — but never publishes them to the Android MediaSession (ALBUM_ART metadata key). The launcher reads artwork exclusively from MediaSession, so it never received anything.
This adds:
- Forward of each received bitmap to
MediaSessionviaIRadioMBSCallback.setSessionMetadataDabBitmap() - Per-station disk cache (
dab_<serviceId>.jpg) — saved on receive, restored on tune - Uniform-colour side-bar crop to square, with letterbox fallback for non-uniform bars
- Proper synchronization (
synchronized(mMBSCallbacks)) and null-guards matching the existing code patterns
At boot the car sends RadioService.onStartCommand() a "resume as source" command (event 0x8006), which the stock code handles via resumeOnlySource() / resumeDabOnlySource() — these deliberately mute(true) and set the session to PAUSED (source loaded, silent). That is why the launcher shows the station name but nothing plays.
This adds: a gate at the top of resumeOnlySource() / resumeDabOnlySource() — when the Auto-resume preference is ON and the radio was playing at shutdown, it instead calls the radio's existing resumeTunerChannel() / resumeDabTunerChannel() (full tune + PLAYING state) so audio actually starts. The preference and last-playing state are persisted in RadioSharedPreference; the on-screen toggle and play-state tracking live in the FM/DAB presenters and fragments.
Pausing routes through RadioMBService.toSetSessionPlaybackStatePaused(), which set the playback state to STATE_PAUSED and called MediaSession.setActive(false). An inactive session is no longer the system's active media session, so the launcher stops receiving metadata/art updates even though the tuner is still decoding them (pause = RadioTuner.setMute(true) only — the tuner stays tuned).
This removes the setActive(false) call on pause. The state is still reported as STATE_PAUSED (correct play/pause button, audio stays muted), but the session stays active, so the existing slideshow/DLS/RDS forwarding (which already runs with no play-state condition) keeps the launcher's artwork and text live.
Everything is contained in the radio APK — the launcher APK is untouched. See patches/radio/ for the exact modified smali and resource files.
- Download Radio_patched_signed.apk
- Copy it to a USB stick and plug it into the head unit's USB port
- Open the APK with the built-in file manager to install it
⚠️ A REBOOT IS REQUIRED after installation — this is not optional. Hold the Home button for approximately 20 seconds until the screen turns off and the unit restarts. Until you reboot, the old version keeps running and the patch will appear to do nothing.
ADB is disabled by default on the MG4 head unit. You need to enable it first using ADB_util, a tool developed by Leon Kerman:
XDA thread — MG4 Electric AAOS 9 playing (and possibly other MG models)
Once USB debugging is enabled:
- Connect a USB cable between your PC and the head unit
- Run:
The
adb push Radio_patched_signed.apk /data/local/tmp/radio_patch.apk adb shell pm install -f /data/local/tmp/radio_patch.apk
-fflag is required to replace the system app with the patched version.
⚠️ A REBOOT IS REQUIRED after installation — this is not optional. Hold the Home button for approximately 20 seconds until the screen turns off and the unit restarts. Until you reboot, the old version keeps running and the patch will appear to do nothing.
adb shell pm uninstall com.saicmotor.radioThe system original under /system/priv-app/Radio_eh32_ll/ is restored automatically.
Tested on: Radio_eh32_ll
Check your version before installing:
adb shell dumpsys package com.saicmotor.radio | grep versionName
