Android: Convert GameFileCache to Kotlin
This commit is contained in:
parent
a56ee1a62e
commit
09c2c6541d
|
@ -1,139 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.model;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
|
||||
import org.dolphinemu.dolphinemu.NativeLibrary;
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
|
||||
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
|
||||
import org.dolphinemu.dolphinemu.utils.ContentHandler;
|
||||
import org.dolphinemu.dolphinemu.utils.IniFile;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.LinkedHashSet;
|
||||
|
||||
public class GameFileCache
|
||||
{
|
||||
@Keep
|
||||
private long mPointer;
|
||||
|
||||
public GameFileCache()
|
||||
{
|
||||
mPointer = newGameFileCache();
|
||||
}
|
||||
|
||||
private static native long newGameFileCache();
|
||||
|
||||
@Override
|
||||
public native void finalize();
|
||||
|
||||
public static void addGameFolder(String path)
|
||||
{
|
||||
File dolphinFile = SettingsFile.getSettingsFile(Settings.FILE_DOLPHIN);
|
||||
IniFile dolphinIni = new IniFile(dolphinFile);
|
||||
LinkedHashSet<String> pathSet = getPathSet(false);
|
||||
int totalISOPaths =
|
||||
dolphinIni.getInt(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATHS, 0);
|
||||
|
||||
if (!pathSet.contains(path))
|
||||
{
|
||||
dolphinIni.setInt(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATHS,
|
||||
totalISOPaths + 1);
|
||||
dolphinIni.setString(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATH_BASE +
|
||||
totalISOPaths, path);
|
||||
dolphinIni.save(dolphinFile);
|
||||
NativeLibrary.ReloadConfig();
|
||||
}
|
||||
}
|
||||
|
||||
private static LinkedHashSet<String> getPathSet(boolean removeNonExistentFolders)
|
||||
{
|
||||
File dolphinFile = SettingsFile.getSettingsFile(Settings.FILE_DOLPHIN);
|
||||
IniFile dolphinIni = new IniFile(dolphinFile);
|
||||
LinkedHashSet<String> pathSet = new LinkedHashSet<>();
|
||||
int totalISOPaths =
|
||||
dolphinIni.getInt(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATHS, 0);
|
||||
|
||||
for (int i = 0; i < totalISOPaths; i++)
|
||||
{
|
||||
String path = dolphinIni.getString(Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATH_BASE + i, "");
|
||||
|
||||
if (ContentHandler.isContentUri(path) ? ContentHandler.exists(path) : new File(path).exists())
|
||||
{
|
||||
pathSet.add(path);
|
||||
}
|
||||
}
|
||||
|
||||
if (removeNonExistentFolders && totalISOPaths > pathSet.size())
|
||||
{
|
||||
int setIndex = 0;
|
||||
|
||||
dolphinIni.setInt(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATHS,
|
||||
pathSet.size());
|
||||
|
||||
// One or more folders have been removed.
|
||||
for (String entry : pathSet)
|
||||
{
|
||||
dolphinIni.setString(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATH_BASE +
|
||||
setIndex, entry);
|
||||
|
||||
setIndex++;
|
||||
}
|
||||
|
||||
// Delete known unnecessary keys. Ignore i values beyond totalISOPaths.
|
||||
for (int i = setIndex; i < totalISOPaths; i++)
|
||||
{
|
||||
dolphinIni.deleteKey(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATH_BASE + i);
|
||||
}
|
||||
|
||||
dolphinIni.save(dolphinFile);
|
||||
NativeLibrary.ReloadConfig();
|
||||
}
|
||||
|
||||
return pathSet;
|
||||
}
|
||||
|
||||
public static String[] getAllGamePaths()
|
||||
{
|
||||
boolean recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean();
|
||||
|
||||
LinkedHashSet<String> folderPathsSet = getPathSet(true);
|
||||
|
||||
String[] folderPaths = folderPathsSet.toArray(new String[0]);
|
||||
|
||||
return getAllGamePaths(folderPaths, recursiveScan);
|
||||
}
|
||||
|
||||
public static native String[] getAllGamePaths(String[] folderPaths, boolean recursiveScan);
|
||||
|
||||
public synchronized native int getSize();
|
||||
|
||||
public synchronized native GameFile[] getAllGames();
|
||||
|
||||
public synchronized native GameFile addOrGet(String gamePath);
|
||||
|
||||
/**
|
||||
* Sets the list of games to cache.
|
||||
*
|
||||
* Games which are in the passed-in list but not in the cache are scanned and added to the cache,
|
||||
* and games which are in the cache but not in the passed-in list are removed from the cache.
|
||||
*
|
||||
* @return true if the cache was modified
|
||||
*/
|
||||
public synchronized native boolean update(String[] gamePaths);
|
||||
|
||||
/**
|
||||
* For each game that already is in the cache, scans the folder that contains the game
|
||||
* for additional metadata files (PNG/XML).
|
||||
*
|
||||
* @return true if the cache was modified
|
||||
*/
|
||||
public synchronized native boolean updateAdditionalMetadata();
|
||||
|
||||
public synchronized native boolean load();
|
||||
|
||||
public synchronized native boolean save();
|
||||
}
|
|
@ -0,0 +1,152 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.model
|
||||
|
||||
import androidx.annotation.Keep
|
||||
import org.dolphinemu.dolphinemu.NativeLibrary
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.Settings
|
||||
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile
|
||||
import org.dolphinemu.dolphinemu.utils.ContentHandler
|
||||
import org.dolphinemu.dolphinemu.utils.IniFile
|
||||
import java.io.File
|
||||
|
||||
class GameFileCache {
|
||||
@Keep
|
||||
private val pointer: Long = newGameFileCache()
|
||||
|
||||
external fun finalize()
|
||||
|
||||
@Synchronized
|
||||
external fun getSize(): Int
|
||||
|
||||
@Synchronized
|
||||
external fun getAllGames(): Array<GameFile>
|
||||
|
||||
@Synchronized
|
||||
external fun addOrGet(gamePath: String): GameFile?
|
||||
|
||||
/**
|
||||
* Sets the list of games to cache.
|
||||
*
|
||||
* Games which are in the passed-in list but not in the cache are scanned and added to the cache,
|
||||
* and games which are in the cache but not in the passed-in list are removed from the cache.
|
||||
*
|
||||
* @return true if the cache was modified
|
||||
*/
|
||||
@Synchronized
|
||||
external fun update(gamePaths: Array<String>): Boolean
|
||||
|
||||
/**
|
||||
* For each game that already is in the cache, scans the folder that contains the game
|
||||
* for additional metadata files (PNG/XML).
|
||||
*
|
||||
* @return true if the cache was modified
|
||||
*/
|
||||
@Synchronized
|
||||
external fun updateAdditionalMetadata(): Boolean
|
||||
|
||||
@Synchronized
|
||||
external fun load(): Boolean
|
||||
|
||||
@Synchronized
|
||||
external fun save(): Boolean
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
private external fun newGameFileCache(): Long
|
||||
|
||||
fun addGameFolder(path: String) {
|
||||
val dolphinFile = SettingsFile.getSettingsFile(Settings.FILE_DOLPHIN)
|
||||
val dolphinIni = IniFile(dolphinFile)
|
||||
val pathSet = getPathSet(false)
|
||||
val totalISOPaths =
|
||||
dolphinIni.getInt(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATHS, 0)
|
||||
|
||||
if (!pathSet.contains(path)) {
|
||||
dolphinIni.setInt(
|
||||
Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATHS,
|
||||
totalISOPaths + 1
|
||||
)
|
||||
dolphinIni.setString(
|
||||
Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATH_BASE + totalISOPaths,
|
||||
path
|
||||
)
|
||||
dolphinIni.save(dolphinFile)
|
||||
NativeLibrary.ReloadConfig()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getPathSet(removeNonExistentFolders: Boolean): LinkedHashSet<String> {
|
||||
val dolphinFile = SettingsFile.getSettingsFile(Settings.FILE_DOLPHIN)
|
||||
val dolphinIni = IniFile(dolphinFile)
|
||||
val pathSet = LinkedHashSet<String>()
|
||||
val totalISOPaths =
|
||||
dolphinIni.getInt(Settings.SECTION_INI_GENERAL, SettingsFile.KEY_ISO_PATHS, 0)
|
||||
|
||||
for (i in 0 until totalISOPaths) {
|
||||
val path = dolphinIni.getString(
|
||||
Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATH_BASE + i,
|
||||
""
|
||||
)
|
||||
|
||||
val pathExists = if (ContentHandler.isContentUri(path))
|
||||
ContentHandler.exists(path)
|
||||
else
|
||||
File(path).exists()
|
||||
if (pathExists) {
|
||||
pathSet.add(path)
|
||||
}
|
||||
}
|
||||
|
||||
if (removeNonExistentFolders && totalISOPaths > pathSet.size) {
|
||||
var setIndex = 0
|
||||
|
||||
dolphinIni.setInt(
|
||||
Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATHS,
|
||||
pathSet.size
|
||||
)
|
||||
|
||||
// One or more folders have been removed.
|
||||
for (entry in pathSet) {
|
||||
dolphinIni.setString(
|
||||
Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATH_BASE + setIndex,
|
||||
entry
|
||||
)
|
||||
setIndex++
|
||||
}
|
||||
|
||||
// Delete known unnecessary keys. Ignore i values beyond totalISOPaths.
|
||||
for (i in setIndex until totalISOPaths) {
|
||||
dolphinIni.deleteKey(
|
||||
Settings.SECTION_INI_GENERAL,
|
||||
SettingsFile.KEY_ISO_PATH_BASE + i
|
||||
)
|
||||
}
|
||||
|
||||
dolphinIni.save(dolphinFile)
|
||||
NativeLibrary.ReloadConfig()
|
||||
}
|
||||
return pathSet
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getAllGamePaths(): Array<String> {
|
||||
val recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.boolean
|
||||
val folderPathsSet = getPathSet(true)
|
||||
val folderPaths = folderPathsSet.toTypedArray()
|
||||
return getAllGamePaths(folderPaths, recursiveScan)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
external fun getAllGamePaths(
|
||||
folderPaths: Array<String>,
|
||||
recursiveScan: Boolean
|
||||
): Array<String>
|
||||
}
|
||||
}
|
|
@ -123,7 +123,7 @@ class MainPresenter(private val mainView: MainView, private val activity: Fragme
|
|||
|
||||
fun onResume() {
|
||||
if (dirToAdd != null) {
|
||||
GameFileCache.addGameFolder(dirToAdd)
|
||||
GameFileCache.addGameFolder(dirToAdd!!)
|
||||
dirToAdd = null
|
||||
}
|
||||
|
||||
|
|
|
@ -570,7 +570,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
|||
const jclass game_file_cache_class =
|
||||
env->FindClass("org/dolphinemu/dolphinemu/model/GameFileCache");
|
||||
s_game_file_cache_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_file_cache_class));
|
||||
s_game_file_cache_pointer = env->GetFieldID(game_file_cache_class, "mPointer", "J");
|
||||
s_game_file_cache_pointer = env->GetFieldID(game_file_cache_class, "pointer", "J");
|
||||
env->DeleteLocalRef(game_file_cache_class);
|
||||
|
||||
const jclass analytics_class = env->FindClass("org/dolphinemu/dolphinemu/utils/Analytics");
|
||||
|
|
Loading…
Reference in New Issue