Files
amnezia-client/client/android/src/org/amnezia/vpn/IpcMessage.kt
T
albexk abb3c918e3 Android notification and routing (#797)
Android notification and routing
2024-05-12 16:04:14 +01:00

47 lines
1.3 KiB
Kotlin

package org.amnezia.vpn
import android.os.Bundle
import android.os.Message
import kotlin.enums.enumEntries
sealed interface IpcMessage {
companion object {
@OptIn(ExperimentalStdlibApi::class)
inline fun <reified T> extractFromMessage(msg: Message): T
where T : Enum<T>,
T : IpcMessage {
val values = enumEntries<T>()
if (msg.what !in values.indices) {
throw IllegalArgumentException("IPC action or event not found for the message: $msg")
}
return values[msg.what]
}
}
}
enum class ServiceEvent : IpcMessage {
STATUS_CHANGED,
STATUS,
STATISTICS_UPDATE,
ERROR
}
enum class Action : IpcMessage {
REGISTER_CLIENT,
UNREGISTER_CLIENT,
CONNECT,
DISCONNECT,
REQUEST_STATUS,
NOTIFICATION_PERMISSION_GRANTED,
SET_SAVE_LOGS
}
fun <T> T.packToMessage(): Message
where T : Enum<T>, T : IpcMessage = Message.obtain().also { it.what = ordinal }
fun <T> T.packToMessage(block: Bundle.() -> Unit): Message
where T : Enum<T>, T : IpcMessage = packToMessage().also { it.data = Bundle().apply(block) }
inline fun <reified T> Message.extractIpcMessage(): T
where T : Enum<T>, T : IpcMessage = IpcMessage.extractFromMessage<T>(this)