summaryrefslogtreecommitdiffhomepage
path: root/app/src/main/java/com/wireguard/android/model
diff options
context:
space:
mode:
authorSamuel Holland <samuel@sholland.org>2018-01-07 00:24:56 -0600
committerSamuel Holland <samuel@sholland.org>2018-01-07 00:24:56 -0600
commitbe8b6017d504cdc791f9578ea196934e652b1af6 (patch)
tree98c46e87485d5ba3032d77a4e4ee9bec11fd3d1a /app/src/main/java/com/wireguard/android/model
parent5a2f692d7323f3bc7f5b2347fb8490be9057f302 (diff)
Make TunnelManager the point of asynchronicity
Signed-off-by: Samuel Holland <samuel@sholland.org>
Diffstat (limited to 'app/src/main/java/com/wireguard/android/model')
-rw-r--r--app/src/main/java/com/wireguard/android/model/TunnelManager.java58
1 files changed, 35 insertions, 23 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 22bf1190..e802c152 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,14 @@
package com.wireguard.android.model;
import android.content.SharedPreferences;
+import android.support.annotation.NonNull;
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.AsyncWorker;
import com.wireguard.android.util.ExceptionLoggers;
import com.wireguard.android.util.ObservableKeyedList;
import com.wireguard.android.util.ObservableSortedKeyedArrayList;
@@ -38,6 +40,7 @@ public final class TunnelManager {
private static final String KEY_RUNNING_TUNNELS = "enabled_configs";
private static final String TAG = TunnelManager.class.getSimpleName();
+ private final AsyncWorker asyncWorker;
private final Backend backend;
private final ConfigStore configStore;
private final SharedPreferences preferences;
@@ -45,45 +48,55 @@ public final class TunnelManager {
new ObservableSortedKeyedArrayList<>(COMPARATOR);
@Inject
- public TunnelManager(final Backend backend, final ConfigStore configStore,
- final SharedPreferences preferences) {
+ public TunnelManager(final AsyncWorker asyncWorker, final Backend backend,
+ final ConfigStore configStore, final SharedPreferences preferences) {
+ this.asyncWorker = asyncWorker;
this.backend = backend;
this.configStore = configStore;
this.preferences = preferences;
}
- private Tunnel add(final String name, final Config config, final State state) {
+ private Tunnel addToList(final String name, final Config config, final State state) {
final Tunnel tunnel = new Tunnel(this, name, config, state);
tunnels.add(tunnel);
return tunnel;
}
- public CompletionStage<Tunnel> create(final String name, final Config config) {
+ public CompletionStage<Tunnel> create(@NonNull final String name, final Config 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(cfg -> add(name, cfg, State.DOWN));
+ return asyncWorker.supplyAsync(() -> configStore.create(name, config))
+ .thenApply(savedConfig -> addToList(name, savedConfig, State.DOWN));
}
CompletionStage<Void> delete(final Tunnel tunnel) {
- return setTunnelState(tunnel, State.DOWN)
- .thenCompose(x -> configStore.delete(tunnel.getName()))
- .thenAccept(x -> remove(tunnel));
+ return asyncWorker.runAsync(() -> {
+ backend.setState(tunnel, State.DOWN);
+ configStore.delete(tunnel.getName());
+ }).thenAccept(x -> {
+ if (tunnel.getName().equals(preferences.getString(KEY_PRIMARY_TUNNEL, null)))
+ preferences.edit().remove(KEY_PRIMARY_TUNNEL).apply();
+ tunnels.remove(tunnel);
+ });
}
CompletionStage<Config> getTunnelConfig(final Tunnel tunnel) {
- return configStore.load(tunnel.getName()).thenApply(tunnel::onConfigChanged);
+ return asyncWorker.supplyAsync(() -> configStore.load(tunnel.getName()))
+ .thenApply(tunnel::onConfigChanged);
}
CompletionStage<State> getTunnelState(final Tunnel tunnel) {
- return backend.getState(tunnel).thenApply(tunnel::onStateChanged);
+ return asyncWorker.supplyAsync(() -> backend.getState(tunnel))
+ .thenApply(tunnel::onStateChanged);
}
CompletionStage<Statistics> getTunnelStatistics(final Tunnel tunnel) {
- return backend.getStatistics(tunnel).thenApply(tunnel::onStatisticsChanged);
+ return asyncWorker.supplyAsync(() -> backend.getStatistics(tunnel))
+ .thenApply(tunnel::onStatisticsChanged);
}
public ObservableKeyedList<String, Tunnel> getTunnels() {
@@ -91,16 +104,14 @@ public final class TunnelManager {
}
public void onCreate() {
- configStore.enumerate().thenAcceptBoth(backend.enumerate(), (names, running) -> {
- for (final String name : names)
- add(name, null, running.contains(name) ? State.UP : State.DOWN);
- }).whenComplete(ExceptionLoggers.E);
+ asyncWorker.supplyAsync(configStore::enumerate)
+ .thenAcceptBoth(asyncWorker.supplyAsync(backend::enumerate), this::onTunnelsLoaded)
+ .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);
+ private void onTunnelsLoaded(final Set<String> present, final Set<String> running) {
+ for (final String name : present)
+ addToList(name, null, running.contains(name) ? State.UP : State.DOWN);
}
public CompletionStage<Void> restoreState() {
@@ -125,13 +136,14 @@ public final class TunnelManager {
}
CompletionStage<Config> setTunnelConfig(final Tunnel tunnel, final Config config) {
- return backend.applyConfig(tunnel, config)
- .thenCompose(cfg -> configStore.save(tunnel.getName(), cfg))
- .thenApply(tunnel::onConfigChanged);
+ return asyncWorker.supplyAsync(() -> {
+ final Config appliedConfig = backend.applyConfig(tunnel, config);
+ return configStore.save(tunnel.getName(), appliedConfig);
+ }).thenApply(tunnel::onConfigChanged);
}
CompletionStage<State> setTunnelState(final Tunnel tunnel, final State state) {
- return backend.setState(tunnel, state)
+ return asyncWorker.supplyAsync(() -> backend.setState(tunnel, state))
.thenApply(tunnel::onStateChanged);
}
}