From 04072f0ce63c64924695743cd83a028c06fe6be2 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 24 Sep 2022 13:03:45 +0200 Subject: [PATCH] Integrate "Ignore for this session" better with config system Because of the previous commit, this is needed to stop DolphinQt from forgetting that the user pressed ignore whenever any part of the config is changed. This commit also changes the behavior a bit on DolphinQt: "Ignore for this session" now applies to the current emulation session instead of the current Dolphin launch. This matches how it already worked on Android, and is in my opinion better because it means the user won't lose out on important panic alerts in a game becase they played another game first that had repeated panic alerts that they wanted to ignore. For Android, this commit isn't necessary, but it makes the code cleaner. --- .../dolphinemu/dolphinemu/NativeLibrary.java | 83 +++++++++---------- .../activities/EmulationActivity.java | 15 ---- .../dolphinemu/dialogs/AlertMessage.java | 4 +- .../settings/model/BooleanSetting.java | 12 +++ .../features/settings/model/NativeConfig.java | 1 + Source/Android/jni/Config/NativeConfig.cpp | 5 ++ Source/Core/Common/Config/Config.h | 7 ++ Source/Core/DolphinQt/Main.cpp | 2 +- Source/Core/DolphinQt/MenuBar.cpp | 3 +- 9 files changed, 69 insertions(+), 63 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index dd2c4e8407..fa347e0f25 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -511,59 +511,54 @@ public final class NativeLibrary Log.error("[NativeLibrary] Alert: " + text); final EmulationActivity emulationActivity = sEmulationActivity.get(); boolean result = false; - if (isWarning && emulationActivity != null && emulationActivity.isIgnoringWarnings()) + + // We can't use AlertMessages unless we have a non-null activity reference + // and are allowed to block. As a fallback, we can use toasts. + if (emulationActivity == null || nonBlocking) { - return true; + new Handler(Looper.getMainLooper()).post( + () -> Toast.makeText(DolphinApplication.getAppContext(), text, Toast.LENGTH_LONG) + .show()); } else { - // We can't use AlertMessages unless we have a non-null activity reference - // and are allowed to block. As a fallback, we can use toasts. - if (emulationActivity == null || nonBlocking) + sIsShowingAlertMessage = true; + + emulationActivity.runOnUiThread(() -> { - new Handler(Looper.getMainLooper()).post( - () -> Toast.makeText(DolphinApplication.getAppContext(), text, Toast.LENGTH_LONG) - .show()); + FragmentManager fragmentManager = emulationActivity.getSupportFragmentManager(); + if (fragmentManager.isStateSaved()) + { + // The activity is being destroyed, so we can't use it to display an AlertMessage. + // Fall back to a toast. + Toast.makeText(emulationActivity, text, Toast.LENGTH_LONG).show(); + NotifyAlertMessageLock(); + } + else + { + AlertMessage.newInstance(caption, text, yesNo, isWarning) + .show(fragmentManager, "AlertMessage"); + } + }); + + // Wait for the lock to notify that it is complete. + synchronized (sAlertMessageLock) + { + try + { + sAlertMessageLock.wait(); + } + catch (Exception ignored) + { + } } - else + + if (yesNo) { - sIsShowingAlertMessage = true; - - emulationActivity.runOnUiThread(() -> - { - FragmentManager fragmentManager = emulationActivity.getSupportFragmentManager(); - if (fragmentManager.isStateSaved()) - { - // The activity is being destroyed, so we can't use it to display an AlertMessage. - // Fall back to a toast. - Toast.makeText(emulationActivity, text, Toast.LENGTH_LONG).show(); - NotifyAlertMessageLock(); - } - else - { - AlertMessage.newInstance(caption, text, yesNo, isWarning) - .show(fragmentManager, "AlertMessage"); - } - }); - - // Wait for the lock to notify that it is complete. - synchronized (sAlertMessageLock) - { - try - { - sAlertMessageLock.wait(); - } - catch (Exception ignored) - { - } - } - - if (yesNo) - { - result = AlertMessage.getAlertResult(); - } + result = AlertMessage.getAlertResult(); } } + sIsShowingAlertMessage = false; return result; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index 969d1ca3f1..9106d8d81c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -88,14 +88,12 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP private String[] mPaths; private boolean mRiivolution; private boolean mLaunchSystemMenu; - private boolean mIgnoreWarnings; private static boolean sUserPausedEmulation; private boolean mMenuToastShown; public static final String EXTRA_SELECTED_GAMES = "SelectedGames"; public static final String EXTRA_RIIVOLUTION = "Riivolution"; public static final String EXTRA_SYSTEM_MENU = "SystemMenu"; - public static final String EXTRA_IGNORE_WARNINGS = "IgnoreWarnings"; public static final String EXTRA_USER_PAUSED_EMULATION = "sUserPausedEmulation"; public static final String EXTRA_MENU_TOAST_SHOWN = "MenuToastShown"; @@ -316,7 +314,6 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP mPaths = gameToEmulate.getStringArrayExtra(EXTRA_SELECTED_GAMES); mRiivolution = gameToEmulate.getBooleanExtra(EXTRA_RIIVOLUTION, false); mLaunchSystemMenu = gameToEmulate.getBooleanExtra(EXTRA_SYSTEM_MENU, false); - mIgnoreWarnings = gameToEmulate.getBooleanExtra(EXTRA_IGNORE_WARNINGS, false); sUserPausedEmulation = gameToEmulate.getBooleanExtra(EXTRA_USER_PAUSED_EMULATION, false); mMenuToastShown = false; activityRecreated = false; @@ -366,7 +363,6 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP mEmulationFragment.saveTemporaryState(); } outState.putStringArray(EXTRA_SELECTED_GAMES, mPaths); - outState.putBoolean(EXTRA_IGNORE_WARNINGS, mIgnoreWarnings); outState.putBoolean(EXTRA_USER_PAUSED_EMULATION, sUserPausedEmulation); outState.putBoolean(EXTRA_MENU_TOAST_SHOWN, mMenuToastShown); super.onSaveInstanceState(outState); @@ -375,7 +371,6 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP protected void restoreState(Bundle savedInstanceState) { mPaths = savedInstanceState.getStringArray(EXTRA_SELECTED_GAMES); - mIgnoreWarnings = savedInstanceState.getBoolean(EXTRA_IGNORE_WARNINGS); sUserPausedEmulation = savedInstanceState.getBoolean(EXTRA_USER_PAUSED_EMULATION); mMenuToastShown = savedInstanceState.getBoolean(EXTRA_MENU_TOAST_SHOWN); } @@ -754,16 +749,6 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP } } - public boolean isIgnoringWarnings() - { - return mIgnoreWarnings; - } - - public void setIgnoreWarnings(boolean value) - { - mIgnoreWarnings = value; - } - public static boolean getHasUserPausedEmulation() { return sUserPausedEmulation; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AlertMessage.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AlertMessage.java index 69cf5ef280..aef3016134 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AlertMessage.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AlertMessage.java @@ -13,6 +13,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.activities.EmulationActivity; +import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.NativeConfig; public final class AlertMessage extends DialogFragment { @@ -82,7 +84,7 @@ public final class AlertMessage extends DialogFragment { builder.setNeutralButton(R.string.ignore_warning_alert_messages, (dialog, which) -> { - emulationActivity.setIgnoreWarnings(true); + BooleanSetting.MAIN_USE_PANIC_HANDLERS.setBoolean(NativeConfig.LAYER_CURRENT, false); dialog.dismiss(); NativeLibrary.NotifyAlertMessageLock(); }); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index 0c02f1b9a0..2a82bdd5b4 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -329,6 +329,18 @@ public enum BooleanSetting implements AbstractBooleanSetting } } + public void setBoolean(int layerType, boolean newValue) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + NativeConfig.setBoolean(layerType, mFile, mSection, mKey, newValue); + } + else + { + throw new UnsupportedOperationException("The old config system doesn't support layers"); + } + } + public boolean getBooleanGlobal() { return NativeConfig.getBoolean(NativeConfig.LAYER_ACTIVE, mFile, mSection, mKey, mDefaultValue); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java index 21ad4b661f..07646a2eb8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java @@ -8,6 +8,7 @@ public class NativeConfig public static final int LAYER_BASE = 1; public static final int LAYER_LOCAL_GAME = 2; public static final int LAYER_ACTIVE = 3; + public static final int LAYER_CURRENT = 4; public static native boolean isSettingSaveable(String file, String section, String key); diff --git a/Source/Android/jni/Config/NativeConfig.cpp b/Source/Android/jni/Config/NativeConfig.cpp index 4ec0d0bd86..f707e91f5b 100644 --- a/Source/Android/jni/Config/NativeConfig.cpp +++ b/Source/Android/jni/Config/NativeConfig.cpp @@ -16,6 +16,7 @@ constexpr jint LAYER_BASE_OR_CURRENT = 0; constexpr jint LAYER_BASE = 1; constexpr jint LAYER_LOCAL_GAME = 2; constexpr jint LAYER_ACTIVE = 3; +constexpr jint LAYER_CURRENT = 4; static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section, jstring key) { @@ -76,6 +77,10 @@ static std::shared_ptr GetLayer(jint layer, const Config::Locatio layer_type = Config::GetActiveLayerForConfig(location); break; + case LAYER_CURRENT: + layer_type = Config::LayerType::CurrentRun; + break; + default: ASSERT(false); return nullptr; diff --git a/Source/Core/Common/Config/Config.h b/Source/Core/Common/Config/Config.h index d956a203aa..b448f234f9 100644 --- a/Source/Core/Common/Config/Config.h +++ b/Source/Core/Common/Config/Config.h @@ -120,6 +120,13 @@ void SetBaseOrCurrent(const Info& info, const std::common_type_t& value) Set(LayerType::CurrentRun, info, value); } +template +void DeleteKey(LayerType layer, const Info& info) +{ + if (GetLayer(layer)->DeleteKey(info.GetLocation())) + OnConfigChanged(); +} + // Used to defer OnConfigChanged until after the completion of many config changes. class ConfigChangeCallbackGuard { diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index bd17fe5890..06a29081f6 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -92,7 +92,7 @@ static bool QtMsgAlertHandler(const char* caption, const char* text, bool yes_no if (button == QMessageBox::Ignore) { - Common::SetEnableAlert(false); + Config::SetCurrent(Config::MAIN_USE_PANIC_HANDLERS, false); return true; } diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp index 790e19f8d3..e1737f79d3 100644 --- a/Source/Core/DolphinQt/MenuBar.cpp +++ b/Source/Core/DolphinQt/MenuBar.cpp @@ -548,8 +548,7 @@ void MenuBar::AddOptionsMenu() m_reset_ignore_panic_handler = options_menu->addAction(tr("Reset Ignore Panic Handler")); connect(m_reset_ignore_panic_handler, &QAction::triggered, this, []() { - if (Config::Get(Config::MAIN_USE_PANIC_HANDLERS)) - Common::SetEnableAlert(true); + Config::DeleteKey(Config::LayerType::CurrentRun, Config::MAIN_USE_PANIC_HANDLERS); }); m_change_font = options_menu->addAction(tr("&Font..."), this, &MenuBar::ChangeDebugFont);