/* * 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.android.databinding.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, Tunnel { override val key = name @Bindable override fun getName() = name fun setNameAsync(name: String): CompletionStage = 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 = if (state != this.state) manager.setTunnelState(this, state) else CompletableFuture.completedFuture(this.state) @get:Bindable var config = config get() { if (field == null) manager.getTunnelConfig(this).whenComplete(ExceptionLoggers.E) return field } private set val configAsync: CompletionStage = if (config == null) manager.getTunnelConfig(this) else CompletableFuture.completedFuture(config) fun setConfigAsync(config: Config): CompletionStage = 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) manager.getTunnelStatistics(this).whenComplete(ExceptionLoggers.E) return field } private set val statisticsAsync: CompletionStage = if (statistics == null || statistics!!.isStale) manager.getTunnelStatistics(this) else CompletableFuture.completedFuture(statistics) fun onStatisticsChanged(statistics: Statistics?): Statistics? { this.statistics = statistics notifyPropertyChanged(BR.statistics) return statistics } fun delete(): CompletionStage = manager.delete(this) }