refactor: file handle manager

This commit is contained in:
rhunk
2024-05-28 23:41:52 +02:00
parent 84fc7c6ee3
commit c31e6fd0c2
25 changed files with 329 additions and 303 deletions

View File

@ -19,7 +19,6 @@ import me.rhunk.snapenhance.common.bridge.wrapper.MappingsWrapper
import me.rhunk.snapenhance.common.config.ModConfig
import me.rhunk.snapenhance.core.action.ActionManager
import me.rhunk.snapenhance.core.bridge.BridgeClient
import me.rhunk.snapenhance.core.bridge.loadFromBridge
import me.rhunk.snapenhance.core.database.DatabaseAccess
import me.rhunk.snapenhance.core.event.EventBus
import me.rhunk.snapenhance.core.event.EventDispatcher
@ -48,15 +47,15 @@ class ModContext(
val resources: Resources get() = androidContext.resources
val gson: Gson = GsonBuilder().create()
private val _config = ModConfig(androidContext)
val config by _config::root
private val _config by lazy { ModConfig(androidContext, bridgeClient.getFileHandlerManager()) }
val config get() = _config.root
val log by lazy { CoreLogger(this.bridgeClient) }
val translation = LocaleWrapper()
val translation by lazy { LocaleWrapper(bridgeClient.getFileHandlerManager()) }
val httpServer = HttpServer()
val messageSender = MessageSender(this)
val features = FeatureManager(this)
val mappings = MappingsWrapper()
val mappings by lazy { MappingsWrapper(bridgeClient.getFileHandlerManager()) }
val actionManager = ActionManager(this)
val database = DatabaseAccess(this)
val event = EventBus(this)
@ -144,9 +143,7 @@ class ModContext(
fun reloadConfig() {
log.verbose("reloading config")
_config.loadFromCallback { file ->
file.loadFromBridge(bridgeClient)
}
_config.load()
reloadNativeConfig()
}

View File

@ -19,7 +19,6 @@ import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.common.util.toSerialized
import me.rhunk.snapenhance.core.bridge.BridgeClient
import me.rhunk.snapenhance.core.bridge.loadFromBridge
import me.rhunk.snapenhance.core.data.SnapClassCache
import me.rhunk.snapenhance.core.event.events.impl.NativeUnaryCallEvent
import me.rhunk.snapenhance.core.event.events.impl.SnapWidgetBroadcastReceiveEvent
@ -148,12 +147,9 @@ class SnapEnhance {
log.error("Failed to sync remote", it)
}
translation.userLocale = getConfigLocale()
translation.loadFromCallback { locale ->
bridgeClient.fetchLocales(locale)
}
translation.load()
}
mappings.loadFromBridge(bridgeClient)
mappings.init(androidContext)
database.init()
eventDispatcher.init()

View File

@ -18,11 +18,8 @@ import me.rhunk.snapenhance.bridge.logger.LoggerInterface
import me.rhunk.snapenhance.bridge.logger.TrackerInterface
import me.rhunk.snapenhance.bridge.scripting.IScripting
import me.rhunk.snapenhance.bridge.snapclient.MessagingBridge
import me.rhunk.snapenhance.bridge.storage.FileHandleManager
import me.rhunk.snapenhance.common.Constants
import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.bridge.types.FileActionType
import me.rhunk.snapenhance.common.bridge.types.LocalePair
import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.common.data.MessagingRuleType
@ -34,14 +31,6 @@ import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import kotlin.system.exitProcess
fun FileLoaderWrapper.loadFromBridge(bridgeClient: BridgeClient) {
isFileExists = { bridgeClient.isFileExists(fileType) }
read = { bridgeClient.createAndReadFile(fileType, defaultContent) }
write = { bridgeClient.writeFile(fileType, it) }
delete = { bridgeClient.deleteFile(fileType) }
}
class BridgeClient(
private val context: ModContext
): ServiceConnection {
@ -125,39 +114,6 @@ class BridgeClient(
}
}
//TODO: use interfaces instead of direct file access
fun createAndReadFile(
fileType: BridgeFileType,
defaultContent: ByteArray
): ByteArray = safeServiceCall {
service.fileOperation(FileActionType.CREATE_AND_READ.ordinal, fileType.value, defaultContent)
}
fun readFile(fileType: BridgeFileType): ByteArray = safeServiceCall { service.fileOperation(FileActionType.READ.ordinal, fileType.value, null) }
fun writeFile(
fileType: BridgeFileType,
content: ByteArray?
): ByteArray = safeServiceCall {
service.fileOperation(FileActionType.WRITE.ordinal, fileType.value, content)
}
fun deleteFile(fileType: BridgeFileType) {
safeServiceCall {
service.fileOperation(FileActionType.DELETE.ordinal, fileType.value, null)
}
}
fun isFileExists(fileType: BridgeFileType) = safeServiceCall {
service.fileOperation(FileActionType.EXISTS.ordinal, fileType.value, null).isNotEmpty()
}
fun fetchLocales(userLocale: String) = safeServiceCall {
service.fetchLocales(userLocale).map {
LocalePair(it.key, it.value)
}
}
fun getApplicationApkPath(): String = safeServiceCall { service.applicationApkPath }
fun enqueueDownload(intent: Intent, callback: DownloadCallback) = safeServiceCall {
@ -215,6 +171,8 @@ class BridgeClient(
fun getAccountStorage(): AccountStorage = safeServiceCall { service.accountStorage }
fun getFileHandlerManager(): FileHandleManager = safeServiceCall { service.fileHandleManager }
fun registerMessagingBridge(bridge: MessagingBridge) = safeServiceCall { service.registerMessagingBridge(bridge) }
fun openSettingsOverlay() = safeServiceCall { service.openSettingsOverlay() }

View File

@ -1,32 +1,38 @@
package me.rhunk.snapenhance.core.features
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.bridge.FileHandleScope
import me.rhunk.snapenhance.common.bridge.InternalFileHandleType
import me.rhunk.snapenhance.common.bridge.toWrapper
import java.io.BufferedReader
import java.io.ByteArrayInputStream
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
abstract class BridgeFileFeature(name: String, private val bridgeFileType: BridgeFileType, loadParams: Int) : Feature(name, loadParams) {
abstract class BridgeFileFeature(name: String, private val bridgeFileType: InternalFileHandleType, loadParams: Int) : Feature(name, loadParams) {
private val fileLines = mutableListOf<String>()
private val fileWrapper by lazy { context.bridgeClient.getFileHandlerManager().getFileHandle(FileHandleScope.INTERNAL.key, bridgeFileType.key)!!.toWrapper() }
protected fun readFile() {
val temporaryLines = mutableListOf<String>()
val fileData: ByteArray = context.bridgeClient.createAndReadFile(bridgeFileType, ByteArray(0))
with(BufferedReader(InputStreamReader(ByteArrayInputStream(fileData), StandardCharsets.UTF_8))) {
var line = ""
while (readLine()?.also { line = it } != null) temporaryLines.add(line)
close()
fileWrapper.inputStream { stream ->
with(BufferedReader(InputStreamReader(stream, StandardCharsets.UTF_8))) {
var line = ""
while (readLine()?.also { line = it } != null) temporaryLines.add(line)
close()
}
}
fileLines.clear()
fileLines.addAll(temporaryLines)
}
private fun updateFile() {
val sb = StringBuilder()
fileLines.forEach {
sb.append(it).append("\n")
fileWrapper.outputStream { stream ->
fileLines.forEach {
stream.write(it.toByteArray())
stream.write("\n".toByteArray())
stream.flush()
}
}
context.bridgeClient.writeFile(bridgeFileType, sb.toString().toByteArray(Charsets.UTF_8))
}
protected fun exists(line: String) = fileLines.contains(line)

View File

@ -7,7 +7,7 @@ import com.google.gson.JsonObject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.bridge.InternalFileHandleType
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
import me.rhunk.snapenhance.core.event.events.impl.NetworkApiRequestEvent
import me.rhunk.snapenhance.core.event.events.impl.UnaryCallEvent
@ -18,7 +18,7 @@ import java.io.InputStreamReader
import java.nio.ByteBuffer
import java.util.UUID
class BestFriendPinning: BridgeFileFeature("Best Friend Pinning", BridgeFileType.PINNED_BEST_FRIEND, loadParams = FeatureLoadParams.INIT_SYNC) {
class BestFriendPinning: BridgeFileFeature("Best Friend Pinning", InternalFileHandleType.PINNED_BEST_FRIEND, loadParams = FeatureLoadParams.INIT_SYNC) {
private fun updatePinnedBestFriendStatus() {
lines().firstOrNull()?.trim()?.let {
context.database.updatePinnedBestFriendStatus(it.substring(0, 36), "number_one_bf_for_two_months")

View File

@ -2,7 +2,7 @@ package me.rhunk.snapenhance.core.features.impl.global
import android.view.ViewGroup
import android.widget.Switch
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.bridge.InternalFileHandleType
import me.rhunk.snapenhance.core.event.events.impl.LayoutInflateEvent
import me.rhunk.snapenhance.core.features.BridgeFileFeature
import me.rhunk.snapenhance.core.features.FeatureLoadParams
@ -12,7 +12,7 @@ import me.rhunk.snapenhance.core.util.ktx.getLayoutId
class SuspendLocationUpdates : BridgeFileFeature(
"Suspend Location Updates",
loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC, bridgeFileType = BridgeFileType.SUSPEND_LOCATION_STATE) {
loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC, bridgeFileType = InternalFileHandleType.SUSPEND_LOCATION_STATE) {
fun isSuspended() = exists("true")
private fun setSuspended(suspended: Boolean) = setState("true", suspended)