Skip to content

Commit 33de447

Browse files
committed
fix next/previous/paly/pause for A9 firmware
1 parent fea357a commit 33de447

1 file changed

Lines changed: 34 additions & 2 deletions

File tree

‎app/src/main/java/com/mg4/control/hardware/MG4Hardware.kt‎

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)