ANDROID: Correctly init config keys and reflect values on GUI

Also comments added about how this process works. Fixes bug #11743
This commit is contained in:
antoniou 2020-10-07 15:23:53 +03:00
parent 465807f165
commit e25ac0bc55

View File

@ -302,25 +302,97 @@ void *OSystem_Android::audioThreadFunc(void *arg) {
return 0;
}
//
// When launching ScummVM (from ScummVMActivity) order of business is as follows:
// 1. scummvm_main() (base/main.cpp)
// 1.1. call system.initBackend() (from scummvm_main() (base/main.cpp))
// According to comments in main.cpp:
// "Init the backend. Must take place after all config data (including the command line params) was read."
// 1.2. call setupGraphics(system); (from scummvm_main() (base/main.cpp))
// 1.3. call launcherDialog() (from scummvm_main() (base/main.cpp))
// Upon calling launcherDialog() the transient domain configuration options are cleared!
// According to comments in main.cpp:
// "Those that affect the graphics mode and the others (like bootparam etc.) should not blindly be passed to the first game launched from the launcher."
void OSystem_Android::initBackend() {
ENTER();
_main_thread = pthread_self();
// Warning: ConfMan.registerDefault() can be used for a Session of ScummVM
// but:
// 1. The values will NOT persist to storage
// ie. they won't get saved to scummvm.ini
// 2. The values will NOT be reflected on the GUI
// and they cannot be recovered after exiting scummvm and re-launching
// Also, if after a ConfMan.registerDefault(), we subsequently use ConfMan.hasKey()
// here or anywhere else in ScummVM, it WILL NOT return true.
// As noted in ConfigManager::hasKey() implementation: (common/config_manager.cpp)
// // Search the domains in the following order:
// // 1) the transient domain,
// // 2) the active game domain (if any),
// // 3) the application domain.
// --> // The defaults domain is explicitly *not* checked. <--
//
// So for at least some of these keys,
// we need to additionally check with hasKey() if they are persisted
// and set them explicitly that way.
// TODO Maybe the registerDefault only has meaning for "savepath"
// and similar key/values retrieved from "Command Line"
// so that they won't get "nuked"
// and maintained for the duration ScummVM app session (until we exit the app)
ConfMan.registerDefault("fullscreen", true);
ConfMan.registerDefault("aspect_ratio", true);
ConfMan.registerDefault("filtering", false);
ConfMan.registerDefault("touchpad_mouse_mode", true);
ConfMan.registerDefault("onscreen_control", true);
ConfMan.registerDefault("autosave_period", 0);
// explicitly set this, since fullscreen cannot be changed from GUI
// and for Android it should be persisted (and ConfMan.hasKey("fullscreen") check should return true for it)
// Also in Options::dialogBuild() (gui/options.cpp), since Android does not have kFeatureFullscreenMode (see hasFeature() below)
// the state of the checkbox in the GUI is set to true (and disabled)
ConfMan.setBool("fullscreen", true);
// Aspect ratio can be changed from the GUI.
// However we set it explicitly here (in addition to the registerDefault command above)
// if it's not already set in the persistent config file
if (!ConfMan.hasKey("aspect_ratio")) {
ConfMan.setBool("aspect_ratio", true);
}
if (!ConfMan.hasKey("filtering")) {
ConfMan.setBool("filtering", false);
}
// Note: About the stretch mode setting
// If not explicitly set in the config file
// the default used by OSystem::setStretchMode() (common/system.h)
// is the one returned by getDefaultStretchMode() (backends/graphics/opengl-graphics.cpp)
// which currently is STRETCH_FIT
if (!ConfMan.hasKey("touchpad_mouse_mode")) {
ConfMan.setBool("touchpad_mouse_mode", true);
}
_touchpad_mode = ConfMan.getBool("touchpad_mouse_mode");
if (!ConfMan.hasKey("onscreen_control")) {
ConfMan.setBool("onscreen_control", true);
}
JNI::showKeyboardControl(ConfMan.getBool("onscreen_control"));
if (!ConfMan.hasKey("autosave_period")) {
ConfMan.setInt("autosave_period", 0);
}
// The swap_menu_and_back is a deprecated configuration key
// It is no longer relevant, after introducing the keymapper functionality
// since the behaviour of the menu and back buttons is now handled by the keymapper.
// We now ignore it completely
ConfMan.registerDefault("autosave_period", 0);
ConfMan.setBool("FM_high_quality", false);
ConfMan.setBool("FM_medium_quality", true);
// we need a relaxed delay for the remapping timeout since handling touch interface and virtual keyboard can be slow
// We need a relaxed delay for the remapping timeout since handling touch interface and virtual keyboard can be slow
// and especially in some occasions when we need to pull down (hide) the keyboard and map a system key (like the AC_Back) button.
// 8 seconds should be enough
ConfMan.registerDefault("remap_timeout_delay_ms", 8000);
@ -329,31 +401,22 @@ void OSystem_Android::initBackend() {
}
if (!ConfMan.hasKey("browser_lastpath")) {
// TODO remove the debug message eventually
LOGD("Setting Browser Lastpath to root");
ConfMan.set("browser_lastpath", "/");
}
if (ConfMan.hasKey("touchpad_mouse_mode")) {
_touchpad_mode = ConfMan.getBool("touchpad_mouse_mode");
} else {
ConfMan.setBool("touchpad_mouse_mode", true);
_touchpad_mode = true;
}
if (ConfMan.hasKey("onscreen_control"))
JNI::showKeyboardControl(ConfMan.getBool("onscreen_control"));
else
ConfMan.setBool("onscreen_control", true);
// BUG: "transient" ConfMan settings get nuked by the options
// screen. Passing the savepath in this way makes it stick
// (via ConfMan.registerDefault)
// (via ConfMan.registerDefault() which is called from DefaultSaveFileManager constructor (backends/saves/default/default-saves.cpp))
// Note: The aforementioned bug is probably the one reported here:
// https://bugs.scummvm.org/ticket/3712
// and maybe here:
// https://bugs.scummvm.org/ticket/7389
// TODO is this right to save full path?
// However, we do NOT set the savepath key explicitly for ConfMan
// and thus the savepath will only be persisted as "default" config
// for the rest of the app session (until exit).
// It will NOT be reflected on the GUI, if it's not set explicitly by the user there
// TODO Why do we need it not shown on the GUI though?
// Btw, this is a ScummVM thing, the "defaults" do not show they values on our GUI)
_savefileManager = new DefaultSaveFileManager(ConfMan.get("savepath"));
// TODO remove the debug message eventually
LOGD("Setting DefaultSaveFileManager path to: %s", ConfMan.get("savepath").c_str());
@ -389,6 +452,8 @@ void OSystem_Android::initBackend() {
}
bool OSystem_Android::hasFeature(Feature f) {
if (f == kFeatureFullscreenMode)
return false;
if (f == kFeatureVirtualKeyboard ||
f == kFeatureOpenUrl ||
f == kFeatureTouchpadMode ||