aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt')
-rw-r--r--ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt114
1 files changed, 114 insertions, 0 deletions
diff --git a/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt b/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt
new file mode 100644
index 00000000..838ad7f9
--- /dev/null
+++ b/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.wireguard.android.model
+
+import androidx.databinding.BaseObservable
+import androidx.databinding.Bindable
+import com.wireguard.android.BR
+import com.wireguard.android.backend.Statistics
+import com.wireguard.android.backend.Tunnel
+import com.wireguard.android.util.ExceptionLoggers
+import com.wireguard.config.Config
+import com.wireguard.util.Keyed
+import java9.util.concurrent.CompletableFuture
+import java9.util.concurrent.CompletionStage
+
+/**
+ * Encapsulates the volatile and nonvolatile state of a WireGuard tunnel.
+ */
+class ObservableTunnel internal constructor(
+ private val manager: TunnelManager,
+ private var name: String,
+ config: Config?,
+ state: Tunnel.State
+) : BaseObservable(), Keyed<String>, Tunnel {
+ override fun getKey() = name
+
+
+ @Bindable
+ override fun getName() = name
+
+ fun setNameAsync(name: String): CompletionStage<String> = if (name != this.name)
+ manager.setTunnelName(this, name)
+ else
+ CompletableFuture.completedFuture(this.name)
+
+ fun onNameChanged(name: String): String {
+ this.name = name
+ notifyPropertyChanged(BR.name)
+ return name
+ }
+
+
+ @get:Bindable
+ var state = state
+ private set
+
+ override fun onStateChange(newState: Tunnel.State) {
+ onStateChanged(newState)
+ }
+
+ fun onStateChanged(state: Tunnel.State): Tunnel.State {
+ if (state != Tunnel.State.UP) onStatisticsChanged(null)
+ this.state = state
+ notifyPropertyChanged(BR.state)
+ return state
+ }
+
+ fun setStateAsync(state: Tunnel.State): CompletionStage<Tunnel.State> = if (state != this.state)
+ manager.setTunnelState(this, state)
+ else
+ CompletableFuture.completedFuture(this.state)
+
+
+ @get:Bindable
+ var config = config
+ get() {
+ if (config == null)
+ manager.getTunnelConfig(this).whenComplete(ExceptionLoggers.E)
+ return config
+ }
+ private set
+
+ val configAsync: CompletionStage<Config> = if (config == null)
+ manager.getTunnelConfig(this)
+ else
+ CompletableFuture.completedFuture(config)
+
+ fun setConfigAsync(config: Config): CompletionStage<Config?> = if (config != this.config)
+ manager.setTunnelConfig(this, config)
+ else
+ CompletableFuture.completedFuture(this.config)
+
+ fun onConfigChanged(config: Config?): Config? {
+ this.config = config
+ notifyPropertyChanged(BR.config)
+ return config
+ }
+
+
+ @get:Bindable
+ var statistics: Statistics? = null
+ get() {
+ if (field == null || field!!.isStale)
+ TunnelManager.getTunnelStatistics(this).whenComplete(ExceptionLoggers.E)
+ return field
+ }
+ private set
+
+ val statisticsAsync: CompletionStage<Statistics> = if (statistics == null || statistics!!.isStale)
+ TunnelManager.getTunnelStatistics(this)
+ else
+ CompletableFuture.completedFuture(statistics)
+
+ fun onStatisticsChanged(statistics: Statistics?): Statistics? {
+ this.statistics = statistics
+ notifyPropertyChanged(BR.statistics)
+ return statistics
+ }
+
+
+ fun delete(): CompletionStage<Void> = manager.delete(this)
+}