mirror of
https://github.com/rafaelvcaetano/melonDS-android.git
synced 2025-03-01 10:17:06 +00:00
Add ROM icon caching
This commit is contained in:
parent
b4641826b4
commit
b99f599715
@ -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 {
|
||||
|
@ -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()
|
||||
|
59
app/src/main/java/me/magnum/melonds/utils/RomIconProvider.kt
Normal file
59
app/src/main/java/me/magnum/melonds/utils/RomIconProvider.kt
Normal 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
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user