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.IBinder
import android.os.Message import android.os.Message
import android.os.Messenger import android.os.Messenger
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.suspendCancellableCoroutine
import me.rhunk.snapenhance.BuildConfig import me.rhunk.snapenhance.BuildConfig
import me.rhunk.snapenhance.Logger.xposedLog import me.rhunk.snapenhance.Logger.xposedLog
import me.rhunk.snapenhance.bridge.AbstractBridgeClient 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 me.rhunk.snapenhance.bridge.service.BridgeService
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import java.util.concurrent.Executors 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.reflect.KClass
import kotlin.system.exitProcess import kotlin.system.exitProcess
class ServiceBridgeClient: AbstractBridgeClient(), ServiceConnection { class ServiceBridgeClient: AbstractBridgeClient(), ServiceConnection {
private val handlerThread = HandlerThread("BridgeClient") private val handlerThread = HandlerThread("BridgeClient")
private val lock = ReentrantLock()
private lateinit var messenger: Messenger private lateinit var messenger: Messenger
private lateinit var future: CompletableFuture<Boolean> private lateinit var future: CompletableFuture<Boolean>
@ -83,33 +84,31 @@ class ServiceBridgeClient: AbstractBridgeClient(), ServiceConnection {
@Suppress("UNCHECKED_CAST", "UNUSED_PARAMETER") @Suppress("UNCHECKED_CAST", "UNUSED_PARAMETER")
private fun <T : BridgeMessage> sendMessage( private fun <T : BridgeMessage> sendMessage(
messageType: BridgeMessageType, messageType: BridgeMessageType,
message: BridgeMessage, bridgeMessage: BridgeMessage,
resultType: KClass<T>? = null resultType: KClass<T>? = null
) = runBlocking { ): T {
suspendCancellableCoroutine { cancelableContinuation -> val response = AtomicReference<BridgeMessage>()
val replyMessenger = Messenger(object : Handler(handlerThread.looper) { val condition = lock.newCondition()
with(Message.obtain()) {
what = messageType.value
replyTo = Messenger(object : Handler(handlerThread.looper) {
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
if (cancelableContinuation.isCancelled) return response.set(handleResponseMessage(msg))
runCatching { lock.withLock {
cancelableContinuation.resume(handleResponseMessage(msg) as T) condition.signal()
}.onFailure {
cancelableContinuation.cancel(it)
} }
} }
}) })
data = Bundle()
runCatching { bridgeMessage.write(data)
with(Message.obtain()) { messenger.send(this)
what = messageType.value
replyTo = replyMessenger
data = Bundle()
message.write(data)
messenger.send(this)
}
}.onFailure {
cancelableContinuation.cancel(it)
}
} }
lock.withLock {
condition.awaitUninterruptibly()
}
return response.get() as T
} }
override fun createAndReadFile( 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.Mapper
import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper
import me.rhunk.snapenhance.mapping.impl.CallbackMapper 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.DefaultMediaItemMapper
import me.rhunk.snapenhance.mapping.impl.EnumMapper
import me.rhunk.snapenhance.mapping.impl.OperaPageViewControllerMapper import me.rhunk.snapenhance.mapping.impl.OperaPageViewControllerMapper
import me.rhunk.snapenhance.mapping.impl.PlatformAnalyticsCreatorMapper import me.rhunk.snapenhance.mapping.impl.PlatformAnalyticsCreatorMapper
import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper 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 me.rhunk.snapenhance.util.getObjectField
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import kotlin.concurrent.thread
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
class MappingManager(private val context: ModContext) : Manager { class MappingManager(private val context: ModContext) : Manager {

View File

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