@@ -2,6 +2,8 @@

package org.dolphinemu.dolphinemu.features.input.model;

import androidx.annotation.NonNull;

import org.dolphinemu.dolphinemu.features.input.model.controlleremu.NumericSetting;
import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
@@ -16,19 +18,19 @@ public InputMappingIntSetting(NumericSetting numericSetting)
}

@Override
public int getInt(Settings settings)
public int getInt()
{
return mNumericSetting.getIntValue();
}

@Override
public void setInt(Settings settings, int newValue)
public void setInt(@NonNull Settings settings, int newValue)
{
mNumericSetting.setIntValue(newValue);
}

@Override
public boolean isOverridden(Settings settings)
public boolean isOverridden()
{
return false;
}
@@ -40,7 +42,7 @@ public boolean isRuntimeEditable()
}

@Override
public boolean delete(Settings settings)
public boolean delete(@NonNull Settings settings)
{
mNumericSetting.setIntValue(mNumericSetting.getIntDefaultValue());
return true;
@@ -24,13 +24,13 @@ public InputDeviceSetting(Context context, int titleId, int descriptionId,
}

@Override
public String getSelectedChoice(Settings settings)
public String getSelectedChoice()
{
return mController.getDefaultDevice();
}

@Override
public String getSelectedValue(Settings settings)
public String getSelectedValue()
{
return mController.getDefaultDevice();
}
@@ -44,7 +44,7 @@ class RiivolutionBootActivity : AppCompatActivity() {
val revision = intent.getIntExtra(ARG_REVISION, -1)
val discNumber = intent.getIntExtra(ARG_DISC_NUMBER, -1)

var loadPath = StringSetting.MAIN_LOAD_PATH.stringGlobal
var loadPath = StringSetting.MAIN_LOAD_PATH.string
if (loadPath.isEmpty()) loadPath = DirectoryInitialization.getUserDirectory() + "/Load"

binding.textSdRoot.text = getString(R.string.riivolution_sd_root, "$loadPath/Riivolution")
@@ -6,7 +6,7 @@

public interface AbstractBooleanSetting extends AbstractSetting
{
boolean getBoolean(@NonNull Settings settings);
boolean getBoolean();

void setBoolean(@NonNull Settings settings, boolean newValue);
}
@@ -6,7 +6,7 @@

public interface AbstractFloatSetting extends AbstractSetting
{
float getFloat(@NonNull Settings settings);
float getFloat();

void setFloat(@NonNull Settings settings, float newValue);
}
@@ -6,7 +6,7 @@

public interface AbstractIntSetting extends AbstractSetting
{
int getInt(@NonNull Settings settings);
int getInt();

void setInt(@NonNull Settings settings, int newValue);
}

This file was deleted.

@@ -6,7 +6,7 @@

public interface AbstractSetting
{
boolean isOverridden(@NonNull Settings settings);
boolean isOverridden();

boolean isRuntimeEditable();

@@ -7,7 +7,7 @@
public interface AbstractStringSetting extends AbstractSetting
{
@NonNull
String getString(@NonNull Settings settings);
String getString();

void setString(@NonNull Settings settings, @NonNull String newValue);
}
@@ -25,7 +25,7 @@ public AdHocBooleanSetting(String file, String section, String key, boolean defa
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return NativeConfig.isOverridden(mFile, mSection, mKey);
}
@@ -43,7 +43,7 @@ public boolean delete(@NonNull Settings settings)
}

@Override
public boolean getBoolean(@NonNull Settings settings)
public boolean getBoolean()
{
return NativeConfig.getBoolean(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}
@@ -25,7 +25,7 @@ public AdHocStringSetting(String file, String section, String key, String defaul
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return NativeConfig.isOverridden(mFile, mSection, mKey);
}
@@ -43,7 +43,7 @@ public boolean delete(@NonNull Settings settings)
}

@NonNull @Override
public String getString(@NonNull Settings settings)
public String getString()
{
return NativeConfig.getString(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}
@@ -296,12 +296,9 @@ public enum BooleanSetting implements AbstractBooleanSetting
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey))
return settings.getSection(mFile, mSection).exists(mKey);
else
return NativeConfig.isOverridden(mFile, mSection, mKey);
return NativeConfig.isOverridden(mFile, mSection, mKey);
}

@Override
@@ -322,62 +319,41 @@ public boolean isRuntimeEditable()
@Override
public boolean delete(@NonNull Settings settings)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}
else
{
return settings.getSection(mFile, mSection).delete(mKey);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}

return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}

@Override
public boolean getBoolean(@NonNull Settings settings)
public boolean getBoolean()
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.getBoolean(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey,
mDefaultValue);
}
else
{
return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue);
}
return NativeConfig.getBoolean(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}

@Override
public void setBoolean(@NonNull Settings settings, boolean newValue)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
NativeConfig.setBoolean(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}
else
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
settings.getSection(mFile, mSection).setBoolean(mKey, newValue);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}

NativeConfig.setBoolean(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}

public void setBoolean(int layerType, boolean newValue)
public void setBoolean(int layer, boolean newValue)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
NativeConfig.setBoolean(layerType, mFile, mSection, mKey, newValue);
}
else
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
throw new UnsupportedOperationException("The old config system doesn't support layers");
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}
}

public boolean getBooleanGlobal()
{
return NativeConfig.getBoolean(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}

public void setBooleanGlobal(int layer, boolean newValue)
{
NativeConfig.setBoolean(layer, mFile, mSection, mKey, newValue);
}

@@ -25,12 +25,9 @@ public enum FloatSetting implements AbstractFloatSetting
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey))
return settings.getSection(mFile, mSection).exists(mKey);
else
return NativeConfig.isOverridden(mFile, mSection, mKey);
return NativeConfig.isOverridden(mFile, mSection, mKey);
}

@Override
@@ -42,48 +39,34 @@ public boolean isRuntimeEditable()
@Override
public boolean delete(@NonNull Settings settings)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}
else
{
return settings.getSection(mFile, mSection).delete(mKey);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}

return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}

@Override
public float getFloat(@NonNull Settings settings)
public float getFloat()
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.getFloat(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}
else
{
return settings.getSection(mFile, mSection).getFloat(mKey, mDefaultValue);
}
return NativeConfig.getFloat(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}

@Override
public void setFloat(@NonNull Settings settings, float newValue)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
NativeConfig.setFloat(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}
else
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
settings.getSection(mFile, mSection).setFloat(mKey, newValue);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}
}

public float getFloatGlobal()
{
return NativeConfig.getFloat(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
NativeConfig.setFloat(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}

public void setFloatGlobal(int layer, float newValue)
public void setFloat(int layer, float newValue)
{
NativeConfig.setFloat(layer, mFile, mSection, mKey, newValue);
}
@@ -121,12 +121,9 @@ public enum IntSetting implements AbstractIntSetting
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey))
return settings.getSection(mFile, mSection).exists(mKey);
else
return NativeConfig.isOverridden(mFile, mSection, mKey);
return NativeConfig.isOverridden(mFile, mSection, mKey);
}

@Override
@@ -147,49 +144,41 @@ public boolean isRuntimeEditable()
@Override
public boolean delete(@NonNull Settings settings)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}
else
{
return settings.getSection(mFile, mSection).delete(mKey);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}

return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}

@Override
public int getInt(@NonNull Settings settings)
public int getInt()
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.getInt(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}
else
{
return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue);
}
return NativeConfig.getInt(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}

@Override
public void setInt(@NonNull Settings settings, int newValue)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
NativeConfig.setInt(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}
else
{
settings.getSection(mFile, mSection).setInt(mKey, newValue);
}
}

public int getIntGlobal()
{
return NativeConfig.getInt(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
NativeConfig.setInt(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}

public void setIntGlobal(int layer, int newValue)
public void setInt(int layer, int newValue)
{
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}

NativeConfig.setInt(layer, mFile, mSection, mKey, newValue);
}

This file was deleted.

@@ -18,10 +18,14 @@

public static native void save(int layer);

public static native void deleteAllKeys(int layer);

public static native boolean isOverridden(String file, String section, String key);

public static native boolean deleteKey(int layer, String file, String section, String key);

public static native boolean exists(int layer, String file, String section, String key);

public static native String getString(int layer, String file, String section, String key,
String defaultValue);

@@ -6,8 +6,8 @@ class ScaledIntSetting(
private val scale: Int,
private val setting: AbstractIntSetting
) : AbstractIntSetting {
override fun isOverridden(settings: Settings): Boolean {
return setting.isOverridden(settings)
override fun isOverridden(): Boolean {
return setting.isOverridden()
}

override fun isRuntimeEditable(): Boolean {
@@ -18,8 +18,8 @@ class ScaledIntSetting(
return setting.delete(settings)
}

override fun getInt(settings: Settings): Int {
return setting.getInt(settings) / scale
override fun getInt(): Int {
return setting.getInt() / scale
}

override fun setInt(settings: Settings, newValue: Int) {
@@ -9,15 +9,9 @@
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.input.model.MappingCommon;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityView;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.services.GameFileCacheManager;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.IniFile;

import java.io.Closeable;
import java.util.HashMap;
import java.util.Map;

public class Settings implements Closeable
{
@@ -26,6 +20,7 @@ public class Settings implements Closeable
public static final String FILE_GFX = "GFX";
public static final String FILE_LOGGER = "Logger";
public static final String FILE_WIIMOTE = "WiimoteNew";
public static final String FILE_GAME_SETTINGS_ONLY = "GameSettingsOnly";

public static final String SECTION_INI_ANDROID = "Android";
public static final String SECTION_INI_ANDROID_OVERLAY_BUTTONS = "AndroidOverlayButtons";
@@ -51,40 +46,14 @@ public class Settings implements Closeable

public static final String SECTION_ANALYTICS = "Analytics";

public static final String GAME_SETTINGS_PLACEHOLDER_FILE_NAME = "";

private String mGameId;
private int mRevision;
private boolean mIsWii;

private static final String[] configFiles = new String[]{FILE_DOLPHIN, FILE_GFX, FILE_LOGGER,
FILE_WIIMOTE};

private Map<String, IniFile> mIniFiles = new HashMap<>();
private boolean mSettingsLoaded = false;

private boolean mLoadedRecursiveIsoPathsValue = false;

private IniFile getGameSpecificFile()
{
if (!isGameSpecific() || mIniFiles.size() != 1)
throw new IllegalStateException();

return mIniFiles.get(GAME_SETTINGS_PLACEHOLDER_FILE_NAME);
}

public IniFile.Section getSection(String fileName, String sectionName)
{
if (!isGameSpecific())
{
return mIniFiles.get(fileName).getOrCreateSection(sectionName);
}
else
{
return getGameSpecificFile()
.getOrCreateSection(SettingsFile.mapSectionNameFromIni(sectionName));
}
}

public boolean isGameSpecific()
{
return !TextUtils.isEmpty(mGameId);
@@ -100,91 +69,56 @@ public int getWriteLayer()
return isGameSpecific() ? NativeConfig.LAYER_LOCAL_GAME : NativeConfig.LAYER_BASE_OR_CURRENT;
}

public boolean isEmpty()
public boolean areSettingsLoaded()
{
return mIniFiles.isEmpty();
return mSettingsLoaded;
}

public void loadSettings()
{
// The value of isWii doesn't matter if we don't have any SettingsActivity
loadSettings(null, true);
loadSettings(true);
}

public void loadSettings(SettingsActivityView view, boolean isWii)
public void loadSettings(boolean isWii)
{
mIsWii = isWii;
mSettingsLoaded = true;

mIniFiles = new HashMap<>();

if (!isGameSpecific())
{
loadDolphinSettings(view);
}
else
if (isGameSpecific())
{
// Loading game INIs while the core is running will mess with the game INIs loaded by the core
if (NativeLibrary.IsRunning())
throw new IllegalStateException("Attempted to load game INI while emulating");

NativeConfig.loadGameInis(mGameId, mRevision);
loadCustomGameSettings(mGameId, view);
}

mLoadedRecursiveIsoPathsValue = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this);
}

private void loadDolphinSettings(SettingsActivityView view)
{
for (String fileName : configFiles)
{
IniFile ini = new IniFile();
SettingsFile.readFile(fileName, ini, view);
mIniFiles.put(fileName, ini);
}
}

private void loadCustomGameSettings(String gameId, SettingsActivityView view)
{
IniFile ini = new IniFile();
SettingsFile.readCustomGameSettings(gameId, ini, view);
mIniFiles.put(GAME_SETTINGS_PLACEHOLDER_FILE_NAME, ini);
mLoadedRecursiveIsoPathsValue = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean();
}

public void loadSettings(SettingsActivityView view, String gameId, int revision, boolean isWii)
public void loadSettings(String gameId, int revision, boolean isWii)
{
mGameId = gameId;
mRevision = revision;
loadSettings(view, isWii);
loadSettings(isWii);
}

public void saveSettings(SettingsActivityView view, Context context)
public void saveSettings(Context context)
{
if (!isGameSpecific())
{
if (context != null)
Toast.makeText(context, R.string.settings_saved, Toast.LENGTH_SHORT).show();

for (Map.Entry<String, IniFile> entry : mIniFiles.entrySet())
{
SettingsFile.saveFile(entry.getKey(), entry.getValue(), view);
}

MappingCommon.save();

NativeConfig.save(NativeConfig.LAYER_BASE);

if (!NativeLibrary.IsRunning())
{
// Notify the native code of the changes to legacy settings
NativeLibrary.ReloadConfig();
}

// LogManager does use the new config system, but doesn't pick up on changes automatically
NativeLibrary.ReloadLoggerConfig();
NativeLibrary.UpdateGCAdapterScanThread();

if (mLoadedRecursiveIsoPathsValue != BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this))
if (mLoadedRecursiveIsoPathsValue != BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean())
{
// Refresh game library
GameFileCacheManager.startRescan();
@@ -200,18 +134,13 @@ public void saveSettings(SettingsActivityView view, Context context)
Toast.LENGTH_SHORT).show();
}

SettingsFile.saveCustomGameSettings(mGameId, getGameSpecificFile());

NativeConfig.save(NativeConfig.LAYER_LOCAL_GAME);
}
}

public void clearSettings()
public void clearGameSettings()
{
for (String fileName : mIniFiles.keySet())
{
mIniFiles.put(fileName, new IniFile());
}
NativeConfig.deleteAllKeys(NativeConfig.LAYER_LOCAL_GAME);
}

public boolean gameIniContainsJunk()
@@ -237,7 +166,8 @@ public boolean gameIniContainsJunk()
if (!isGameSpecific())
return false;

return getSection(Settings.FILE_DOLPHIN, SECTION_INI_INTERFACE).exists("ThemeName");
return NativeConfig.exists(NativeConfig.LAYER_LOCAL_GAME, FILE_DOLPHIN, SECTION_INI_INTERFACE,
"ThemeName");
}

@Override
@@ -65,12 +65,9 @@ public enum StringSetting implements AbstractStringSetting
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey))
return settings.getSection(mFile, mSection).exists(mKey);
else
return NativeConfig.isOverridden(mFile, mSection, mKey);
return NativeConfig.isOverridden(mFile, mSection, mKey);
}

@Override
@@ -88,49 +85,28 @@ public boolean isRuntimeEditable()
@Override
public boolean delete(@NonNull Settings settings)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}
else
{
return settings.getSection(mFile, mSection).delete(mKey);
}
return NativeConfig.deleteKey(settings.getWriteLayer(), mFile, mSection, mKey);
}

@NonNull @Override
public String getString(@NonNull Settings settings)
public String getString()
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
if (!NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
return NativeConfig.getString(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey,
mDefaultValue);
}
else
{
return settings.getSection(mFile, mSection).getString(mKey, mDefaultValue);
throw new UnsupportedOperationException(
"Unsupported setting: " + mFile + ", " + mSection + ", " + mKey);
}

return NativeConfig.getString(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
}

@Override
public void setString(@NonNull Settings settings, @NonNull String newValue)
{
if (NativeConfig.isSettingSaveable(mFile, mSection, mKey))
{
NativeConfig.setString(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}
else
{
settings.getSection(mFile, mSection).setString(mKey, newValue);
}
}

public String getStringGlobal()
{
return NativeConfig.getString(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue);
NativeConfig.setString(settings.getWriteLayer(), mFile, mSection, mKey, newValue);
}

public void setStringGlobal(int layer, String newValue)
public void setString(int layer, String newValue)
{
NativeConfig.setString(layer, mFile, mSection, mKey, newValue);
}
@@ -25,7 +25,7 @@ class DateTimeChoiceSetting(
setting.setString(settings, selection)
}

fun getSelectedValue(settings: Settings): String {
return setting.getString(settings)
fun getSelectedValue(): String {
return setting.getString()
}
}
@@ -25,9 +25,9 @@ public FilePicker(Context context, AbstractStringSetting setting, int titleId, i
mDefaultPathRelativeToUserDirectory = defaultPathRelativeToUserDirectory;
}

public String getSelectedValue(Settings settings)
public String getSelectedValue()
{
return mSetting.getString(settings);
return mSetting.getString();
}

public void setSelectedValue(Settings settings, String selection)
@@ -26,9 +26,9 @@ public FloatSliderSetting(AbstractFloatSetting setting, CharSequence name,
mSetting = setting;
}

public int getSelectedValue(Settings settings)
public int getSelectedValue()
{
return Math.round(mSetting.getFloat(settings));
return Math.round(mSetting.getFloat());
}

public void setSelectedValue(Settings settings, float selection)
@@ -43,9 +43,9 @@ public InputStringSetting(Context context, AbstractStringSetting setting, int ti
this(context, setting, titleId, descriptionId, choicesId, valuesId, null);
}

public String getSelectedValue(Settings settings)
public String getSelectedValue()
{
return mSetting.getString(settings);
return mSetting.getString();
}

public MenuTag getMenuTag()
@@ -19,9 +19,9 @@ public IntSliderSetting(Context context, AbstractIntSetting setting, int titleId
mSetting = setting;
}

public int getSelectedValue(Settings settings)
public int getSelectedValue()
{
return mSetting.getInt(settings);
return mSetting.getInt();
}

public void setSelectedValue(Settings settings, int selection)
@@ -17,9 +17,9 @@ public InvertedSwitchSetting(Context context, AbstractBooleanSetting setting, in
}

@Override
public boolean isChecked(Settings settings)
public boolean isChecked()
{
return !mSetting.getBoolean(settings);
return !mSetting.getBoolean();
}

@Override
@@ -17,9 +17,9 @@ public PercentSliderSetting(Context context, AbstractFloatSetting setting, int t
}

@Override
public int getSelectedValue(Settings settings)
public int getSelectedValue()
{
return Math.round(mSetting.getFloat(settings) * 100);
return Math.round(mSetting.getFloat() * 100);
}

@Override
@@ -75,10 +75,10 @@ public CharSequence getDescription()

protected abstract AbstractSetting getSetting();

public boolean isOverridden(Settings settings)
public boolean isOverridden()
{
AbstractSetting setting = getSetting();
return setting != null && setting.isOverridden(settings);
return setting != null && setting.isOverridden();
}

public boolean isEditable()
@@ -43,9 +43,9 @@ public int getValuesId()
return mValuesId;
}

public int getSelectedValue(Settings settings)
public int getSelectedValue()
{
return mSetting.getInt(settings);
return mSetting.getInt();
}

public MenuTag getMenuTag()
@@ -60,9 +60,9 @@ public int getDescriptionValuesId()
return mDescriptionValuesId;
}

public int getSelectedValue(Settings settings)
public int getSelectedValue()
{
return mSetting.getInt(settings);
return mSetting.getInt();
}

public MenuTag getMenuTag()
@@ -31,7 +31,7 @@ public SliderSetting(CharSequence name, CharSequence description, int min, int m
mUnits = units;
}

public abstract int getSelectedValue(Settings settings);
public abstract int getSelectedValue();

public int getMin()
{
@@ -94,19 +94,19 @@ public String getValueAt(int index)
return "";
}

public String getSelectedChoice(Settings settings)
public String getSelectedChoice()
{
return getChoiceAt(getSelectedValueIndex(settings));
return getChoiceAt(getSelectedValueIndex());
}

public String getSelectedValue(Settings settings)
public String getSelectedValue()
{
return mSetting.getString(settings);
return mSetting.getString();
}

public int getSelectedValueIndex(Settings settings)
public int getSelectedValueIndex()
{
String selectedValue = getSelectedValue(settings);
String selectedValue = getSelectedValue();
for (int i = 0; i < mValues.length; i++)
{
if (mValues[i].equals(selectedValue))
@@ -26,9 +26,9 @@ public SwitchSetting(AbstractBooleanSetting setting, CharSequence title,
mSetting = setting;
}

public boolean isChecked(Settings settings)
public boolean isChecked()
{
return mSetting.getBoolean(settings);
return mSetting.getBoolean();
}

public void setChecked(Settings settings, boolean checked)
@@ -276,7 +276,7 @@ public void showGameIniJunkDeletionQuestion()
new MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.game_ini_junk_title))
.setMessage(getString(R.string.game_ini_junk_question))
.setPositiveButton(R.string.yes, (dialogInterface, i) -> mPresenter.clearSettings())
.setPositiveButton(R.string.yes, (dialogInterface, i) -> mPresenter.clearGameSettings())
.setNegativeButton(R.string.no, null)
.show();
}
@@ -66,11 +66,11 @@ private void loadSettingsUI()
{
mView.hideLoading();

if (mSettings.isEmpty())
if (!mSettings.areSettingsLoaded())
{
if (!TextUtils.isEmpty(mGameId))
{
mSettings.loadSettings(mView, mGameId, mRevision, mIsWii);
mSettings.loadSettings(mGameId, mRevision, mIsWii);

if (mSettings.gameIniContainsJunk())
{
@@ -79,7 +79,7 @@ private void loadSettingsUI()
}
else
{
mSettings.loadSettings(mView, mIsWii);
mSettings.loadSettings(mIsWii);
}
}

@@ -99,9 +99,9 @@ public Settings getSettings()
return mSettings;
}

public void clearSettings()
public void clearGameSettings()
{
mSettings.clearSettings();
mSettings.clearGameSettings();
onSettingChanged();
}

@@ -110,7 +110,7 @@ public void onStop(boolean finishing)
if (mSettings != null && finishing && mShouldSave)
{
Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI...");
mSettings.saveSettings(mView, mActivity);
mSettings.saveSettings(mActivity);
}
}

@@ -217,7 +217,7 @@ public void onInputStringClick(InputStringSetting item, int position)

DialogInputStringBinding binding = DialogInputStringBinding.inflate(inflater);
TextInputEditText input = binding.input;
input.setText(item.getSelectedValue(getSettings()));
input.setText(item.getSelectedValue());

mDialog = new MaterialAlertDialogBuilder(mView.getActivity())
.setView(binding.getRoot())
@@ -226,7 +226,7 @@ public void onInputStringClick(InputStringSetting item, int position)
{
String editTextInput = input.getText().toString();

if (!item.getSelectedValue(mView.getSettings()).equals(editTextInput))
if (!item.getSelectedValue().equals(editTextInput))
{
notifyItemChanged(position);
mView.onSettingChanged();
@@ -272,7 +272,7 @@ public void onStringSingleChoiceClick(StringSingleChoiceSetting item, int positi
{
mDialog = new MaterialAlertDialogBuilder(mView.getActivity())
.setTitle(item.getName())
.setSingleChoiceItems(item.getChoices(), item.getSelectedValueIndex(getSettings()),
.setSingleChoiceItems(item.getChoices(), item.getSelectedValueIndex(),
this)
.show();
}
@@ -296,7 +296,7 @@ public void onSliderClick(SliderSetting item, int position)
{
mClickedItem = item;
mClickedPosition = position;
mSeekbarProgress = item.getSelectedValue(getSettings());
mSeekbarProgress = item.getSelectedValue();

LayoutInflater inflater = LayoutInflater.from(mView.getActivity());
DialogSliderBinding binding = DialogSliderBinding.inflate(inflater);
@@ -430,8 +430,7 @@ public void onFilePickerFileClick(SettingsItem item, int position)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI,
filePicker.getSelectedValue(mView.getSettings()));
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, filePicker.getSelectedValue());
}

mView.getActivity().startActivityForResult(intent, filePicker.getRequestType());
@@ -441,7 +440,7 @@ public void onDateTimeClick(DateTimeChoiceSetting item, int position)
{
mClickedItem = item;
mClickedPosition = position;
long storedTime = Long.decode(item.getSelectedValue(mView.getSettings())) * 1000;
long storedTime = Long.decode(item.getSelectedValue()) * 1000;

// Helper to extract hour and minute from epoch time
Calendar calendar = Calendar.getInstance();
@@ -481,7 +480,7 @@ public void onDateTimeClick(DateTimeChoiceSetting item, int position)
epochTime += (long) timePicker.getHour() * 60 * 60;
epochTime += (long) timePicker.getMinute() * 60;
String rtcString = "0x" + Long.toHexString(epochTime);
if (!item.getSelectedValue(mView.getSettings()).equals(rtcString))
if (!item.getSelectedValue().equals(rtcString))
{
notifyItemChanged(mClickedPosition);
mView.onSettingChanged();
@@ -498,7 +497,7 @@ public void onFilePickerConfirmation(String selectedFile)
{
FilePicker filePicker = (FilePicker) mClickedItem;

if (!filePicker.getSelectedValue(mView.getSettings()).equals(selectedFile))
if (!filePicker.getSelectedValue().equals(selectedFile))
{
notifyItemChanged(mClickedPosition);
mView.onSettingChanged();
@@ -543,7 +542,7 @@ public void onClick(DialogInterface dialog, int which)
SingleChoiceSetting scSetting = (SingleChoiceSetting) mClickedItem;

int value = getValueForSingleChoiceSelection(scSetting, which);
if (scSetting.getSelectedValue(getSettings()) != value)
if (scSetting.getSelectedValue() != value)
mView.onSettingChanged();

scSetting.setSelectedValue(getSettings(), value);
@@ -556,7 +555,7 @@ else if (mClickedItem instanceof SingleChoiceSettingDynamicDescriptions)
(SingleChoiceSettingDynamicDescriptions) mClickedItem;

int value = getValueForSingleChoiceDynamicDescriptionsSelection(scSetting, which);
if (scSetting.getSelectedValue(getSettings()) != value)
if (scSetting.getSelectedValue() != value)
mView.onSettingChanged();

scSetting.setSelectedValue(getSettings(), value);
@@ -567,7 +566,7 @@ else if (mClickedItem instanceof StringSingleChoiceSetting)
{
StringSingleChoiceSetting scSetting = (StringSingleChoiceSetting) mClickedItem;
String value = scSetting.getValueAt(which);
if (!scSetting.getSelectedValue(getSettings()).equals(value))
if (!scSetting.getSelectedValue().equals(value))
mView.onSettingChanged();

scSetting.setSelectedValue(getSettings(), value);
@@ -577,7 +576,7 @@ else if (mClickedItem instanceof StringSingleChoiceSetting)
else if (mClickedItem instanceof IntSliderSetting)
{
IntSliderSetting sliderSetting = (IntSliderSetting) mClickedItem;
if (sliderSetting.getSelectedValue(getSettings()) != mSeekbarProgress)
if (sliderSetting.getSelectedValue() != mSeekbarProgress)
mView.onSettingChanged();

sliderSetting.setSelectedValue(getSettings(), mSeekbarProgress);
@@ -587,7 +586,7 @@ else if (mClickedItem instanceof IntSliderSetting)
else if (mClickedItem instanceof FloatSliderSetting)
{
FloatSliderSetting sliderSetting = (FloatSliderSetting) mClickedItem;
if (sliderSetting.getSelectedValue(getSettings()) != mSeekbarProgress)
if (sliderSetting.getSelectedValue() != mSeekbarProgress)
mView.onSettingChanged();

sliderSetting.setSelectedValue(getSettings(), mSeekbarProgress);
@@ -637,7 +636,7 @@ private int getValueForSingleChoiceSelection(SingleChoiceSetting item, int which

private int getSelectionForSingleChoiceValue(SingleChoiceSetting item)
{
int value = item.getSelectedValue(getSettings());
int value = item.getSelectedValue();
int valuesId = item.getValuesId();

if (valuesId > 0)
@@ -679,7 +678,7 @@ private int getValueForSingleChoiceDynamicDescriptionsSelection(
private int getSelectionForSingleChoiceDynamicDescriptionsValue(
SingleChoiceSettingDynamicDescriptions item)
{
int value = item.getSelectedValue(getSettings());
int value = item.getSelectedValue();
int valuesId = item.getValuesId();

if (valuesId > 0)
@@ -29,10 +29,10 @@
import org.dolphinemu.dolphinemu.features.settings.model.AbstractBooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.AdHocBooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.model.AdHocStringSetting;
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting;
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.LegacyStringSetting;
import org.dolphinemu.dolphinemu.features.settings.model.PostProcessing;
import org.dolphinemu.dolphinemu.features.settings.model.ScaledIntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
@@ -368,9 +368,9 @@ private void addInterfaceSettings(ArrayList<SettingsItem> sl)
AbstractIntSetting appTheme = new AbstractIntSetting()
{
@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return IntSetting.MAIN_INTERFACE_THEME.isOverridden(settings);
return IntSetting.MAIN_INTERFACE_THEME.isOverridden();
}

@Override
@@ -388,9 +388,9 @@ public boolean delete(@NonNull Settings settings)
}

@Override
public int getInt(@NonNull Settings settings)
public int getInt()
{
return IntSetting.MAIN_INTERFACE_THEME.getInt(settings);
return IntSetting.MAIN_INTERFACE_THEME.getInt();
}

@Override
@@ -416,9 +416,9 @@ public void setInt(@NonNull Settings settings, int newValue)
AbstractIntSetting themeMode = new AbstractIntSetting()
{
@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return IntSetting.MAIN_INTERFACE_THEME_MODE.isOverridden(settings);
return IntSetting.MAIN_INTERFACE_THEME_MODE.isOverridden();
}

@Override
@@ -436,9 +436,9 @@ public boolean delete(@NonNull Settings settings)
}

@Override
public int getInt(@NonNull Settings settings)
public int getInt()
{
return IntSetting.MAIN_INTERFACE_THEME_MODE.getInt(settings);
return IntSetting.MAIN_INTERFACE_THEME_MODE.getInt();
}

@Override
@@ -455,9 +455,9 @@ public void setInt(@NonNull Settings settings, int newValue)
AbstractBooleanSetting blackBackgrounds = new AbstractBooleanSetting()
{
@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.isOverridden(settings);
return BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.isOverridden();
}

@Override
@@ -474,9 +474,9 @@ public boolean delete(@NonNull Settings settings)
}

@Override
public boolean getBoolean(@NonNull Settings settings)
public boolean getBoolean()
{
return BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.getBoolean(settings);
return BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.getBoolean();
}

@Override
@@ -500,15 +500,15 @@ private void addAudioSettings(ArrayList<SettingsItem> sl)
AbstractIntSetting dspEmulationEngine = new AbstractIntSetting()
{
@Override
public int getInt(@NonNull Settings settings)
public int getInt()
{
if (BooleanSetting.MAIN_DSP_HLE.getBoolean(settings))
if (BooleanSetting.MAIN_DSP_HLE.getBoolean())
{
return DSP_HLE;
}
else
{
boolean jit = BooleanSetting.MAIN_DSP_JIT.getBoolean(settings);
boolean jit = BooleanSetting.MAIN_DSP_JIT.getBoolean();
return jit ? DSP_LLE_RECOMPILER : DSP_LLE_INTERPRETER;
}
}
@@ -536,10 +536,10 @@ public void setInt(@NonNull Settings settings, int newValue)
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return BooleanSetting.MAIN_DSP_HLE.isOverridden(settings) ||
BooleanSetting.MAIN_DSP_JIT.isOverridden(settings);
return BooleanSetting.MAIN_DSP_HLE.isOverridden() ||
BooleanSetting.MAIN_DSP_JIT.isOverridden();
}

@Override
@@ -681,15 +681,15 @@ private void addAdvancedSettings(ArrayList<SettingsItem> sl)
AbstractIntSetting synchronizeGpuThread = new AbstractIntSetting()
{
@Override
public int getInt(@NonNull Settings settings)
public int getInt()
{
if (BooleanSetting.MAIN_SYNC_GPU.getBoolean(settings))
if (BooleanSetting.MAIN_SYNC_GPU.getBoolean())
{
return SYNC_GPU_ALWAYS;
}
else
{
boolean syncOnSkipIdle = BooleanSetting.MAIN_SYNC_ON_SKIP_IDLE.getBoolean(settings);
boolean syncOnSkipIdle = BooleanSetting.MAIN_SYNC_ON_SKIP_IDLE.getBoolean();
return syncOnSkipIdle ? SYNC_GPU_ON_IDLE_SKIP : SYNC_GPU_NEVER;
}
}
@@ -717,10 +717,10 @@ public void setInt(@NonNull Settings settings, int newValue)
}

@Override
public boolean isOverridden(@NonNull Settings settings)
public boolean isOverridden()
{
return BooleanSetting.MAIN_SYNC_ON_SKIP_IDLE.isOverridden(settings) ||
BooleanSetting.MAIN_SYNC_GPU.isOverridden(settings);
return BooleanSetting.MAIN_SYNC_ON_SKIP_IDLE.isOverridden() ||
BooleanSetting.MAIN_SYNC_GPU.isOverridden();
}

@Override
@@ -879,7 +879,7 @@ private void addEnhanceSettings(ArrayList<SettingsItem> sl)
R.string.texture_filtering, R.string.texture_filtering_description,
R.array.textureFilteringEntries, R.array.textureFilteringValues));

int stereoModeValue = IntSetting.GFX_STEREO_MODE.getInt(mSettings);
int stereoModeValue = IntSetting.GFX_STEREO_MODE.getInt();
final int anaglyphMode = 3;
String[] shaderList = stereoModeValue == anaglyphMode ?
PostProcessing.getAnaglyphShaderList() : PostProcessing.getShaderList();
@@ -1198,7 +1198,7 @@ private void addControllerPerGameSettings(ArrayList<SettingsItem> sl, String pro
String[] profiles = new ProfileDialogPresenter(mMenuTag).getProfileNames(false);
String profileKey = profileString + "Profile" + (controllerNumber + 1);
sl.add(new StringSingleChoiceSetting(mContext,
new LegacyStringSetting("", "Controls", profileKey, ""),
new AdHocStringSetting(Settings.FILE_GAME_SETTINGS_ONLY, "Controls", profileKey, ""),
R.string.input_profile, 0, profiles, profiles, R.string.input_profiles_empty));
}

@@ -1216,7 +1216,7 @@ private void addControllerMetaSettings(ArrayList<SettingsItem> sl, EmulatedContr
sl.add(new SwitchSetting(mContext, new AbstractBooleanSetting()
{
@Override
public boolean isOverridden(Settings settings)
public boolean isOverridden()
{
return false;
}
@@ -1228,20 +1228,20 @@ public boolean isRuntimeEditable()
}

@Override
public boolean delete(Settings settings)
public boolean delete(@NonNull Settings settings)
{
mView.setMappingAllDevices(false);
return true;
}

@Override
public boolean getBoolean(Settings settings)
public boolean getBoolean()
{
return mView.isMappingAllDevices();
}

@Override
public void setBoolean(Settings settings, boolean newValue)
public void setBoolean(@NonNull Settings settings, boolean newValue)
{
mView.setMappingAllDevices(newValue);
}
@@ -22,7 +22,7 @@ class DateTimeSettingViewHolder(

override fun bind(item: SettingsItem) {
mItem = item as DateTimeChoiceSetting
val inputTime = mItem!!.getSelectedValue(adapter.settings)
val inputTime = mItem!!.getSelectedValue()
binding.textSettingName.text = item.getName()

if (!TextUtils.isEmpty(inputTime)) {
@@ -35,7 +35,7 @@ public void bind(SettingsItem item)
mFilePicker = (FilePicker) item;
mItem = item;

String path = mFilePicker.getSelectedValue(getAdapter().getSettings());
String path = mFilePicker.getSelectedValue();

if (FileBrowserHelper.isPathEmptyOrValid(path))
{
@@ -31,7 +31,7 @@ public void bind(SettingsItem item)
{
mInputString = (InputStringSetting) item;

String inputString = mInputString.getSelectedValue(getAdapter().getSettings());
String inputString = mInputString.getSelectedValue();

mBinding.textSettingName.setText(item.getName());

@@ -41,7 +41,7 @@ protected SettingsAdapter getAdapter()

protected void setStyle(TextView textView, SettingsItem settingsItem)
{
boolean overridden = settingsItem.isOverridden(mAdapter.getSettings());
boolean overridden = settingsItem.isOverridden();
textView.setTypeface(null, overridden ? Typeface.BOLD : Typeface.NORMAL);

if (!settingsItem.isEditable())
@@ -18,7 +18,7 @@
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter;

import java.util.function.Function;
import java.util.function.Supplier;

public final class SingleChoiceViewHolder extends SettingViewHolder
{
@@ -39,17 +39,14 @@ public void bind(SettingsItem item)

mBinding.textSettingName.setText(item.getName());

SettingsAdapter adapter = getAdapter();
Settings settings = adapter.getSettings();

if (!TextUtils.isEmpty(item.getDescription()))
{
mBinding.textSettingDescription.setText(item.getDescription());
}
else if (item instanceof SingleChoiceSetting)
{
SingleChoiceSetting setting = (SingleChoiceSetting) item;
int selected = setting.getSelectedValue(settings);
int selected = setting.getSelectedValue();
Resources resMgr = mBinding.textSettingDescription.getContext().getResources();
String[] choices = resMgr.getStringArray(setting.getChoicesId());
int[] values = resMgr.getIntArray(setting.getValuesId());
@@ -64,14 +61,14 @@ else if (item instanceof SingleChoiceSetting)
else if (item instanceof StringSingleChoiceSetting)
{
StringSingleChoiceSetting setting = (StringSingleChoiceSetting) item;
String choice = setting.getSelectedChoice(settings);
String choice = setting.getSelectedChoice();
mBinding.textSettingDescription.setText(choice);
}
else if (item instanceof SingleChoiceSettingDynamicDescriptions)
{
SingleChoiceSettingDynamicDescriptions setting =
(SingleChoiceSettingDynamicDescriptions) item;
int selected = setting.getSelectedValue(settings);
int selected = setting.getSelectedValue();
Resources resMgr = mBinding.textSettingDescription.getContext().getResources();
String[] choices = resMgr.getStringArray(setting.getDescriptionChoicesId());
int[] values = resMgr.getIntArray(setting.getDescriptionValuesId());
@@ -85,7 +82,7 @@ else if (item instanceof SingleChoiceSettingDynamicDescriptions)
}

MenuTag menuTag = null;
Function<Settings, Integer> getSelectedValue = null;
Supplier<Integer> getSelectedValue = null;
if (item instanceof SingleChoiceSetting)
{
SingleChoiceSetting setting = (SingleChoiceSetting) item;
@@ -99,15 +96,14 @@ else if (item instanceof StringSingleChoiceSetting)
getSelectedValue = setting::getSelectedValueIndex;
}

if (menuTag != null &&
adapter.hasMenuTagActionForValue(menuTag, getSelectedValue.apply(settings)))
if (menuTag != null && getAdapter().hasMenuTagActionForValue(menuTag, getSelectedValue.get()))
{
mBinding.buttonMoreSettings.setVisibility(View.VISIBLE);

final MenuTag finalMenuTag = menuTag;
final Function<Settings, Integer> finalGetSelectedValue = getSelectedValue;
final Supplier<Integer> finalGetSelectedValue = getSelectedValue;
mBinding.buttonMoreSettings.setOnClickListener((view) ->
adapter.onMenuTagAction(finalMenuTag, finalGetSelectedValue.apply(settings)));
getAdapter().onMenuTagAction(finalMenuTag, finalGetSelectedValue.get()));
}
else
{
@@ -44,9 +44,8 @@ public void bind(SettingsItem item)
}
else
{
mBinding.textSettingDescription.setText(mContext
.getString(R.string.slider_setting_value,
mItem.getSelectedValue(getAdapter().getSettings()), mItem.getUnits()));
mBinding.textSettingDescription.setText(mContext.getString(R.string.slider_setting_value,
mItem.getSelectedValue(), mItem.getUnits()));
}

setStyle(mBinding.textSettingName, mItem);
@@ -38,7 +38,7 @@ public void bind(SettingsItem item)
mBinding.textSettingName.setText(item.getName());
mBinding.textSettingDescription.setText(item.getDescription());

mBinding.settingSwitch.setChecked(mItem.isChecked(getAdapter().getSettings()));
mBinding.settingSwitch.setChecked(mItem.isChecked());
mBinding.settingSwitch.setEnabled(mItem.isEditable());

// Check for IPL to make sure user can skip.
@@ -56,14 +56,7 @@ public void bind(SettingsItem item)
}
}

if (mItem.isChecked(getAdapter().getSettings()))
{
mBinding.settingSwitch.setEnabled(iplExists);
}
else
{
mBinding.settingSwitch.setEnabled(true);
}
mBinding.settingSwitch.setEnabled(iplExists || !mItem.isChecked());
}

mBinding.settingSwitch.setOnCheckedChangeListener((buttonView, isChecked) ->
@@ -95,7 +88,7 @@ public void onClick(View clicked)

if (mItem.getSetting() == BooleanSetting.MAIN_SKIP_IPL && !iplExists)
{
if (mItem.isChecked(getAdapter().getSettings()))
if (mItem.isChecked())
{
showIplNotAvailableError();
return;
@@ -115,7 +115,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
{
int overlayX = mInputOverlay.getLeft();
int overlayY = mInputOverlay.getTop();
mInputOverlay.setSurfacePosition(activity.getSettings(), new Rect(
mInputOverlay.setSurfacePosition(new Rect(
surfaceView.getLeft() - overlayX, surfaceView.getTop() - overlayY,
surfaceView.getRight() - overlayX, surfaceView.getBottom() - overlayY));
});
@@ -135,7 +135,7 @@ public void onResume()
super.onResume();

if (mInputOverlay != null && NativeLibrary.IsGameMetadataValid())
mInputOverlay.refreshControls(activity.getSettings());
mInputOverlay.refreshControls();

run(activity.isActivityRecreated());
}
@@ -171,34 +171,34 @@ public void onDetach()
public void toggleInputOverlayVisibility(Settings settings)
{
BooleanSetting.MAIN_SHOW_INPUT_OVERLAY
.setBoolean(settings, !BooleanSetting.MAIN_SHOW_INPUT_OVERLAY.getBoolean(settings));
.setBoolean(settings, !BooleanSetting.MAIN_SHOW_INPUT_OVERLAY.getBoolean());

if (mInputOverlay != null)
mInputOverlay.refreshControls(settings);
mInputOverlay.refreshControls();
}

public void initInputPointer(Settings settings)
public void initInputPointer()
{
if (mInputOverlay != null)
mInputOverlay.initTouchPointer(settings);
mInputOverlay.initTouchPointer();
}

public void refreshInputOverlay(Settings settings)
public void refreshInputOverlay()
{
if (mInputOverlay != null)
mInputOverlay.refreshControls(settings);
mInputOverlay.refreshControls();
}

public void refreshOverlayPointer(Settings settings)
public void refreshOverlayPointer()
{
if (mInputOverlay != null)
mInputOverlay.refreshOverlayPointer(settings);
mInputOverlay.refreshOverlayPointer();
}

public void resetInputOverlay(Settings settings)
public void resetInputOverlay()
{
if (mInputOverlay != null)
mInputOverlay.resetButtonPlacement(settings);
mInputOverlay.resetButtonPlacement();
}

@Override
@@ -65,13 +65,12 @@ class GridOptionDialogFragment : BottomSheetDialogFragment() {
}

private fun setUpCoverButtons() {
mBindingMobile.switchDownloadCovers.isChecked =
BooleanSetting.MAIN_USE_GAME_COVERS.booleanGlobal
mBindingMobile.switchDownloadCovers.isChecked = BooleanSetting.MAIN_USE_GAME_COVERS.boolean
mBindingMobile.rootDownloadCovers.setOnClickListener {
mBindingMobile.switchDownloadCovers.isChecked = !mBindingMobile.switchDownloadCovers.isChecked
}
mBindingMobile.switchDownloadCovers.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
BooleanSetting.MAIN_USE_GAME_COVERS.setBooleanGlobal(
BooleanSetting.MAIN_USE_GAME_COVERS.setBoolean(
NativeConfig.LAYER_BASE,
mBindingMobile.switchDownloadCovers.isChecked
)
@@ -80,12 +79,12 @@ class GridOptionDialogFragment : BottomSheetDialogFragment() {
}

private fun setUpTitleButtons() {
mBindingMobile.switchShowTitles.isChecked = BooleanSetting.MAIN_SHOW_GAME_TITLES.booleanGlobal
mBindingMobile.switchShowTitles.isChecked = BooleanSetting.MAIN_SHOW_GAME_TITLES.boolean
mBindingMobile.rootShowTitles.setOnClickListener {
mBindingMobile.switchShowTitles.isChecked = !mBindingMobile.switchShowTitles.isChecked
}
mBindingMobile.switchShowTitles.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
BooleanSetting.MAIN_SHOW_GAME_TITLES.setBooleanGlobal(
BooleanSetting.MAIN_SHOW_GAME_TITLES.setBoolean(
NativeConfig.LAYER_BASE,
mBindingMobile.switchShowTitles.isChecked
)
@@ -96,12 +95,12 @@ class GridOptionDialogFragment : BottomSheetDialogFragment() {
// TODO: Remove this when leanback is removed
private fun setUpCoverButtonsTv() {
mBindingTv.switchDownloadCovers.isChecked =
BooleanSetting.MAIN_USE_GAME_COVERS.booleanGlobal
BooleanSetting.MAIN_USE_GAME_COVERS.boolean
mBindingTv.rootDownloadCovers.setOnClickListener {
mBindingTv.switchDownloadCovers.isChecked = !mBindingTv.switchDownloadCovers.isChecked
}
mBindingTv.switchDownloadCovers.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
BooleanSetting.MAIN_USE_GAME_COVERS.setBooleanGlobal(
BooleanSetting.MAIN_USE_GAME_COVERS.setBoolean(
NativeConfig.LAYER_BASE,
mBindingTv.switchDownloadCovers.isChecked
)
@@ -92,7 +92,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
if (IntSetting.MAIN_INTERFACE_THEME.getIntGlobal() != ThemeHelper.DEFAULT)
if (IntSetting.MAIN_INTERFACE_THEME.getInt() != ThemeHelper.DEFAULT)
{
@ColorInt int color = new ElevationOverlayProvider(view.getContext()).compositeOverlay(
MaterialColors.getColor(view, R.attr.colorSurface),
@@ -114,7 +114,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
mBinding.menuSkylanders.setVisibility(View.GONE);
}

if (!BooleanSetting.MAIN_EMULATE_SKYLANDER_PORTAL.getBooleanGlobal())
if (!BooleanSetting.MAIN_EMULATE_SKYLANDER_PORTAL.getBoolean())
{
mBinding.menuSkylanders.setVisibility(View.GONE);
}
@@ -176,7 +176,7 @@ public void onResume()
{
super.onResume();

boolean savestatesEnabled = BooleanSetting.MAIN_ENABLE_SAVESTATES.getBooleanGlobal();
boolean savestatesEnabled = BooleanSetting.MAIN_ENABLE_SAVESTATES.getBoolean();
int savestateVisibility = savestatesEnabled ? View.VISIBLE : View.GONE;
mBinding.menuQuicksave.setVisibility(savestateVisibility);
mBinding.menuQuickload.setVisibility(savestateVisibility);
@@ -98,7 +98,7 @@ private static LinkedHashSet<String> getPathSet(boolean removeNonExistentFolders

public static String[] getAllGamePaths()
{
boolean recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBooleanGlobal();
boolean recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean();

LinkedHashSet<String> folderPathsSet = getPathSet(true);

Large diffs are not rendered by default.

@@ -102,7 +102,7 @@ public void draw(Canvas canvas)

public boolean TrackEvent(MotionEvent event)
{
boolean reCenter = BooleanSetting.MAIN_JOYSTICK_REL_CENTER.getBooleanGlobal();
boolean reCenter = BooleanSetting.MAIN_JOYSTICK_REL_CENTER.getBoolean();
int action = event.getActionMasked();
boolean firstPointer = action != MotionEvent.ACTION_POINTER_DOWN &&
action != MotionEvent.ACTION_POINTER_UP;
@@ -378,7 +378,7 @@ private void setPlatformTabsAndStartGameFileCacheService()
public void onTabSelected(@NonNull TabLayout.Tab tab)
{
super.onTabSelected(tab);
IntSetting.MAIN_LAST_PLATFORM_TAB.setIntGlobal(NativeConfig.LAYER_BASE,
IntSetting.MAIN_LAST_PLATFORM_TAB.setInt(NativeConfig.LAYER_BASE,
tab.getPosition());
}
});
@@ -388,7 +388,7 @@ public void onTabSelected(@NonNull TabLayout.Tab tab)
mBinding.tabsPlatforms.getTabAt(i).setIcon(PlatformPagerAdapter.TAB_ICONS[i]);
}

mBinding.pagerPlatforms.setCurrentItem(IntSetting.MAIN_LAST_PLATFORM_TAB.getIntGlobal());
mBinding.pagerPlatforms.setCurrentItem(IntSetting.MAIN_LAST_PLATFORM_TAB.getInt());

showGames();
GameFileCacheManager.startLoad();
@@ -175,7 +175,7 @@ public void onDirectorySelected(Intent result)
{
Uri uri = result.getData();

boolean recursive = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBooleanGlobal();
boolean recursive = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean();
String[] childNames = ContentHandler.getChildNames(uri, recursive);
if (Arrays.stream(childNames).noneMatch((name) -> FileBrowserHelper.GAME_EXTENSIONS.contains(
FileBrowserHelper.getExtension(name, false))))
@@ -21,7 +21,7 @@ object Analytics {
@JvmStatic
fun checkAnalyticsInit(activity: FragmentActivity) {
AfterDirectoryInitializationRunner().runWithoutLifecycle {
if (!BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.booleanGlobal) {
if (!BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.boolean) {
AnalyticsDialog().show(activity.supportFragmentManager, AnalyticsDialog.TAG)
}
}
@@ -34,7 +34,7 @@ object Analytics {
BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.setBoolean(settings, true)

// Context is set to null to avoid toasts
settings.saveSettings(null, null)
settings.saveSettings(null)
}
}

@@ -37,7 +37,7 @@ object CoilUtils {
}
)
}
} else if (BooleanSetting.MAIN_USE_GAME_COVERS.booleanGlobal) {
} else if (BooleanSetting.MAIN_USE_GAME_COVERS.boolean) {
imageView.load(CoverHelper.buildGameTDBUrl(gameFile, CoverHelper.getRegion(gameFile))) {
error(R.drawable.no_banner)
target(
@@ -58,13 +58,13 @@ object CoilUtils {
}

private fun enableInnerTitle(gameViewHolder: GameViewHolder?) {
if (gameViewHolder != null && !BooleanSetting.MAIN_SHOW_GAME_TITLES.booleanGlobal) {
if (gameViewHolder != null && !BooleanSetting.MAIN_SHOW_GAME_TITLES.boolean) {
gameViewHolder.binding.textGameTitleInner.visibility = View.VISIBLE
}
}

private fun disableInnerTitle(gameViewHolder: GameViewHolder?) {
if (gameViewHolder != null && !BooleanSetting.MAIN_SHOW_GAME_TITLES.booleanGlobal) {
if (gameViewHolder != null && !BooleanSetting.MAIN_SHOW_GAME_TITLES.boolean) {
gameViewHolder.binding.textGameTitleInner.visibility = View.GONE
}
}
@@ -361,30 +361,29 @@ public static boolean isWaitingForWriteAccess(Context context)
private static void checkThemeSettings(Context context)
{
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (IntSetting.MAIN_INTERFACE_THEME.getIntGlobal() !=
if (IntSetting.MAIN_INTERFACE_THEME.getInt() !=
preferences.getInt(ThemeHelper.CURRENT_THEME, ThemeHelper.DEFAULT))
{
preferences.edit()
.putInt(ThemeHelper.CURRENT_THEME, IntSetting.MAIN_INTERFACE_THEME.getIntGlobal())
.putInt(ThemeHelper.CURRENT_THEME, IntSetting.MAIN_INTERFACE_THEME.getInt())
.apply();
}

if (IntSetting.MAIN_INTERFACE_THEME_MODE.getIntGlobal() !=
if (IntSetting.MAIN_INTERFACE_THEME_MODE.getInt() !=
preferences.getInt(ThemeHelper.CURRENT_THEME_MODE,
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM))
{
preferences.edit()
.putInt(ThemeHelper.CURRENT_THEME_MODE,
IntSetting.MAIN_INTERFACE_THEME_MODE.getIntGlobal())
.putInt(ThemeHelper.CURRENT_THEME_MODE, IntSetting.MAIN_INTERFACE_THEME_MODE.getInt())
.apply();
}

if (BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.getBooleanGlobal() !=
if (BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.getBoolean() !=
preferences.getBoolean(ThemeHelper.USE_BLACK_BACKGROUNDS, false))
{
preferences.edit()
.putBoolean(ThemeHelper.USE_BLACK_BACKGROUNDS,
BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.getBooleanGlobal())
BooleanSetting.MAIN_USE_BLACK_BACKGROUNDS.getBoolean())
.apply();
}
}
@@ -79,7 +79,7 @@ public static String getSelectedPath(Intent result)

public static boolean isPathEmptyOrValid(StringSetting path)
{
return isPathEmptyOrValid(path.getStringGlobal());
return isPathEmptyOrValid(path.getString());
}

/**
@@ -43,6 +43,10 @@ static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section,
{
system = Config::System::WiiPad;
}
else if (decoded_file == "GameSettingsOnly")
{
system = Config::System::GameSettingsOnly;
}
else
{
ASSERT(false);
@@ -134,12 +138,14 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_unloadGameIn
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_save(
JNIEnv*, jclass, jint layer)
{
const std::shared_ptr<Config::Layer> layer_ptr = GetLayer(layer, {});

// Workaround for the Settings class carrying around a legacy map of settings it always saves
layer_ptr->MarkAsDirty();
return GetLayer(layer, {})->Save();
}

return layer_ptr->Save();
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteAllKeys(JNIEnv*, jclass,
jint layer)
{
return GetLayer(layer, {})->DeleteAllKeys();
}

JNIEXPORT jboolean JNICALL
@@ -162,6 +168,16 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey(
return static_cast<jboolean>(had_value);
}

JNIEXPORT jboolean JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_exists(JNIEnv* env, jclass,
jint layer, jstring file,
jstring section,
jstring key)
{
const Config::Location location = GetLocation(env, file, section, key);
return static_cast<jboolean>(GetLayer(layer, location)->Exists(location));
}

JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getString(
JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key,
@@ -159,7 +159,8 @@ static const std::map<System, std::string> system_to_name = {
{System::SYSCONF, "SYSCONF"},
{System::DualShockUDPClient, "DualShockUDPClient"},
{System::FreeLook, "FreeLook"},
{System::Session, "Session"}};
{System::Session, "Session"},
{System::GameSettingsOnly, "GameSettingsOnly"}};

const std::string& GetSystemName(System system)
{
@@ -33,6 +33,7 @@ enum class System
DualShockUDPClient,
FreeLook,
Session,
GameSettingsOnly,
};

constexpr std::array<LayerType, 7> SEARCH_ORDER{{
@@ -159,6 +159,9 @@ class BaseConfigLayerLoader final : public Config::ConfigLayerLoader
if (location.system == Config::System::Session)
continue;

if (location.system == Config::System::GameSettingsOnly)
continue;

auto ini = inis.find(location.system);
if (ini == inis.end())
{
@@ -104,6 +104,7 @@ static const INIToSectionMap& GetINIToSectionMap()
{"Video_Stereoscopy", {Config::System::GFX, "Stereoscopy"}},
{"Video_Hacks", {Config::System::GFX, "Hacks"}},
{"Video", {Config::System::GFX, "GameSpecific"}},
{"Controls", {Config::System::GameSettingsOnly, "Controls"}},
};
return ini_to_section;
}
@@ -18,7 +18,8 @@ bool IsSettingSaveable(const Config::Location& config_location)
{
for (Config::System system :
{Config::System::SYSCONF, Config::System::GFX, Config::System::DualShockUDPClient,
Config::System::Logger, Config::System::FreeLook, Config::System::Main})
Config::System::Logger, Config::System::FreeLook, Config::System::Main,
Config::System::GameSettingsOnly})
{
if (config_location.system == system)
return true;