summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMikael Magnusson <mikma@users.sourceforge.net>2021-03-15 22:39:56 +0000
committerMikael Magnusson <mikma@users.sourceforge.net>2023-02-07 22:43:23 +0100
commit279e9297b9700c6db9cef22d86755f5f8337ad35 (patch)
tree3ef226c1c23c9e37ea2918c7a110098d517de443
parent421bae85375dbef7fb64759eae22134d3c42a1fe (diff)
WIP: add dhcp information to detail
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/Backend.java2
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/DhcpInfo.java57
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java11
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/WgQuickBackend.java6
-rw-r--r--ui/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.kt4
-rw-r--r--ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt30
-rw-r--r--ui/src/main/java/com/wireguard/android/model/TunnelManager.kt5
-rw-r--r--ui/src/main/res/layout/tunnel_detail_fragment.xml32
-rw-r--r--ui/src/main/res/values/strings.xml2
9 files changed, 147 insertions, 2 deletions
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/Backend.java b/tunnel/src/main/java/com/wireguard/android/backend/Backend.java
index 5aaad826..1d9be593 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/Backend.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/Backend.java
@@ -18,6 +18,8 @@ import androidx.annotation.Nullable;
@NonNullForAll
public interface Backend {
+ DhcpInfo getDhcpInfo(Tunnel tunnel) throws Exception;
+
/**
* Enumerate names of currently-running tunnels.
*
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/DhcpInfo.java b/tunnel/src/main/java/com/wireguard/android/backend/DhcpInfo.java
new file mode 100644
index 00000000..35a7dd43
--- /dev/null
+++ b/tunnel/src/main/java/com/wireguard/android/backend/DhcpInfo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2020 WireGuard LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.wireguard.android.backend;
+
+import android.os.SystemClock;
+import android.util.Pair;
+
+import com.wireguard.crypto.Key;
+import com.wireguard.util.NonNullForAll;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Class representing DHCP info for a {@link Tunnel} instance.
+ */
+@NonNullForAll
+public class DhcpInfo {
+ private String info;
+ private long lastTouched = SystemClock.elapsedRealtime();
+
+ DhcpInfo() {
+ }
+
+ /**
+ * Add a peer and its current data usage to the internal map.
+ *
+ * @param key A WireGuard public key bound to a particular peer
+ * @param rx The received traffic for the {@link com.wireguard.config.Peer} referenced by
+ * the provided {@link Key}. This value is in bytes
+ * @param tx The transmitted traffic for the {@link com.wireguard.config.Peer} referenced by
+ * the provided {@link Key}. This value is in bytes.
+ */
+ void set(final String info) {
+ this.info = info;
+ lastTouched = SystemClock.elapsedRealtime();
+ }
+
+ /**
+ * Check if the statistics are stale, indicating the need for the {@link Backend} to update them.
+ *
+ * @return boolean indicating if the current statistics instance has stale values.
+ */
+ public boolean isStale() {
+ return SystemClock.elapsedRealtime() - lastTouched > 900;
+ }
+
+ /**
+ */
+ public String get() {
+ return info;
+ }
+
+}
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
index f077189a..fdbf0e9c 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
@@ -88,6 +88,17 @@ public final class GoBackend implements Backend, EventHandler {
private static native String wgVersion();
+ @Override
+ public DhcpInfo getDhcpInfo(final Tunnel tunnel) {
+ final DhcpInfo info = new DhcpInfo();
+ if (tunnel != currentTunnel) {
+ return info;
+ }
+ // TODO update info
+ info.set("FIXME");
+ return info;
+ }
+
/**
* Method to get the names of running tunnels.
*
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/WgQuickBackend.java b/tunnel/src/main/java/com/wireguard/android/backend/WgQuickBackend.java
index 3121c996..9c9dfbc1 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/WgQuickBackend.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/WgQuickBackend.java
@@ -58,6 +58,12 @@ public final class WgQuickBackend implements Backend {
}
@Override
+ public DhcpInfo getDhcpInfo(final Tunnel tunnel) {
+ final DhcpInfo info = new DhcpInfo();
+ return info;
+ }
+
+ @Override
public Set<String> getRunningTunnelNames() {
final List<String> output = new ArrayList<>();
// Don't throw an exception here or nothing will show up in the UI.
diff --git a/ui/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.kt b/ui/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.kt
index 7046cb96..1f0eca5d 100644
--- a/ui/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.kt
+++ b/ui/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.kt
@@ -100,6 +100,10 @@ class TunnelDetailFragment : BaseFragment() {
if (state != Tunnel.State.UP && lastState == state) return
lastState = state
try {
+ binding.dhcpInfoText.text = tunnel.getDhcpInfo().get()
+ binding.dhcpInfoLabel.visibility = View.VISIBLE
+ binding.dhcpInfoText.visibility = View.VISIBLE
+
val statistics = tunnel.getStatisticsAsync()
for (i in 0 until binding.peersLayout.childCount) {
val peer: TunnelDetailPeerBinding = DataBindingUtil.getBinding(binding.peersLayout.getChildAt(i))
diff --git a/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt b/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt
index 252e8759..edf8feaf 100644
--- a/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt
+++ b/ui/src/main/java/com/wireguard/android/model/ObservableTunnel.kt
@@ -8,6 +8,7 @@ import android.util.Log
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import com.wireguard.android.BR
+import com.wireguard.android.backend.DhcpInfo
import com.wireguard.android.backend.Statistics
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.databinding.Keyed
@@ -136,6 +137,35 @@ class ObservableTunnel internal constructor(
return statistics
}
+ @get:Bindable
+ var dhcpInfo: DhcpInfo? = null
+ get() {
+ if (field == null || field?.isStale != false)
+ applicationScope.launch {
+ try {
+ manager.getTunnelDhcpInfo(this@ObservableTunnel)
+ } catch (e: Throwable) {
+ Log.e(TAG, Log.getStackTraceString(e))
+ }
+ }
+ return field
+ }
+ private set
+
+ suspend fun getDhcpInfo(): DhcpInfo = withContext(Dispatchers.Main.immediate) {
+ dhcpInfo.let {
+ if (it == null || it.isStale)
+ manager.getTunnelDhcpInfo(this@ObservableTunnel)
+ else
+ it
+ }
+ }
+
+ fun onDhcpInfoChanged(dhcpInfo: DhcpInfo?): DhcpInfo? {
+ this.dhcpInfo = dhcpInfo
+ notifyPropertyChanged(BR.dhcpInfo)
+ return dhcpInfo
+ }
suspend fun deleteAsync() = manager.delete(this)
diff --git a/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt b/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt
index ec796164..ac39ac4a 100644
--- a/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt
+++ b/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt
@@ -17,6 +17,7 @@ import com.wireguard.android.Application.Companion.getBackend
import com.wireguard.android.Application.Companion.getTunnelManager
import com.wireguard.android.BR
import com.wireguard.android.R
+import com.wireguard.android.backend.DhcpInfo
import com.wireguard.android.backend.Statistics
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.configStore.ConfigStore
@@ -240,6 +241,10 @@ class TunnelManager(private val configStore: ConfigStore) : BaseObservable() {
}
}
+ suspend fun getTunnelDhcpInfo(tunnel: ObservableTunnel): DhcpInfo = withContext(Dispatchers.Main.immediate) {
+ tunnel.onDhcpInfoChanged(withContext(Dispatchers.IO) { getBackend().getDhcpInfo(tunnel) })!!
+ }
+
suspend fun getTunnelState(tunnel: ObservableTunnel): Tunnel.State = withContext(Dispatchers.Main.immediate) {
tunnel.onStateChanged(withContext(Dispatchers.IO) { getBackend().getState(tunnel) })
}
diff --git a/ui/src/main/res/layout/tunnel_detail_fragment.xml b/ui/src/main/res/layout/tunnel_detail_fragment.xml
index 164fabf0..b8ffd8c5 100644
--- a/ui/src/main/res/layout/tunnel_detail_fragment.xml
+++ b/ui/src/main/res/layout/tunnel_detail_fragment.xml
@@ -293,14 +293,42 @@
android:layout_height="wrap_content"
android:contentDescription="@string/applications"
android:nextFocusUp="@id/mtu_text"
- android:nextFocusDown="@id/peers_layout"
- android:nextFocusForward="@id/peers_layout"
+ android:nextFocusDown="@id/dhcp_info_text"
+ android:nextFocusForward="@id/dhcp_info_text"
android:onClick="@{ClipboardUtils::copyTextView}"
android:text="@{config.interface.includedApplications.isEmpty() ? @plurals/n_excluded_applications(config.interface.excludedApplications.size(), config.interface.excludedApplications.size()) : @plurals/n_included_applications(config.interface.includedApplications.size(), config.interface.includedApplications.size())}"
android:visibility="@{config.interface.includedApplications.isEmpty() &amp;&amp; config.interface.excludedApplications.isEmpty() ? android.view.View.GONE : android.view.View.VISIBLE}"
app:layout_constraintTop_toBottomOf="@+id/applications_label"
app:layout_constraintStart_toStartOf="parent"
tools:text="8 excluded" />
+
+ <TextView
+ android:id="@+id/dhcp_info_label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:labelFor="@+id/dhcp_info_text"
+ android:text="@string/dhcp_info"
+ android:visibility="gone"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/applications_text" />
+
+ <TextView
+ android:id="@+id/dhcp_info_text"
+ style="@style/DetailText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/dhcp_info"
+ android:nextFocusUp="@id/applications_text"
+ android:nextFocusDown="@id/peers_layout"
+ android:nextFocusForward="@id/peers_layout"
+ android:onClick="@{ClipboardUtils::copyTextView}"
+ android:visibility="gone"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/dhcp_info_label"
+ tools:text="Addresses: 192.0.2.123/24, 2001:db8::123/128"
+ tools:visibility="visible" />
+
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml
index 6c090199..515ef67d 100644
--- a/ui/src/main/res/values/strings.xml
+++ b/ui/src/main/res/values/strings.xml
@@ -237,4 +237,6 @@
<string name="biometric_prompt_private_key_title">Authenticate to view private key</string>
<string name="biometric_auth_error">Authentication failure</string>
<string name="biometric_auth_error_reason">Authentication failure: %s</string>
+ <string name="dhcp_info">DHCP information</string>
+ <string name="dhcp_info_text">Addresses: %s\nIPv6 prefixes: %s\nDNS servers: %s</string>
</resources>