diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/media/CarMedia.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/media/CarMedia.kt index 325c0d7..a4d7881 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/media/CarMedia.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/media/CarMedia.kt @@ -1,5 +1,6 @@ package app.seb3thehacker.gearslip.media +import app.seb3thehacker.gearslip.R import android.content.ComponentName import android.content.Context import android.content.Intent @@ -391,7 +392,7 @@ class CarMedia(private val context: Context) { speed = state?.playbackSpeed ?: 1f, updatedAt = state?.lastPositionUpdateTime ?: 0, actions = state?.actions ?: 0, - custom = state?.customActions.orEmpty().map { CustomAction(it.action, it.name.toString(), it.extras, it.icon, iconName(it.icon)) }, + custom = withNextChapter(state?.customActions.orEmpty().map { CustomAction(it.action, it.name.toString(), it.extras, it.icon, iconName(it.icon)) }), error = state?.errorMessage?.toString(), activeQueueItemId = state?.activeQueueItemId ?: MediaSession.QueueItem.UNKNOWN_ID.toLong(), heart = if (controller?.ratingType == Rating.RATING_HEART) { @@ -405,12 +406,28 @@ class CarMedia(private val context: Context) { private var appResources: Pair? = null /** The icon's resource name in the app's package, or "" when it can't be read. */ - private fun iconName(icon: Int): String { - val pkg = controller?.packageName ?: return "" + /** + * AntennaPod takes a Next chapter command whenever it's playing, but offers the button only + * when the driver turns it on in its notification settings. Gearslip offers it either way, + * with AntennaPod's own icon; on an episode without chapters it does nothing. + */ + private fun withNextChapter(actions: List): List { + if (controller?.packageName != ANTENNAPOD) return actions + if (actions.any { it.id in ANTENNAPOD_NEXT_CHAPTER }) return actions + val icon = resourcesOf(ANTENNAPOD)?.getIdentifier("ic_notification_next_chapter", "drawable", ANTENNAPOD) ?: 0 + return actions + CustomAction(ANTENNAPOD_NEXT_CHAPTER.first(), context.getString(R.string.player_next_chapter), null, icon) + } + + private fun resourcesOf(pkg: String): android.content.res.Resources? { if (appResources?.first != pkg) { appResources = pkg to runCatching { context.packageManager.getResourcesForApplication(pkg) }.getOrNull() } - val res = appResources?.second ?: return "" + return appResources?.second + } + + private fun iconName(icon: Int): String { + val pkg = controller?.packageName ?: return "" + val res = resourcesOf(pkg) ?: return "" return runCatching { res.getResourceEntryName(icon) }.getOrDefault("") } @@ -515,7 +532,15 @@ class CarMedia(private val context: Context) { fun next() = controller?.transportControls?.skipToNext() fun previous() = controller?.transportControls?.skipToPrevious() fun seek(ms: Long) = controller?.transportControls?.seekTo(ms) - fun custom(action: CustomAction) = controller?.transportControls?.sendCustomAction(action.id, action.extras) + fun custom(action: CustomAction) { + val controls = controller?.transportControls ?: return + // AntennaPod's media3 service and its older one each know only their own name for it. + if (controller?.packageName == ANTENNAPOD && action.id in ANTENNAPOD_NEXT_CHAPTER) { + ANTENNAPOD_NEXT_CHAPTER.forEach { controls.sendCustomAction(it, null) } + } else { + controls.sendCustomAction(action.id, action.extras) + } + } fun playQueueItem(track: QueueTrack) = controller?.transportControls?.skipToQueueItem(track.queueId) /** @@ -798,6 +823,10 @@ class CarMedia(private val context: Context) { } /** Android Auto's browse layout hints, which any app built for it already sends. */ +private const val ANTENNAPOD = "de.danoeh.antennapod" +/** The media3 service's name first: that's the one offered as the button's own. */ +private val ANTENNAPOD_NEXT_CHAPTER = listOf("next_chapter", "action.de.danoeh.antennapod.core.service.next_chapter") + private const val STYLE_SUPPORTED = "android.media.browse.CONTENT_STYLE_SUPPORTED" private const val STYLE_BROWSABLE = "android.media.browse.CONTENT_STYLE_BROWSABLE_HINT" private const val STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT" diff --git a/gearslip/src/main/res/values-ar/strings.xml b/gearslip/src/main/res/values-ar/strings.xml index deedb66..ada635f 100644 --- a/gearslip/src/main/res/values-ar/strings.xml +++ b/gearslip/src/main/res/values-ar/strings.xml @@ -865,4 +865,5 @@ مسح اللغة مثل لغة الهاتف + الفصل التالي diff --git a/gearslip/src/main/res/values-cs/strings.xml b/gearslip/src/main/res/values-cs/strings.xml index d599e0c..fa7cb2a 100644 --- a/gearslip/src/main/res/values-cs/strings.xml +++ b/gearslip/src/main/res/values-cs/strings.xml @@ -849,4 +849,5 @@ Vymazat Jazyk Stejný jako v telefonu + Další kapitola diff --git a/gearslip/src/main/res/values-da/strings.xml b/gearslip/src/main/res/values-da/strings.xml index 2a571a9..70803a2 100644 --- a/gearslip/src/main/res/values-da/strings.xml +++ b/gearslip/src/main/res/values-da/strings.xml @@ -2,4 +2,5 @@ Sprog Samme som telefonen + Næste kapitel \ No newline at end of file diff --git a/gearslip/src/main/res/values-de/strings.xml b/gearslip/src/main/res/values-de/strings.xml index 486519a..5ed8e8a 100644 --- a/gearslip/src/main/res/values-de/strings.xml +++ b/gearslip/src/main/res/values-de/strings.xml @@ -715,4 +715,5 @@ Für Autos mit einem zweiten Bildschirm im Kombiinstrument: Gearslip zeigt dort das nächste Abbiegen. Gilt ab der nächsten Verbindung. Sprache Wie auf dem Telefon + Nächstes Kapitel diff --git a/gearslip/src/main/res/values-es/strings.xml b/gearslip/src/main/res/values-es/strings.xml index 8bad5d9..5717641 100644 --- a/gearslip/src/main/res/values-es/strings.xml +++ b/gearslip/src/main/res/values-es/strings.xml @@ -715,4 +715,5 @@ Para coches con una segunda pantalla en el cuadro de instrumentos: Gearslip muestra ahí el próximo giro. Se aplica en la próxima conexión. Idioma El mismo que el teléfono + Capítulo siguiente diff --git a/gearslip/src/main/res/values-fr/strings.xml b/gearslip/src/main/res/values-fr/strings.xml index efd9d95..cac5c71 100644 --- a/gearslip/src/main/res/values-fr/strings.xml +++ b/gearslip/src/main/res/values-fr/strings.xml @@ -841,4 +841,5 @@ Effacer Langue Comme le téléphone + Chapitre suivant diff --git a/gearslip/src/main/res/values-it/strings.xml b/gearslip/src/main/res/values-it/strings.xml index 8b44ad4..3d4941d 100644 --- a/gearslip/src/main/res/values-it/strings.xml +++ b/gearslip/src/main/res/values-it/strings.xml @@ -841,4 +841,5 @@ Cancella Lingua Come il telefono + Capitolo successivo diff --git a/gearslip/src/main/res/values-ja/strings.xml b/gearslip/src/main/res/values-ja/strings.xml index cc7f440..775d95b 100644 --- a/gearslip/src/main/res/values-ja/strings.xml +++ b/gearslip/src/main/res/values-ja/strings.xml @@ -825,4 +825,5 @@ 消去 言語 スマートフォンと同じ + 次のチャプター diff --git a/gearslip/src/main/res/values-ko/strings.xml b/gearslip/src/main/res/values-ko/strings.xml index b412491..ea2d22b 100644 --- a/gearslip/src/main/res/values-ko/strings.xml +++ b/gearslip/src/main/res/values-ko/strings.xml @@ -825,4 +825,5 @@ 지우기 언어 휴대전화와 동일 + 다음 챕터 diff --git a/gearslip/src/main/res/values-nl/strings.xml b/gearslip/src/main/res/values-nl/strings.xml index 887d8a0..9381f58 100644 --- a/gearslip/src/main/res/values-nl/strings.xml +++ b/gearslip/src/main/res/values-nl/strings.xml @@ -833,4 +833,5 @@ Wissen Taal Zelfde als de telefoon + Volgend hoofdstuk diff --git a/gearslip/src/main/res/values-pl/strings.xml b/gearslip/src/main/res/values-pl/strings.xml index dea80c3..979c09a 100644 --- a/gearslip/src/main/res/values-pl/strings.xml +++ b/gearslip/src/main/res/values-pl/strings.xml @@ -849,4 +849,5 @@ Wyczyść Język Taki sam jak w telefonie + Następny rozdział diff --git a/gearslip/src/main/res/values-pt-rBR/strings.xml b/gearslip/src/main/res/values-pt-rBR/strings.xml index 2b9ce89..b113c67 100644 --- a/gearslip/src/main/res/values-pt-rBR/strings.xml +++ b/gearslip/src/main/res/values-pt-rBR/strings.xml @@ -841,4 +841,5 @@ Limpar Idioma O mesmo do celular + Próximo capítulo diff --git a/gearslip/src/main/res/values-ro/strings.xml b/gearslip/src/main/res/values-ro/strings.xml index 28f0a3e..7e5b225 100644 --- a/gearslip/src/main/res/values-ro/strings.xml +++ b/gearslip/src/main/res/values-ro/strings.xml @@ -2,4 +2,5 @@ Limbă La fel ca pe telefon + Capitolul următor \ No newline at end of file diff --git a/gearslip/src/main/res/values-ru/strings.xml b/gearslip/src/main/res/values-ru/strings.xml index aae6635..e923084 100644 --- a/gearslip/src/main/res/values-ru/strings.xml +++ b/gearslip/src/main/res/values-ru/strings.xml @@ -849,4 +849,5 @@ Очистить Язык Как на телефоне + Следующая глава diff --git a/gearslip/src/main/res/values-sv/strings.xml b/gearslip/src/main/res/values-sv/strings.xml index ed531b0..40973ec 100644 --- a/gearslip/src/main/res/values-sv/strings.xml +++ b/gearslip/src/main/res/values-sv/strings.xml @@ -833,4 +833,5 @@ Rensa Språk Samma som telefonen + Nästa kapitel diff --git a/gearslip/src/main/res/values-tr/strings.xml b/gearslip/src/main/res/values-tr/strings.xml index 88688eb..dd0b7f8 100644 --- a/gearslip/src/main/res/values-tr/strings.xml +++ b/gearslip/src/main/res/values-tr/strings.xml @@ -833,4 +833,5 @@ Temizle Dil Telefonla aynı + Sonraki bölüm diff --git a/gearslip/src/main/res/values-uk/strings.xml b/gearslip/src/main/res/values-uk/strings.xml index e93ab50..8d05571 100644 --- a/gearslip/src/main/res/values-uk/strings.xml +++ b/gearslip/src/main/res/values-uk/strings.xml @@ -849,4 +849,5 @@ Очистити Мова Як на телефоні + Наступний розділ diff --git a/gearslip/src/main/res/values-zh-rCN/strings.xml b/gearslip/src/main/res/values-zh-rCN/strings.xml index 9607302..635de5c 100644 --- a/gearslip/src/main/res/values-zh-rCN/strings.xml +++ b/gearslip/src/main/res/values-zh-rCN/strings.xml @@ -825,4 +825,5 @@ 清除 语言 与手机相同 + 下一章 diff --git a/gearslip/src/main/res/values/strings.xml b/gearslip/src/main/res/values/strings.xml index d8b786a..9fa6e27 100644 --- a/gearslip/src/main/res/values/strings.xml +++ b/gearslip/src/main/res/values/strings.xml @@ -877,4 +877,5 @@ Clear Language Same as the phone + Next chapter