commit fd3e7e416e216cb41f0870c85a8d492523cba192
parent 8caf2b6d90a746ade4ea6ad73f542a70184565e2
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sat, 10 Jun 2023 12:24:23 +0200

pref: bridge client

Diffstat:
Mapp/src/main/kotlin/me/rhunk/snapenhance/bridge/client/ServiceBridgeClient.kt | 45++++++++++++++++++++++-----------------------
Mapp/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt | 3+--
Mapp/src/main/kotlin/me/rhunk/snapenhance/manager/impl/TranslationManager.kt | 2+-
3 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/bridge/client/ServiceBridgeClient.kt b/app/src/main/kotlin/me/rhunk/snapenhance/bridge/client/ServiceBridgeClient.kt @@ -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() } } }) + data = Bundle() + bridgeMessage.write(data) + messenger.send(this) + } - runCatching { - with(Message.obtain()) { - 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( diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt @@ -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 { diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/TranslationManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/TranslationManager.kt @@ -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