Introduce AndroidSettings class and use inheritance

The `Settings` class now has a pure virtual `Update` method, and uses inheritance over template specialization for platform-specific behavior override.
This commit is contained in:
lynxnb 2022-07-22 10:53:28 +02:00 committed by ◱ Mark
parent 3905728447
commit 2840a126dd
6 changed files with 58 additions and 35 deletions

View File

@ -134,7 +134,6 @@ add_library(skyline SHARED
${source_DIR}/skyline/common.cpp ${source_DIR}/skyline/common.cpp
${source_DIR}/skyline/common/exception.cpp ${source_DIR}/skyline/common/exception.cpp
${source_DIR}/skyline/common/logger.cpp ${source_DIR}/skyline/common/logger.cpp
${source_DIR}/skyline/common/settings.cpp
${source_DIR}/skyline/common/signal.cpp ${source_DIR}/skyline/common/signal.cpp
${source_DIR}/skyline/common/uuid.cpp ${source_DIR}/skyline/common/uuid.cpp
${source_DIR}/skyline/common/trace.cpp ${source_DIR}/skyline/common/trace.cpp

View File

@ -8,7 +8,7 @@
#include "skyline/common.h" #include "skyline/common.h"
#include "skyline/common/language.h" #include "skyline/common/language.h"
#include "skyline/common/signal.h" #include "skyline/common/signal.h"
#include "skyline/common/settings.h" #include "skyline/common/android_settings.h"
#include "skyline/common/trace.h" #include "skyline/common/trace.h"
#include "skyline/loader/loader.h" #include "skyline/loader/loader.h"
#include "skyline/vfs/android_asset_filesystem.h" #include "skyline/vfs/android_asset_filesystem.h"
@ -54,14 +54,6 @@ static std::string GetTimeZoneName() {
return "GMT"; return "GMT";
} }
template<> void skyline::Settings::Update<skyline::KtSettings>(KtSettings newSettings) {
isDocked = newSettings.GetBool("isDocked");
usernameValue = newSettings.GetString("usernameValue");
systemLanguage = newSettings.GetInt<skyline::language::SystemLanguage>("systemLanguage");
forceTripleBuffering = newSettings.GetBool("forceTripleBuffering");
disableFrameThrottling = newSettings.GetBool("disableFrameThrottling");
}
extern "C" JNIEXPORT void Java_emu_skyline_SkylineApplication_initializeLog( extern "C" JNIEXPORT void Java_emu_skyline_SkylineApplication_initializeLog(
JNIEnv *env, JNIEnv *env,
jobject, jobject,
@ -93,8 +85,7 @@ extern "C" JNIEXPORT void Java_emu_skyline_EmulationActivity_executeApplication(
auto jvmManager{std::make_shared<skyline::JvmManager>(env, instance)}; auto jvmManager{std::make_shared<skyline::JvmManager>(env, instance)};
skyline::KtSettings ktSettings{env, settingsInstance}; std::shared_ptr<skyline::Settings> settings{std::make_shared<skyline::AndroidSettings>(env, settingsInstance)};
auto settings{std::make_shared<skyline::Settings>(ktSettings)};
skyline::JniString publicAppFilesPath(env, publicAppFilesPathJstring); skyline::JniString publicAppFilesPath(env, publicAppFilesPathJstring);
skyline::Logger::EmulationContext.Initialize(publicAppFilesPath + "logs/emulation.sklog"); skyline::Logger::EmulationContext.Initialize(publicAppFilesPath + "logs/emulation.sklog");
@ -240,10 +231,9 @@ extern "C" JNIEXPORT void JNICALL Java_emu_skyline_EmulationActivity_setTouchSta
env->ReleaseIntArrayElements(pointsJni, reinterpret_cast<jint *>(points.data()), JNI_ABORT); env->ReleaseIntArrayElements(pointsJni, reinterpret_cast<jint *>(points.data()), JNI_ABORT);
} }
extern "C" JNIEXPORT void JNICALL Java_emu_skyline_utils_SettingsValues_updateNative(JNIEnv *env, jobject settingsInstance) { extern "C" JNIEXPORT void JNICALL Java_emu_skyline_utils_SettingsValues_updateNative(JNIEnv *env, jobject) {
auto settings{SettingsWeak.lock()}; auto settings{SettingsWeak.lock()};
if (!settings) if (!settings)
return; // We don't mind if we miss settings updates while settings haven't been initialized return; // We don't mind if we miss settings updates while settings haven't been initialized
skyline::KtSettings ktSettings{env, settingsInstance}; settings->Update();
settings->Update(ktSettings);
} }

View File

@ -0,0 +1,41 @@
// SPDX-License-Identifier: MPL-2.0
// Copyright © 2022 Skyline Team and Contributors (https://github.com/skyline-emu/)
#pragma once
#include "settings.h"
#include "jvm.h"
namespace skyline {
/**
* @brief Handles settings on the android platform
* @note Lifetime of this class must not exceed the one of the JNIEnv contained inside ktSettings
*/
class AndroidSettings final : public Settings {
private:
KtSettings ktSettings;
public:
/**
* @note Will construct the underlying KtSettings object in-place
*/
AndroidSettings(JNIEnv *env, jobject settingsInstance) : ktSettings(env, settingsInstance) {
Update();
}
/**
* @note Will take ownership of the passed KtSettings object
*/
AndroidSettings(KtSettings &&ktSettings) : ktSettings(std::move(ktSettings)) {
Update();
}
void Update() override {
isDocked = ktSettings.GetBool("isDocked");
usernameValue = std::move(ktSettings.GetString("usernameValue"));
systemLanguage = ktSettings.GetInt<skyline::language::SystemLanguage>("systemLanguage");
forceTripleBuffering = ktSettings.GetBool("forceTripleBuffering");
disableFrameThrottling = ktSettings.GetBool("disableFrameThrottling");
};
};
}

View File

@ -1,12 +0,0 @@
// SPDX-License-Identifier: MPL-2.0
// Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
#include "settings.h"
namespace skyline {
/**
* @note This is a placeholder implementation, it must be overridden via template specialisation for platform-specific behavior
*/
template<class T>
void Settings::Update(T newSettings) {}
}

View File

@ -7,7 +7,7 @@
namespace skyline { namespace skyline {
/** /**
* @brief The Settings class is used to access preferences set in the Kotlin component of Skyline * @brief The Settings class provides a simple interface to access user-defined settings, update values and subscribe callbacks to observe changes.
*/ */
class Settings { class Settings {
template<typename T> template<typename T>
@ -60,16 +60,14 @@ namespace skyline {
Setting<bool> forceTripleBuffering; //!< If the presentation engine should always triple buffer even if the swapchain supports double buffering Setting<bool> forceTripleBuffering; //!< If the presentation engine should always triple buffer even if the swapchain supports double buffering
Setting<bool> disableFrameThrottling; //!< Allow the guest to submit frames without any blocking calls Setting<bool> disableFrameThrottling; //!< Allow the guest to submit frames without any blocking calls
template<class T> Settings() = default;
Settings(T settings) {
Update(settings); virtual ~Settings() = default;
}
/** /**
* @brief Updates settings with the given values * @brief Updates settings with the given values
* @param newSettings A platform-specific object containing the new settings' values * @note This method is platform-specific and must be overridden
*/ */
template<class T> virtual void Update() = 0;
void Update(T newSettings);
}; };
} }

View File

@ -21,6 +21,7 @@ namespace skyline {
/** /**
* @brief A wrapper over the `Settings` Kotlin class * @brief A wrapper over the `Settings` Kotlin class
* @note The lifetime of this class must not exceed that of the JNI environment * @note The lifetime of this class must not exceed that of the JNI environment
* @note Copy construction of this class is disallowed to avoid issues with the JNI environment lifetime
*/ */
class KtSettings { class KtSettings {
private: private:
@ -31,6 +32,12 @@ namespace skyline {
public: public:
KtSettings(JNIEnv *env, jobject settingsInstance) : env(env), settingsInstance(settingsInstance), settingsClass(env->GetObjectClass(settingsInstance)) {} KtSettings(JNIEnv *env, jobject settingsInstance) : env(env), settingsInstance(settingsInstance), settingsClass(env->GetObjectClass(settingsInstance)) {}
KtSettings(const KtSettings &) = delete;
void operator=(const KtSettings &) = delete;
KtSettings(KtSettings &&) = default;
/** /**
* @param key A null terminated string containing the key of the setting to get * @param key A null terminated string containing the key of the setting to get
*/ */