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.
This commit is contained in:
JosJuice 2022-09-24 13:03:45 +02:00
parent 16c71b9a35
commit 04072f0ce6
9 changed files with 69 additions and 63 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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();
});

View File

@ -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);

View File

@ -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);

View File

@ -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<Config::Layer> 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;

View File

@ -120,6 +120,13 @@ void SetBaseOrCurrent(const Info<T>& info, const std::common_type_t<T>& value)
Set<T>(LayerType::CurrentRun, info, value);
}
template <typename T>
void DeleteKey(LayerType layer, const Info<T>& info)
{
if (GetLayer(layer)->DeleteKey(info.GetLocation()))
OnConfigChanged();
}
// Used to defer OnConfigChanged until after the completion of many config changes.
class ConfigChangeCallbackGuard
{

View File

@ -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;
}

View File

@ -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);