Skip to content

Commit 5fbc232

Browse files
committed
support audio files album icon preview
1 parent 26e47ff commit 5fbc232

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

app/src/main/java/com/raival/compose/file/explorer/App.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import coil3.request.crossfade
1818
import coil3.svg.SvgDecoder
1919
import coil3.video.VideoFrameDecoder
2020
import com.raival.compose.file.explorer.coil.apk.ApkFileDecoder
21+
import com.raival.compose.file.explorer.coil.audio.AudioFileDecoder
2122
import com.raival.compose.file.explorer.coil.pdf.PdfFileDecoder
2223
import com.raival.compose.file.explorer.common.FileExplorerLogger
2324
import com.raival.compose.file.explorer.screen.main.MainActivityManager
@@ -192,6 +193,7 @@ class App : Application(), coil3.SingletonImageLoader.Factory {
192193
add(VideoFrameDecoder.Factory())
193194
add(ApkFileDecoder.Factory())
194195
add(PdfFileDecoder.Factory())
196+
add(AudioFileDecoder.Factory())
195197
}
196198
.build()
197199
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.raival.compose.file.explorer.coil.audio
2+
3+
import android.graphics.BitmapFactory.decodeByteArray
4+
import android.media.MediaMetadataRetriever
5+
import coil3.ImageLoader
6+
import coil3.asImage
7+
import coil3.decode.DecodeResult
8+
import coil3.decode.Decoder
9+
import coil3.fetch.SourceFetchResult
10+
import coil3.request.Options
11+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.audioFileType
12+
import java.io.File
13+
14+
class AudioFileDecoder(
15+
private val source: File,
16+
) : Decoder {
17+
override suspend fun decode(): DecodeResult? {
18+
return try {
19+
val metadata = MediaMetadataRetriever()
20+
metadata.setDataSource(source.absolutePath)
21+
22+
val albumArt = metadata.embeddedPicture
23+
metadata.release()
24+
25+
if (albumArt != null) {
26+
val bitmap = decodeByteArray(albumArt, 0, albumArt.size)
27+
if (bitmap != null) {
28+
DecodeResult(
29+
image = bitmap.asImage(),
30+
isSampled = false
31+
)
32+
} else null
33+
} else null
34+
} catch (e: Exception) {
35+
null
36+
}
37+
}
38+
39+
class Factory : Decoder.Factory {
40+
override fun create(
41+
result: SourceFetchResult,
42+
options: Options,
43+
imageLoader: ImageLoader
44+
): Decoder? {
45+
val file = result.source.file().toFile()
46+
if (file.exists() && audioFileType.contains(file.extension)) {
47+
return AudioFileDecoder(file)
48+
}
49+
return null
50+
}
51+
}
52+
}

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/files/coil/Utils.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.raival.compose.file.explorer.screen.main.tab.files.coil
22

33
import com.raival.compose.file.explorer.screen.main.tab.files.holder.ContentHolder
44
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.apkFileType
5+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.audioFileType
56
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.imageFileType
67
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.pdfFileType
78
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.videoFileType
@@ -10,6 +11,7 @@ fun canUseCoil(contentHolder: ContentHolder): Boolean {
1011
return (contentHolder.isFile()
1112
&& imageFileType.contains(contentHolder.extension)
1213
|| videoFileType.contains(contentHolder.extension)
14+
|| audioFileType.contains(contentHolder.extension)
1315
|| contentHolder.extension == apkFileType
1416
|| contentHolder.extension == pdfFileType
1517
)

0 commit comments

Comments
 (0)