diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/SettingSection.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/SettingSection.java index 25d07a3dad..1263d3a95a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/SettingSection.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/SettingSection.java @@ -52,4 +52,12 @@ public final class SettingSection { return mSettings; } + + public void mergeSection(SettingSection settingSection) + { + for (Setting setting : settingSection.mSettings.values()) + { + putSetting(setting); + } + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index d2ea2716eb..5d960a3b9f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -7,6 +7,7 @@ import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -83,18 +84,62 @@ public class Settings public void loadSettings(SettingsActivityView view) { sections = new Settings.SettingsSectionMap(); - if (TextUtils.isEmpty(gameId)) + + HashSet filesToExclude = new HashSet<>(); + if (!TextUtils.isEmpty(gameId)) { - for (Map.Entry> entry : configFileSectionsMap.entrySet()) + // for per-game settings, don't load the WiiMoteNew.ini settings + filesToExclude.add(SettingsFile.FILE_NAME_WIIMOTE); + } + + loadDolphinSettings(view, filesToExclude); + + if (!TextUtils.isEmpty(gameId)) + { + loadGenericGameSettings(gameId, view); + loadCustomGameSettings(gameId, view); + } + } + + private void loadDolphinSettings(SettingsActivityView view, HashSet filesToExclude) + { + for (Map.Entry> entry : configFileSectionsMap.entrySet()) + { + String fileName = entry.getKey(); + if(filesToExclude == null || !filesToExclude.contains(fileName)) { - String fileName = entry.getKey(); sections.putAll(SettingsFile.readFile(fileName, view)); } } - else + } + + private void loadGenericGameSettings(String gameId, SettingsActivityView view) + { + // generic game settings + mergeSections(SettingsFile.readGenericGameSettings(gameId, view)); + mergeSections(SettingsFile.readGenericGameSettingsForAllRegions(gameId, view)); + } + + private void loadCustomGameSettings(String gameId, SettingsActivityView view) + { + // custom game settings + mergeSections(SettingsFile.readCustomGameSettings(gameId, view)); + } + + private void mergeSections(HashMap updatedSections) + { + for (Map.Entry entry : updatedSections.entrySet()) { - // custom game settings - sections.putAll(SettingsFile.readCustomGameSettings(gameId, view)); + if (sections.containsKey(entry.getKey())) + { + SettingSection originalSection = sections.get(entry.getKey()); + SettingSection updatedSection = entry.getValue(); + originalSection.mergeSection(updatedSection); + } + else + { + sections.put(entry.getKey(), entry.getValue()); + } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java index 616d4fa4f5..2260b413f7 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java @@ -260,16 +260,13 @@ public final class SettingsFile * effectively a HashMap of key/value settings. If unsuccessful, outputs an error telling why it * failed. * - * @param fileName The name of the settings file without a path or extension. - * @param view The current view. - * @return An Observable that emits a HashMap of the file's contents, then completes. + * @param ini The ini file to load the settings from + * @param view The current view. */ - static HashMap readFile(final String fileName, boolean isCustomGame, SettingsActivityView view) + static HashMap readFile(final File ini, boolean isCustomGame, SettingsActivityView view) { HashMap sections = new Settings.SettingsSectionMap(); - File ini = getSettingsFile(fileName); - BufferedReader reader = null; try @@ -296,12 +293,12 @@ public final class SettingsFile } catch (FileNotFoundException e) { - Log.error("[SettingsFile] File not found: " + fileName + ".ini: " + e.getMessage()); + Log.error("[SettingsFile] File not found: " + ini.getAbsolutePath() + e.getMessage()); view.onSettingsFileNotFound(); } catch (IOException e) { - Log.error("[SettingsFile] Error reading from: " + fileName + ".ini: " + e.getMessage()); + Log.error("[SettingsFile] Error reading from: " + ini.getAbsolutePath()+ e.getMessage()); view.onSettingsFileNotFound(); } finally @@ -314,22 +311,24 @@ public final class SettingsFile } catch (IOException e) { - Log.error("[SettingsFile] Error closing: " + fileName + ".ini: " + e.getMessage()); + Log.error("[SettingsFile] Error closing: " + ini.getAbsolutePath()+ e.getMessage()); } } } - if (fileName.equals(SettingsFile.FILE_NAME_DOLPHIN)) - { - addGcPadSettingsIfTheyDontExist(sections); - } - return sections; } public static HashMap readFile(final String fileName, SettingsActivityView view) { - return readFile(fileName, false, view); + HashMap sections = readFile(getSettingsFile(fileName), false, view); + + if (fileName.equals(SettingsFile.FILE_NAME_DOLPHIN)) + { + addGcPadSettingsIfTheyDontExist(sections); + } + + return sections; } /** @@ -342,10 +341,20 @@ public final class SettingsFile */ public static HashMap readCustomGameSettings(final String gameId, SettingsActivityView view) { - String fileName = "../GameSettings/" + gameId; - return readFile(fileName, true, view); + return readFile(getCustomGameSettingsFile(gameId), true, view); } + public static HashMap readGenericGameSettings(final String gameId, SettingsActivityView view) + { + return readFile(getGenericGameSettingsFile(gameId), true, view); + } + + public static HashMap readGenericGameSettingsForAllRegions(final String gameId, SettingsActivityView view) + { + return readFile(getGenericGameSettingsForAllRegions(gameId), true, view); + } + + /** * Saves a Settings HashMap to a given .ini file on disk. If unsuccessful, outputs an error * telling why it failed. @@ -436,6 +445,23 @@ public final class SettingsFile return new File(DirectoryInitializationService.getUserDirectory() + "/Config/" + fileName + ".ini"); } + private static File getGenericGameSettingsForAllRegions(String gameId) + { + // Use the first 3 chars from the gameId to load the generic game settings for all regions + gameId = gameId.substring(0, 3); + return new File(DirectoryInitializationService.getDolphinInternalDirectory() + "/GameSettings/" + gameId + ".ini"); + } + + private static File getGenericGameSettingsFile(String gameId) + { + return new File(DirectoryInitializationService.getDolphinInternalDirectory() + "/GameSettings/" + gameId + ".ini"); + } + + private static File getCustomGameSettingsFile(String gameId) + { + return new File(DirectoryInitializationService.getUserDirectory() + "/GameSettings/" + gameId + ".ini"); + } + private static SettingSection sectionFromLine(String line, boolean isCustomGame) { String sectionName = line.substring(1, line.length() - 1);