Add ROM icon caching

This commit is contained in:
Rafael Caetano 2020-06-24 18:57:08 +01:00
parent b4641826b4
commit b99f599715
3 changed files with 64 additions and 4 deletions

View File

@ -15,6 +15,7 @@ import me.magnum.melonds.repositories.SettingsRepository
import me.magnum.melonds.ui.emulator.EmulatorViewModel
import me.magnum.melonds.ui.inputsetup.InputSetupViewModel
import me.magnum.melonds.ui.romlist.RomListViewModel
import me.magnum.melonds.utils.RomIconProvider
class MelonDSApplication : Application() {
private var themeObserverDisposable: Disposable? = null
@ -30,6 +31,7 @@ class MelonDSApplication : Application() {
ServiceLocator.bindSingleton(Context::class, applicationContext)
ServiceLocator.bindSingleton(SettingsRepository::class, SharedPreferencesSettingsRepository(this, PreferenceManager.getDefaultSharedPreferences(this), ServiceLocator[Gson::class]))
ServiceLocator.bindSingleton(RomsRepository::class, FileSystemRomsRepository(ServiceLocator[Context::class], ServiceLocator[Gson::class], ServiceLocator[SettingsRepository::class]))
ServiceLocator.bindSingleton(RomIconProvider(this))
ServiceLocator.bindSingleton(ViewModelProvider.Factory::class, object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {

View File

@ -35,8 +35,7 @@ import me.magnum.melonds.ui.romlist.RomConfigDialog.OnRomConfigSavedListener
import me.magnum.melonds.ui.romlist.RomListFragment.RomListAdapter.RomViewHolder
import me.magnum.melonds.utils.ConfigurationUtils.ConfigurationDirStatus
import me.magnum.melonds.utils.ConfigurationUtils.checkConfigurationDirectory
import me.magnum.melonds.utils.RomProcessor
import java.io.File
import me.magnum.melonds.utils.RomIconProvider
import java.util.*
class RomListFragment : Fragment() {
@ -50,6 +49,7 @@ class RomListFragment : Fragment() {
private var romSelectedListener: ((Rom) -> Unit)? = null
private val romListViewModel: RomListViewModel by viewModels { ServiceLocator[ViewModelProvider.Factory::class] }
private val romIconProvider: RomIconProvider by lazy { ServiceLocator[RomIconProvider::class] }
private lateinit var settingsRepository: SettingsRepository
private lateinit var romListAdapter: RomListAdapter
@ -281,9 +281,8 @@ class RomListFragment : Fragment() {
fun setRom(rom: Rom) {
this.rom = rom
val romFile = File(rom.path)
try {
val icon = RomProcessor.getRomIcon(romFile)
val icon = romIconProvider.getRomIcon(rom)
itemView.imageRomIcon.setImageBitmap(icon)
} catch (e: Exception) {
e.printStackTrace()

View File

@ -0,0 +1,59 @@
package me.magnum.melonds.utils
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import me.magnum.melonds.model.Rom
import java.io.File
import java.io.FileOutputStream
import java.lang.Exception
/**
* Provider for ROM icons that supports caching. Both memory and disk caches are supported. If upon
* request an icon is not found, it is generated and, if generated successfully, it's stored on both
* caches.
* The name of the file for the disk cache is the hash of the ROM's path.
*/
class RomIconProvider(private val context: Context) {
private val memoryIconCache = mutableMapOf<String, Bitmap>()
fun getRomIcon(rom: Rom): Bitmap? {
val romHash = rom.path.hashCode().toString()
return loadIconFromMemory(romHash, rom)
}
private fun loadIconFromMemory(hash: String, rom: Rom): Bitmap? {
var bitmap = memoryIconCache[hash]
if (bitmap != null)
return bitmap
bitmap = loadIconFromDisk(hash, rom)
if (bitmap != null)
memoryIconCache[hash] = bitmap
return bitmap
}
private fun loadIconFromDisk(hash: String, rom: Rom): Bitmap? {
val iconCacheDir = context.externalCacheDir
if (iconCacheDir != null) {
val iconFile = File(iconCacheDir, hash)
if (iconFile.isFile) {
return BitmapFactory.decodeFile(iconFile.absolutePath)
}
}
val bitmap = RomProcessor.getRomIcon(File(rom.path))
if (bitmap != null && iconCacheDir != null) {
val iconFile = File(iconCacheDir, hash)
try {
FileOutputStream(iconFile).use {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, it)
}
} catch (_: Exception) {
// Ignore errors
}
}
return bitmap
}
}