|
|
|
@ -4,32 +4,17 @@ import android.graphics.Bitmap |
|
|
|
|
import io.legado.app.data.entities.Book |
|
|
|
|
import io.legado.app.data.entities.BookSource |
|
|
|
|
import io.legado.app.help.BookHelp |
|
|
|
|
import io.legado.app.help.glide.ImageLoader |
|
|
|
|
import io.legado.app.model.localBook.EpubFile |
|
|
|
|
import io.legado.app.utils.BitmapUtils |
|
|
|
|
import io.legado.app.utils.FileUtils |
|
|
|
|
import kotlinx.coroutines.runBlocking |
|
|
|
|
import splitties.init.appCtx |
|
|
|
|
import java.io.FileOutputStream |
|
|
|
|
import java.util.concurrent.ConcurrentHashMap |
|
|
|
|
|
|
|
|
|
object ImageProvider { |
|
|
|
|
|
|
|
|
|
private val cache = ConcurrentHashMap<Int, ConcurrentHashMap<String, Bitmap>>() |
|
|
|
|
|
|
|
|
|
@Synchronized |
|
|
|
|
fun getCache(chapterIndex: Int, src: String): Bitmap? { |
|
|
|
|
return cache[chapterIndex]?.get(src) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Synchronized |
|
|
|
|
fun setCache(chapterIndex: Int, src: String, bitmap: Bitmap) { |
|
|
|
|
var indexCache = cache[chapterIndex] |
|
|
|
|
if (indexCache == null) { |
|
|
|
|
indexCache = ConcurrentHashMap() |
|
|
|
|
cache[chapterIndex] = indexCache |
|
|
|
|
} |
|
|
|
|
indexCache[src] = bitmap |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun getImage( |
|
|
|
|
book: Book, |
|
|
|
|
chapterIndex: Int, |
|
|
|
@ -37,9 +22,6 @@ object ImageProvider { |
|
|
|
|
bookSource: BookSource?, |
|
|
|
|
onUi: Boolean = false, |
|
|
|
|
): Bitmap? { |
|
|
|
|
getCache(chapterIndex, src)?.let { |
|
|
|
|
return it |
|
|
|
|
} |
|
|
|
|
val vFile = BookHelp.getImage(book, src) |
|
|
|
|
if (!vFile.exists()) { |
|
|
|
|
if (book.isEpub()) { |
|
|
|
@ -56,38 +38,10 @@ object ImageProvider { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return try { |
|
|
|
|
val bitmap = BitmapUtils.decodeBitmap( |
|
|
|
|
vFile.absolutePath, |
|
|
|
|
ChapterProvider.visibleWidth, |
|
|
|
|
ChapterProvider.visibleHeight |
|
|
|
|
) |
|
|
|
|
setCache(chapterIndex, src, bitmap) |
|
|
|
|
bitmap |
|
|
|
|
ImageLoader.loadBitmap(appCtx, vFile.absolutePath).submit().get() |
|
|
|
|
} catch (e: Exception) { |
|
|
|
|
null |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Synchronized |
|
|
|
|
fun clearAllCache() { |
|
|
|
|
cache.forEach { indexCache -> |
|
|
|
|
indexCache.value.forEach { |
|
|
|
|
it.value.recycle() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
cache.clear() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Synchronized |
|
|
|
|
fun clearOut(chapterIndex: Int) { |
|
|
|
|
cache.forEach { indexCache -> |
|
|
|
|
if (indexCache.key !in chapterIndex - 1..chapterIndex + 1) { |
|
|
|
|
indexCache.value.forEach { |
|
|
|
|
it.value.recycle() |
|
|
|
|
} |
|
|
|
|
cache.remove(indexCache.key) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|