feat(auto): browse and play local music folders in Android Auto [size:exception]

Phase 1: pick a device folder via SAF (persisted grant, no new
permission), browse its nested subfolders/tracks as a 5th Android
Auto root folder (hidden until configured), and play tracks through
the existing pipeline (EQ, art rotation, cold-start-safe source).
No metadata/sort/filter/shuffle yet -- filename is the title, generic
rotating art is the placeholder; deferred to a follow-up phase.

Adds a new pluriwave/file_actions native method (listAudioChildren)
and an onActivityResult override in MainActivity for the SAF folder
picker -- both static-review-only, no Android build available here.
This commit is contained in:
2026-07-19 20:30:50 +02:00
parent 99897ec848
commit 6ae7e378c4
28 changed files with 2425 additions and 40 deletions
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "اسم الجهاز",
"eqDeviceNameHint": "مثال: مكبر صوت غرفة المعيشة",
"eqDeviceNameConfirm": "حفظ",
"eqDeviceConnected": "متصل"
"eqDeviceConnected": "متصل",
"localMusicSectionTitle": "الموسيقى المحلية (Android Auto)",
"localMusicSectionDescription": "اختر مجلدًا على هذا الجهاز لتصفح ملفاته الصوتية وتشغيلها من السيارة.",
"localMusicFolderNotConfigured": "لم يتم تحديد مجلد",
"localMusicFolderTitle": "مجلد الموسيقى المحلية",
"localMusicChoosePath": "اختيار مجلد",
"localMusicChangePath": "تغيير المجلد",
"localMusicFolderUpdated": "تم تحديث مجلد الموسيقى المحلية",
"localMusicFolderSaveError": "تعذّر حفظ المجلد: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "ডিভাইসের নাম",
"eqDeviceNameHint": "যেমন: লিভিং রুমের স্পিকার",
"eqDeviceNameConfirm": "সংরক্ষণ করুন",
"eqDeviceConnected": "সংযুক্ত"
"eqDeviceConnected": "সংযুক্ত",
"localMusicSectionTitle": "স্থানীয় সঙ্গীত (Android Auto)",
"localMusicSectionDescription": "গাড়িতে অডিও ফাইল ব্রাউজ ও চালানোর জন্য এই ডিভাইসের একটি ফোল্ডার বেছে নিন।",
"localMusicFolderNotConfigured": "কোনো ফোল্ডার নির্বাচিত হয়নি",
"localMusicFolderTitle": "স্থানীয় সঙ্গীত ফোল্ডার",
"localMusicChoosePath": "ফোল্ডার বেছে নিন",
"localMusicChangePath": "ফোল্ডার পরিবর্তন করুন",
"localMusicFolderUpdated": "স্থানীয় সঙ্গীত ফোল্ডার আপডেট হয়েছে",
"localMusicFolderSaveError": "ফোল্ডার সংরক্ষণ করা যায়নি: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Gerätename",
"eqDeviceNameHint": "z. B. Wohnzimmer-Lautsprecher",
"eqDeviceNameConfirm": "Speichern",
"eqDeviceConnected": "Verbunden"
"eqDeviceConnected": "Verbunden",
"localMusicSectionTitle": "Lokale Musik (Android Auto)",
"localMusicSectionDescription": "Wähle einen Ordner auf diesem Gerät aus, um dessen Audiodateien im Auto zu durchsuchen und abzuspielen.",
"localMusicFolderNotConfigured": "Kein Ordner ausgewählt",
"localMusicFolderTitle": "Ordner für lokale Musik",
"localMusicChoosePath": "Ordner auswählen",
"localMusicChangePath": "Ordner ändern",
"localMusicFolderUpdated": "Ordner für lokale Musik aktualisiert",
"localMusicFolderSaveError": "Ordner konnte nicht gespeichert werden: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Device name",
"eqDeviceNameHint": "e.g. Living Room Speaker",
"eqDeviceNameConfirm": "Save",
"eqDeviceConnected": "Connected"
"eqDeviceConnected": "Connected",
"localMusicSectionTitle": "Local music (Android Auto)",
"localMusicSectionDescription": "Pick a folder on this device to browse and play its audio files from the car.",
"localMusicFolderNotConfigured": "No folder selected",
"localMusicFolderTitle": "Local music folder",
"localMusicChoosePath": "Choose folder",
"localMusicChangePath": "Change folder",
"localMusicFolderUpdated": "Local music folder updated",
"localMusicFolderSaveError": "Could not save the folder: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -619,5 +619,18 @@
"eqDeviceNameLabel": "Nombre del dispositivo",
"eqDeviceNameHint": "Ej: Altavoz del living",
"eqDeviceNameConfirm": "Guardar",
"eqDeviceConnected": "Conectado"
"eqDeviceConnected": "Conectado",
"localMusicSectionTitle": "Música local (Android Auto)",
"localMusicSectionDescription": "Elegí una carpeta de este dispositivo para explorar y reproducir sus archivos de audio desde el auto.",
"localMusicFolderNotConfigured": "No hay carpeta seleccionada",
"localMusicFolderTitle": "Carpeta de música local",
"localMusicChoosePath": "Elegir carpeta",
"localMusicChangePath": "Cambiar carpeta",
"localMusicFolderUpdated": "Carpeta de música local actualizada",
"localMusicFolderSaveError": "No se pudo guardar la carpeta: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Nom de l'appareil",
"eqDeviceNameHint": "ex. : Enceinte salon",
"eqDeviceNameConfirm": "Enregistrer",
"eqDeviceConnected": "Connecté"
"eqDeviceConnected": "Connecté",
"localMusicSectionTitle": "Musique locale (Android Auto)",
"localMusicSectionDescription": "Choisissez un dossier sur cet appareil pour parcourir et lire ses fichiers audio depuis la voiture.",
"localMusicFolderNotConfigured": "Aucun dossier sélectionné",
"localMusicFolderTitle": "Dossier de musique locale",
"localMusicChoosePath": "Choisir un dossier",
"localMusicChangePath": "Changer de dossier",
"localMusicFolderUpdated": "Dossier de musique locale mis à jour",
"localMusicFolderSaveError": "Impossible denregistrer le dossier : {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "डिवाइस का नाम",
"eqDeviceNameHint": "उदा. लिविंग रूम स्पीकर",
"eqDeviceNameConfirm": "सहेजें",
"eqDeviceConnected": "कनेक्टेड"
"eqDeviceConnected": "कनेक्टेड",
"localMusicSectionTitle": "स्थानीय संगीत (Android Auto)",
"localMusicSectionDescription": "गाड़ी में ऑडियो फ़ाइलें ब्राउज़ और चलाने के लिए इस डिवाइस का एक फ़ोल्डर चुनें।",
"localMusicFolderNotConfigured": "कोई फ़ोल्डर चुना नहीं गया",
"localMusicFolderTitle": "स्थानीय संगीत फ़ोल्डर",
"localMusicChoosePath": "फ़ोल्डर चुनें",
"localMusicChangePath": "फ़ोल्डर बदलें",
"localMusicFolderUpdated": "स्थानीय संगीत फ़ोल्डर अपडेट हुआ",
"localMusicFolderSaveError": "फ़ोल्डर सहेजा नहीं जा सका: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Nama perangkat",
"eqDeviceNameHint": "Mis: Speaker ruang tamu",
"eqDeviceNameConfirm": "Simpan",
"eqDeviceConnected": "Terhubung"
"eqDeviceConnected": "Terhubung",
"localMusicSectionTitle": "Musik lokal (Android Auto)",
"localMusicSectionDescription": "Pilih folder di perangkat ini untuk menjelajahi dan memutar file audio di dalamnya dari mobil.",
"localMusicFolderNotConfigured": "Belum ada folder dipilih",
"localMusicFolderTitle": "Folder musik lokal",
"localMusicChoosePath": "Pilih folder",
"localMusicChangePath": "Ubah folder",
"localMusicFolderUpdated": "Folder musik lokal diperbarui",
"localMusicFolderSaveError": "Tidak dapat menyimpan folder: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Nome del dispositivo",
"eqDeviceNameHint": "Es: Cassa del salotto",
"eqDeviceNameConfirm": "Salva",
"eqDeviceConnected": "Connesso"
"eqDeviceConnected": "Connesso",
"localMusicSectionTitle": "Musica locale (Android Auto)",
"localMusicSectionDescription": "Scegli una cartella su questo dispositivo per sfogliare e riprodurre i suoi file audio dall'auto.",
"localMusicFolderNotConfigured": "Nessuna cartella selezionata",
"localMusicFolderTitle": "Cartella musica locale",
"localMusicChoosePath": "Scegli cartella",
"localMusicChangePath": "Cambia cartella",
"localMusicFolderUpdated": "Cartella musica locale aggiornata",
"localMusicFolderSaveError": "Impossibile salvare la cartella: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "デバイス名",
"eqDeviceNameHint": "例:リビングのスピーカー",
"eqDeviceNameConfirm": "保存",
"eqDeviceConnected": "接続中"
"eqDeviceConnected": "接続中",
"localMusicSectionTitle": "ローカル音楽(Android Auto",
"localMusicSectionDescription": "この端末のフォルダーを選択して、車内でその音声ファイルを閲覧・再生します。",
"localMusicFolderNotConfigured": "フォルダーが選択されていません",
"localMusicFolderTitle": "ローカル音楽フォルダー",
"localMusicChoosePath": "フォルダーを選択",
"localMusicChangePath": "フォルダーを変更",
"localMusicFolderUpdated": "ローカル音楽フォルダーを更新しました",
"localMusicFolderSaveError": "フォルダーを保存できませんでした: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Nome do dispositivo",
"eqDeviceNameHint": "Ex: Caixa da sala",
"eqDeviceNameConfirm": "Salvar",
"eqDeviceConnected": "Conectado"
"eqDeviceConnected": "Conectado",
"localMusicSectionTitle": "Música local (Android Auto)",
"localMusicSectionDescription": "Escolha uma pasta neste dispositivo para navegar e reproduzir os arquivos de áudio dela no carro.",
"localMusicFolderNotConfigured": "Nenhuma pasta selecionada",
"localMusicFolderTitle": "Pasta de música local",
"localMusicChoosePath": "Escolher pasta",
"localMusicChangePath": "Alterar pasta",
"localMusicFolderUpdated": "Pasta de música local atualizada",
"localMusicFolderSaveError": "Não foi possível salvar a pasta: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "Название устройства",
"eqDeviceNameHint": "Напр.: Колонка в гостиной",
"eqDeviceNameConfirm": "Сохранить",
"eqDeviceConnected": "Подключено"
"eqDeviceConnected": "Подключено",
"localMusicSectionTitle": "Локальная музыка (Android Auto)",
"localMusicSectionDescription": "Выберите папку на этом устройстве, чтобы просматривать и воспроизводить её аудиофайлы в автомобиле.",
"localMusicFolderNotConfigured": "Папка не выбрана",
"localMusicFolderTitle": "Папка локальной музыки",
"localMusicChoosePath": "Выбрать папку",
"localMusicChangePath": "Изменить папку",
"localMusicFolderUpdated": "Папка локальной музыки обновлена",
"localMusicFolderSaveError": "Не удалось сохранить папку: {error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}
+14 -1
View File
@@ -656,5 +656,18 @@
"eqDeviceNameLabel": "设备名称",
"eqDeviceNameHint": "例:客厅音箱",
"eqDeviceNameConfirm": "保存",
"eqDeviceConnected": "已连接"
"eqDeviceConnected": "已连接",
"localMusicSectionTitle": "本地音乐(Android Auto",
"localMusicSectionDescription": "选择此设备上的一个文件夹,以便在车内浏览和播放其中的音频文件。",
"localMusicFolderNotConfigured": "未选择文件夹",
"localMusicFolderTitle": "本地音乐文件夹",
"localMusicChoosePath": "选择文件夹",
"localMusicChangePath": "更改文件夹",
"localMusicFolderUpdated": "本地音乐文件夹已更新",
"localMusicFolderSaveError": "无法保存文件夹:{error}",
"@localMusicFolderSaveError": {
"placeholders": {
"error": {}
}
}
}