diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 23b51c595..903bb3877 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,19 @@ + + + + + + + + + + + + () val navToItem: LiveData get() = mNavToItem + private val musicStore = MusicStore.getInstance() + /** * Update the current navigation status * @param value Whether the current [DetailFragment] is navigating or not. @@ -107,4 +114,13 @@ class DetailViewModel : ViewModel() { fun doneWithNavToItem() { mNavToItem.value = null } + + /** Navigate to an item using a file [Intent] */ + fun navigateWithIntent(intent: Intent, app: Application) { + val uri = intent.data ?: return + + viewModelScope.launch { + mNavToItem.value = musicStore.getSongForUri(uri, app.contentResolver) + } + } } diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index da81f0a45..1c5a81c85 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -62,7 +62,7 @@ class LoadingFragment : Fragment() { if (noPermissions()) { // MusicStore.Response.NO_PERMS isnt actually returned by MusicStore, its just - // a way to keep the current permission state on_hand + // a way to keep the current permission state across device changes loadingModel.notifyNoPermissions() } diff --git a/app/src/main/java/org/oxycblt/auxio/music/Models.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt index caa7dde22..f204fedb4 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -23,6 +23,7 @@ sealed class Parent : BaseModel() /** * The data object for a song. Inherits [BaseModel]. + * @property fileName The raw filename for this track * @property albumId The Song's Album ID. Never use this outside of when attaching a song to its album. * @property track The Song's Track number * @property duration The duration of the song, in millis. @@ -35,6 +36,7 @@ sealed class Parent : BaseModel() data class Song( override val id: Long = -1, override val name: String, + val fileName: String, val albumId: Long = -1, val track: Int = -1, val duration: Long = 0, diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt index 3e76ccf82..a3479ed28 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt @@ -1,6 +1,9 @@ package org.oxycblt.auxio.music import android.app.Application +import android.content.ContentResolver +import android.net.Uri +import android.provider.OpenableColumns import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.oxycblt.auxio.logD @@ -72,6 +75,20 @@ class MusicStore private constructor() { } } + /** + * Get the song for a specific URI. + */ + suspend fun getSongForUri(uri: Uri, resolver: ContentResolver): Song? { + return withContext(Dispatchers.IO) { + resolver.query(uri, null, null, null, null)?.use { cursor -> + cursor.moveToFirst() + val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) + + return@withContext songs.find { it.fileName == fileName } + } + } + } + enum class Response { NO_MUSIC, NO_PERMS, FAILED, SUCCESS } diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt index 5cf1f10ad..7e5860cf9 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt @@ -158,12 +158,13 @@ class MusicLoader(private val app: Application) { while (cursor.moveToNext()) { val id = cursor.getLong(idIndex) - val title = cursor.getString(titleIndex) ?: cursor.getString(fileIndex) + val title = cursor.getString(titleIndex) + val fileName = cursor.getString(fileIndex) val albumId = cursor.getLong(albumIndex) val track = cursor.getInt(trackIndex) val duration = cursor.getLong(durationIndex) - songs.add(Song(id, title, albumId, track, duration)) + songs.add(Song(id, title ?: fileName, fileName, albumId, track, duration)) } cursor.close() diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7a0900bc1..4be8ecf11 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -87,7 +87,7 @@ Zurückspulen, bevor zurück springen Zurückspulen, bevor zum vorheriger Lied springen Wiedergabezustand abspeichern - der aktuell Wiedergabezustand jetzt abspeichern + Der aktuell Wiedergabezustand jetzt abspeichern Keine Musik gefunden