mirror of
https://github.com/twinksoftware/Gearslip.git
synced 2026-11-10 16:02:25 +01:00
AntennaPod gets a Next chapter button in the car
AntennaPod takes the command whenever it plays, but only offers the button when it's turned on in its own notification settings.
This commit is contained in:
1 parent
3f25122fb6
commit
253cc5cad5
20 files changed
+53
-5
No files matched your search
@@ -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<String, android.content.res.Resources?>? = 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<CustomAction>): List<CustomAction> {
|
||||
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"
|
||||
|
||||
@@ -865,4 +865,5 @@
|
||||
<string name="places_clear">مسح</string>
|
||||
<string name="settings_language">اللغة</string>
|
||||
<string name="settings_language_phone">مثل لغة الهاتف</string>
|
||||
<string name="player_next_chapter">الفصل التالي</string>
|
||||
</resources>
|
||||
@@ -849,4 +849,5 @@
|
||||
<string name="places_clear">Vymazat</string>
|
||||
<string name="settings_language">Jazyk</string>
|
||||
<string name="settings_language_phone">Stejný jako v telefonu</string>
|
||||
<string name="player_next_chapter">Další kapitola</string>
|
||||
</resources>
|
||||
@@ -2,4 +2,5 @@
|
||||
<resources>
|
||||
<string name="settings_language">Sprog</string>
|
||||
<string name="settings_language_phone">Samme som telefonen</string>
|
||||
<string name="player_next_chapter">Næste kapitel</string>
|
||||
</resources>
|
||||
@@ -715,4 +715,5 @@
|
||||
<string name="car_cluster_video_note">Für Autos mit einem zweiten Bildschirm im Kombiinstrument: Gearslip zeigt dort das nächste Abbiegen. Gilt ab der nächsten Verbindung.</string>
|
||||
<string name="settings_language">Sprache</string>
|
||||
<string name="settings_language_phone">Wie auf dem Telefon</string>
|
||||
<string name="player_next_chapter">Nächstes Kapitel</string>
|
||||
</resources>
|
||||
@@ -715,4 +715,5 @@
|
||||
<string name="car_cluster_video_note">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.</string>
|
||||
<string name="settings_language">Idioma</string>
|
||||
<string name="settings_language_phone">El mismo que el teléfono</string>
|
||||
<string name="player_next_chapter">Capítulo siguiente</string>
|
||||
</resources>
|
||||
@@ -841,4 +841,5 @@
|
||||
<string name="places_clear">Effacer</string>
|
||||
<string name="settings_language">Langue</string>
|
||||
<string name="settings_language_phone">Comme le téléphone</string>
|
||||
<string name="player_next_chapter">Chapitre suivant</string>
|
||||
</resources>
|
||||
@@ -841,4 +841,5 @@
|
||||
<string name="places_clear">Cancella</string>
|
||||
<string name="settings_language">Lingua</string>
|
||||
<string name="settings_language_phone">Come il telefono</string>
|
||||
<string name="player_next_chapter">Capitolo successivo</string>
|
||||
</resources>
|
||||
@@ -825,4 +825,5 @@
|
||||
<string name="places_clear">消去</string>
|
||||
<string name="settings_language">言語</string>
|
||||
<string name="settings_language_phone">スマートフォンと同じ</string>
|
||||
<string name="player_next_chapter">次のチャプター</string>
|
||||
</resources>
|
||||
@@ -825,4 +825,5 @@
|
||||
<string name="places_clear">지우기</string>
|
||||
<string name="settings_language">언어</string>
|
||||
<string name="settings_language_phone">휴대전화와 동일</string>
|
||||
<string name="player_next_chapter">다음 챕터</string>
|
||||
</resources>
|
||||
@@ -833,4 +833,5 @@
|
||||
<string name="places_clear">Wissen</string>
|
||||
<string name="settings_language">Taal</string>
|
||||
<string name="settings_language_phone">Zelfde als de telefoon</string>
|
||||
<string name="player_next_chapter">Volgend hoofdstuk</string>
|
||||
</resources>
|
||||
@@ -849,4 +849,5 @@
|
||||
<string name="places_clear">Wyczyść</string>
|
||||
<string name="settings_language">Język</string>
|
||||
<string name="settings_language_phone">Taki sam jak w telefonie</string>
|
||||
<string name="player_next_chapter">Następny rozdział</string>
|
||||
</resources>
|
||||
@@ -841,4 +841,5 @@
|
||||
<string name="places_clear">Limpar</string>
|
||||
<string name="settings_language">Idioma</string>
|
||||
<string name="settings_language_phone">O mesmo do celular</string>
|
||||
<string name="player_next_chapter">Próximo capítulo</string>
|
||||
</resources>
|
||||
@@ -2,4 +2,5 @@
|
||||
<resources>
|
||||
<string name="settings_language">Limbă</string>
|
||||
<string name="settings_language_phone">La fel ca pe telefon</string>
|
||||
<string name="player_next_chapter">Capitolul următor</string>
|
||||
</resources>
|
||||
@@ -849,4 +849,5 @@
|
||||
<string name="places_clear">Очистить</string>
|
||||
<string name="settings_language">Язык</string>
|
||||
<string name="settings_language_phone">Как на телефоне</string>
|
||||
<string name="player_next_chapter">Следующая глава</string>
|
||||
</resources>
|
||||
@@ -833,4 +833,5 @@
|
||||
<string name="places_clear">Rensa</string>
|
||||
<string name="settings_language">Språk</string>
|
||||
<string name="settings_language_phone">Samma som telefonen</string>
|
||||
<string name="player_next_chapter">Nästa kapitel</string>
|
||||
</resources>
|
||||
@@ -833,4 +833,5 @@
|
||||
<string name="places_clear">Temizle</string>
|
||||
<string name="settings_language">Dil</string>
|
||||
<string name="settings_language_phone">Telefonla aynı</string>
|
||||
<string name="player_next_chapter">Sonraki bölüm</string>
|
||||
</resources>
|
||||
@@ -849,4 +849,5 @@
|
||||
<string name="places_clear">Очистити</string>
|
||||
<string name="settings_language">Мова</string>
|
||||
<string name="settings_language_phone">Як на телефоні</string>
|
||||
<string name="player_next_chapter">Наступний розділ</string>
|
||||
</resources>
|
||||
@@ -825,4 +825,5 @@
|
||||
<string name="places_clear">清除</string>
|
||||
<string name="settings_language">语言</string>
|
||||
<string name="settings_language_phone">与手机相同</string>
|
||||
<string name="player_next_chapter">下一章</string>
|
||||
</resources>
|
||||
@@ -877,4 +877,5 @@
|
||||
<string name="places_clear">Clear</string>
|
||||
<string name="settings_language">Language</string>
|
||||
<string name="settings_language_phone">Same as the phone</string>
|
||||
<string name="player_next_chapter">Next chapter</string>
|
||||
</resources>
|
||||
Reference in new issue
Block a user