Compare commits

..

31 Commits

Author SHA1 Message Date
Jason A. Donenfeld e08d873cc3 version: bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-07-24 09:50:31 +02:00
Jason A. Donenfeld 3748a1da88 AdminKnobs: allow enterprise admins to disable private key export
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-07-23 17:35:47 +02:00
Jason A. Donenfeld 9597d719ac build: bump AGP to 4.0.1
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-07-23 16:04:22 +02:00
Harsh Shandilya 041ce2134f build: upgrade to Gradle 6.5.1
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-10 15:07:54 +05:30
Harsh Shandilya 4c17fc51e7 gitignore: add gradlew.bat
We do not support building on Windows for now and deleting this file on every wrapper update is just lame

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-25 01:36:31 +05:30
Harsh Shandilya 6cf7439053 gradle: upgrade to 6.5
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-25 01:36:30 +05:30
Harsh Shandilya 814ab4937d build: bump core-ktx, coroutines and fragments
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-25 01:30:00 +05:30
David Crawshaw 3d088411e2 libwg-go: use conn.Bind for socketfd peek
Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-06-22 02:24:55 -06:00
Jason A. Donenfeld 39e0c861e2 tools: bump versions
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-06-07 01:58:02 -06:00
Harsh Shandilya d60efcd7c7 strings: sync translations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-02 17:52:01 +05:30
Harsh Shandilya 4dff537d21 ui: address new databinding requirements
Layouts in differing configurations must agree on their root tags, so we give
both copies of main_activity the same root ID, and adjust the check for
two-pane layout to simply test for nullability. This also changes the inset
dispatch code to use ViewCompat and WindowInsetsCompat since they will adjust
insets based on the SDK level allowing us to abstract away that concern.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-29 12:25:52 +05:30
Harsh Shandilya 761c2ade4a build: bump to AGP 4.0.0
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-29 12:05:24 +05:30
Harsh Shandilya 115a87af32 ui: remove unneeded actionBarPopupTheme attribute
This caused inconsistencies between our overflow icon and actionbar title's tint

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 15:49:43 +05:30
Harsh Shandilya c7ecaeb145 build: upgrade to gradle 6.4 and track checksum
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 13:15:57 +05:30
Jason A. Donenfeld 8e2d63db75 tunnel: add windows-style killswitch semantics for GoBackend
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-05-04 02:30:44 -06:00
Harsh Shandilya 3208bac987 build: upgrade to mdc-android 1.2.0-alpha06
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-30 18:21:31 +05:30
Harsh Shandilya fc1f2132fe build: bump gradle wrapper version in task configuration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-27 14:09:37 +05:30
Harsh Shandilya 09125e1e31 libwg-go: bump go version
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-26 04:33:41 +05:30
Harsh Shandilya 6b1164ad8d ui: switch up dark theme system bars colors
The status bar color had a subtle transparency applied which caused
inconsistencies, and the navigation bar color was the wrong shade of
gray.

Reported-by: Danny Lin <danny@kdrag0n.dev>
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-26 04:30:26 +05:30
Harsh Shandilya c68a5c776b build: bump threetenabp to 1.2.4
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 19:32:36 +05:30
Harsh Shandilya f3ac787f5a ToolsInstaller: update Magisk directory
/data/adb/modules has been the location for modules since v18.0 and nobody
should reasonably be on any older version anymore. This has continued to
work for this long because Magisk created symlinks for backwards compat. However,
these symlinks are not created anymore on Android 11, which is where this
problem	first surfaced.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-23 01:40:50 +05:30
Harsh Shandilya 751be2c469 build: don't obfuscate code in minify step
While Play Console correctly manages to deobfuscate stacktraces using the
ProGuard mapping, it makes user recorded logs useless which is rather
undesirable.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-21 21:36:59 +05:30
Harsh Shandilya cfb7f1b016 ui: tweak fab animation duration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 02:17:27 +05:30
Harsh Shandilya 33e07628db build: remove unused cardview dependency
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 02:09:07 +05:30
Harsh Shandilya b1b7d1d90c build: upgrade AGP, Kotlin, and preference
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 02:08:41 +05:30
Harsh Shandilya 6cb9548f72 tunnel: disable LongLogTag lint
Should have been part of the patch that disabled this for ui/

Fixes: 8d128cf2e9 ("ui: disable LongLogTag lint")
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 01:59:51 +05:30
Harsh Shandilya 8207ae1e8d strings: sync translations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 01:48:50 +05:30
Harsh Shandilya 48e0e427eb ui: animate fab scale rather than translation
Suggested-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-16 23:14:35 +05:30
Jason A. Donenfeld 03e95d2dd3 ObservableTunnel: account for race in renulling stats
The stats might become null between these two checks, when a tunnel
flips off, resulting in a null pointer dereference:

at com.wireguard.android.model.ObservableTunnel.getStatisticsAsync (ObservableTunnel.java:103)
at com.wireguard.android.fragment.TunnelDetailFragment.updateStats (TunnelDetailFragment.java:108)
at com.wireguard.android.fragment.TunnelDetailFragment.access$updateStats (TunnelDetailFragment.java:27)
at com.wireguard.android.fragment.TunnelDetailFragment$onResume$1.run (TunnelDetailFragment.java:74)
at java.util.TimerThread.mainLoop (TimerThread.java:562)
at java.util.TimerThread.run (TimerThread.java:512)

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-04-15 01:57:55 -06:00
Harsh Shandilya 58b14cc650 ui: animate fab position in tunnel deletion flow
When tunnel deletion is triggered we don't bother with animation theatrics
because the resulting Snackbar needs this fab to be its anchor, which it can't
do if its outside the screen or busy animating.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-08 19:43:25 +05:30
Harsh Shandilya 3fa8e09545 tunnel: disable BuildConfig generation
We don't (and shouldn't) use BuildConfig values, but the class was
polluting our public API regardless which is undesirable.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-08 17:05:31 +05:30
42 changed files with 598 additions and 108 deletions
+1
View File
@@ -15,3 +15,4 @@ build/
*.iml
*.jks
keystore.properties
gradlew.bat
+10 -10
View File
@@ -8,27 +8,26 @@ allprojects {
buildscript {
ext {
agpVersion = '3.6.2'
agpVersion = '4.0.1'
annotationsVersion = '1.1.0'
appcompatVersion = '1.1.0'
bintrayPluginVersion = '1.8.4'
biometricVersion = '1.0.1'
cardviewVersion = '1.0.0'
collectionVersion = '1.1.0'
constraintLayoutVersion = '1.1.3'
coordinatorLayoutVersion = '1.1.0'
coreKtxVersion = '1.2.0'
coroutinesVersion = '1.3.5'
coreKtxVersion = '1.3.0'
coroutinesVersion = '1.3.7'
eddsaVersion = '0.3.0'
fragmentVersion = '1.2.4'
fragmentVersion = '1.2.5'
jsr305Version = '3.0.2'
junitVersion = '4.13'
kotlinVersion = '1.3.71'
materialComponentsVersion = '1.2.0-alpha05'
kotlinVersion = '1.3.72'
materialComponentsVersion = '1.2.0-alpha06'
mavenPluginVersion = '2.1'
preferenceVersion = '1.1.0'
preferenceVersion = '1.1.1'
streamsupportVersion = '1.7.2'
threetenabpVersion = '1.2.3'
threetenabpVersion = '1.2.4'
zxingEmbeddedVersion = '3.6.0'
groupName = 'com.wireguard.android'
@@ -51,8 +50,9 @@ task clean(type: Delete) {
tasks {
wrapper {
gradleVersion = "6.2.2"
gradleVersion = "6.5.1"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920"
}
}
Binary file not shown.
+2 -1
View File
@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
distributionSha256Sum=143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+2
View File
@@ -82,6 +82,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -129,6 +130,7 @@ fi
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
+6
View File
@@ -21,6 +21,9 @@ android {
path 'tools/CMakeLists.txt'
}
}
libraryVariants.all {
it.generateBuildConfigProvider.configure { enabled = false }
}
testOptions.unitTests.all {
testLogging {
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
@@ -42,6 +45,9 @@ android {
}
}
}
lintOptions {
disable('LongLogTag')
}
}
dependencies {
@@ -9,6 +9,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.system.OsConstants;
import android.util.Log;
import com.wireguard.android.backend.BackendException.Reason;
@@ -202,9 +203,19 @@ public final class GoBackend implements Backend {
for (final InetAddress addr : config.getInterface().getDnsServers())
builder.addDnsServer(addr.getHostAddress());
boolean sawDefaultRoute = false;
for (final Peer peer : config.getPeers()) {
for (final InetNetwork addr : peer.getAllowedIps())
for (final InetNetwork addr : peer.getAllowedIps()) {
if (addr.getMask() == 0)
sawDefaultRoute = true;
builder.addRoute(addr.getAddress(), addr.getMask());
}
}
// "Kill-switch" semantics
if (!(sawDefaultRoute && config.getPeers().size() == 1)) {
builder.allowFamily(OsConstants.AF_INET);
builder.allowFamily(OsConstants.AF_INET6);
}
builder.setMtu(config.getInterface().getMtu().orElse(1280));
@@ -143,12 +143,12 @@ public final class ToolsInstaller {
extract();
final StringBuilder script = new StringBuilder("set -ex; ");
script.append("trap 'rm -rf /sbin/.magisk/img/wireguard' INT TERM EXIT; ");
script.append(String.format("rm -rf /sbin/.magisk/img/wireguard/; mkdir -p /sbin/.magisk/img/wireguard%s; ", INSTALL_DIR));
script.append("printf 'name=WireGuard Command Line Tools\nversion=1.0\nversionCode=1\nauthor=zx2c4\ndescription=Command line tools for WireGuard\nminMagisk=1500\n' > /sbin/.magisk/img/wireguard/module.prop; ");
script.append("touch /sbin/.magisk/img/wireguard/auto_mount; ");
script.append("trap 'rm -rf /data/adb/moduleswireguard' INT TERM EXIT; ");
script.append(String.format("rm -rf /data/adb/modules/wireguard/; mkdir -p /data/adb/modules/wireguard%s; ", INSTALL_DIR));
script.append("printf 'name=WireGuard Command Line Tools\nversion=1.0\nversionCode=1\nauthor=zx2c4\ndescription=Command line tools for WireGuard\nminMagisk=1500\n' > /data/adb/modules/wireguard/module.prop; ");
script.append("touch /data/adb/modules/wireguard/auto_mount; ");
for (final String name : EXECUTABLES) {
final File destination = new File("/sbin/.magisk/img/wireguard" + INSTALL_DIR, name);
final File destination = new File("/data/adb/modules/wireguard" + INSTALL_DIR, name);
script.append(String.format("cp '%s' '%s'; chmod 755 '%s'; chcon 'u:object_r:system_file:s0' '%s' || true; ",
new File(localBinaryDir, name), destination, destination, destination));
}
@@ -191,7 +191,7 @@ public final class ToolsInstaller {
synchronized (lock) {
if (installAsMagiskModule == null) {
try {
installAsMagiskModule = rootShell.run(null, "[ -d /sbin/.magisk/mirror -a -d /sbin/.magisk/img -a ! -f /cache/.disable_magisk ]") == OsConstants.EXIT_SUCCESS;
installAsMagiskModule = rootShell.run(null, "[ -d /data/adb/modules -a ! -f /cache/.disable_magisk ]") == OsConstants.EXIT_SUCCESS;
} catch (final Exception ignored) {
installAsMagiskModule = false;
}
+1 -1
View File
@@ -14,7 +14,7 @@ target_link_libraries(libwg-quick.so -ldl)
file(GLOB WG_SOURCES wireguard-tools/src/*.c ndk-compat/compat.c)
add_executable(libwg.so ${WG_SOURCES})
target_include_directories(libwg.so PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/uapi/" "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/")
target_include_directories(libwg.so PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/uapi/linux/" "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/")
target_compile_options(libwg.so PUBLIC -O3 -std=gnu11 -D_GNU_SOURCE -include ${CMAKE_CURRENT_SOURCE_DIR}/ndk-compat/compat.h -DHAVE_VISIBILITY_HIDDEN -DRUNSTATEDIR=\"/data/data/${ANDROID_PACKAGE_NAME}/cache\")
add_custom_target(libwg-go.so WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libwg-go" COMMENT "Building wireguard-go" VERBATIM COMMAND make
+3 -3
View File
@@ -20,11 +20,11 @@ export GOARCH := $(NDK_GO_ARCH_MAP_$(ANDROID_ARCH_NAME))
export GOOS := android
export CGO_ENABLED := 1
GO_VERSION := 1.14.1
GO_VERSION := 1.14.4
GO_PLATFORM := $(shell uname -s | tr '[:upper:]' '[:lower:]')-$(NDK_GO_ARCH_MAP_$(shell uname -m))
GO_TARBALL := go$(GO_VERSION).$(GO_PLATFORM).tar.gz
GO_HASH_darwin-amd64 := 6632f9d53fd95632e431e8c34295349cca3f0a124e3a28b760ae5c42b32816e3
GO_HASH_linux-amd64 := 2f49eb17ce8b48c680cdb166ffd7389702c0dec6effa090c324804a5cac8a7f8
GO_HASH_darwin-amd64 := 3fa7ed8dc44fdd50c0bfe72676250cceca527d59950aef20af906a670cf88de2
GO_HASH_linux-amd64 := aed845e4185a0b2a3c3d5e1d0a35491702c55889192bb9c30e67a3de6849c067
default: $(DESTDIR)/libwg-go.so
+16 -6
View File
@@ -11,10 +11,6 @@ import "C"
import (
"bufio"
"golang.org/x/sys/unix"
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/ipc"
"golang.zx2c4.com/wireguard/tun"
"bytes"
"log"
"math"
@@ -24,6 +20,12 @@ import (
"runtime"
"strings"
"unsafe"
"golang.org/x/sys/unix"
"golang.zx2c4.com/wireguard/conn"
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/ipc"
"golang.zx2c4.com/wireguard/tun"
)
type AndroidLogger struct {
@@ -149,7 +151,11 @@ func wgGetSocketV4(tunnelHandle int32) int32 {
if !ok {
return -1
}
fd, err := handle.device.PeekLookAtSocketFd4()
bind, _ := handle.device.Bind().(conn.PeekLookAtSocketFd)
if bind == nil {
return -1
}
fd, err := bind.PeekLookAtSocketFd4()
if err != nil {
return -1
}
@@ -162,7 +168,11 @@ func wgGetSocketV6(tunnelHandle int32) int32 {
if !ok {
return -1
}
fd, err := handle.device.PeekLookAtSocketFd6()
bind, _ := handle.device.Bind().(conn.PeekLookAtSocketFd)
if bind == nil {
return -1
}
fd, err := bind.PeekLookAtSocketFd4()
if err != nil {
return -1
}
+5 -5
View File
@@ -1,10 +1,10 @@
module golang.zx2c4.com/wireguard/android
go 1.13
go 1.14
require (
golang.org/x/crypto v0.0.0-20200320181102-891825fb96df // indirect
golang.org/x/net v0.0.0-20200320220750-118fecf932d8 // indirect
golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae
golang.zx2c4.com/wireguard v0.0.20200320
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 // indirect
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980
golang.zx2c4.com/wireguard v0.0.20200321-0.20200622004228-b84f1d4db25e
)
+12 -11
View File
@@ -1,19 +1,20 @@
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200320181102-891825fb96df h1:lDWgvUvNnaTnNBc/dwOty86cFeKoKWbwy2wQj0gIxbU=
golang.org/x/crypto v0.0.0-20200320181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae h1:3tcmuaB7wwSZtelmiv479UjUB+vviwABz7a133ZwOKQ=
golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.zx2c4.com/wireguard v0.0.20200320 h1:1vE6zVeO7fix9cJX1Z9ZQ+ikPIIx7vIyU0o0tLDD88g=
golang.zx2c4.com/wireguard v0.0.20200320/go.mod h1:lDian4Sw4poJ04SgHh35nzMVwGSYlPumkdnHcucAQoY=
golang.zx2c4.com/wireguard v0.0.20200321-0.20200622004228-b84f1d4db25e h1:f8BS3yEMeIGx/zzJfihxDRedx6lT7EiJlfih4j6LY98=
golang.zx2c4.com/wireguard v0.0.20200321-0.20200622004228-b84f1d4db25e/go.mod h1:GJvYs5O24/ASlwPiRklVnjMx2xQzrOic0DuU6GvYJL4=
+2 -3
View File
@@ -21,8 +21,8 @@ android {
}
}
compileSdkVersion 29
dataBinding.enabled true
viewBinding.enabled true
buildFeatures.dataBinding = true
buildFeatures.viewBinding = true
defaultConfig {
applicationId 'com.wireguard.android'
minSdkVersion 21
@@ -68,7 +68,6 @@ dependencies {
implementation project(":tunnel")
implementation "androidx.annotation:annotation:$annotationsVersion"
implementation "androidx.appcompat:appcompat:$appcompatVersion"
implementation "androidx.cardview:cardview:$cardviewVersion"
implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$coordinatorLayoutVersion"
implementation "androidx.biometric:biometric:$biometricVersion"
+3 -3
View File
@@ -2,9 +2,6 @@
# escalates them as errors.
-dontwarn sun.misc.Unsafe
# Retain some information to keep stacktraces usable
-keepattributes SourceFile,LineNumberTable
# Fragment 1.2.4 allows Fragment classes to be obfuscated but
# databinding references in XML seem to not be rewritten to
# match, so we preserve the names as 1.2.3 did.
@@ -12,3 +9,6 @@
-keep public class <1> {
public <init>();
}
# Don't obfuscate
-dontobfuscate
+3
View File
@@ -112,5 +112,8 @@
android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="false" />
</service>
<meta-data android:name="android.content.APP_RESTRICTIONS"
android:resource="@xml/app_restrictions" />
</application>
</manifest>
@@ -9,8 +9,9 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.LinearLayout
import androidx.appcompat.app.ActionBar
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.wireguard.android.R
@@ -55,16 +56,15 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
actionBar = supportActionBar
isTwoPaneLayout = findViewById<View>(R.id.master_detail_wrapper) is LinearLayout
isTwoPaneLayout = findViewById<View?>(R.id.master_detail_wrapper) != null
supportFragmentManager.addOnBackStackChangedListener(this)
onBackStackChanged()
// Dispatch insets on back stack change
// This is required to ensure replaced fragments are also able to consume insets
findViewById<View>(R.id.master_detail_wrapper).setOnApplyWindowInsetsListener { _, insets ->
val fragmentManager = supportFragmentManager
fragmentManager.addOnBackStackChangedListener {
fragmentManager.fragments.forEach {
it.requireView().dispatchApplyWindowInsets(insets)
findViewById<View>(R.id.main_activity_container).setOnApplyWindowInsetsListener { _, insets ->
supportFragmentManager.addOnBackStackChangedListener {
supportFragmentManager.fragments.forEach {
ViewCompat.dispatchApplyWindowInsets(it.requireView(), WindowInsetsCompat.toWindowInsetsCompat(insets))
}
}
insets
@@ -17,6 +17,7 @@ import androidx.preference.PreferenceFragmentCompat
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ModuleLoader
import java.util.ArrayList
import java.util.Arrays
@@ -87,6 +88,10 @@ class SettingsActivity : ThemeChangeAwareActivity() {
val remoteApps = preferenceManager.findPreference<Preference>("allow_remote_control_intents")
remoteApps?.parent?.removePreference(remoteApps)
}
if (AdminKnobs.disableConfigExport) {
val zipExporter = preferenceManager.findPreference<Preference>("zip_exporter")
zipExporter?.parent?.removePreference(zipExporter)
}
val wgQuickOnlyPrefs = arrayOf(
preferenceManager.findPreference("tools_installer"),
preferenceManager.findPreference("restore_on_boot"),
@@ -26,6 +26,7 @@ import com.wireguard.android.databinding.TunnelEditorFragmentBinding
import com.wireguard.android.fragment.AppListDialogFragment.AppSelectionListener
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.BiometricAuthenticator
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.viewmodel.ConfigProxy
import com.wireguard.android.widget.EdgeToEdge.setUpRoot
@@ -252,6 +253,7 @@ class TunnelEditorFragment : BaseFragment(), AppSelectionListener {
val edit = view as? EditText ?: return
if (edit.inputType == InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) return
if (!haveShownKeys && edit.text.isNotEmpty()) {
if (AdminKnobs.disableConfigExport) return
showingAuthenticator = true
BiometricAuthenticator.authenticate(R.string.biometric_prompt_private_key_title, this) {
showingAuthenticator = false
@@ -17,6 +17,8 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import com.google.android.material.snackbar.Snackbar
@@ -314,6 +316,11 @@ class TunnelListFragment : BaseFragment() {
return when (item.itemId) {
R.id.menu_action_delete -> {
val copyCheckedItems = HashSet(checkedItems)
binding?.createFab?.apply {
visibility = View.VISIBLE
scaleX = 1f
scaleY = 1f
}
Application.getTunnelManager().tunnels.thenAccept { tunnels ->
val tunnelsToDelete = ArrayList<ObservableTunnel>()
for (position in copyCheckedItems) tunnelsToDelete.add(tunnels[position])
@@ -343,6 +350,7 @@ class TunnelListFragment : BaseFragment() {
if (activity != null) {
resources = activity!!.resources
}
animateFab(binding?.createFab, false)
mode.menuInflater.inflate(R.menu.tunnel_list_action_mode, menu)
binding?.tunnelList?.adapter?.notifyDataSetChanged()
return true
@@ -351,6 +359,7 @@ class TunnelListFragment : BaseFragment() {
override fun onDestroyActionMode(mode: ActionMode) {
actionMode = null
resources = null
animateFab(binding?.createFab, true)
checkedItems.clear()
binding!!.tunnelList.adapter!!.notifyDataSetChanged()
}
@@ -391,6 +400,26 @@ class TunnelListFragment : BaseFragment() {
mode.title = resources!!.getQuantityString(R.plurals.delete_title, count, count)
}
}
private fun animateFab(view: View?, show: Boolean) {
view ?: return
val animation = AnimationUtils.loadAnimation(
context, if (show) R.anim.scale_up else R.anim.scale_down
)
animation.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
}
override fun onAnimationEnd(animation: Animation?) {
if (!show) view.visibility = View.GONE
}
override fun onAnimationStart(animation: Animation?) {
if (show) view.visibility = View.VISIBLE
}
})
view.startAnimation(animation)
}
}
companion object {
@@ -93,14 +93,14 @@ class ObservableTunnel internal constructor(
@get:Bindable
var statistics: Statistics? = null
get() {
if (field == null || field!!.isStale)
if (field == null || field?.isStale != false)
manager.getTunnelStatistics(this).whenComplete(ExceptionLoggers.E)
return field
}
private set
val statisticsAsync: CompletionStage<Statistics>
get() = if (statistics == null || statistics!!.isStale)
get() = if (statistics == null || statistics?.isStale != false)
manager.getTunnelStatistics(this)
else
CompletableFuture.completedFuture(statistics)
@@ -16,6 +16,7 @@ import com.wireguard.android.R
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.BiometricAuthenticator
import com.wireguard.android.util.DownloadsFileSaver
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.FragmentUtils
import java9.util.concurrent.CompletableFuture
@@ -82,6 +83,7 @@ class ZipExporterPreference(context: Context, attrs: AttributeSet?) : Preference
override fun getTitle() = context.getString(R.string.zip_export_title)
override fun onClick() {
if (AdminKnobs.disableConfigExport) return
val prefActivity = FragmentUtils.getPrefActivity(this)
val fragment = prefActivity.supportFragmentManager.fragments.first()
BiometricAuthenticator.authenticate(R.string.biometric_prompt_zip_exporter_title, fragment) {
@@ -0,0 +1,16 @@
/*
* Copyright © 2020 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
import android.content.RestrictionsManager
import androidx.core.content.getSystemService
import com.wireguard.android.Application
object AdminKnobs {
private val restrictions: RestrictionsManager? = Application.get().getSystemService()
val disableConfigExport: Boolean
get() = restrictions?.applicationRestrictions?.getBoolean("disable_config_export", false) ?: false
}
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="300"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0"
android:toYScale="0" />
</set>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="300"
android:fromXScale="0"
android:fromYScale="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_activity_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/master_detail_wrapper"
android:id="@+id/main_activity_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
+27 -27
View File
@@ -25,7 +25,7 @@
<item quantity="other">%d ausgeschlossene Anwendungen</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d ausgeschlossene Anwendung</item>
<item quantity="one">%d einbezogene Anwendung</item>
<item quantity="other">%d einbezogene Anwendungen</item>
</plurals>
<plurals name="n_excluded_applications">
@@ -53,18 +53,18 @@
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">Sekunde</item>
<item quantity="other">Sekunde</item>
<item quantity="other">Sekunden</item>
</plurals>
<string name="use_all_applications">Alle Apps verwenden</string>
<string name="add_peer">Teilnehmer hinzufügen</string>
<string name="addresses">Adressen</string>
<string name="applications">Applikationen</string>
<string name="applications">Anwendungen</string>
<string name="allow_remote_control_intents_summary_off">Externe Apps dürfen keine Tunnel umschalten (empfohlen)</string>
<string name="allow_remote_control_intents_summary_on">Externe Apps dürfen Tunnel umschalten (erweitert)</string>
<string name="allow_remote_control_intents_title">Erlaube Steuerung über externe Apps</string>
<string name="allowed_ips">Erlaubte IPs</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$ss %2$s</string>
<string name="bad_config_context">%2$s des %1$s</string>
<string name="bad_config_context_top_level">%s</string>
<string name="bad_config_error">%1$s in %2$s</string>
<string name="bad_config_explanation_pka">: Muss positiv sein und nicht größer als 65535</string>
@@ -73,8 +73,8 @@
<string name="bad_config_reason_invalid_key">Ungültiger Schlüssel</string>
<string name="bad_config_reason_invalid_number">Ungültige Zahl</string>
<string name="bad_config_reason_invalid_value">Ungültiger Wert</string>
<string name="bad_config_reason_missing_attribute">Attribut fehlt</string>
<string name="bad_config_reason_missing_section">Fehlende Sektion</string>
<string name="bad_config_reason_missing_attribute">Fehlendes Attribut</string>
<string name="bad_config_reason_missing_section">Fehlender Abschnitt</string>
<string name="bad_config_reason_syntax_error">Syntaxfehler</string>
<string name="bad_config_reason_unknown_attribute">Unbekanntes Attribut</string>
<string name="bad_config_reason_unknown_section">Unbekannter Abschnitt</string>
@@ -89,22 +89,22 @@
<string name="config_save_error">Konfiguration für „%1$s“ kann nicht gespeichert werden: %2$s</string>
<string name="config_save_success">Konfiguration für „%s ” erfolgreich gespeichert</string>
<string name="create_activity_title">WireGuard-Tunnel erstellen</string>
<string name="create_bin_dir_error">Lokales Anwendungsverzeichnis konnte nicht erstellt werden</string>
<string name="create_downloads_file_error">Datei konnte im Download-Verzeichnis nicht erstellt werden</string>
<string name="create_bin_dir_error">Lokales Anwendungsverzeichnis kann nicht erstellt werden</string>
<string name="create_downloads_file_error">Datei kann im Download-Verzeichnis nicht erstellt werden</string>
<string name="create_empty">Neu erstellen</string>
<string name="create_from_file">Aus Datei oder Archiv importieren</string>
<string name="create_from_qr_code">Vom QR-Code scannen</string>
<string name="create_from_qr_code">Von QR-Code scannen</string>
<string name="create_output_dir_error">Konnte das Ausgabeverzeichnis nicht erstellen</string>
<string name="create_temp_dir_error">Lokales temporäres Verzeichnis konnte nicht erstellt werden</string>
<string name="create_temp_dir_error">Lokales temporäres Verzeichnis kann nicht erstellt werden</string>
<string name="create_tunnel">Tunnel erstellen</string>
<string name="dark_theme_summary_off">Helles (Tag) Design in Verwendung</string>
<string name="dark_theme_summary_on">Dunkles (Nacht) Design in Verwendung</string>
<string name="dark_theme_summary_off">Verwende helles Design (Tag)</string>
<string name="dark_theme_summary_on">Verwende dunkles Design (Nacht)</string>
<string name="dark_theme_title">Dunkles Design verwenden</string>
<string name="delete">Entfernen</string>
<string name="dns_servers">DNS-Server</string>
<string name="edit">Bearbeiten</string>
<string name="endpoint">Endpunkt</string>
<string name="error_down">Fehler beim Herunterfahren des Tunnels: %s</string>
<string name="error_down">Fehler beim Abschalten des Tunnels: %s</string>
<string name="error_fetching_apps">Fehler beim Abrufen der App-Liste: %s</string>
<string name="error_root">Bitte root-Zugriff anfordern und erneut versuchen</string>
<string name="error_up">Fehler beim Starten des Tunnels: %s</string>
@@ -120,38 +120,38 @@
<string name="import_error">Kann Tunnel nicht importieren: %s</string>
<string name="import_from_qr_code">Tunnel aus QR-Code importieren</string>
<string name="import_success">„%s” importiert</string>
<string name="interface_title">Schnittstelle</string>
<string name="key_contents_error">Falsche Zeichen in Schlüssel</string>
<string name="interface_title">Interface</string>
<string name="key_contents_error">Unzulässige Zeichen im Schlüssel</string>
<string name="key_length_error">Falsche Schlüssellänge</string>
<string name="key_length_explanation_base64">: WireGuard base64-Schlüssel müssen 44 Zeichen enthalten (32 Bytes)</string>
<string name="key_length_explanation_binary">: WireGuard-Schlüssel müssen 32 Bytes groß sein</string>
<string name="key_length_explanation_hex">: WireGuard Hex-Schlüssel müssen 64 Zeichen (32 Bytes) groß sein</string>
<string name="listen_port">Eingangs-Port</string>
<string name="log_export_error">Fehler beim Exportieren des Logs: %s</string>
<string name="log_export_subject">WireGuard Android Log Datei</string>
<string name="log_export_error">Konnte Protokoll nicht exportieren: %s</string>
<string name="log_export_subject">WireGuard Android Protokolldatei</string>
<string name="log_export_success">Gespeichert in „%s”</string>
<string name="log_export_title">Logdatei exportieren</string>
<string name="log_saver_activity_label">Log speichern</string>
<string name="log_viewer_pref_summary">Logs können beim Debuggen helfen</string>
<string name="log_viewer_pref_title">Protokoll der Anwendung anzeigen</string>
<string name="log_viewer_title">Loggen</string>
<string name="log_saver_activity_label">Protokoll speichern</string>
<string name="log_viewer_pref_summary">Protokolle können beim Debuggen helfen</string>
<string name="log_viewer_pref_title">Anwendungs-Protokoll anzeigen</string>
<string name="log_viewer_title">Protokoll</string>
<string name="logcat_error">Konnte logcat nicht ausführen: </string>
<string name="module_disabler_disabled_summary">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
<string name="module_disabler_disabled_title">Kernelmodul-Backend aktivieren</string>
<string name="module_disabler_enabled_summary">Das langsamere Userspace-Backend kann die Stabilität verbessern</string>
<string name="module_disabler_enabled_title">Kernelmodul-Backend deaktivieren</string>
<string name="module_installer_error">Es ist etwas schief gelaufen. Bitte versuchen Sie es später erneut</string>
<string name="module_installer_error">Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut</string>
<string name="module_installer_initial">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
<string name="module_installer_not_found">Für Ihr Gerät sind keine Module verfügbar</string>
<string name="module_installer_title">Kernelmodul herunterladen und installieren</string>
<string name="module_installer_working">Herunterladen und Installieren…</string>
<string name="module_installer_working">Lade herunter und installiere…</string>
<string name="module_version_error">Konnte Version des Kernel-Moduls nicht ermitteln</string>
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Einschalten eines Tunnels wird andere ausschalten</string>
<string name="multiple_tunnels_summary_on">Mehrere Tunnel können gleichzeitig aktiviert werden</string>
<string name="multiple_tunnels_title">Erlaube mehrere Tunnel gleichzeitig</string>
<string name="multiple_tunnels_summary_off">Das einschalten eines Tunnels wird andere ausschalten</string>
<string name="multiple_tunnels_summary_on">Mehrere Tunnel können gleichzeitig aktiviert sein</string>
<string name="multiple_tunnels_title">Erlaube mehrere gleichzeitige Tunnel</string>
<string name="name">Name</string>
<string name="no_config_error">Versucht einen Tunnel ohne Konfiguration zu starten</string>
<string name="no_config_error">Es wurde versucht, einen Tunnel ohne Konfiguration zu starten</string>
<string name="no_configs_error">Keine Konfigurationen gefunden</string>
<string name="no_tunnels_error">Keine Tunnel vorhanden</string>
<string name="parse_error_generic">String (Zeichenkette)</string>
+229
View File
@@ -0,0 +1,229 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="delete_error">
<item quantity="one">Impossible de supprimer %d tunnel : %s</item>
<item quantity="other">Impossible de supprimer %d tunnels : %s</item>
</plurals>
<plurals name="delete_success">
<item quantity="one">Supprimé avec succès %d tunnel</item>
<item quantity="other">Supprimé avec succès %d tunnels</item>
</plurals>
<plurals name="delete_title">
<item quantity="one">%d tunnel sélectionné</item>
<item quantity="other">%d tunnels sélectionnés</item>
</plurals>
<plurals name="import_partial_success">
<item quantity="one">%1$d de %2$d tunnels importés</item>
<item quantity="other">%1$d de %2$d tunnels importés</item>
</plurals>
<plurals name="import_total_success">
<item quantity="one">%d tunnel importé</item>
<item quantity="other">%d tunnels importés</item>
</plurals>
<plurals name="set_excluded_applications">
<item quantity="one">%d application exclue</item>
<item quantity="other">%d applications exclues</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d application incluse</item>
<item quantity="other">%d applications incluses</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d exclue</item>
<item quantity="other">%d exclues</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d incluse</item>
<item quantity="other">%d incluses</item>
</plurals>
<string name="all_applications">Toutes les Applications</string>
<string name="exclude_from_tunnel">Exclure</string>
<string name="include_in_tunnel">Inclure uniquement</string>
<plurals name="include_n_applications">
<item quantity="one">Inclure %d application</item>
<item quantity="other">Inclure %d applications</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Exclure %d application</item>
<item quantity="other">Exclure %d applications</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">chaque seconde</item>
<item quantity="other">tous les %d secondes</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">seconde</item>
<item quantity="other">secondes</item>
</plurals>
<string name="use_all_applications">Utiliser toutes les applications</string>
<string name="add_peer">Ajouter un pair</string>
<string name="addresses">Adresses</string>
<string name="applications">Applications</string>
<string name="allow_remote_control_intents_summary_off">Les applications externes ne peuvent pas activer les tunnels (recommandé)</string>
<string name="allow_remote_control_intents_summary_on">Les applications externes peuvent activer les tunnels (avancés)</string>
<string name="allow_remote_control_intents_title">Autoriser les applications de contrôle à distance</string>
<string name="allowed_ips">Adresses IP autorisées</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$s de %2$s</string>
<string name="bad_config_context_top_level">%s</string>
<string name="bad_config_error">%1$s dans %2$s</string>
<string name="bad_config_explanation_pka">: Doit être positif et ne pas dépasser 65535</string>
<string name="bad_config_explanation_positive_number">: Doit être positif</string>
<string name="bad_config_explanation_udp_port">: Doit être un numéro de port UDP valide</string>
<string name="bad_config_reason_invalid_key">Clef invalide</string>
<string name="bad_config_reason_invalid_number">Numéro invalide</string>
<string name="bad_config_reason_invalid_value">Valeur invalide</string>
<string name="bad_config_reason_missing_attribute">Attribut manquant</string>
<string name="bad_config_reason_missing_section">Section manquante</string>
<string name="bad_config_reason_syntax_error">Erreur de syntaxe</string>
<string name="bad_config_reason_unknown_attribute">Attribut inconnu</string>
<string name="bad_config_reason_unknown_section">Section inconnue</string>
<string name="bad_config_reason_value_out_of_range">Valeur hors limite</string>
<string name="bad_extension_error">Le fichier doit être .conf ou .zip</string>
<string name="cancel">Annuler</string>
<string name="config_delete_error">Impossible de supprimer le fichier de configuration %s</string>
<string name="config_exists_error">La configuration de « %s » existe déjà</string>
<string name="config_file_exists_error">Le fichier de configuration « %s » existe déjà</string>
<string name="config_not_found_error">Fichier de configuration «%s» introuvable</string>
<string name="config_rename_error">Impossible de renommer le fichier de configuration «%s»</string>
<string name="config_save_error">Impossible d’enregistrer la configuration pour «%1$s» : %2$s</string>
<string name="config_save_success">Configuration enregistrée avec succès pour “%s”</string>
<string name="create_activity_title">Créer un tunnel WireGuard</string>
<string name="create_bin_dir_error">Impossible de créer le répertoire binaire local</string>
<string name="create_downloads_file_error">Impossible de créer le fichier dans le répertoire des téléchargements</string>
<string name="create_empty">Créer à partir de zéro</string>
<string name="create_from_file">Importer depuis un fichier ou une archive</string>
<string name="create_from_qr_code">Créer avec un scan de QR code</string>
<string name="create_output_dir_error">Impossible de créer le répertoire de sortie</string>
<string name="create_temp_dir_error">Impossible de créer le répertoire temporaire local</string>
<string name="create_tunnel">Créer un tunnel</string>
<string name="dark_theme_summary_off">Utilisation en cours du thème clair (jour)</string>
<string name="dark_theme_summary_on">Utilisation en cours du thème sombre (nuit)</string>
<string name="dark_theme_title">Utilisez le thème sombre</string>
<string name="delete">Supprimer</string>
<string name="dns_servers">Serveurs DNS</string>
<string name="edit">Modifier</string>
<string name="endpoint">Point de terminaison</string>
<string name="error_down">Erreur lors de la désactivation du tunnel : %s</string>
<string name="error_fetching_apps">Erreur lors de la récupération de la liste d\'applications : %s</string>
<string name="error_root">Veuillez obtenir l\'accès root et essayez à nouveau</string>
<string name="error_up">Erreur lors de la mise en place du tunnel : %s</string>
<string name="exclude_private_ips">Exclure les IPs privées</string>
<string name="generate_new_private_key">Générer une nouvelle clé privée</string>
<string name="generic_error">Erreur inconnue « %s »</string>
<string name="hint_automatic">(auto)</string>
<string name="hint_generated">(généré)</string>
<string name="hint_optional">(facultatif)</string>
<string name="hint_optional_discouraged">(facultatif, non recommandé)</string>
<string name="hint_random">(aléatoire)</string>
<string name="illegal_filename_error">Nom de fichier invalide “%s”</string>
<string name="import_error">Impossible d\'importer le tunnel : %s</string>
<string name="import_from_qr_code">Importer un tunnel depuis un QR-code</string>
<string name="import_success">Importé «%s »</string>
<string name="interface_title">Interface</string>
<string name="key_contents_error">Mauvais caractères dans la clé</string>
<string name="key_length_error">Longueur de la clé incorrecte</string>
<string name="key_length_explanation_base64">: Les clés base64 WireGuard doivent comporter 44 caractères (32 octets)</string>
<string name="key_length_explanation_binary">: Les clés WireGuard doivent comporter 32 octets</string>
<string name="key_length_explanation_hex">: Les clés hexadécimales WireGuard doivent comporter 64 caractères (32 octets)</string>
<string name="listen_port">Port d\'écoute</string>
<string name="log_export_error">Impossible d\'exporter le journal : %s</string>
<string name="log_export_subject">Fichier journal d\'Android WireGuard</string>
<string name="log_export_success">Enregistré dans « %s »</string>
<string name="log_export_title">Exporter le fichier journal</string>
<string name="log_saver_activity_label">Enregistrer le journal</string>
<string name="log_viewer_pref_summary">Les journaux peuvent aider au débogage</string>
<string name="log_viewer_pref_title">Afficher le journal de l\'application</string>
<string name="log_viewer_title">Journal</string>
<string name="logcat_error">Impossible d\'exécuter logcat : </string>
<string name="module_disabler_disabled_summary">Le module expérimental du noyau peut améliorer les performances</string>
<string name="module_disabler_disabled_title">Activer le backend du module du noyau</string>
<string name="module_disabler_enabled_summary">Le backend plus lent de l\'espace utilisateur peut améliorer la stabilité</string>
<string name="module_disabler_enabled_title">Désactiver le backend du module du noyau</string>
<string name="module_installer_error">Une erreur est survenue. Veuillez réessayer</string>
<string name="module_installer_initial">Le module expérimental du noyau peut améliorer les performances</string>
<string name="module_installer_not_found">Aucun module n\'est disponible pour votre appareil</string>
<string name="module_installer_title">Télécharger et installer le module du noyau</string>
<string name="module_installer_working">Téléchargement et installation en cours…</string>
<string name="module_version_error">Impossible de déterminer la version du module noyau</string>
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Activer un tunnel éteindra les autres</string>
<string name="multiple_tunnels_summary_on">Plusieurs tunnels peuvent être activés simultanément</string>
<string name="multiple_tunnels_title">Autoriser plusieurs tunnels simultanés</string>
<string name="name">Nom</string>
<string name="no_config_error">Tentative d\'établir un tunnel sans configuration</string>
<string name="no_configs_error">Aucune configuration trouvée</string>
<string name="no_tunnels_error">Aucun tunnel existant</string>
<string name="parse_error_generic">chaîne de caractères</string>
<string name="parse_error_inet_address">Adresse IP</string>
<string name="parse_error_inet_endpoint">point de terminaison</string>
<string name="parse_error_inet_network">Réseau IP</string>
<string name="parse_error_integer">nombre</string>
<string name="parse_error_reason">Impossible d\'analyser %1$s “%2$s”</string>
<string name="peer">Pair</string>
<string name="permission_description">contrôler les tunnels WireGuard, activer et désactiver les tunnels à volonté, potentiellement détourner le trafic Internet</string>
<string name="permission_label">contrôler les tunnels WireGuard</string>
<string name="persistent_keepalive">Maintien de connexion permanente</string>
<string name="pre_shared_key">Clé pré-partagée</string>
<string name="pre_shared_key_enabled">activée</string>
<string name="private_key">Clé privée</string>
<string name="public_key">Clé publique</string>
<string name="qr_code_hint">Astuce : générez avec \"qrencode -t ansiutf8 &lt; tunnel.conf\".</string>
<string name="restore_on_boot_summary_off">N\'affichera pas les tunnels activés au démarrage</string>
<string name="restore_on_boot_summary_on">Les tunnels activés seront affichés au démarrage</string>
<string name="restore_on_boot_title">Restaurer au démarrage</string>
<string name="save">Enregistrer</string>
<string name="select_all">Tout sélectionner</string>
<string name="settings">Paramètres</string>
<string name="shell_exit_status_read_error">L\'interpréteur de commande ne peut pas lire l\'état de sortie</string>
<string name="shell_marker_count_error">L\'interpréteur de commandes attendait 4 marqueurs, %d reçus</string>
<string name="shell_start_error">L\'interpréteur de commande n\'a pas pu démarrer : %d</string>
<string name="success_application_will_restart">Succès. L\'application va redémarrer maintenant…</string>
<string name="toggle_all">Tout basculer</string>
<string name="toggle_error">Erreur lors de l\'activation du tunnel WireGuard : %s</string>
<string name="tools_installer_already">wg et wg-quick sont déjà installés</string>
<string name="tools_installer_failure">Impossible d\'installer les outils en ligne de commande (pas de root?)</string>
<string name="tools_installer_initial">Installer les outils optionnels pour le script</string>
<string name="tools_installer_initial_magisk">Installer les outils optionnels pour le script en tant que module Magisk</string>
<string name="tools_installer_initial_system">Installer les outils optionnels pour le script dans la partition système</string>
<string name="tools_installer_success_magisk">wg et wg-quick installés en tant que module Magisk (redémarrage requis)</string>
<string name="tools_installer_success_system">wg et wg-quick installés dans la partition système</string>
<string name="tools_installer_title">Installer les outils de ligne de commande</string>
<string name="tools_installer_working">Installation de wg et wg-quick</string>
<string name="tools_unavailable_error">Outils requis indisponibles</string>
<string name="transfer">Transférer</string>
<string name="transfer_bytes">%d Octets</string>
<string name="transfer_gibibytes">%.2f Go</string>
<string name="transfer_kibibytes">%.2f Ko</string>
<string name="transfer_mibibytes">%.2f Mo</string>
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
<string name="transfer_tibibytes">%.2f To</string>
<string name="tun_create_error">Impossible de créer le périphérique tun</string>
<string name="tunnel_config_error">Impossible de configurer le tunnel (wg-quick a retourné %d)</string>
<string name="tunnel_create_error">Impossible de créer le tunnel : %s</string>
<string name="tunnel_create_success">Tunnel «%s » créé avec succès</string>
<string name="tunnel_error_already_exists">Le tunnel « %s » existe déjà</string>
<string name="tunnel_error_invalid_name">Nom invalide</string>
<string name="tunnel_list_placeholder">Ajouter un tunnel en utilisant le bouton bleu</string>
<string name="tunnel_name">Nom du tunnel</string>
<string name="tunnel_on_error">Impossible d\'activer le tunnel (wgTurnOn a retourné %d)</string>
<string name="tunnel_rename_error">Impossible de renommer le tunnel : %s</string>
<string name="tunnel_rename_success">Tunnel renommé avec succès en «%s »</string>
<string name="type_name_go_userspace">Nom de l\'espace utilisateur</string>
<string name="type_name_kernel_module">Module noyau</string>
<string name="unknown_error">Erreur inconnue</string>
<string name="version_summary">%1$s backend v%2$s</string>
<string name="version_summary_checking">Vérification de la version %s du backend</string>
<string name="version_summary_unknown">Version %s inconnue</string>
<string name="version_title">WireGuard pour Android v%s</string>
<string name="vpn_not_authorized_error">Service VPN non autorisé par l\'utilisateur</string>
<string name="vpn_start_error">Impossible de démarrer le service VPN Android</string>
<string name="zip_export_error">Impossible d\'exporter les tunnels : %s</string>
<string name="zip_export_success">Enregistré dans « %s »</string>
<string name="zip_export_summary">L\'archive zip sera sauvegardée dans le dossier de téléchargement</string>
<string name="zip_export_title">Exporter les tunnels vers le fichier zip</string>
<string name="biometric_prompt_zip_exporter_title">S\'authentifier pour exporter des tunnels</string>
<string name="biometric_prompt_private_key_title">S\'authentifier pour voir la clé privée</string>
<string name="biometric_auth_error">Échec de l\'authentification</string>
<string name="biometric_auth_error_reason">Échec de l\'authentification : %s</string>
</resources>
+32 -5
View File
@@ -18,10 +18,36 @@
<plurals name="set_excluded_applications">
<item quantity="other">%d Aplikasi Dikecualikan</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="other">%d Aplikasi Dikecualikan</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="other">%d dikecualikan</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="other">%d termasuk</item>
</plurals>
<string name="all_applications">Semua aplikasi</string>
<string name="exclude_from_tunnel">Kecualikan</string>
<string name="include_in_tunnel">Berlaku hanya untuk</string>
<plurals name="include_n_applications">
<item quantity="other">Aplikasi %d yang disertakan</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="other">Aplikasi %d yang disertakan</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="other">setiap 10 detik</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="other">detik</item>
</plurals>
<string name="use_all_applications">Gunakan semua aplikasi</string>
<string name="add_peer">Tambahkan rekan</string>
<string name="addresses">Alamat</string>
<string name="allow_remote_control_intents_summary_off">Apl eksternal tidak dapat mengalihkan terowongan (disarankan)</string>
<string name="allow_remote_control_intents_summary_on">Apl eksternal dapat mengalihkan terowongan (lanjutan)</string>
<string name="applications">Aplikasi</string>
<string name="allow_remote_control_intents_summary_off">Apl eksternal tidak dapat mengalihkan tunnel (disarankan)</string>
<string name="allow_remote_control_intents_summary_on">Apl eksternal dapat mengalihkan tunnel (lanjutan)</string>
<string name="allow_remote_control_intents_title">Izinkan apl kendali jarak jauh</string>
<string name="allowed_ips">IP diizinkan</string>
<string name="app_name">WireGuard</string>
@@ -64,11 +90,11 @@
<string name="delete">Hapus</string>
<string name="dns_servers">Server DNS</string>
<string name="edit">Edit</string>
<string name="endpoint">Titik akhir</string>
<string name="error_down">Kesalahan mengurangi tunel: %s</string>
<string name="endpoint">Endpoint</string>
<string name="error_down">Kesalahan pada tunel: %s</string>
<string name="error_fetching_apps">Kesalahan mengambil daftar aplikasi: %s</string>
<string name="error_root">Izinkan akses root dan coba lagi</string>
<string name="error_up">Kesalahan menambahkan tunel: %s</string>
<string name="error_up">Kesalahan pada tunel: %s</string>
<string name="exclude_private_ips">Kecualikan IP pribadi</string>
<string name="generate_new_private_key">Buat kunci privat baru</string>
<string name="generic_error">Eror “%s” Tidak diketahui</string>
@@ -126,6 +152,7 @@
<string name="permission_label">Kontrol tunel WireGuard</string>
<string name="persistent_keepalive">Keepalive persisten</string>
<string name="pre_shared_key">Kunci Pra-bersama</string>
<string name="pre_shared_key_enabled">diaktifkan</string>
<string name="private_key">Kunci pribadi</string>
<string name="public_key">Kunci publik</string>
<string name="qr_code_hint">Tips: generate dengan `qrencode -t ansiutf8 &lt; tunnel.conf`.</string>
+34
View File
@@ -24,8 +24,41 @@
<item quantity="one">%d applicazione esclusa</item>
<item quantity="other">%d applicazioni escluse</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d applicazione esclusa</item>
<item quantity="other">%d applicazioni incluse</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d escluse</item>
<item quantity="other">%d escluse</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d escluse</item>
<item quantity="other">%d incluse</item>
</plurals>
<string name="all_applications">Tutte le applicazioni</string>
<string name="exclude_from_tunnel">Escludi</string>
<string name="include_in_tunnel">Includi solo</string>
<plurals name="include_n_applications">
<item quantity="one">Includi %d applicazione</item>
<item quantity="other">Includi %d applicazioni</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Escludi %d applicazione</item>
<item quantity="other">Escludi %d applicazioni</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">ogni secondo</item>
<item quantity="other">ogni %d secondi</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">secondo</item>
<item quantity="other">secondi</item>
</plurals>
<string name="use_all_applications">Utilizza tutte le applicazioni</string>
<string name="add_peer">Aggiungi peer</string>
<string name="addresses">Indirizzi</string>
<string name="applications">Applicazioni</string>
<string name="allow_remote_control_intents_summary_off">Le applicazioni esterne non possono attivare tunnel (consigliato)</string>
<string name="allow_remote_control_intents_summary_on">Le applicazioni esterne possono attivare tunnel (avanzato)</string>
<string name="allow_remote_control_intents_title">Consenti applicazioni di controllo remoto</string>
@@ -132,6 +165,7 @@
<string name="permission_label">controlla tunnel WireGuard</string>
<string name="persistent_keepalive">Tieni sempre attivo</string>
<string name="pre_shared_key">Chiave condivisa (PSK)</string>
<string name="pre_shared_key_enabled">abilitata</string>
<string name="private_key">Chiave privata</string>
<string name="public_key">Chiave pubblica</string>
<string name="qr_code_hint">Suggerimento: genera con `qrencode -t ansiutf8 &lt; tunnel.conf`.</string>
+28 -1
View File
@@ -18,8 +18,34 @@
<plurals name="set_excluded_applications">
<item quantity="other">除外アプリ %d 個</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="other">トンネリング対象アプリ %d 個</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="other">対象外アプリ %d 個</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="other">トンネル対象アプリ %d 個</item>
</plurals>
<string name="all_applications">すべてのアプリがトンネル対象</string>
<string name="exclude_from_tunnel">トンネルしない</string>
<string name="include_in_tunnel">トンネルする</string>
<plurals name="include_n_applications">
<item quantity="other">%d アプリが対象</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="other">%d アプリを除外</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="other">%d 秒ごと</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="other">秒</item>
</plurals>
<string name="use_all_applications">全アプリをトンネル対象にする</string>
<string name="add_peer">ピアを追加する</string>
<string name="addresses">アドレス</string>
<string name="applications">アプリ</string>
<string name="allow_remote_control_intents_summary_off">外部アプリはトンネルを制御できない(推奨)</string>
<string name="allow_remote_control_intents_summary_on">外部アプリにトンネルの制御を許可(上級者向け)</string>
<string name="allow_remote_control_intents_title">外部アプリからの制御</string>
@@ -126,6 +152,7 @@
<string name="permission_label">WireGuard トンネルの制御</string>
<string name="persistent_keepalive">持続的キープアライブ</string>
<string name="pre_shared_key">事前共有鍵</string>
<string name="pre_shared_key_enabled">有効</string>
<string name="private_key">秘密鍵</string>
<string name="public_key">公開鍵</string>
<string name="qr_code_hint">Tip: `qrencode -t ansiutf8 &lt; tunnel.conf` で生成できます</string>
@@ -139,7 +166,7 @@
<string name="shell_marker_count_error">シェルは 4 マーカーを期待していますが、 %d マーカーを受け取りました</string>
<string name="shell_start_error">シェルの起動に失敗しました: %d</string>
<string name="success_application_will_restart">成功。アプリケーションは再起動します…</string>
<string name="toggle_all">すべてのトンネルの状態を切り替え</string>
<string name="toggle_all">すべての状態を切り替え</string>
<string name="toggle_error">WireGuard トンネルの状態切り替え時にエラー: %s</string>
<string name="tools_installer_already">wg および wg-quick はインストール済みです</string>
<string name="tools_installer_failure">コマンドラインツールをインストールできません(root権限がない?)</string>
+2 -2
View File
@@ -12,8 +12,8 @@
<!-- Theme variables -->
<color name="list_multiselect_background">#1aeeeeee</color>
<color name="status_bar_color">#21242424</color>
<color name="navigation_bar_color">#aa242424</color>
<color name="status_bar_color">@color/primary_color</color>
<color name="navigation_bar_color">#aa212121</color>
<!-- Log viewer tag colors -->
<color name="debug_tag_color">#aaaaaa</color>
+54 -6
View File
@@ -2,31 +2,31 @@
<resources>
<plurals name="delete_error">
<item quantity="one">Не удалось удалить %d туннель: %s</item>
<item quantity="few">Не удалось удалить %d туннелей: %s</item>
<item quantity="few">Не удалось удалить %d туннеля: %s</item>
<item quantity="many">Не удалось удалить %d туннелей: %s</item>
<item quantity="other">Не удалось удалить %d туннелей: %s</item>
</plurals>
<plurals name="delete_success">
<item quantity="one">Успешно удален %d туннель</item>
<item quantity="few">Успешно удалено %d туннелей</item>
<item quantity="few">Успешно удалено %d туннеля</item>
<item quantity="many">Успешно удалено %d туннелей</item>
<item quantity="other">Успешно удалено %d туннелей</item>
</plurals>
<plurals name="delete_title">
<item quantity="one">%d туннель выбран</item>
<item quantity="few">%d туннелей выбрано</item>
<item quantity="few">%d туннеля выбрано</item>
<item quantity="many">%d туннелей выбрано</item>
<item quantity="other">%d туннелей выбрано</item>
</plurals>
<plurals name="import_partial_success">
<item quantity="one">Импортирован %1$d из %2$d туннелей</item>
<item quantity="few">Импортировано %1$d из %2$d туннелей</item>
<item quantity="few">Импортировано %1$d из %2$d туннеля</item>
<item quantity="many">Импортировано %1$d из %2$d туннелей</item>
<item quantity="other">Импортировано %1$d из %2$d туннелей</item>
</plurals>
<plurals name="import_total_success">
<item quantity="one">Импортированный %d туннель</item>
<item quantity="few">Импортировано %d туннелей</item>
<item quantity="few">Импортировано %d туннеля</item>
<item quantity="many">Импортировано %d туннелей</item>
<item quantity="other">Импортировано %d туннелей</item>
</plurals>
@@ -36,8 +36,55 @@
<item quantity="many">%d Исключенных приложений</item>
<item quantity="other">%d Исключенных приложений</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d Включенное приложение</item>
<item quantity="few">%d Включенных приложений</item>
<item quantity="many">%d Включенных приложений</item>
<item quantity="other">%d Включенных приложений</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d исключен</item>
<item quantity="few">%d исключено</item>
<item quantity="many">%d исключено</item>
<item quantity="other">%d исключено</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d влючен</item>
<item quantity="few">%d включено</item>
<item quantity="many">%d включено</item>
<item quantity="other">%d включено</item>
</plurals>
<string name="all_applications">Все приложения</string>
<string name="exclude_from_tunnel">Исключить</string>
<string name="include_in_tunnel">Только включить</string>
<plurals name="include_n_applications">
<item quantity="one">Включить %d приложение</item>
<item quantity="few">Включить %d приложения</item>
<item quantity="many">Включить %d приложений</item>
<item quantity="other">Включить %d приложений</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Исключить %d приложение</item>
<item quantity="few">Исключить %d приложения</item>
<item quantity="many">Исключить %d приложений</item>
<item quantity="other">Исключить %d приложений</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">каждую %d секунду</item>
<item quantity="few">каждые %d секунды</item>
<item quantity="many">каждые %d секунд</item>
<item quantity="other">каждые %d секунд</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">секунда</item>
<item quantity="few">секунд</item>
<item quantity="many">секунд</item>
<item quantity="other">секунд</item>
</plurals>
<string name="use_all_applications">Использовать все приложения</string>
<string name="add_peer">Добавить пира</string>
<string name="addresses">IP-адреса</string>
<string name="applications">Приложения</string>
<string name="allow_remote_control_intents_summary_off">Сторонние приложения не могут переключать туннели (рекомендуется)</string>
<string name="allow_remote_control_intents_summary_on">Сторонние приложения могут переключать туннели (дополнительно)</string>
<string name="allow_remote_control_intents_title">Доступ к другим приложениям</string>
@@ -128,7 +175,7 @@
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Только один туннель, выключит другие</string>
<string name="multiple_tunnels_summary_on">Могут быть включены несколько туннелей одновременно</string>
<string name="multiple_tunnels_title">Несколько одновременных туннелей</string>
<string name="multiple_tunnels_title">Несколько туннелей</string>
<string name="name">Имя</string>
<string name="no_config_error">Попытка поднять туннель без конфигурации</string>
<string name="no_configs_error">Конфигурации не найдены</string>
@@ -144,6 +191,7 @@
<string name="permission_label">управлять туннелями WireGuard</string>
<string name="persistent_keepalive">Постоянное соединение</string>
<string name="pre_shared_key">Общий ключ</string>
<string name="pre_shared_key_enabled">включено</string>
<string name="private_key">Приватный ключ</string>
<string name="public_key">Публичный ключ</string>
<string name="qr_code_hint">Совет: генерировать с `qrencode -t ansiutf8 &lt; tunnel.conf`.</string>
+1 -1
View File
@@ -235,7 +235,7 @@
<string name="tunnel_on_error">Tunela ni bilo mogoče vključiti (wgTurnOn je vrnil %d)</string>
<string name="tunnel_rename_error">Tunela ni bilo mogoče preimenovati: %s</string>
<string name="tunnel_rename_success">Tunel uspešno preimenovan v „%s“</string>
<string name="type_name_go_userspace">Go userspace</string>
<string name="type_name_go_userspace">Uporabniški prostor Go</string>
<string name="type_name_kernel_module">Modul jedra</string>
<string name="unknown_error">Neznana napaka</string>
<string name="version_summary">Zaledje %1$s v%2$s</string>
-1
View File
@@ -20,7 +20,6 @@
<item name="android:windowBackground">@color/primary_color</item>
<item name="alertDialogTheme">@style/AppTheme.Dialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.Dialog</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.ActionBar</item>
<item name="textInputStyle">@style/TextInputLayoutBase</item>
<item name="materialCardViewStyle">@style/AppTheme.MaterialCardView</item>
</style>
-1
View File
@@ -23,7 +23,6 @@
<item name="android:windowBackground">@color/primary_color</item>
<item name="alertDialogTheme">@style/AppTheme.Dialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.Dialog</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.ActionBar</item>
<item name="textInputStyle">@style/TextInputLayoutBase</item>
<item name="materialCardViewStyle">@style/AppTheme.MaterialCardView</item>
</style>
+2
View File
@@ -101,6 +101,8 @@
<string name="dark_theme_summary_on">Currently using dark (night) theme</string>
<string name="dark_theme_title">Use dark theme</string>
<string name="delete">Delete</string>
<string name="disable_config_export_title">Disable config exporting</string>
<string name="disable_config_export_description">Disabling config exporting makes private keys less accessible</string>
<string name="dns_servers">DNS servers</string>
<string name="edit">Edit</string>
<string name="endpoint">Endpoint</string>
-1
View File
@@ -19,7 +19,6 @@
<item name="android:windowBackground">@color/primary_color</item>
<item name="alertDialogTheme">@style/AppTheme.Dialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.Dialog</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.ActionBar</item>
<item name="textInputStyle">@style/TextInputLayoutBase</item>
<item name="materialCardViewStyle">@style/AppTheme.MaterialCardView</item>
</style>
+13
View File
@@ -0,0 +1,13 @@
<!--
~ Copyright © 2020 WireGuard LLC. All Rights Reserved.
~ SPDX-License-Identifier: Apache-2.0
-->
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">
<restriction
android:defaultValue="false"
android:description="@string/disable_config_export_description"
android:key="disable_config_export"
android:restrictionType="bool"
android:title="@string/disable_config_export_title" />
</restrictions>
+2 -2
View File
@@ -1,6 +1,6 @@
buildscript {
ext {
wireguardVersionCode = 474
wireguardVersionName = '1.0.20200407'
wireguardVersionCode = 475
wireguardVersionName = '1.0.20200724'
}
}