Skip to content

Commit 9bcccfd

Browse files
committed
improve preview
1 parent 21806c9 commit 9bcccfd

File tree

6 files changed

+73
-66
lines changed

6 files changed

+73
-66
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@
106106
android:name=".ui.AudioPreviewActivity"
107107
android:theme="@style/Theme.AudioPreviewDialogTheme"
108108
android:exported="true"
109-
android:launchMode="singleTop">
109+
android:launchMode="singleTop"
110+
android:taskAffinity="">
110111
<intent-filter>
111112
<action android:name="android.intent.action.VIEW" />
112113

app/src/main/kotlin/org/akanework/gramophone/logic/GramophoneExtensions.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,14 @@ fun MediaItem.getFile(): File? {
102102
return getUri()?.toFile()
103103
}
104104

105-
fun MediaItem.getMediaStoreId(): Long? {
106-
return if (mediaId.startsWith("MediaStore:"))
107-
mediaId.substring("MediaStore:".length).toLongOrNull()
105+
fun String.toMediaStoreId(): Long? {
106+
return if (startsWith("MediaStore:"))
107+
substring("MediaStore:".length).toLongOrNull()
108108
else null
109109
}
110110

111111
fun MediaItem.requireMediaStoreId(): Long {
112-
return getMediaStoreId()
112+
return mediaId.toMediaStoreId()
113113
?: throw IllegalArgumentException("Media item with ID $mediaId doesn't appear to be media store item")
114114
}
115115

app/src/main/kotlin/org/akanework/gramophone/ui/AudioPreviewActivity.kt

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import org.akanework.gramophone.logic.utils.exoplayer.GramophoneMediaSourceFacto
5050
import org.akanework.gramophone.logic.utils.exoplayer.GramophoneRenderFactory
5151
import org.akanework.gramophone.ui.components.FullBottomSheet.Companion.SLIDER_UPDATE_INTERVAL
5252
import org.akanework.gramophone.ui.components.SquigglyProgress
53+
import uk.akane.libphonograph.toUriCompat
5354
import java.io.File
5455

5556
private const val TAG = "AudioPreviewActivity"
@@ -334,42 +335,58 @@ class AudioPreviewActivity : AppCompatActivity(), View.OnClickListener {
334335
}
335336
else null
336337
Log.i(TAG, "Audio preview opening $uri with query=$queryUri file=$fileUri")
337-
val projection =
338-
arrayOf(MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DURATION)
339338
val cursor = if (queryUri != null || fileUri != null) contentResolver.query(
340339
queryUri ?: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
341-
projection,
342-
if (fileUri != null)
340+
arrayOf(MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DURATION,
341+
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA),
342+
if (queryUri == null)
343343
MediaStore.Audio.Media.DATA + " = ?" else null,
344-
if (fileUri != null) arrayOf(fileUri!!.toFile().absolutePath) else null,
344+
if (queryUri == null) arrayOf(fileUri!!.toFile().absolutePath) else null,
345345
null
346346
) else null
347347
val mediaItem = MediaItem.Builder()
348-
.setUri(fileUri ?: queryUri ?: uri)
349-
if (cursor?.moveToFirst() == true) {
350-
val id = cursor.getLong(
351-
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)
352-
)
353-
if (id != 0L) {
354-
val durationMs = cursor.getLong(
355-
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)
348+
run {
349+
if (cursor?.moveToFirst() == true) {
350+
val id = cursor.getLong(
351+
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)
356352
)
357-
mediaItem.setMediaId(id.toString())
358-
mediaItem.setMediaMetadata(
359-
MediaMetadata.Builder()
360-
.setDurationMs(durationMs)
361-
.build()
362-
)
363-
openIcon.visibility = View.VISIBLE
364-
openText.visibility = View.VISIBLE
365-
Log.i(TAG, "Audio preview found ID $id for query=$queryUri file=$fileUri (was uri=$uri)")
353+
if (id != 0L) {
354+
val durationMs = cursor.getLong(
355+
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)
356+
)
357+
val title = cursor.getString(
358+
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)
359+
)
360+
val data = cursor.getString(
361+
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)
362+
)
363+
mediaItem.setUri(File(data).toUriCompat())
364+
mediaItem.setMediaId(id.toString())
365+
mediaItem.setMediaMetadata(
366+
MediaMetadata.Builder()
367+
.setTitle(title)
368+
.setDurationMs(durationMs)
369+
.build()
370+
)
371+
openIcon.visibility = View.VISIBLE
372+
openText.visibility = View.VISIBLE
373+
Log.i(
374+
TAG,
375+
"Audio preview found ID $id for query=$queryUri file=$fileUri (was uri=$uri)"
376+
)
377+
return@run
378+
} else {
379+
Log.i(
380+
TAG,
381+
"Audio preview found no ID for query=$queryUri file=$fileUri (was uri=$uri)"
382+
)
383+
}
366384
} else {
367-
Log.i(TAG, "Audio preview found no ID for query=$queryUri file=$fileUri (was uri=$uri)")
385+
Log.i(TAG, "Audio preview found no data for query=$queryUri file=$fileUri (was uri=$uri)")
368386
}
369-
} else {
370387
openIcon.visibility = View.GONE
371388
openText.visibility = View.GONE
372-
Log.i(TAG, "Audio preview found no data for query=$queryUri file=$fileUri (was uri=$uri)")
389+
mediaItem.setUri(fileUri ?: queryUri ?: uri)
373390
}
374391
try {
375392
player.setMediaItem(mediaItem.build())

app/src/main/kotlin/org/akanework/gramophone/ui/MainActivity.kt

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ import androidx.media3.session.DefaultMediaNotificationProvider
5050
import coil3.imageLoader
5151
import kotlinx.coroutines.CoroutineScope
5252
import kotlinx.coroutines.Dispatchers
53-
import kotlinx.coroutines.flow.first
5453
import kotlinx.coroutines.flow.firstOrNull
55-
import kotlinx.coroutines.flow.map
5654
import kotlinx.coroutines.launch
5755
import kotlinx.coroutines.runBlocking
5856
import kotlinx.coroutines.withContext
@@ -175,23 +173,27 @@ class MainActivity : AppCompatActivity() {
175173
super.onNewIntent(intent)
176174
autoPlay = intent.extras?.getBoolean(PLAYBACK_AUTO_START_FOR_FGS, false) == true
177175
if (ready) {
178-
intent.extras?.getString(PLAYBACK_AUTO_PLAY_ID)?.let { theId ->
179-
val id = "MediaStore:$theId"
180-
val pos = intent.extras?.getLong(PLAYBACK_AUTO_PLAY_POSITION, C.TIME_UNSET) ?: C.TIME_UNSET
181-
controllerViewModel.addControllerCallback(lifecycle) { controller, _ ->
182-
runBlocking { reader.songListFlow
183-
.map { it.find { it.mediaId == id } }.firstOrNull() }
184-
.let { mediaItem ->
185-
if (mediaItem != null) {
186-
controller.setMediaItem(mediaItem, pos)
187-
controller.prepare()
188-
controller.play()
189-
} else {
190-
Toast.makeText(this@MainActivity, R.string.cannot_find_file, Toast.LENGTH_LONG).show()
191-
}
176+
doPlayFromIntent(intent)
177+
}
178+
}
179+
180+
private fun doPlayFromIntent(intent: Intent) {
181+
intent.extras?.getString(PLAYBACK_AUTO_PLAY_ID)?.let { id ->
182+
val pos = intent.extras?.getLong(PLAYBACK_AUTO_PLAY_POSITION, C.TIME_UNSET) ?: C.TIME_UNSET
183+
controllerViewModel.addControllerCallback(lifecycle) { controller, _ ->
184+
runBlocking { reader.idMapFlow.firstOrNull() }
185+
.let { col ->
186+
val mediaItem = id.toLongOrNull()?.let { col?.let { it2 -> it2[it] } }
187+
if (mediaItem != null) {
188+
controller.setMediaItem(mediaItem, pos)
189+
controller.prepare()
190+
controller.play()
191+
} else {
192+
Log.e("MainActivity", "can't find file with ID $id in library with ${col?.size} items")
193+
Toast.makeText(this@MainActivity, R.string.cannot_find_file, Toast.LENGTH_LONG).show()
192194
}
193-
dispose()
194-
}
195+
}
196+
dispose()
195197
}
196198
}
197199
}
@@ -217,20 +219,7 @@ class MainActivity : AppCompatActivity() {
217219

218220
fun onLibraryLoaded() {
219221
if (!ready) reportFullyDrawn()
220-
intent?.extras?.getLong(PLAYBACK_AUTO_PLAY_ID, 0L).let { it ->
221-
if (it != 0L) {
222-
val id = it.toString()
223-
controllerViewModel.addControllerCallback(lifecycle) { controller, _ ->
224-
val songs = runBlocking { this@MainActivity.gramophoneApplication.reader.songListFlow.first() }
225-
songs.find { it.mediaId == id }?.let { mediaItem ->
226-
controller.setMediaItem(mediaItem)
227-
controller.prepare()
228-
controller.play()
229-
}
230-
dispose()
231-
}
232-
}
233-
}
222+
doPlayFromIntent(intent)
234223
}
235224

236225
/**

app/src/main/kotlin/org/akanework/gramophone/ui/fragments/DetailDialogFragment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.akanework.gramophone.ui.fragments
22

33
import android.os.Bundle
4-
import android.util.Log
54
import android.view.LayoutInflater
65
import android.view.View
76
import android.view.ViewGroup
@@ -27,6 +26,7 @@ import org.akanework.gramophone.logic.getBitrate
2726
import org.akanework.gramophone.logic.getFile
2827
import org.akanework.gramophone.logic.hasGenreInMediaStore
2928
import org.akanework.gramophone.logic.toLocaleString
29+
import org.akanework.gramophone.logic.toMediaStoreId
3030
import org.akanework.gramophone.logic.ui.placeholderScaleToFit
3131
import org.akanework.gramophone.logic.utils.CalculationUtils.convertDurationToTimeStamp
3232

@@ -44,8 +44,8 @@ class DetailDialogFragment : BaseFragment(false) {
4444
rootView.findViewById<MaterialToolbar>(R.id.topAppBar).setNavigationOnClickListener {
4545
requireActivity().supportFragmentManager.popBackStack()
4646
}
47-
val id = requireArguments().getString("Id")
48-
val mediaItem = runBlocking { mainActivity.reader.songListFlow.map { it.find { it.mediaId == id } }.first() }
47+
val id = requireArguments().getString("Id")?.toMediaStoreId()
48+
val mediaItem = runBlocking { mainActivity.reader.idMapFlow.map { it[id] }.first() }
4949
?: return null.also { requireActivity().supportFragmentManager.popBackStack() }
5050
val mediaMetadata = mediaItem.mediaMetadata
5151
val albumCoverImageView = rootView.findViewById<ImageView>(R.id.album_cover)

libphonograph

0 commit comments

Comments
 (0)