aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/app/src/main/java/com/wireguard/android/model/TunnelManager.java
diff options
context:
space:
mode:
authorSamuel Holland <samuel@sholland.org>2018-01-06 06:30:41 -0600
committerSamuel Holland <samuel@sholland.org>2018-01-06 06:30:41 -0600
commit22bdffcecd11cfb14243c65c0c9c8e5f3a50540a (patch)
tree3deacc3e4912e5e5c42a20aa8382442c4e217639 /app/src/main/java/com/wireguard/android/model/TunnelManager.java
parentTunnelManager: Enumerate running tunnels only once (diff)
downloadwireguard-android-22bdffcecd11cfb14243c65c0c9c8e5f3a50540a.tar.xz
wireguard-android-22bdffcecd11cfb14243c65c0c9c8e5f3a50540a.zip
model: Proxy all async work through the TunnelManager
Signed-off-by: Samuel Holland <samuel@sholland.org>
Diffstat (limited to 'app/src/main/java/com/wireguard/android/model/TunnelManager.java')
-rw-r--r--app/src/main/java/com/wireguard/android/model/TunnelManager.java58
1 files changed, 37 insertions, 21 deletions
diff --git a/app/src/main/java/com/wireguard/android/model/TunnelManager.java b/app/src/main/java/com/wireguard/android/model/TunnelManager.java
index 3682cfcd..123f5b51 100644
--- a/app/src/main/java/com/wireguard/android/model/TunnelManager.java
+++ b/app/src/main/java/com/wireguard/android/model/TunnelManager.java
@@ -1,12 +1,12 @@
package com.wireguard.android.model;
import android.content.SharedPreferences;
-import android.util.Log;
import com.wireguard.android.Application.ApplicationScope;
import com.wireguard.android.backend.Backend;
import com.wireguard.android.configStore.ConfigStore;
import com.wireguard.android.model.Tunnel.State;
+import com.wireguard.android.model.Tunnel.Statistics;
import com.wireguard.android.util.ExceptionLoggers;
import com.wireguard.android.util.KeyedObservableList;
import com.wireguard.android.util.SortedKeyedObservableArrayList;
@@ -49,36 +49,37 @@ public final class TunnelManager {
}
private Tunnel add(final String name, final Config config, final State state) {
- final Tunnel tunnel = new Tunnel(backend, configStore, name, config, state);
+ final Tunnel tunnel = new Tunnel(this, name, config, state);
tunnels.add(tunnel);
return tunnel;
}
- private Tunnel add(final String name) {
- return add(name, null, State.UNKNOWN);
- }
-
public CompletionStage<Tunnel> create(final String name, final Config config) {
- Log.v(TAG, "Requested create tunnel " + name + " with config\n" + config);
if (!Tunnel.isNameValid(name))
return CompletableFuture.failedFuture(new IllegalArgumentException("Invalid name"));
if (tunnels.containsKey(name)) {
final String message = "Tunnel " + name + " already exists";
return CompletableFuture.failedFuture(new IllegalArgumentException(message));
}
- return configStore.create(name, config)
- .thenApply(savedConfig -> add(name, savedConfig, State.DOWN));
+ return configStore.create(name, config).thenApply(cfg -> add(name, cfg, State.DOWN));
}
- public CompletionStage<Void> delete(final Tunnel tunnel) {
- Log.v(TAG, "Requested delete tunnel " + tunnel.getName() + " state=" + tunnel.getState());
- return backend.setState(tunnel, State.DOWN)
+ CompletionStage<Void> delete(final Tunnel tunnel) {
+ return setTunnelState(tunnel, State.DOWN)
.thenCompose(x -> configStore.delete(tunnel.getName()))
- .thenAccept(x -> {
- tunnels.remove(tunnel);
- if (tunnel.getName().equals(preferences.getString(KEY_PRIMARY_TUNNEL, null)))
- preferences.edit().remove(KEY_PRIMARY_TUNNEL).apply();
- });
+ .thenAccept(x -> remove(tunnel));
+ }
+
+ CompletionStage<Config> getTunnelConfig(final Tunnel tunnel) {
+ return configStore.load(tunnel.getName()).thenApply(tunnel::onConfigChanged);
+ }
+
+ CompletionStage<State> getTunnelState(final Tunnel tunnel) {
+ return backend.getState(tunnel).thenApply(tunnel::onStateChanged);
+ }
+
+ CompletionStage<Statistics> getTunnelStatistics(final Tunnel tunnel) {
+ return backend.getStatistics(tunnel).thenApply(tunnel::onStatisticsChanged);
}
public KeyedObservableList<String, Tunnel> getTunnels() {
@@ -86,12 +87,16 @@ public final class TunnelManager {
}
public void onCreate() {
- Log.v(TAG, "onCreate triggered");
configStore.enumerate().thenAcceptBoth(backend.enumerate(), (names, running) -> {
- for (final String name : names) {
+ for (final String name : names)
add(name, null, running.contains(name) ? State.UP : State.DOWN);
- }
- }).whenComplete(ExceptionLoggers.D);
+ }).whenComplete(ExceptionLoggers.E);
+ }
+
+ private void remove(final Tunnel tunnel) {
+ if (tunnel.getName().equals(preferences.getString(KEY_PRIMARY_TUNNEL, null)))
+ preferences.edit().remove(KEY_PRIMARY_TUNNEL).apply();
+ tunnels.remove(tunnel);
}
public CompletionStage<Void> restoreState() {
@@ -114,4 +119,15 @@ public final class TunnelManager {
preferences.edit().putStringSet(KEY_RUNNING_TUNNELS, runningTunnels).apply();
return CompletableFuture.completedFuture(null);
}
+
+ CompletionStage<Config> setTunnelConfig(final Tunnel tunnel, final Config config) {
+ return backend.applyConfig(tunnel, config)
+ .thenCompose(cfg -> configStore.save(tunnel.getName(), cfg))
+ .thenApply(tunnel::onConfigChanged);
+ }
+
+ CompletionStage<State> setTunnelState(final Tunnel tunnel, final State state) {
+ return backend.setState(tunnel, state)
+ .thenApply(tunnel::onStateChanged);
+ }
}