mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-12 13:17:42 +02:00
refactor: file handle manager
This commit is contained in:
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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() }
|
||||
|
@ -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)
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user