pref: bridge client

This commit is contained in:
rhunk 2023-06-10 12:24:23 +02:00
parent 8caf2b6d90
commit fd3e7e416e
3 changed files with 25 additions and 27 deletions

View File

@ -13,8 +13,6 @@ import android.os.HandlerThread
import android.os.IBinder
import android.os.Message
import android.os.Messenger
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.suspendCancellableCoroutine
import me.rhunk.snapenhance.BuildConfig
import me.rhunk.snapenhance.Logger.xposedLog
import me.rhunk.snapenhance.bridge.AbstractBridgeClient
@ -33,13 +31,16 @@ import me.rhunk.snapenhance.bridge.common.impl.messagelogger.MessageLoggerResult
import me.rhunk.snapenhance.bridge.service.BridgeService
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Executors
import kotlin.coroutines.resume
import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
import kotlin.reflect.KClass
import kotlin.system.exitProcess
class ServiceBridgeClient: AbstractBridgeClient(), ServiceConnection {
private val handlerThread = HandlerThread("BridgeClient")
private val lock = ReentrantLock()
private lateinit var messenger: Messenger
private lateinit var future: CompletableFuture<Boolean>
@ -83,33 +84,31 @@ class ServiceBridgeClient: AbstractBridgeClient(), ServiceConnection {
@Suppress("UNCHECKED_CAST", "UNUSED_PARAMETER")
private fun <T : BridgeMessage> sendMessage(
messageType: BridgeMessageType,
message: BridgeMessage,
bridgeMessage: BridgeMessage,
resultType: KClass<T>? = null
) = runBlocking {
suspendCancellableCoroutine { cancelableContinuation ->
val replyMessenger = Messenger(object : Handler(handlerThread.looper) {
): T {
val response = AtomicReference<BridgeMessage>()
val condition = lock.newCondition()
with(Message.obtain()) {
what = messageType.value
replyTo = Messenger(object : Handler(handlerThread.looper) {
override fun handleMessage(msg: Message) {
if (cancelableContinuation.isCancelled) return
runCatching {
cancelableContinuation.resume(handleResponseMessage(msg) as T)
}.onFailure {
cancelableContinuation.cancel(it)
response.set(handleResponseMessage(msg))
lock.withLock {
condition.signal()
}
}
})
runCatching {
with(Message.obtain()) {
what = messageType.value
replyTo = replyMessenger
data = Bundle()
message.write(data)
messenger.send(this)
}
}.onFailure {
cancelableContinuation.cancel(it)
}
data = Bundle()
bridgeMessage.write(data)
messenger.send(this)
}
lock.withLock {
condition.awaitUninterruptibly()
}
return response.get() as T
}
override fun createAndReadFile(

View File

@ -16,8 +16,8 @@ import me.rhunk.snapenhance.manager.Manager
import me.rhunk.snapenhance.mapping.Mapper
import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper
import me.rhunk.snapenhance.mapping.impl.CallbackMapper
import me.rhunk.snapenhance.mapping.impl.EnumMapper
import me.rhunk.snapenhance.mapping.impl.DefaultMediaItemMapper
import me.rhunk.snapenhance.mapping.impl.EnumMapper
import me.rhunk.snapenhance.mapping.impl.OperaPageViewControllerMapper
import me.rhunk.snapenhance.mapping.impl.PlatformAnalyticsCreatorMapper
import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper
@ -26,7 +26,6 @@ import me.rhunk.snapenhance.mapping.impl.StoryBoostStateMapper
import me.rhunk.snapenhance.util.getObjectField
import java.nio.charset.StandardCharsets
import java.util.concurrent.ConcurrentHashMap
import kotlin.concurrent.thread
@Suppress("UNCHECKED_CAST")
class MappingManager(private val context: ModContext) : Manager {

View File

@ -14,7 +14,7 @@ class TranslationManager(
lateinit var locale: Locale
override fun init() {
val messageLocaleResult = context.bridgeClient.fetchTranslations();
val messageLocaleResult = context.bridgeClient.fetchTranslations()
locale = messageLocaleResult.locale?.split("_")?.let { Locale(it[0], it[1]) } ?: Locale.getDefault()
val translations = JsonParser.parseString(messageLocaleResult.content?.toString(Charsets.UTF_8)).asJsonObject