Add IpcMessenger class

This commit is contained in:
albexk 2023-11-24 17:10:08 +03:00
parent 0ba5d754d5
commit ad5ea1ca44
2 changed files with 54 additions and 37 deletions

View file

@ -0,0 +1,42 @@
package org.amnezia.vpn
import android.os.DeadObjectException
import android.os.Message
import android.os.Messenger
import android.os.RemoteException
private const val TAG = "IpcMessenger"
class IpcMessenger(
private val onDeadObjectException: () -> Unit = {},
private val onRemoteException: () -> Unit = {},
private val messengerName: String = "Unknown"
) {
private var messenger: Messenger? = null
fun set(messenger: Messenger) {
this.messenger = messenger
}
fun reset() {
messenger = null
}
fun send(msg: () -> Message) = messenger?.sendMsg(msg())
fun <T> send(msg: T)
where T : Enum<T>, T : IpcMessage = messenger?.sendMsg(msg.packToMessage())
private fun Messenger.sendMsg(msg: Message) {
try {
send(msg)
} catch (e: DeadObjectException) {
Log.w(TAG, "$messengerName messenger is dead")
messenger = null
onDeadObjectException()
} catch (e: RemoteException) {
Log.w(TAG, "Sending a message to the $messengerName messenger failed: ${e.message}")
onRemoteException()
}
}
}