@@ -4209,6 +4209,25 @@ object MG4Hardware {
42094209 * 4. **La touche média Android**, dernier recours : c'est la seule voie sur les firmwares A9,
42104210 * où ce service SAIC n'existe pas, et la seule qui atteigne une session Bluetooth.
42114211 */
4212+ /* *
4213+ * Une session est-elle en lecture ? `null` si on ne peut pas les consulter.
4214+ *
4215+ * ⚠️ Sert à décider du sens de la bascule pour la projection, à la place de `isMusicActive`.
4216+ * Ce dernier reste vrai plusieurs secondes après un arrêt — le piège déjà rencontré sur les
4217+ * autres sources : après une pause, on renvoyait une pause au lieu d'une reprise.
4218+ */
4219+ private fun sessionJoue (): Boolean? {
4220+ val ctx = sAppContext ? : return null
4221+ val msm = ctx.getSystemService(Context .MEDIA_SESSION_SERVICE ) as ? MediaSessionManager
4222+ ? : return null
4223+ return try {
4224+ msm.getActiveSessions(null )
4225+ .any { it.playbackState?.state == PlaybackState .STATE_PLAYING }
4226+ } catch (e: Exception ) {
4227+ null
4228+ }
4229+ }
4230+
42124231 /* *
42134232 * Pilotage par **session média** — la voie du framework Android.
42144233 *
@@ -4242,7 +4261,18 @@ object MG4Hardware {
42424261 val joue = sessions.firstOrNull { it.playbackState?.state == PlaybackState .STATE_PLAYING }
42434262 val cible = joue
42444263 ? : if (cmd == CmdMedia .LECTURE_PAUSE )
4245- sessions.firstOrNull { it.playbackState?.state == PlaybackState .STATE_PAUSED }
4264+ // ⚠️ Pour REPRENDRE, on ne demande pas un état précis mais une CAPACITÉ.
4265+ // Exiger STATE_PAUSED était trop strict : mesuré sur SWI132, la radio mise en
4266+ // pause ne se déclare pas forcément « en pause » — elle peut annoncer arrêtée
4267+ // ou aucun état. On ne trouvait alors aucune cible et la reprise était
4268+ // impossible, alors que la pause fonctionnait parfaitement.
4269+ //
4270+ // La liste est ordonnée par priorité : la première session capable de
4271+ // reprendre est la plus récemment active, donc celle que l'utilisateur veut.
4272+ sessions.firstOrNull {
4273+ ((it.playbackState?.actions ? : 0L ) and
4274+ (PlaybackState .ACTION_PLAY or PlaybackState .ACTION_PLAY_PAUSE )) != 0L
4275+ }
42464276 else null
42474277
42484278 if (cible == null ) {
@@ -4348,7 +4378,9 @@ object MG4Hardware {
43484378 // La session couvre radio, Bluetooth et USB sur ces firmwares. Ce qu'elle ne couvre
43494379 // pas, c'est la projection : elle ne déclare ni piste suivante ni précédente. D'où
43504380 // le service allgo, qui est justement la voie que leur launcher emprunte.
4351- if (ruiMedia(cmd, musiqueEnCours())) return true
4381+ // L'état vient des sessions, pas d'isMusicActive : c'est la seule source fiable
4382+ // ici, et `sessionMedia` vient justement de les consulter.
4383+ if (ruiMedia(cmd, sessionJoue() ? : musiqueEnCours())) return true
43524384
43534385 // Ultime recours, si l'énumération des sessions est refusée : la touche média, mais
43544386 // UNIQUEMENT si quelque chose joue. Sans ce garde-fou, l'envoyer pendant que la
0 commit comments