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:
parent
16c71b9a35
commit
04072f0ce6
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue