commit be4a0f5ccd9aec32534ec7dda2ae901455b5b866 parent a4b743200606e6a294d9cfc3f6a52cb88a29ccc2 Author: rhunk <101876869+rhunk@users.noreply.github.com> Date: Wed, 25 Oct 2023 03:20:48 +0200 refactor: ModConfig lateInit Diffstat:
5 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/RemoteSideContext.kt b/app/src/main/kotlin/me/rhunk/snapenhance/RemoteSideContext.kt @@ -57,7 +57,7 @@ class RemoteSideContext( set(value) { _activity?.clear(); _activity = WeakReference(value) } val sharedPreferences: SharedPreferences get() = androidContext.getSharedPreferences("prefs", 0) - val config = ModConfig() + val config = ModConfig(androidContext) val translation = LocaleWrapper() val mappings = MappingsWrapper() val downloadTaskManager = DownloadTaskManager() diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/config/ConfigContainer.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/config/ConfigContainer.kt @@ -1,5 +1,6 @@ package me.rhunk.snapenhance.common.config +import android.content.Context import com.google.gson.JsonObject import kotlin.reflect.KProperty @@ -83,6 +84,12 @@ open class ConfigContainer( } } + open fun lateInit(context: Context) { + properties.values.filter { it.getNullable() is ConfigContainer }.forEach { + (it.get() as ConfigContainer).lateInit(context) + } + } + operator fun getValue(t: Any?, property: KProperty<*>) = this.globalState operator fun setValue(t: Any?, property: KProperty<*>, t1: Boolean?) { this.globalState = t1 } } \ No newline at end of file diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/config/ModConfig.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/config/ModConfig.kt @@ -12,7 +12,9 @@ import me.rhunk.snapenhance.common.config.impl.RootConfig import me.rhunk.snapenhance.common.logger.AbstractLogger import kotlin.properties.Delegates -class ModConfig { +class ModConfig( + private val context: Context +) { var locale: String = LocaleWrapper.DEFAULT_LOCALE private val gson: Gson = GsonBuilder().setPrettyPrinting().create() @@ -24,8 +26,10 @@ class ModConfig { lateinit var root: RootConfig private set + private fun createRootConfig() = RootConfig().apply { lateInit(context) } + private fun load() { - root = RootConfig() + root = createRootConfig() wasPresent = file.isFileExists() if (!file.isFileExists()) { writeConfig() @@ -95,7 +99,7 @@ class ModConfig { configStateListener?.also { runCatching { - compareDiff(RootConfig().apply { + compareDiff(createRootConfig().apply { fromJson(gson.fromJson(file.read().toString(Charsets.UTF_8), JsonObject::class.java)) }, root) diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/ModContext.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/ModContext.kt @@ -36,10 +36,11 @@ import me.rhunk.snapenhance.nativelib.NativeLib import kotlin.reflect.KClass import kotlin.system.exitProcess -class ModContext { +class ModContext( + val androidContext: Context +) { val coroutineScope = CoroutineScope(Dispatchers.IO) - lateinit var androidContext: Context lateinit var bridgeClient: BridgeClient var mainActivity: Activity? = null @@ -47,7 +48,7 @@ class ModContext { val resources: Resources get() = androidContext.resources val gson: Gson = GsonBuilder().create() - private val _config = ModConfig() + private val _config = ModConfig(androidContext) val config by _config::root val log by lazy { CoreLogger(this.bridgeClient) } val translation = LocaleWrapper() diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/SnapEnhance.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/SnapEnhance.kt @@ -33,7 +33,7 @@ class SnapEnhance { SnapClassCache(classLoader) } } - private val appContext = ModContext() + private lateinit var appContext: ModContext private var isBridgeInitialized = false private var isActivityPaused = false @@ -47,9 +47,11 @@ class SnapEnhance { init { Application::class.java.hook("attach", HookStage.BEFORE) { param -> - appContext.apply { + appContext = ModContext( androidContext = param.arg<Context>(0).also { classLoader = it.classLoader } - bridgeClient = BridgeClient(appContext) + ) + appContext.apply { + bridgeClient = BridgeClient(this) bridgeClient.apply { connect( onFailure = {