diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-12-04 21:56:39 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-02-15 18:47:22 +0000 |
| commit | 377def40946c239beae7246184f1e04d0ebe35da (patch) | |
| tree | dcae02400c96ddb85bd81bfbc3bb34c89ebe693a /android/src | |
| parent | bd025c240900012d05eeedc6f04581a021212922 (diff) | |
| download | mullvadvpn-377def40946c239beae7246184f1e04d0ebe35da.tar.xz mullvadvpn-377def40946c239beae7246184f1e04d0ebe35da.zip | |
Create `DispatchingHandler` helper class
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/DispatchingHandler.kt | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/DispatchingHandler.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/DispatchingHandler.kt new file mode 100644 index 0000000000..0f3820ff48 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/DispatchingHandler.kt @@ -0,0 +1,48 @@ +package net.mullvad.mullvadvpn.ipc + +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.util.Log +import java.util.concurrent.locks.ReentrantReadWriteLock +import kotlin.concurrent.withLock +import kotlin.reflect.KClass + +class DispatchingHandler<T : Any>( + looper: Looper, + private val extractor: (Message) -> T? +) : Handler(looper) { + private val handlers = HashMap<KClass<out T>, (T) -> Unit>() + private val lock = ReentrantReadWriteLock() + + fun <V : T> registerHandler(variant: KClass<V>, handler: (V) -> Unit) { + lock.writeLock().withLock { + handlers.put(variant) { instance -> + @Suppress("UNCHECKED_CAST") + handler(instance as V) + } + } + } + + override fun handleMessage(message: Message) { + lock.readLock().withLock { + val instance = extractor(message) + + if (instance != null) { + val handler = handlers.get(instance::class) + + handler?.invoke(instance) + } else { + Log.e("mullvad", "Dispatching handler received an unexpected message") + } + } + } + + fun onDestroy() { + lock.writeLock().withLock { + handlers.clear() + } + + removeCallbacksAndMessages(null) + } +} |
