summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-01-15 21:20:40 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-04-22 19:16:13 +0000
commit17c4882d8b88c703bcbb3154de0319d6168f5050 (patch)
tree62510ec45771324ab07eb0966c8f15c8037411f2 /android/src
parent93f3f17df9ed2bfd0c67aaf796dfd79901d01241 (diff)
downloadmullvadvpn-17c4882d8b88c703bcbb3154de0319d6168f5050.tar.xz
mullvadvpn-17c4882d8b88c703bcbb3154de0319d6168f5050.zip
Create UI side `VoucherRedeemer`
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VoucherRedeemer.kt43
1 files changed, 43 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VoucherRedeemer.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VoucherRedeemer.kt
new file mode 100644
index 0000000000..d2378100ea
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VoucherRedeemer.kt
@@ -0,0 +1,43 @@
+package net.mullvad.mullvadvpn.ui.serviceconnection
+
+import android.os.Messenger
+import kotlinx.coroutines.CompletableDeferred
+import net.mullvad.mullvadvpn.ipc.Event
+import net.mullvad.mullvadvpn.ipc.MessageDispatcher
+import net.mullvad.mullvadvpn.ipc.Request
+import net.mullvad.mullvadvpn.model.VoucherSubmissionResult
+
+class VoucherRedeemer(val connection: Messenger, eventDispatcher: MessageDispatcher<Event>) {
+ private val activeSubmissions =
+ mutableMapOf<String, CompletableDeferred<VoucherSubmissionResult>>()
+
+ init {
+ eventDispatcher.registerHandler(Event.VoucherSubmissionResult::class) { event ->
+ synchronized(this@VoucherRedeemer) {
+ activeSubmissions.remove(event.voucher)?.complete(event.result)
+ }
+ }
+ }
+
+ suspend fun submit(voucher: String): VoucherSubmissionResult {
+ val result = CompletableDeferred<VoucherSubmissionResult>()
+
+ synchronized(this) {
+ activeSubmissions.put(voucher, result)
+ }
+
+ connection.send(Request.SubmitVoucher(voucher).message)
+
+ return result.await()
+ }
+
+ fun onDestroy() {
+ synchronized(this) {
+ for ((_, submission) in activeSubmissions) {
+ submission.cancel()
+ }
+
+ activeSubmissions.clear()
+ }
+ }
+}