Skip to content

Commit d9c5203

Browse files
committed
Fix OOM on huge covers in widget
1 parent fd61a83 commit d9c5203

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

app/src/main/java/org/grakovne/lissen/channel/audiobookshelf/common/converter/RecentListeningResponseConverter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class RecentListeningResponseConverter @Inject constructor() {
2121
title = it.media.metadata.title,
2222
author = it.media.metadata.authorName,
2323
listenedPercentage = progress[it.id]?.second?.let { it * 100 }?.toInt(),
24-
listenedLastUpdate = progress[it.id]?.first ,
24+
listenedLastUpdate = progress[it.id]?.first,
2525
)
2626
} ?: emptyList()
2727

app/src/main/java/org/grakovne/lissen/widget/PlayerWidgetStateService.kt

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.grakovne.lissen.common.RunningComponent
1515
import org.grakovne.lissen.common.toBase64
1616
import org.grakovne.lissen.content.LissenMediaProvider
1717
import org.grakovne.lissen.domain.DetailedItem
18+
import java.io.ByteArrayOutputStream
1819
import javax.inject.Inject
1920
import javax.inject.Singleton
2021

@@ -39,23 +40,30 @@ class PlayerWidgetStateService @Inject constructor(
3940
) { book: DetailedItem?, isPlaying, chapterIndex: Int? ->
4041
val chapterTitle = provideChapterTitle(book, chapterIndex)
4142

42-
val maybeCover = when (book == null) {
43-
true -> null
44-
false -> when (playingBookId != book.id || cachedCover == null) {
45-
true ->
46-
book
47-
.let { mediaProvider.fetchBookCover(it.id) }
43+
val maybeCover = when (book) {
44+
null -> null
45+
else -> when {
46+
playingBookId != book.id || cachedCover == null -> {
47+
mediaProvider.fetchBookCover(book.id)
4848
.fold(
49-
onSuccess = {
50-
it
51-
.readBytes()
52-
.also { cover -> cachedCover = cover }
53-
.also { playingBookId = book.id }
49+
onSuccess = { inputStream ->
50+
inputStream.use { stream ->
51+
val buffer = ByteArray(8192)
52+
val output = ByteArrayOutputStream()
53+
var bytesRead: Int
54+
while (stream.read(buffer).also { bytesRead = it } != -1) {
55+
output.write(buffer, 0, bytesRead)
56+
}
57+
output.toByteArray()
58+
}.also { cover ->
59+
cachedCover = cover
60+
playingBookId = book.id
61+
}
5462
},
5563
onFailure = { null },
5664
)
57-
58-
false -> cachedCover
65+
}
66+
else -> cachedCover
5967
}
6068
}
6169

0 commit comments

Comments
 (0)