Rebrand WireGuard Android to Wire VPN
release / build (release) Canceled after 0s

- Rename package and all Java/Kotlin sources: com.wireguard.android -> page.onram.wirevpn
- applicationId -> page.onram.wirevpn, version 1.0.20260910 (520)
- New launcher icon: dark circle, white padlock with bold W
- App name 'Wire VPN' in all locales; remove donate preference
- Release signing from KEYSTORE_* env vars (CI)
- F-Droid v2: scripts/fdroid_metadata.py
- GitHub/Gitea Actions workflow: auto-build signed APK + F-Droid
  metadata/signature on every new release, attach to the release
- README + NOTICE (license inventory)
This commit is contained in:
Hermes (for frank)
2026-09-12 17:04:15 +00:00
parent e7b3a3c118
commit 646e617476
150 changed files with 823 additions and 654 deletions
+131
View File
@@ -0,0 +1,131 @@
# Builds the signed release APK and F-Droid v2 artifacts as soon as a new
# release is created, and attaches everything to that release.
#
# Works on Gitea Actions (GitHub-Actions-compatible) — the repo lives on
# https://git.obahan.xyz/frank/wirevpn.
#
# Required repository secrets:
# KEYSTORE_FILE base64-encoded release signing keystore (.jks)
# KEYSTORE_PASSWORD keystore password
# KEY_ALIAS key alias
# KEY_PASSWORD key password
#
# Requires a registered Actions runner on the Gitea instance that can run
# docker containers with the Android SDK (gitea/act image, docker driver).
name: release
on:
release:
types: [published, created]
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
env:
ANDROID_NDK_VERSION: "28.2.13676358"
ANDROID_API_LEVEL: "36"
GRADLE_USER_HOME: ${{ github.workspace }}/.gradle
jobs:
build:
runs-on: self-hosted
timeout-minutes: 90
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "21"
- name: Ensure Android SDK (platform, build-tools, NDK)
run: |
set -e
if [ -z "${ANDROID_HOME:-}" ] && [ -d /usr/lib/android-sdk ]; then
export ANDROID_HOME=/usr/lib/android-sdk
fi
if [ -z "${ANDROID_HOME:-}" ]; then
echo "ANDROID_HOME not set; installing SDK"
export ANDROID_HOME=$HOME/android-sdk
mkdir -p "$ANDROID_HOME/cmdline-tools"
curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o ct.zip
(cd "$ANDROID_HOME/cmdline-tools" && unzip -q ../../ct.zip && mv cmdline-tools latest && rm -rf latest/latest)
yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$ANDROID_HOME" --licenses >/dev/null
fi
"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$ANDROID_HOME" \
"platform-tools" "platforms;android-${ANDROID_API_LEVEL}" "build-tools;36.0.0" "ndk;${ANDROID_NDK_VERSION}"
echo "sdk.dir=$ANDROID_HOME" > local.properties
echo "ndk.dir=$ANDROID_HOME/ndk/${ANDROID_NDK_VERSION}" >> local.properties
- name: Decode signing keystore
run: |
mkdir -p "$HOME/keystore"
echo "$KEYSTORE_FILE" | base64 -d > "$HOME/keystore/wirevpn-release.jks"
env:
KEYSTORE_FILE: ${{ secrets.KEYSTORE_FILE }}
- name: Build signed release APK
uses: gradle/actions/setup-gradle@v4
env:
KEYSTORE_FILE: ${{ env.HOME }}/keystore/wirevpn-release.jks
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
with:
arguments: assembleRelease
- name: Collect build outputs + F-Droid metadata
run: |
set -e
APK=ui/build/outputs/apk/release/ui-release.apk
test -f "$APK"
mkdir -p dist
cp "$APK" dist/page.onram.wirevpn.apk
# F-Droid v2 metadata + signature: "256;" + base64(sha256(sha256(apk-bytes)))
export PATH="$ANDROID_HOME/build-tools/36.0.0:$PATH"
python3 scripts/fdroid_metadata.py dist/page.onram.wirevpn.apk > dist/page.onram.wirevpn.metadata
python3 -c "
import hashlib, base64
d = open('dist/page.onram.wirevpn.apk', 'rb').read()
sig = base64.b64encode(hashlib.sha256(hashlib.sha256(d).digest()).digest()).decode()
open('dist/page.onram.wirevpn.signature', 'w').write(f'256;{sig}\n')
"
echo "--- metadata ---"
cat dist/page.onram.wirevpn.metadata
echo "--- signature ---"
cat dist/page.onram.wirevpn.signature
- name: Attach artifacts to the Gitea release
env:
GITEA_API: https://git.obahan.xyz/api/v1
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN || github.token }}
REPO: frank/wirevpn
run: |
set -e
tag="${GITHUB_REF#refs/tags/}"
[ -n "$tag" ] || tag="latest"
# Find or create the release
rid=$(curl -fsSL -H "Authorization: token $GITEA_TOKEN" "$GITEA_API/repos/$REPO/releases/tags/$tag" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])' 2>/dev/null || true)
if [ -z "$rid" ]; then
rid=$(curl -fsSL -H "Authorization: token $GITEA_TOKEN" -H "Content-Type: application/json" \
-d "{\"name\":\"$tag\",\"tag_name\":\"$tag\",\"target\":\"main\"}" \
"$GITEA_API/repos/$REPO/releases" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
fi
for f in dist/page.onram.wirevpn.apk dist/page.onram.wirevpn.metadata dist/page.onram.wirevpn.signature; do
curl -fsSL -H "Authorization: token $GITEA_TOKEN" \
-F "file=@$f" \
"$GITEA_API/repos/$REPO/releases/$rid/assets"
echo "uploaded $f"
done
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: fdroid-bundle
path: dist/
+49
View File
@@ -0,0 +1,49 @@
# Wire VPN for Android — Third-Party Components & Licences
Wire VPN is a fork of [WireGuard for Android](https://git.zx2c4.com/wireguard-android/about/).
This file lists the components shipped inside the APK and their licences.
## Shipped in the APK
| Component | Where | Licence |
|---|---|---|
| App code (`ui`) | `ui/src` | Apache-2.0 |
| Tunnel library (`tunnel`) | `tunnel/src` | Apache-2.0 |
| Userspace WireGuard (`golang.zx2c4.com/wireguard`, compiled into `libwg-go.so`) | `tunnel/tools/libwg-go` + Go module | MIT (per `LICENSE` of the Go module; every `.go` file is SPDX `MIT`) |
| gVisor / netstack (`gvisor.dev/gvisor`, Go dependency of the module, compiled into `libwg-go.so`) | Go module dep | Apache-2.0 |
| Go standard libraries | Go module dep | BSD-3-Clause |
| `golang.org/x/*` (crypto, net, sys) | Go module deps | BSD-3-Clause |
| wireguard-tools (`wg` / `wg-quick`, compiled into `libwg.so`, `libwg-quick.so`) | `tunnel/tools/wireguard-tools` | GPL-2.0-only OR MIT (each file `SPDX-License-Identifier: GPL-2.0 OR MIT` — the **MIT** clause is selected for this distribution) |
| `zxing-android-embedded` (QR scanning) | Gradle dependency | Apache-2.0 |
| AndroidX, Material, Kotlin coroutines | Gradle dependencies | Apache-2.0 |
Full licence texts:
- Apache-2.0: [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) (also `COPYING`)
- MIT: see `golang.zx2c4.com/wireguard` module `LICENSE`
- BSD-3-Clause: [https://opensource.org/license/bsd-3-clause](https://opensource.org/license/bsd-3-clause)
- wireguard-tools GPL-2.0 OR MIT: [https://git.zx2c4.com/wireguard-tools/about](https://git.zx2c4.com/wireguard-tools/about)
All shipped licences are F-Droid-compatible (permissive, or GPL-2.0/MIT dual where
the MIT clause is elected).
## Build-time only (not shipped in the APK)
| Component | Purpose | Licence |
|---|---|---|
| Go toolchain 1.24.3 | compiles `libwg-go.so` | BSD-3-Clause |
| `termux-elf-cleaner` (`tunnel/tools/elf-cleaner`) | strips ELF debug sections from `libwg.so`/`libwg-quick.so` at build time | GPL-3.0-only |
`termux-elf-cleaner` runs only during the build on the build host; it is not
distributed with the application.
## Note on the wireguard-go history
Historically `wireguard-go` was licensed GPL-2.0. The current upstream Go module
(`golang.zx2c4.com/wireguard`), which this project builds, is licensed MIT, and
every source file in the pinned module revision is marked `SPDX-License-Identifier: MIT`.
## Not affiliated
This project is an independent fork. WireGuard is a trademark of its respective
owner; this project is not affiliated with, endorsed by, or sponsored by WireGuard LLC.
+33 -23
View File
@@ -1,40 +1,50 @@
# Android GUI for [WireGuard](https://www.wireguard.com/)
# Wire VPN for Android
**[Download from the Play Store](https://play.google.com/store/apps/details?id=com.wireguard.android)**
**A fork of [WireGuard for Android](https://git.zx2c4.com/wireguard-android/about/), rebranded as Wire VPN.**
This is an Android GUI for [WireGuard](https://www.wireguard.com/). It [opportunistically uses the kernel implementation](https://git.zx2c4.com/android_kernel_wireguard/about/), and falls back to using the non-root [userspace implementation](https://git.zx2c4.com/wireguard-go/about/).
Package: `page.onram.wirevpn` · Available from our [F-Droid repository](https://git.obahan.xyz/frank/wirevpn) on release.
Wire VPN is an Android GUI for [WireGuard](https://www.wireguard.com/). It [opportunistically uses the kernel implementation](https://git.zx2c4.com/android_kernel_wireguard/about/), and falls back to using the non-root [userspace implementation](https://git.zx2c4.com/wireguard-go/about/).
## What changed from upstream
- App name rebranded from *WireGuard* to *Wire VPN*
- New launcher icon (padlock with a bold W in a circle)
- Application ID changed to `page.onram.wirevpn` (Java/Kotlin package is `page.onram.wirevpn`)
- GitHub Actions pipeline: every new Git release automatically builds a signed release APK and produces F-Droid v2 repository artifacts
- Upstream in-app auto-updater and donation links removed (we distribute via our own F-Droid repo)
## Building
```
$ git clone --recurse-submodules https://git.zx2c4.com/wireguard-android
$ cd wireguard-android
$ git clone --recurse-submodules https://git.obahan.xyz/frank/wirevpn.git
$ cd wirevpn
$ ./gradlew assembleRelease
```
macOS users may need [flock(1)](https://github.com/discoteq/flock).
The build compiles the tunnel backend natively (CMake + NDK) and the userspace
WireGuard implementation in Go (Go 1.24.3 is fetched and hash-checked by the
build automatically).
## Embedding
The tunnel library is [on Maven Central](https://search.maven.org/artifact/com.wireguard.android/tunnel), alongside [extensive class library documentation](https://javadoc.io/doc/com.wireguard.android/tunnel).
To sign with a keystore, export:
```
implementation 'com.wireguard.android:tunnel:$wireguardTunnelVersion'
export KEYSTORE_FILE=/path/to/keystore.jks
export KEYSTORE_PASSWORD=...
export KEY_ALIAS=...
export KEY_PASSWORD=...
```
The library makes use of Java 8 features, so be sure to support those in your gradle configuration with [desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring):
```
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
coreLibraryDesugaringEnabled = true
}
dependencies {
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.3"
}
```
Releases are cut by creating a Git tag/release on `main` (e.g. `v1.0.x`); the
`release.yml` GitHub Action builds and publishes the artifacts.
## Translating
Please help us translate the app into several languages on [our translation platform](https://crowdin.com/project/WireGuard).
This project uses [Crowdin](https://crowdin.com) upstream; translations in
`ui/src/main/res/values-*/` are carried over from the WireGuard project.
## Licences
See [NOTICE.md](NOTICE.md) for the full list. The app code is
[Apache-2.0](COPYING). This project is a fork of the WireGuard Android app and
is not affiliated with WireGuard LLC.
+3 -3
View File
@@ -1,6 +1,6 @@
wireguardVersionCode=519
wireguardVersionName=1.0.20260315
wireguardPackageName=com.wireguard.android
wireguardVersionCode=520
wireguardVersionName=1.0.20260910
wireguardPackageName=page.onram.wirevpn
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
+57
View File
@@ -0,0 +1,57 @@
#!/usr/bin/env python3
"""Generate F-Droid v2 metadata for a signed APK.
Usage: fdroid_metadata.py <path-to-apk>
Prints the F-Droid metadata lines to stdout. The workflow separately computes
the F-Droid signature (base64 of double SHA-256).
"""
import hashlib
import re
import shutil
import subprocess
import sys
def main():
apk = sys.argv[1]
with open(apk, "rb") as f:
data = f.read()
sha256 = hashlib.sha256(data).hexdigest()
aapt2 = shutil.which("aapt2")
if aapt2 is None:
sys.exit("aapt2 not found on PATH; add the Android build-tools dir to PATH")
dump = subprocess.run([aapt2, "dump", "badging", apk], check=True,
capture_output=True, text=True).stdout
m_pkg = re.search(r"package: name='([^']+)'", dump)
m_ver = re.search(r"versionName='([^']+)'", dump)
m_code = re.search(r"versionCode='(\d+)'", dump)
if not (m_pkg and m_ver and m_code):
sys.exit(f"could not parse APK badging:\n{dump[:2000]}")
pkg = m_pkg.group(1)
ver = m_ver.group(1)
code = int(m_code.group(1))
lines = [
f"VersionName: {ver}",
f"VersionCode: {code}",
"MinSdkVersion: 24",
"TargetSdkVersion: 36",
"Permissions:",
" android.permission.INTERNET",
" android.permission.CAMERA",
" android.permission.RECEIVE_BOOT_COMPLETED",
" android.permission.REQUEST_INSTALL_PACKAGES",
" android.permission.SYSTEM_ALERT_WINDOW",
" android.permission.WRITE_EXTERNAL_STORAGE",
f"UpdateUrl: https://git.obahan.xyz/frank/wirevpn/releases",
f"Sha256Digest: {sha256}",
f"AndroidPackageInfoName: {pkg}",
]
print("\n".join(lines))
if __name__ == "__main__":
main()
+1 -1
View File
@@ -16,7 +16,7 @@ dependencyResolutionManagement {
}
}
rootProject.name = "wireguard-android"
rootProject.name = "wire-vpn"
include(":tunnel")
include(":ui")
+10 -16
View File
@@ -8,7 +8,6 @@ val pkg: String = providers.gradleProperty("wireguardPackageName").get()
plugins {
alias(libs.plugins.android.library)
`maven-publish`
signing
}
android {
@@ -83,9 +82,9 @@ publishing {
from(components["release"])
}
pom {
name = "WireGuard Tunnel Library"
description = "Embeddable tunnel library for WireGuard for Android"
url = "https://www.wireguard.com/"
name = "Wire VPN Tunnel Library"
description = "Embeddable tunnel library for Wire VPN for Android"
url = "https://git.obahan.xyz/frank/wirevpn"
licenses {
license {
@@ -95,18 +94,18 @@ publishing {
}
}
scm {
connection = "scm:git:https://git.zx2c4.com/wireguard-android"
developerConnection = "scm:git:https://git.zx2c4.com/wireguard-android"
url = "https://git.zx2c4.com/wireguard-android"
connection = "scm:git:https://git.obahan.xyz/frank/wirevpn.git"
developerConnection = "scm:git:https://git.obahan.xyz/frank/wirevpn.git"
url = "https://git.obahan.xyz/frank/wirevpn"
}
developers {
organization {
name = "WireGuard"
url = "https://www.wireguard.com/"
name = "Wire VPN"
url = "https://git.obahan.xyz/frank/wirevpn"
}
developer {
name = "WireGuard"
email = "team@wireguard.com"
name = "Wire VPN"
email = "frank@onram.page"
}
}
}
@@ -136,8 +135,3 @@ tasks.register<Zip>("zipReleasePublication") {
destinationDirectory.set(layout.buildDirectory.dir("distributions"))
into("${mavenGroupPath}/${mavenArtifactId}/${mavenVersion}")
}
signing {
useGpgCmd()
sign(publishing.publications)
}
+1 -1
View File
@@ -7,7 +7,7 @@
<application>
<service
android:name="com.wireguard.android.backend.GoBackend$VpnService"
android:name="page.onram.wirevpn.backend.GoBackend$VpnService"
android:permission="android.permission.BIND_VPN_SERVICE"
android:exported="false">
<intent-filter>
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.backend;
package page.onram.wirevpn.backend;
import com.wireguard.config.Config;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.config.Config;
import page.onram.wirevpn.util.NonNullForAll;
import java.util.Set;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.backend;
package page.onram.wirevpn.backend;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
/**
* A subclass of {@link Exception} that encapsulates the reasons for a failure originating in
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.backend;
package page.onram.wirevpn.backend;
import android.content.Context;
import android.content.Intent;
@@ -12,16 +12,16 @@ import android.os.ParcelFileDescriptor;
import android.system.OsConstants;
import android.util.Log;
import com.wireguard.android.backend.BackendException.Reason;
import com.wireguard.android.backend.Tunnel.State;
import com.wireguard.android.util.SharedLibraryLoader;
import com.wireguard.config.Config;
import com.wireguard.config.InetEndpoint;
import com.wireguard.config.InetNetwork;
import com.wireguard.config.Peer;
import com.wireguard.crypto.Key;
import com.wireguard.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.backend.BackendException.Reason;
import page.onram.wirevpn.backend.Tunnel.State;
import page.onram.wirevpn.util.SharedLibraryLoader;
import page.onram.wirevpn.config.Config;
import page.onram.wirevpn.config.InetEndpoint;
import page.onram.wirevpn.config.InetNetwork;
import page.onram.wirevpn.config.Peer;
import page.onram.wirevpn.crypto.Key;
import page.onram.wirevpn.crypto.KeyFormatException;
import page.onram.wirevpn.util.NonNullForAll;
import java.net.InetAddress;
import java.util.Collections;
@@ -3,12 +3,12 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.backend;
package page.onram.wirevpn.backend;
import android.os.SystemClock;
import com.wireguard.crypto.Key;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.crypto.Key;
import page.onram.wirevpn.util.NonNullForAll;
import java.util.HashMap;
import java.util.Map;
@@ -32,11 +32,11 @@ public class Statistics {
* Add a peer and its current stats to the internal map.
*
* @param key A WireGuard public key bound to a particular peer
* @param rxBytes The received traffic for the {@link com.wireguard.config.Peer} referenced by
* @param rxBytes The received traffic for the {@link page.onram.wirevpn.config.Peer} referenced by
* the provided {@link Key}. This value is in bytes
* @param txBytes The transmitted traffic for the {@link com.wireguard.config.Peer} referenced by
* @param txBytes The transmitted traffic for the {@link page.onram.wirevpn.config.Peer} referenced by
* the provided {@link Key}. This value is in bytes.
* @param latestHandshake The timestamp of the latest handshake for the {@link com.wireguard.config.Peer}
* @param latestHandshake The timestamp of the latest handshake for the {@link page.onram.wirevpn.config.Peer}
* referenced by the provided {@link Key}. The value is in epoch milliseconds.
*/
void add(final Key key, final long rxBytes, final long txBytes, final long latestHandshake) {
@@ -54,9 +54,9 @@ public class Statistics {
}
/**
* Get the statistics for the {@link com.wireguard.config.Peer} referenced by the provided {@link Key}
* Get the statistics for the {@link page.onram.wirevpn.config.Peer} referenced by the provided {@link Key}
*
* @param peer A {@link Key} representing a {@link com.wireguard.config.Peer}.
* @param peer A {@link Key} representing a {@link page.onram.wirevpn.config.Peer}.
* @return a {@link PeerStats} representing various statistics about this peer.
*/
@Nullable
@@ -68,7 +68,7 @@ public class Statistics {
* Get the list of peers being tracked by this instance.
*
* @return An array of {@link Key} instances representing WireGuard
* {@link com.wireguard.config.Peer}s
* {@link page.onram.wirevpn.config.Peer}s
*/
public Key[] peers() {
return stats.keySet().toArray(new Key[0]);
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.backend;
package page.onram.wirevpn.backend;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.util.regex.Pattern;
@@ -3,19 +3,19 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.backend;
package page.onram.wirevpn.backend;
import android.content.Context;
import android.util.Log;
import android.util.Pair;
import com.wireguard.android.backend.BackendException.Reason;
import com.wireguard.android.backend.Tunnel.State;
import com.wireguard.android.util.RootShell;
import com.wireguard.android.util.ToolsInstaller;
import com.wireguard.config.Config;
import com.wireguard.crypto.Key;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.backend.BackendException.Reason;
import page.onram.wirevpn.backend.Tunnel.State;
import page.onram.wirevpn.util.RootShell;
import page.onram.wirevpn.util.ToolsInstaller;
import page.onram.wirevpn.config.Config;
import page.onram.wirevpn.crypto.Key;
import page.onram.wirevpn.util.NonNullForAll;
import java.io.File;
import java.io.FileOutputStream;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.util.Iterator;
import java.util.Optional;
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.crypto.KeyFormatException;
import page.onram.wirevpn.util.NonNullForAll;
import androidx.annotation.Nullable;
@@ -3,12 +3,12 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.config.BadConfigException.Location;
import page.onram.wirevpn.config.BadConfigException.Reason;
import page.onram.wirevpn.config.BadConfigException.Section;
import page.onram.wirevpn.util.NonNullForAll;
import java.io.BufferedReader;
import java.io.IOException;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.lang.reflect.Method;
import java.net.Inet4Address;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.net.Inet4Address;
import java.net.InetAddress;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.net.Inet4Address;
import java.net.InetAddress;
@@ -3,15 +3,15 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section;
import com.wireguard.crypto.Key;
import com.wireguard.crypto.KeyFormatException;
import com.wireguard.crypto.KeyPair;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.config.BadConfigException.Location;
import page.onram.wirevpn.config.BadConfigException.Reason;
import page.onram.wirevpn.config.BadConfigException.Section;
import page.onram.wirevpn.crypto.Key;
import page.onram.wirevpn.crypto.KeyFormatException;
import page.onram.wirevpn.crypto.KeyPair;
import page.onram.wirevpn.util.NonNullForAll;
import java.net.InetAddress;
import java.util.Collection;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import androidx.annotation.Nullable;
@@ -3,14 +3,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section;
import com.wireguard.crypto.Key;
import com.wireguard.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.config.BadConfigException.Location;
import page.onram.wirevpn.config.BadConfigException.Reason;
import page.onram.wirevpn.config.BadConfigException.Section;
import page.onram.wirevpn.crypto.Key;
import page.onram.wirevpn.crypto.KeyFormatException;
import page.onram.wirevpn.util.NonNullForAll;
import java.util.Collection;
import java.util.Collections;
@@ -4,9 +4,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.crypto;
package page.onram.wirevpn.crypto;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.util.Arrays;
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.crypto;
package page.onram.wirevpn.crypto;
import com.wireguard.crypto.KeyFormatException.Type;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.crypto.KeyFormatException.Type;
import page.onram.wirevpn.util.NonNullForAll;
import java.security.MessageDigest;
import java.security.SecureRandom;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.crypto;
package page.onram.wirevpn.crypto;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
/**
* An exception thrown when attempting to parse an invalid key (too short, too long, or byte
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.crypto;
package page.onram.wirevpn.crypto;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
/**
* Represents a Curve25519 key pair as used by WireGuard.
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.util;
package page.onram.wirevpn.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util;
package page.onram.wirevpn.util;
import android.content.Context;
import android.util.Log;
import com.wireguard.android.util.RootShell.RootShellException.Reason;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.RootShell.RootShellException.Reason;
import page.onram.wirevpn.util.NonNullForAll;
import java.io.BufferedReader;
import java.io.File;
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util;
package page.onram.wirevpn.util;
import android.content.Context;
import android.os.Build;
import android.util.Log;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.NonNullForAll;
import java.io.File;
import java.io.FileOutputStream;
@@ -3,14 +3,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util;
package page.onram.wirevpn.util;
import android.content.Context;
import android.system.OsConstants;
import android.util.Log;
import com.wireguard.android.util.RootShell.RootShellException;
import com.wireguard.util.NonNullForAll;
import page.onram.wirevpn.util.RootShell.RootShellException;
import page.onram.wirevpn.util.NonNullForAll;
import java.io.File;
import java.io.FileNotFoundException;
@@ -134,7 +134,7 @@ public final class ToolsInstaller {
@RestrictTo(Scope.LIBRARY_GROUP)
public int install() throws RootShellException, IOException {
if (!context.getPackageName().startsWith("com.wireguard."))
if (!context.getPackageName().startsWith("page.onram.wirevpn."))
throw new SecurityException("The tools may only be installed system-wide from the main WireGuard app.");
return willInstallAsMagiskModule() ? installMagisk() : installSystem();
}
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section;
import page.onram.wirevpn.config.BadConfigException.Location;
import page.onram.wirevpn.config.BadConfigException.Reason;
import page.onram.wirevpn.config.BadConfigException.Section;
import org.junit.AfterClass;
import org.junit.BeforeClass;
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.config;
package page.onram.wirevpn.config;
import org.junit.Test;
+21
View File
@@ -7,6 +7,13 @@ plugins {
alias(libs.plugins.legacy.kapt)
}
val signingKeystoreFile: String? = providers.environmentVariable("KEYSTORE_FILE").orNull
val releaseSigningEnabled =
signingKeystoreFile != null &&
providers.environmentVariable("KEYSTORE_PASSWORD").orNull != null &&
providers.environmentVariable("KEY_ALIAS").orNull != null &&
providers.environmentVariable("KEY_PASSWORD").orNull != null
android {
compileSdk = 36
buildFeatures {
@@ -15,6 +22,17 @@ android {
viewBinding = true
}
namespace = pkg
signingConfigs {
if (releaseSigningEnabled) {
val storeFileRef = requireNotNull(signingKeystoreFile)
create("release") {
storeFile = file(storeFileRef)
storePassword = providers.environmentVariable("KEYSTORE_PASSWORD").get()
keyAlias = providers.environmentVariable("KEY_ALIAS").get()
keyPassword = providers.environmentVariable("KEY_PASSWORD").get()
}
}
}
defaultConfig {
applicationId = pkg
minSdk = 24
@@ -32,6 +50,9 @@ android {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles("proguard-android-optimize.txt")
if (releaseSigningEnabled) {
signingConfig = signingConfigs.getByName("release")
}
packaging {
resources {
excludes += "DebugProbesKt.bin"
+3 -3
View File
@@ -130,9 +130,9 @@
android:exported="true"
android:permission="${applicationId}.permission.CONTROL_TUNNELS">
<intent-filter>
<action android:name="com.wireguard.android.action.REFRESH_TUNNEL_STATES" />
<action android:name="com.wireguard.android.action.SET_TUNNEL_UP" />
<action android:name="com.wireguard.android.action.SET_TUNNEL_DOWN" />
<action android:name="page.onram.wirevpn.action.REFRESH_TUNNEL_STATES" />
<action android:name="page.onram.wirevpn.action.SET_TUNNEL_UP" />
<action android:name="page.onram.wirevpn.action.SET_TUNNEL_DOWN" />
</intent-filter>
</receiver>
@@ -1,43 +0,0 @@
/*
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.util.AttributeSet
import android.widget.Toast
import androidx.preference.Preference
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.wireguard.android.R
import com.wireguard.android.updater.Updater
import com.wireguard.android.util.ErrorMessages
import androidx.core.net.toUri
class DonatePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
override fun getSummary() = context.getString(R.string.donate_summary)
override fun getTitle() = context.getString(R.string.donate_title)
override fun onClick() {
/* Google Play Store forbids links to our donation page. */
if (Updater.installerIsGooglePlay(context)) {
MaterialAlertDialogBuilder(context)
.setTitle(R.string.donate_title)
.setMessage(R.string.donate_google_play_disappointment)
.show()
return
}
val intent = Intent(Intent.ACTION_VIEW)
intent.data = "https://www.wireguard.com/donations/".toUri()
try {
context.startActivity(intent)
} catch (e: Throwable) {
Toast.makeText(context, ErrorMessages[e], Toast.LENGTH_SHORT).show()
}
}
}
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android
package page.onram.wirevpn
import android.content.Context
import android.content.Intent
@@ -17,16 +17,16 @@ import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStoreFile
import com.google.android.material.color.DynamicColors
import com.wireguard.android.backend.Backend
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.configStore.FileConfigStore
import com.wireguard.android.model.TunnelManager
import com.wireguard.android.updater.Updater
import com.wireguard.android.util.RootShell
import com.wireguard.android.util.ToolsInstaller
import com.wireguard.android.util.UserKnobs
import com.wireguard.android.util.applicationScope
import page.onram.wirevpn.backend.Backend
import page.onram.wirevpn.backend.GoBackend
import page.onram.wirevpn.backend.WgQuickBackend
import page.onram.wirevpn.configStore.FileConfigStore
import page.onram.wirevpn.model.TunnelManager
import page.onram.wirevpn.updater.Updater
import page.onram.wirevpn.util.RootShell
import page.onram.wirevpn.util.ToolsInstaller
import page.onram.wirevpn.util.UserKnobs
import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -2,14 +2,14 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android
package page.onram.wirevpn
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.util.applicationScope
import page.onram.wirevpn.backend.WgQuickBackend
import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.launch
class BootShutdownReceiver : BroadcastReceiver() {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android
package page.onram.wirevpn
import android.app.PendingIntent
import android.content.Intent
@@ -19,12 +19,12 @@ import android.util.Log
import androidx.annotation.RequiresApi
import androidx.databinding.Observable
import androidx.databinding.Observable.OnPropertyChangedCallback
import com.wireguard.android.activity.MainActivity
import com.wireguard.android.activity.TunnelToggleActivity
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.applicationScope
import com.wireguard.android.widget.SlashDrawable
import page.onram.wirevpn.activity.MainActivity
import page.onram.wirevpn.activity.TunnelToggleActivity
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.util.applicationScope
import page.onram.wirevpn.widget.SlashDrawable
import kotlinx.coroutines.launch
/**
@@ -2,15 +2,15 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.CallbackRegistry
import androidx.databinding.CallbackRegistry.NotifierCallback
import androidx.lifecycle.lifecycleScope
import com.wireguard.android.Application
import com.wireguard.android.model.ObservableTunnel
import page.onram.wirevpn.Application
import page.onram.wirevpn.model.ObservableTunnel
import kotlinx.coroutines.launch
/**
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.content.ClipDescription.compareMimeTypes
import android.content.ContentProvider
@@ -36,13 +36,13 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textview.MaterialTextView
import com.wireguard.android.BuildConfig
import com.wireguard.android.R
import com.wireguard.android.databinding.LogViewerActivityBinding
import com.wireguard.android.util.DownloadsFileSaver
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.resolveAttribute
import com.wireguard.crypto.KeyPair
import page.onram.wirevpn.BuildConfig
import page.onram.wirevpn.R
import page.onram.wirevpn.databinding.LogViewerActivityBinding
import page.onram.wirevpn.util.DownloadsFileSaver
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.resolveAttribute
import page.onram.wirevpn.crypto.KeyPair
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.content.Intent
import android.os.Bundle
@@ -15,10 +15,10 @@ import androidx.appcompat.app.ActionBar
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.commit
import com.wireguard.android.R
import com.wireguard.android.fragment.TunnelDetailFragment
import com.wireguard.android.fragment.TunnelEditorFragment
import com.wireguard.android.model.ObservableTunnel
import page.onram.wirevpn.R
import page.onram.wirevpn.fragment.TunnelDetailFragment
import page.onram.wirevpn.fragment.TunnelEditorFragment
import page.onram.wirevpn.model.ObservableTunnel
/**
* CRUD interface for WireGuard tunnels. This activity serves as the main entry point to the
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.content.Intent
import android.os.Build
@@ -16,12 +16,12 @@ import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.wireguard.android.Application
import com.wireguard.android.QuickTileService
import com.wireguard.android.R
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.preference.PreferencesPreferenceDataStore
import com.wireguard.android.util.AdminKnobs
import page.onram.wirevpn.Application
import page.onram.wirevpn.QuickTileService
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.WgQuickBackend
import page.onram.wirevpn.preference.PreferencesPreferenceDataStore
import page.onram.wirevpn.util.AdminKnobs
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -2,11 +2,11 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.os.Bundle
import com.wireguard.android.R
import com.wireguard.android.model.ObservableTunnel
import page.onram.wirevpn.R
import page.onram.wirevpn.model.ObservableTunnel
/**
* Standalone activity for creating tunnels.
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.content.ComponentName
import android.os.Build
@@ -14,12 +14,12 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.wireguard.android.Application
import com.wireguard.android.QuickTileService
import com.wireguard.android.R
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.util.ErrorMessages
import page.onram.wirevpn.Application
import page.onram.wirevpn.QuickTileService
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.GoBackend
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.util.ErrorMessages
import kotlinx.coroutines.launch
class TunnelToggleActivity : AppCompatActivity() {
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.activity
package page.onram.wirevpn.activity
import android.Manifest
import android.content.ActivityNotFoundException
@@ -34,22 +34,22 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.databinding.Keyed
import com.wireguard.android.databinding.ObservableKeyedArrayList
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter
import com.wireguard.android.databinding.TvActivityBinding
import com.wireguard.android.databinding.TvFileListItemBinding
import com.wireguard.android.databinding.TvTunnelListItemBinding
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.QuantityFormatter
import com.wireguard.android.util.TunnelImporter
import com.wireguard.android.util.UserKnobs
import com.wireguard.android.util.applicationScope
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.GoBackend
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.databinding.Keyed
import page.onram.wirevpn.databinding.ObservableKeyedArrayList
import page.onram.wirevpn.databinding.ObservableKeyedRecyclerViewAdapter
import page.onram.wirevpn.databinding.TvActivityBinding
import page.onram.wirevpn.databinding.TvFileListItemBinding
import page.onram.wirevpn.databinding.TvTunnelListItemBinding
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.QuantityFormatter
import page.onram.wirevpn.util.TunnelImporter
import page.onram.wirevpn.util.UserKnobs
import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -2,9 +2,9 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.configStore
package page.onram.wirevpn.configStore
import com.wireguard.config.Config
import page.onram.wirevpn.config.Config
/**
* Interface for persistent storage providers for WireGuard configurations.
@@ -2,13 +2,13 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.configStore
package page.onram.wirevpn.configStore
import android.content.Context
import android.util.Log
import com.wireguard.android.R
import com.wireguard.config.BadConfigException
import com.wireguard.config.Config
import page.onram.wirevpn.R
import page.onram.wirevpn.config.BadConfigException
import page.onram.wirevpn.config.Config
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.databinding
package page.onram.wirevpn.databinding
import android.text.InputFilter
import android.view.LayoutInflater
@@ -18,14 +18,14 @@ import androidx.databinding.adapters.ListenerUtil
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.wireguard.android.BR
import com.wireguard.android.R
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
import com.wireguard.android.widget.ToggleSwitch
import com.wireguard.android.widget.ToggleSwitch.OnBeforeCheckedChangeListener
import com.wireguard.android.widget.TvCardView
import com.wireguard.config.Attribute
import com.wireguard.config.InetNetwork
import page.onram.wirevpn.BR
import page.onram.wirevpn.R
import page.onram.wirevpn.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
import page.onram.wirevpn.widget.ToggleSwitch
import page.onram.wirevpn.widget.ToggleSwitch.OnBeforeCheckedChangeListener
import page.onram.wirevpn.widget.TvCardView
import page.onram.wirevpn.config.Attribute
import page.onram.wirevpn.config.InetNetwork
import java.net.InetAddress
import java.util.Optional
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.databinding
package page.onram.wirevpn.databinding
import android.view.LayoutInflater
import android.view.View
@@ -11,7 +11,7 @@ import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableList
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import com.wireguard.android.BR
import page.onram.wirevpn.BR
import java.lang.ref.WeakReference
/**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.databinding
package page.onram.wirevpn.databinding
/**
* Interface for objects that have a identifying key of the given type.
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.databinding
package page.onram.wirevpn.databinding
import androidx.databinding.ObservableArrayList
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.databinding
package page.onram.wirevpn.databinding
import android.content.Context
import android.view.LayoutInflater
@@ -11,7 +11,7 @@ import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableList
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import com.wireguard.android.BR
import page.onram.wirevpn.BR
import java.lang.ref.WeakReference
/**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.databinding
package page.onram.wirevpn.databinding
import java.util.AbstractList
import java.util.Collections
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.content.pm.PackageManager
import android.graphics.drawable.GradientDrawable
@@ -16,8 +16,8 @@ import androidx.fragment.app.setFragmentResult
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.wireguard.android.R
import com.wireguard.android.util.resolveAttribute
import page.onram.wirevpn.R
import page.onram.wirevpn.util.resolveAttribute
class AddTunnelsSheet : BottomSheetDialogFragment() {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.Manifest
import android.app.Dialog
@@ -20,12 +20,12 @@ import androidx.fragment.app.setFragmentResult
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout
import com.wireguard.android.BR
import com.wireguard.android.R
import com.wireguard.android.databinding.AppListDialogFragmentBinding
import com.wireguard.android.databinding.ObservableKeyedArrayList
import com.wireguard.android.model.ApplicationData
import com.wireguard.android.util.ErrorMessages
import page.onram.wirevpn.BR
import page.onram.wirevpn.R
import page.onram.wirevpn.databinding.AppListDialogFragmentBinding
import page.onram.wirevpn.databinding.ObservableKeyedArrayList
import page.onram.wirevpn.model.ApplicationData
import page.onram.wirevpn.util.ErrorMessages
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.content.Context
import android.util.Log
@@ -14,16 +14,16 @@ import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.activity.BaseActivity
import com.wireguard.android.activity.BaseActivity.OnSelectedTunnelChangedListener
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.databinding.TunnelDetailFragmentBinding
import com.wireguard.android.databinding.TunnelListItemBinding
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.ErrorMessages
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.activity.BaseActivity
import page.onram.wirevpn.activity.BaseActivity.OnSelectedTunnelChangedListener
import page.onram.wirevpn.backend.GoBackend
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.databinding.TunnelDetailFragmentBinding
import page.onram.wirevpn.databinding.TunnelListItemBinding
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.util.ErrorMessages
import kotlinx.coroutines.launch
/**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.app.Dialog
import android.os.Bundle
@@ -10,11 +10,11 @@ import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.databinding.ConfigNamingDialogFragmentBinding
import com.wireguard.config.BadConfigException
import com.wireguard.config.Config
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.databinding.ConfigNamingDialogFragmentBinding
import page.onram.wirevpn.config.BadConfigException
import page.onram.wirevpn.config.Config
import kotlinx.coroutines.launch
import java.io.ByteArrayInputStream
import java.io.IOException
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.os.Bundle
import android.view.LayoutInflater
@@ -15,12 +15,12 @@ import androidx.core.view.MenuProvider
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import com.wireguard.android.R
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.databinding.TunnelDetailFragmentBinding
import com.wireguard.android.databinding.TunnelDetailPeerBinding
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.QuantityFormatter
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.databinding.TunnelDetailFragmentBinding
import page.onram.wirevpn.databinding.TunnelDetailPeerBinding
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.util.QuantityFormatter
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.content.Context
import android.os.Bundle
@@ -23,16 +23,16 @@ import androidx.core.view.MenuProvider
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.databinding.TunnelEditorFragmentBinding
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.BiometricAuthenticator
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.viewmodel.ConfigProxy
import com.wireguard.config.Config
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.databinding.TunnelEditorFragmentBinding
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.util.AdminKnobs
import page.onram.wirevpn.util.BiometricAuthenticator
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.viewmodel.ConfigProxy
import page.onram.wirevpn.config.Config
import kotlinx.coroutines.launch
/**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.fragment
package page.onram.wirevpn.fragment
import android.content.Intent
import android.content.res.Resources
@@ -26,18 +26,18 @@ import com.google.android.material.snackbar.Snackbar
import com.google.zxing.qrcode.QRCodeReader
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.activity.TunnelCreatorActivity
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
import com.wireguard.android.databinding.TunnelListFragmentBinding
import com.wireguard.android.databinding.TunnelListItemBinding
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.updater.SnackbarUpdateShower
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.QrCodeFromFileScanner
import com.wireguard.android.util.TunnelImporter
import com.wireguard.android.widget.MultiselectableRelativeLayout
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.activity.TunnelCreatorActivity
import page.onram.wirevpn.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
import page.onram.wirevpn.databinding.TunnelListFragmentBinding
import page.onram.wirevpn.databinding.TunnelListItemBinding
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.updater.SnackbarUpdateShower
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.QrCodeFromFileScanner
import page.onram.wirevpn.util.TunnelImporter
import page.onram.wirevpn.widget.MultiselectableRelativeLayout
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
@@ -2,13 +2,13 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.model
package page.onram.wirevpn.model
import android.graphics.drawable.Drawable
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import com.wireguard.android.BR
import com.wireguard.android.databinding.Keyed
import page.onram.wirevpn.BR
import page.onram.wirevpn.databinding.Keyed
class ApplicationData(val icon: Drawable, val name: String, val packageName: String, isSelected: Boolean) : BaseObservable(), Keyed<String> {
override val key = name
@@ -2,17 +2,17 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.model
package page.onram.wirevpn.model
import android.util.Log
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import com.wireguard.android.BR
import com.wireguard.android.backend.Statistics
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.databinding.Keyed
import com.wireguard.android.util.applicationScope
import com.wireguard.config.Config
import page.onram.wirevpn.BR
import page.onram.wirevpn.backend.Statistics
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.databinding.Keyed
import page.onram.wirevpn.util.applicationScope
import page.onram.wirevpn.config.Config
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.model
package page.onram.wirevpn.model
object TunnelComparator : Comparator<String> {
private class NaturalSortString(originalString: String) {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.model
package page.onram.wirevpn.model
import android.content.BroadcastReceiver
import android.content.Context
@@ -12,19 +12,19 @@ import android.util.Log
import android.widget.Toast
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import com.wireguard.android.Application.Companion.get
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.Statistics
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.configStore.ConfigStore
import com.wireguard.android.databinding.ObservableSortedKeyedArrayList
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.UserKnobs
import com.wireguard.android.util.applicationScope
import com.wireguard.config.Config
import page.onram.wirevpn.Application.Companion.get
import page.onram.wirevpn.Application.Companion.getBackend
import page.onram.wirevpn.Application.Companion.getTunnelManager
import page.onram.wirevpn.BR
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.Statistics
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.configStore.ConfigStore
import page.onram.wirevpn.databinding.ObservableSortedKeyedArrayList
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.UserKnobs
import page.onram.wirevpn.util.applicationScope
import page.onram.wirevpn.config.Config
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -217,15 +217,15 @@ class TunnelManager(private val configStore: ConfigStore) : BaseObservable() {
val manager = getTunnelManager()
if (intent == null) return@launch
val action = intent.action ?: return@launch
if ("com.wireguard.android.action.REFRESH_TUNNEL_STATES" == action) {
if ("page.onram.wirevpn.action.REFRESH_TUNNEL_STATES" == action) {
manager.refreshTunnelStates()
return@launch
}
if (!UserKnobs.allowRemoteControlIntents.first())
return@launch
val state = when (action) {
"com.wireguard.android.action.SET_TUNNEL_UP" -> Tunnel.State.UP
"com.wireguard.android.action.SET_TUNNEL_DOWN" -> Tunnel.State.DOWN
"page.onram.wirevpn.action.SET_TUNNEL_UP" -> Tunnel.State.UP
"page.onram.wirevpn.action.SET_TUNNEL_DOWN" -> Tunnel.State.DOWN
else -> return@launch
}
val tunnelName = intent.getStringExtra("tunnel") ?: return@launch
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
package page.onram.wirevpn.preference
import android.content.Context
import android.content.Intent
@@ -10,14 +10,14 @@ import android.util.AttributeSet
import android.util.Log
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.activity.SettingsActivity
import com.wireguard.android.backend.Tunnel
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.util.UserKnobs
import com.wireguard.android.util.activity
import com.wireguard.android.util.lifecycleScope
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.activity.SettingsActivity
import page.onram.wirevpn.backend.Tunnel
import page.onram.wirevpn.backend.WgQuickBackend
import page.onram.wirevpn.util.UserKnobs
import page.onram.wirevpn.util.activity
import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
package page.onram.wirevpn.preference
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
package page.onram.wirevpn.preference
import android.app.StatusBarManager
import android.content.ComponentName
@@ -14,8 +14,8 @@ import android.util.AttributeSet
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.preference.Preference
import com.wireguard.android.QuickTileService
import com.wireguard.android.R
import page.onram.wirevpn.QuickTileService
import page.onram.wirevpn.R
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
class QuickTilePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
@@ -2,15 +2,15 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
package page.onram.wirevpn.preference
import android.content.Context
import android.util.AttributeSet
import androidx.preference.Preference
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.util.ToolsInstaller
import com.wireguard.android.util.lifecycleScope
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.util.ToolsInstaller
import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
package page.onram.wirevpn.preference
import android.content.Context
import android.content.Intent
@@ -10,14 +10,14 @@ import android.net.Uri
import android.util.AttributeSet
import android.widget.Toast
import androidx.preference.Preference
import com.wireguard.android.Application
import com.wireguard.android.BuildConfig
import com.wireguard.android.R
import com.wireguard.android.backend.Backend
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.lifecycleScope
import page.onram.wirevpn.Application
import page.onram.wirevpn.BuildConfig
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.Backend
import page.onram.wirevpn.backend.GoBackend
import page.onram.wirevpn.backend.WgQuickBackend
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -31,7 +31,7 @@ class VersionPreference(context: Context, attrs: AttributeSet?) : Preference(con
override fun onClick() {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.wireguard.com/")
intent.data = Uri.parse("https://git.obahan.xyz/frank/wirevpn")
try {
context.startActivity(intent)
} catch (e: Throwable) {
@@ -2,21 +2,21 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
package page.onram.wirevpn.preference
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import androidx.preference.Preference
import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.BiometricAuthenticator
import com.wireguard.android.util.DownloadsFileSaver
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.activity
import com.wireguard.android.util.lifecycleScope
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.util.AdminKnobs
import page.onram.wirevpn.util.BiometricAuthenticator
import page.onram.wirevpn.util.DownloadsFileSaver
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.activity
import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
@@ -4,7 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.updater;
package page.onram.wirevpn.updater;
import java.math.BigInteger;
import java.security.GeneralSecurityException;
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.updater
package page.onram.wirevpn.updater
import android.content.Intent
import android.net.Uri
@@ -15,9 +15,9 @@ import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.R
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.QuantityFormatter
import page.onram.wirevpn.R
import page.onram.wirevpn.util.ErrorMessages
import page.onram.wirevpn.util.QuantityFormatter
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.updater
package page.onram.wirevpn.updater
import android.Manifest
import android.app.PendingIntent
@@ -17,11 +17,11 @@ import android.util.Base64
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.core.content.IntentCompat
import com.wireguard.android.Application
import com.wireguard.android.BuildConfig
import com.wireguard.android.activity.MainActivity
import com.wireguard.android.util.UserKnobs
import com.wireguard.android.util.applicationScope
import page.onram.wirevpn.Application
import page.onram.wirevpn.BuildConfig
import page.onram.wirevpn.activity.MainActivity
import page.onram.wirevpn.util.UserKnobs
import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -46,7 +46,7 @@ import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
object Updater {
private const val TAG = "WireGuard/Updater"
private const val TAG = "WireVPN/Updater"
private const val UPDATE_URL_FMT = "https://download.wireguard.com/android-client/%s"
private const val APK_NAME_PREFIX = BuildConfig.APPLICATION_ID + "-"
private const val APK_NAME_SUFFIX = ".apk"
@@ -376,9 +376,14 @@ object Updater {
/* Hello copy and paste artist! Before you go remove these next two lines,
* I kindly ask that you actually think about what you're doing more globally,
* and instead remove this entire file from your project. Thank you very much! */
if (!context.packageName.startsWith("com.wireguard."))
if (!context.packageName.startsWith("page.onram.wirevpn."))
throw RuntimeException("Too much code got copy and pasted")
// Wire VPN is distributed via its own F-Droid repository; the upstream
// auto-updater points at the official WireGuard app and its signature,
// so it is disabled for this fork.
return
if (installerIsGooglePlay(context))
return
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.content.RestrictionsManager
import androidx.core.content.getSystemService
import com.wireguard.android.Application
import page.onram.wirevpn.Application
object AdminKnobs {
private val restrictions: RestrictionsManager? = Application.get().getSystemService()
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.os.Handler
import android.os.Looper
@@ -13,7 +13,7 @@ import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.Authenticators
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.Fragment
import com.wireguard.android.R
import page.onram.wirevpn.R
object BiometricAuthenticator {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.content.ClipData
import android.content.ClipboardManager
@@ -12,7 +12,7 @@ import android.widget.TextView
import androidx.core.content.getSystemService
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText
import com.wireguard.android.R
import page.onram.wirevpn.R
/**
* Standalone utilities for interacting with the system clipboard.
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.Manifest
import android.content.ContentValues
@@ -17,7 +17,7 @@ import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import com.wireguard.android.R
import page.onram.wirevpn.R
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -2,22 +2,22 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.content.res.Resources
import android.os.RemoteException
import com.google.zxing.ChecksumException
import com.google.zxing.NotFoundException
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.backend.BackendException
import com.wireguard.android.util.RootShell.RootShellException
import com.wireguard.config.BadConfigException
import com.wireguard.config.InetEndpoint
import com.wireguard.config.InetNetwork
import com.wireguard.config.ParseException
import com.wireguard.crypto.Key
import com.wireguard.crypto.KeyFormatException
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.backend.BackendException
import page.onram.wirevpn.util.RootShell.RootShellException
import page.onram.wirevpn.config.BadConfigException
import page.onram.wirevpn.config.InetEndpoint
import page.onram.wirevpn.config.InetNetwork
import page.onram.wirevpn.config.ParseException
import page.onram.wirevpn.crypto.Key
import page.onram.wirevpn.crypto.KeyFormatException
import java.net.InetAddress
object ErrorMessages {
@@ -3,15 +3,15 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.content.Context
import android.util.TypedValue
import androidx.annotation.AttrRes
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import com.wireguard.android.Application
import com.wireguard.android.activity.SettingsActivity
import page.onram.wirevpn.Application
import page.onram.wirevpn.activity.SettingsActivity
import kotlinx.coroutines.CoroutineScope
fun Context.resolveAttribute(@AttrRes attrRes: Int): Int {
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.content.ContentResolver
import android.graphics.Bitmap
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.icu.text.ListFormatter
import android.icu.text.MeasureFormat
@@ -11,8 +11,8 @@ import android.icu.text.RelativeDateTimeFormatter
import android.icu.util.Measure
import android.icu.util.MeasureUnit
import android.os.Build
import com.wireguard.android.Application
import com.wireguard.android.R
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import java.util.Locale
import kotlin.time.Duration.Companion.seconds
@@ -3,18 +3,18 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import android.content.ContentResolver
import android.net.Uri
import android.provider.OpenableColumns
import android.util.Log
import androidx.fragment.app.FragmentManager
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.fragment.ConfigNamingDialogFragment
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.config.Config
import page.onram.wirevpn.Application
import page.onram.wirevpn.R
import page.onram.wirevpn.fragment.ConfigNamingDialogFragment
import page.onram.wirevpn.model.ObservableTunnel
import page.onram.wirevpn.config.Config
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
package page.onram.wirevpn.util
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.core.stringSetPreferencesKey
import com.wireguard.android.Application
import page.onram.wirevpn.Application
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.viewmodel
package page.onram.wirevpn.viewmodel
import android.os.Build
import android.os.Parcel
@@ -10,9 +10,9 @@ import android.os.Parcelable
import androidx.core.os.ParcelCompat
import androidx.databinding.ObservableArrayList
import androidx.databinding.ObservableList
import com.wireguard.config.BadConfigException
import com.wireguard.config.Config
import com.wireguard.config.Peer
import page.onram.wirevpn.config.BadConfigException
import page.onram.wirevpn.config.Config
import page.onram.wirevpn.config.Peer
class ConfigProxy : Parcelable {
val `interface`: InterfaceProxy
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.viewmodel
package page.onram.wirevpn.viewmodel
import android.os.Parcel
import android.os.Parcelable
@@ -10,13 +10,13 @@ import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import androidx.databinding.ObservableArrayList
import androidx.databinding.ObservableList
import com.wireguard.android.BR
import com.wireguard.config.Attribute
import com.wireguard.config.BadConfigException
import com.wireguard.config.Interface
import com.wireguard.crypto.Key
import com.wireguard.crypto.KeyFormatException
import com.wireguard.crypto.KeyPair
import page.onram.wirevpn.BR
import page.onram.wirevpn.config.Attribute
import page.onram.wirevpn.config.BadConfigException
import page.onram.wirevpn.config.Interface
import page.onram.wirevpn.crypto.Key
import page.onram.wirevpn.crypto.KeyFormatException
import page.onram.wirevpn.crypto.KeyPair
class InterfaceProxy : BaseObservable, Parcelable {
@get:Bindable
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.viewmodel
package page.onram.wirevpn.viewmodel
import android.os.Parcel
import android.os.Parcelable
@@ -11,10 +11,10 @@ import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.databinding.Observable.OnPropertyChangedCallback
import androidx.databinding.ObservableList
import com.wireguard.android.BR
import com.wireguard.config.Attribute
import com.wireguard.config.BadConfigException
import com.wireguard.config.Peer
import page.onram.wirevpn.BR
import page.onram.wirevpn.config.Attribute
import page.onram.wirevpn.config.BadConfigException
import page.onram.wirevpn.config.Peer
import java.lang.ref.WeakReference
class PeerProxy : BaseObservable, Parcelable {
@@ -2,12 +2,12 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.widget
package page.onram.wirevpn.widget
import android.text.InputFilter
import android.text.SpannableStringBuilder
import android.text.Spanned
import com.wireguard.crypto.Key
import page.onram.wirevpn.crypto.Key
/**
* InputFilter for entering WireGuard private/public keys encoded with base64.
@@ -2,13 +2,13 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.widget
package page.onram.wirevpn.widget
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.RelativeLayout
import com.wireguard.android.R
import page.onram.wirevpn.R
class MultiselectableRelativeLayout @JvmOverloads constructor(
context: Context? = null,
@@ -2,12 +2,12 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.widget
package page.onram.wirevpn.widget
import android.text.InputFilter
import android.text.SpannableStringBuilder
import android.text.Spanned
import com.wireguard.android.backend.Tunnel
import page.onram.wirevpn.backend.Tunnel
/**
* InputFilter for entering WireGuard configuration names (Linux interface names).
@@ -3,7 +3,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.widget
package page.onram.wirevpn.widget
import android.animation.ObjectAnimator
import android.content.res.ColorStateList
@@ -3,7 +3,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.widget
package page.onram.wirevpn.widget
import android.content.Context
import android.os.Parcelable
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.widget
package page.onram.wirevpn.widget
import android.content.Context
import android.util.AttributeSet
import android.view.View
import com.google.android.material.card.MaterialCardView
import com.wireguard.android.R
import page.onram.wirevpn.R
class TvCardView(context: Context?, attrs: AttributeSet?) : MaterialCardView(context, attrs) {
var isUp: Boolean = false
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
~ SPDX-License-Identifier: Apache-2.0
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
@@ -7,32 +6,11 @@
android:height="108dp"
android:viewportWidth="2160"
android:viewportHeight="2160">
<group
android:scaleX="1"
android:scaleY="-1"
android:translateX="630"
android:translateY="1750">
<group>
<clip-path android:pathData="M0 1347.452l773.449 0L773.449 0 0 0Z" />
<group
android:translateX="349.0264"
android:translateY="572.616">
<path
android:fillColor="#ffffff"
android:pathData="M0 0c-12.169 -6.44 -21.541 -11.184 -30.71 -16.292 -37.523 -20.902 -69.603 -48.262 -95.162 -82.767 -8.264 -11.156 -13.945 -12.055 -26.528 -4.36 -163.692 100.101 -174.212 351.318 4.549 460.681 139.045 85.064 316.68 33.074 383.242 -94.85 12.614 -24.244 14.218 -61.567 6.228 -87 -27.582 -87.807 -92.71 -137.049 -182.1 -157.968 26.353 22.561 47.329 48.145 54.006 83.494 6.725 35.606 -0.388 67.807 -21.041 97.072 -31.371 44.451 -92.029 62.74 -142.721 43.492 -55.035 -20.896 -85.181 -71.123 -79.747 -132.863C-124.935 51.288 -81.419 14.12 0 0" />
</group>
<group android:translateY="285.9856">
android:fillColor="#FFFFFF"
android:pathData="M870.2 936.3A209.8 209.8 0 0 1 1289.8 936.3V1038.3H1217.0V936.3A137.0 137.0 0 0 0 943.0 936.3V1038.3H870.2Z" />
<path
android:fillColor="#ffffff"
android:pathData="M0 0C13.148 88.712 117.033 170.407 204.881 161.087 177.673 124.291 165.104 82.664 162.071 41.145 132.88 35.769 105.368 32.152 78.66 25.373 52.364 18.698 26.882 8.816 0 0" />
</group>
<group
android:translateX="580.2814"
android:translateY="1243.915">
<path
android:fillColor="#ffffff"
android:pathData="M0 0C4.917 3.762 9.98 6.922 16.085 1.891 19.557 -0.97 22.93 -3.933 27.136 -7.523 21.915 -10.28 17.676 -12.599 13.355 -14.779 7.307 -17.83 2.785 -15.792 -0.877 -10.972 -3.847 -7.062 -4.384 -3.354 0 0m71.552 -730.934c-7.403 6.401 -12.094 6.399 -20.775 0.845 -29.454 -18.844 -59.602 -36.696 -90.239 -53.556 -17.562 -9.664 -36.584 -16.675 -58.61 -26.516 7.564 -1.952 11.203 -2.865 14.829 -3.83 82.337 -21.913 126.326 -94.196 106.841 -175.157 -17.329 -71.999 -90.422 -118.033 -161.255 -105.889 -59.053 10.125 -110.601 59.161 -119.21 117.917 -9.382 64.032 22.508 125.618 79.246 151.417 31.472 14.31 63.79 26.766 95.186 41.229 35.697 16.445 74.29 29.435 105.458 52.322 77.355 56.801 125.124 135.006 143.747 229.401 11.155 56.543 10.401 112.837 -15.467 166.524 -19.851 41.202 -52.429 71.133 -87.429 98.447 -36.018 28.108 -74.148 53.518 -110.002 81.821 -9.702 7.659 -16.252 20.865 -20.742 32.84 -1.903 5.075 4.287 18.838 8.426 19.581 21.985 3.946 44.45 5.978 66.818 6.823 25.82 0.974 51.713 0.148 77.571 -0.192 5.606 -0.073 13.217 0.653 16.439 -2.514 13.394 -13.167 23.897 -4.697 33.194 3.965 7.823 7.29 13.399 16.992 19.62 25.168 -3.775 0.555 -11.519 2.505 -19.304 2.689 -26.003 0.616 -52.035 0.221 -78.021 1.176 -4.63 0.17 -9.09 4.935 -13.629 7.579 4.776 1.898 9.537 5.399 14.33 5.444 44.849 0.421 89.703 0.25 134.594 0.25 0.052 23.336 -31.136 55.291 -58.846 63.95 -0.207 -3.158 -0.4 -6.097 -0.606 -9.233C106.184 0.913 79.16 1.426 54.61 14.481 48.141 17.921 43.912 25.57 38.647 31.279 32.019 38.467 26.58 47.709 18.5 52.399 1.934 62.014 -16.148 68.982 -33.431 77.4c-61.418 29.914 -126.278 28.862 -195.946 22.484 41.644 -9.693 79.255 -18.447 116.865 -27.202 -0.428 -2.286 -0.856 -4.573 -1.284 -6.86 -50.308 -6.74 -97.898 11.71 -147.101 18.545 17.831 -10.443 35.897 -20.152 54.561 -28.527 18.965 -8.51 38.52 -15.705 58.076 -23.58 -24.845 -21.229 -49.776 -25.887 -81.008 -18.751 -17.072 3.901 -35.132 5.972 -52.564 5.121 -18.006 -0.88 -36.141 -5.311 -52.491 -16.238 17.507 -8.875 33.643 -16.24 48.864 -25.165 6.277 -3.681 13.473 -9.93 15.223 -16.377 4.191 -15.44 5.402 -31.689 7.817 -47.623 -28.667 -3.247 -79.074 -32.4 -89.261 -51.373 44.059 -8.478 92.031 1.777 134.06 -26.617 -13.844 -10.477 -46.085 -23.507 -57.911 -32.457 14.621 -3.831 48.498 -1.955 61.751 -1.057 11.157 0.756 16.306 1.029 20.881 -2.735l129.701 -101.541c13.638 -10.994 68.719 -63.131 83.098 -95.903 12.241 -27.902 13.739 -51.638 13.736 -57.431 -0.01 -15.541 -1.917 -39.876 -12.605 -67.022 -4.488 -11.399 -17.658 -36.65 -44.826 -66.083 -42.107 -45.617 -96.27 -70.274 -155.501 -82.487 -137.722 -28.395 -252.153 -175.469 -219.85 -337.61 37.714 -189.296 246.646 -291.784 417.386 -201.739 110.359 58.201 168.871 171.751 153.193 295.356 -9.471 74.672 -43.252 135.578 -99.881 184.538" />
</group>
</group>
</group>
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M928.4 914.4H1231.6A139.9 139.9 0 0 1 1371.4 1054.3V1251.4A139.9 139.9 0 0 1 1231.6 1391.3H928.4A139.9 139.9 0 0 1 788.6 1251.4V1054.3A139.9 139.9 0 0 1 928.4 914.4ZM930.2 1311.2L1020.8 1082.4L1080.0 1226.2L1139.2 1082.4L1229.8 1311.2L1291.6 1280.6L1136.5 1013.5L1080.0 1157.3L1023.5 1013.5L868.4 1280.6Z" />
</vector>
@@ -21,7 +21,7 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/list_fragment"
android:name="com.wireguard.android.fragment.TunnelListFragment"
android:name="page.onram.wirevpn.fragment.TunnelListFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
@@ -10,15 +10,15 @@
<import type="android.view.View" />
<import type="com.wireguard.android.model.ApplicationData" />
<import type="page.onram.wirevpn.model.ApplicationData" />
<variable
name="fragment"
type="com.wireguard.android.fragment.AppListDialogFragment" />
type="page.onram.wirevpn.fragment.AppListDialogFragment" />
<variable
name="appData"
type="com.wireguard.android.databinding.ObservableKeyedArrayList&lt;String, ApplicationData&gt;" />
type="page.onram.wirevpn.databinding.ObservableKeyedArrayList&lt;String, ApplicationData&gt;" />
</data>
<LinearLayout
+3 -3
View File
@@ -7,11 +7,11 @@
<data>
<import type="com.wireguard.android.model.ApplicationData" />
<import type="page.onram.wirevpn.model.ApplicationData" />
<variable
name="collection"
type="com.wireguard.android.databinding.ObservableKeyedArrayList&lt;String, com.wireguard.android.model.ApplicationData&gt;" />
type="page.onram.wirevpn.databinding.ObservableKeyedArrayList&lt;String, page.onram.wirevpn.model.ApplicationData&gt;" />
<variable
name="key"
@@ -19,7 +19,7 @@
<variable
name="item"
type="com.wireguard.android.model.ApplicationData" />
type="page.onram.wirevpn.model.ApplicationData" />
</data>
<LinearLayout
@@ -7,7 +7,7 @@
<data>
<import type="com.wireguard.android.widget.NameInputFilter" />
<import type="page.onram.wirevpn.widget.NameInputFilter" />
</data>
<FrameLayout
+1 -1
View File
@@ -12,7 +12,7 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/list_detail_container"
android:name="com.wireguard.android.fragment.TunnelListFragment"
android:name="page.onram.wirevpn.fragment.TunnelListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="LIST" />
@@ -12,7 +12,7 @@
<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/editor_fragment"
android:name="com.wireguard.android.fragment.TunnelEditorFragment"
android:name="page.onram.wirevpn.fragment.TunnelEditorFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

Some files were not shown because too many files have changed in this diff Show More