        val args = invoke.parseArgs(NowPlayingArgs::class.java)
        /* The window is on no screen anywhere — MediaService ignores it and
           the card cannot show it — so logcat is the only place on the
           device it can be read back, and tests/mobile/smoke.mjs reads it
           from exactly here. One line per update, and an update is a track
           change, a transport change or the thirty-second top-up, never a
           position tick. `at=` goes LAST because a title may hold anything,
           spaces and `=` included. */
        val window = args.queue ?: emptyList()
        android.util.Log.i(
            "SoulStream",
            "media window n=" + window.size + " i=" + (args.queueIndex ?: -1) +
                " art=" + window.count { !it.artKey.isNullOrEmpty() } +
                " at=" + (window.getOrNull(args.queueIndex ?: -1)?.title ?: ""),
        )
        ensureNotificationPermission()