16 Commits
Author SHA1 Message Date
Hermes Agent 9cc4259fea Add Gitea Actions runner docker-compose setup 2026-09-12 21:56:45 +00:00
Hermes Agent b632bc755b F-Droid inclusion policy compliance fixes
- Update all 36 locale strings to 'Wire VPN' (fork translation requirement)
- Disable auto-updater on F-Droid builds (no binary downloads without consent)
- Updater checks if installed via F-Droid and skips update monitoring
2026-09-12 20:15:20 +00:00
Hermes Agent 9866a31129 Move CI workflow to .gitea/workflows for Gitea Actions
release / build (release) Canceled after 0s
2026-09-12 19:44:32 +00:00
Hermes (for frank) 99c66bd52c CI: ensure patch on runner (vendored shim), fallback to artifacts branch, master target 2026-09-12 17:11:37 +00:00
frank bbd1034c69 remove test_upload.txt 2026-09-12 19:09:23 +02:00
frank 5372b44ccf test 2026-09-12 19:09:06 +02:00
Hermes (for frank) 646e617476 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)
2026-09-12 17:04:15 +00:00
Jason A. Donenfeld e7b3a3c118 gradle: remove unused settings
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-17 01:50:01 +01:00
Jason A. Donenfeld 0856e2ecf7 version: bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-15 22:26:00 +01:00
Jason A. Donenfeld ba7edf3e3e ui: remove use of deprecated bundleOf
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-15 22:25:56 +01:00
Jason A. Donenfeld 3b1673584b Updater: discourage copy and pasting
When other projects copy and paste all of WireGuard and then tweak it,
some idiots leave the updater code in, resulting in useless requests
going to my server. In some cases this has even resulted in a DoS
because of further confusions.

To cut down on this, hardcode the usual package name prefix, and abort
with a really silly exception if it doesn't match. This will lead copy
and pasters to this comment, which hopefully they read.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-15 22:10:40 +01:00
L.W.ReekandJason A. Donenfeld ecc3c0a61c tunnel: uatch minSdk between tunnel and ui
Signed-off-by: L.W.Reek <syphyr@gmail.com>
[Jason: remove else clause]
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-15 19:24:14 +01:00
Jason A. Donenfeld 176dc18dba gradle: update to agp 9.1
The legacy kapt thing is a bummer. We'll need to move to ksp at some
point.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-15 19:20:29 +01:00
Jason A. Donenfeld cc3f417d76 Application: include appid in user agent
This will help make it more clear which app is doing what.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-10 00:49:28 +01:00
Jason A. Donenfeld 1d80cde609 res: remove untranslatable string from hindi translation
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-10 00:25:21 +01:00
Jason A. Donenfeld 45b12811b0 Updater: don't immediately retry if check fails
If something goes wrong, maybe it's best not to DoS the update server.
Instead back off gradually and then go into the usual sleep loop.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2026-03-10 00:17:22 +01:00
164 changed files with 1371 additions and 987 deletions
+172
View File
@@ -0,0 +1,172 @@
# Builds the signed release APK and F-Droid v2 artifacts as soon as a new
# release is created, and attaches everything to that release.
#
# Written for Gitea Actions (GitHub-Actions-compatible) — the repo lives on
# https://git.obahan.xyz/frank/wirevpn. If release-attachment storage is
# unavailable on the server, outputs are also published to the `artifacts`
# branch (tag-name addressed via commit message).
#
# 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
- name: Ensure build prerequisites (patch)
run: |
set -e
if ! command -v patch >/dev/null 2>&1; then
echo "patch not found; using vendored shim"
mkdir -p "$HOME/bin"
cp scripts/patch-shim.py "$HOME/bin/patch"
chmod +x "$HOME/bin/patch"
echo "$HOME/bin" >> "$GITHUB_PATH"
echo "patch shim ready (vendored)"
else
echo "patch present on runner"
fi
- 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\":\"master\"}" \
"$GITEA_API/repos/$REPO/releases" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
fi
ok=0
for f in dist/page.onram.wirevpn.apk dist/page.onram.wirevpn.metadata dist/page.onram.wirevpn.signature; do
if curl -fsSL -H "Authorization: token $GITEA_TOKEN" \
-F "file=@$f" \
"$GITEA_API/repos/$REPO/releases/$rid/assets" >/dev/null; then
echo "uploaded $f"
ok=1
else
echo "attachment upload failed for $f (Gitea attachment storage broken?)"
fi
done
if [ "$ok" != "1" ]; then
echo "::warning::Could not attach release assets; falling back to artifacts branch"
fi
- name: Publish build outputs to artifacts branch (fallback + archive)
if: always()
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN || github.token }}
run: |
set -e
tag="${GITHUB_REF#refs/tags/}"
[ -n "$tag" ] || tag="latest"
mkdir -p dist-artifacts && cd dist-artifacts
cp ../dist/page.onram.wirevpn.apk ../dist/page.onram.wirevpn.metadata ../dist/page.onram.wirevpn.signature . 2>/dev/null || exit 0
git config user.name "wirevpn-ci"
git config user.email "ci@localhost"
git init -q .
git add -A
git commit -qm "build outputs for $tag"
git push -q --force "https://frank:${GITEA_TOKEN}@git.obahan.xyz/frank/wirevpn.git" HEAD:artifacts
echo "artifacts published to branch 'artifacts'"
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: fdroid-bundle
path: dist/
+1
View File
@@ -16,3 +16,4 @@ build/
*.jks *.jks
gradlew.bat gradlew.bat
maint/ maint/
runner/.env
+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 ## Building
``` ```
$ git clone --recurse-submodules https://git.zx2c4.com/wireguard-android $ git clone --recurse-submodules https://git.obahan.xyz/frank/wirevpn.git
$ cd wireguard-android $ cd wirevpn
$ ./gradlew assembleRelease $ ./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 To sign with a keystore, export:
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).
``` ```
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): 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.
```
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
coreLibraryDesugaringEnabled = true
}
dependencies {
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.3"
}
```
## Translating ## 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.
+1 -9
View File
@@ -1,13 +1,5 @@
plugins { plugins {
alias(libs.plugins.android.application) apply false alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.legacy.kapt) apply false
alias(libs.plugins.kotlin.kapt) apply false
}
tasks {
wrapper {
gradleVersion = "8.14"
distributionSha256Sum = "61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa"
}
} }
+3 -36
View File
@@ -1,49 +1,16 @@
wireguardVersionCode=518 wireguardVersionCode=520
wireguardVersionName=1.0.20260102 wireguardVersionName=1.0.20260910
wireguardPackageName=com.wireguard.android wireguardPackageName=page.onram.wirevpn
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.caching=true org.gradle.caching=true
# Enable Kotlin incremental compilation
kotlin.incremental=true
# Enable AndroidX support
android.useAndroidX=true
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m org.gradle.jvmargs=-Xmx1536m
# Turn off AP discovery in compile path to enable compile avoidance # Turn off AP discovery in compile path to enable compile avoidance
kapt.include.compile.classpath=false kapt.include.compile.classpath=false
# Experimental AGP flags
# Generate compile-time only R class for app modules.
android.enableAppCompileTimeRClass=true
# Keep AAPT2 daemons alive between incremental builds.
android.keepWorkerActionServicesBetweenBuilds=true
# Generate manifest class as a .class directly rather than a Java source file.
android.generateManifestClass=true
# Default Android build features
# Disable resource values generation by default in libraries
android.defaults.buildfeatures.resvalues=false
# Disable shader compilation by default
android.defaults.buildfeatures.shaders=false
# Disable Android resource processing by default
android.library.defaults.buildfeatures.androidresources=false
# Suppress warnings for some features that aren't yet stabilized
android.suppressUnsupportedOptionWarnings=android.keepWorkerActionServicesBetweenBuilds,\
android.enableAppCompileTimeRClass,\
android.suppressUnsupportedOptionWarnings
# OSSRH sometimes struggles with slow deployments, so this makes Gradle
# more tolerant to those delays.
systemProp.org.gradle.internal.http.connectionTimeout=500000
systemProp.org.gradle.internal.http.socketTimeout=500000
+6 -8
View File
@@ -1,17 +1,16 @@
[versions] [versions]
agp = "8.13.2" agp = "9.1.0"
kotlin = "2.3.0"
[libraries] [libraries]
androidx-activity-ktx = "androidx.activity:activity-ktx:1.12.2" androidx-activity-ktx = "androidx.activity:activity-ktx:1.13.0"
androidx-annotation = "androidx.annotation:annotation:1.9.1" androidx-annotation = "androidx.annotation:annotation:1.9.1"
androidx-appcompat = "androidx.appcompat:appcompat:1.7.1" androidx-appcompat = "androidx.appcompat:appcompat:1.7.1"
androidx-biometric = "androidx.biometric:biometric:1.1.0" androidx-biometric = "androidx.biometric:biometric:1.1.0"
androidx-collection = "androidx.collection:collection:1.5.0" androidx-collection = "androidx.collection:collection:1.6.0"
androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.2.1" androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.2.1"
androidx-coordinatorlayout = "androidx.coordinatorlayout:coordinatorlayout:1.3.0" androidx-coordinatorlayout = "androidx.coordinatorlayout:coordinatorlayout:1.3.0"
androidx-core-ktx = "androidx.core:core-ktx:1.17.0" androidx-core-ktx = "androidx.core:core-ktx:1.18.0"
androidx-datastore-preferences = "androidx.datastore:datastore-preferences:1.2.0" androidx-datastore-preferences = "androidx.datastore:datastore-preferences:1.2.1"
androidx-fragment-ktx = "androidx.fragment:fragment-ktx:1.8.9" androidx-fragment-ktx = "androidx.fragment:fragment-ktx:1.8.9"
androidx-lifecycle-runtime-ktx = "androidx.lifecycle:lifecycle-runtime-ktx:2.10.0" androidx-lifecycle-runtime-ktx = "androidx.lifecycle:lifecycle-runtime-ktx:2.10.0"
androidx-preference-ktx = "androidx.preference:preference-ktx:1.2.1" androidx-preference-ktx = "androidx.preference:preference-ktx:1.2.1"
@@ -25,5 +24,4 @@ zxing-android-embedded = "com.journeyapps:zxing-android-embedded:4.3.0"
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "agp" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionSha256Sum=a17ddd85a26b6a7f5ddb71ff8b05fc5104c0202c6e64782429790c933686c806 distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
+3
View File
@@ -0,0 +1,3 @@
# Gitea Actions Runner Token
# Get it from: Settings → Actions → Runners on your repo page at git.obahan.xyz
GITEA_RUNNER_TOKEN=your-token-here
+13
View File
@@ -0,0 +1,13 @@
services:
runner:
image: docker.io/gitea/runner:3
container_name: wirevpn-runner
restart: always
environment:
GITEA_INSTANCE_URL: "https://git.obahan.xyz"
GITEA_RUNNER_REGISTRATION_TOKEN: "${GITEA_RUNNER_TOKEN}"
GITEA_RUNNER_NAME: "wirevpn-builder"
GITEA_RUNNER_LABELS: "self-hosted"
volumes:
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock
+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()
+189
View File
@@ -0,0 +1,189 @@
#!/usr/bin/env python3
"""Minimal `patch` compatible shim (enough for the libwg-go Makefile).
Supports: patch [-pN] [-f] [-N] [-r-] [-d DIR] [-s] (diff read from stdin)
Handles unified diffs with multiple files/hunks (git-style or plain).
"""
import sys
import os
import re
def parse_args(argv):
strip = 1
dir_ = "."
args = list(argv)
i = 0
while i < len(args):
a = args[i]
if a == "-p":
strip = int(args[i + 1]); i += 2; continue
elif a.startswith("-p") and a[2:].isdigit():
strip = int(a[2:]); i += 1; continue
elif a == "-d":
dir_ = args[i + 1]; i += 2; continue
elif a in ("-f", "-N", "-s", "-t", "-i"):
i += 1; continue
elif a == "-r-":
i += 1; continue
elif a.startswith("-"):
i += 1; continue
else:
i += 1
return strip, dir_
def strip_path(p, strip):
parts = p.split("/")
if strip and len(parts) > strip:
parts = parts[strip:]
return "/".join(parts)
def apply_hunks(lines, hunks):
"""Apply parsed hunks (list of (old_start, old_lines, new_lines)) to lines, in order."""
out = list(lines)
offset = 0
for old_start, old_count, old_content, new_content in hunks:
idx = old_start - 1 + offset # 0-based
# find match allowing drift
best = None
for d in range(0, 200):
for sign in (1, -1):
cand = idx + d * sign
if cand < 0 or cand + old_count > len(out):
continue
if out[cand:cand + old_count] == old_content:
best = cand
break
if best is not None:
break
if best is None:
# try whitespace-insensitive
def norm(l):
return l.rstrip("\n")
for d in range(0, 400):
for sign in (1, -1):
cand = idx + d * sign
if cand < 0 or cand + old_count > len(out):
continue
if [norm(x) for x in out[cand:cand + old_count]] == [norm(x) for x in old_content]:
best = cand
break
if best is not None:
break
if best is None:
raise SystemExit(f"patch: hunk at line {old_start} failed to match")
out[best:best + old_count] = new_content
offset += len(new_content) - old_count
return out
def process_file(text, fname, strip, dir_):
# text: the file's section (after "diff --git" or first "---"), up to next file
lines = text.splitlines()
# find hunks
hunks = []
old_content_all = []
# We'll re-parse the raw section for hunk headers
i = 0
in_hunk = False
old_block = []
new_block = []
old_start = 0
while i < len(lines):
ln = lines[i]
m = re.match(r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@", ln)
if m:
if in_hunk and old_block:
old_count = len(old_block)
new_count = len(new_block)
hunks.append((old_start, old_count, old_block, new_block))
old_start = int(m.group(1))
old_count_expect = int(m.group(2) or 1)
new_count_expect = int(m.group(4) or 1)
old_block = []
new_block = []
in_hunk = True
i += 1
while i < len(lines) and len(old_block) < old_count_expect and len(new_block) < new_count_expect:
l = lines[i]
if l.startswith("+"):
new_block.append(l[1:] + "\n")
elif l.startswith("-"):
old_block.append(l[1:] + "\n")
elif l.startswith(" "):
old_block.append(l[1:] + "\n")
new_block.append(l[1:] + "\n")
elif l.startswith("\\"):
pass
else:
break
i += 1
continue
i += 1
if in_hunk and old_block:
old_count = len(old_block)
new_count = len(new_block)
hunks.append((old_start, old_count, old_block, new_block))
target = os.path.join(dir_, strip_path(fname, strip))
if not os.path.exists(target):
raise SystemExit(f"patch: target {target} not found")
with open(target, encoding="utf-8") as f:
content = f.read()
out = apply_hunks(content.splitlines(True), hunks)
with open(target, "w", encoding="utf-8") as f:
f.writelines(out)
return target
def main():
strip, dir_ = parse_args(sys.argv[1:])
data = sys.stdin.read()
# split into per-file sections
# A new file starts at a line "diff --git " or, for plain unified diffs, at "--- "
sections = []
cur = []
for ln in data.splitlines(keepends=True):
if ln.startswith("diff --git "):
if cur:
sections.append("".join(cur))
cur = [ln]
elif ln.startswith("--- ") and not any(c.startswith("diff --git") for c in cur):
# plain unified diff, new file
if cur:
sections.append("".join(cur))
cur = [ln]
else:
cur.append(ln)
if cur:
sections.append("".join(cur))
for sec in sections:
slines = sec.splitlines()
fname = None
for l in slines:
if l.startswith("diff --git "):
m = re.match(r"^diff --git (\S+) b/(\S+)", l)
if m:
fname = m.group(1) # keep the a/ prefix; strip_path removes it
break
if fname is None:
for l in slines:
if l.startswith("--- "):
p = l[4:].strip()
# drop timestamp (last whitespace-separated token if it starts with a date)
parts = p.split("\t")
p = parts[0].strip()
if p == "/dev/null":
continue
fname = p
break
if fname is None:
continue
# section body starts after the header; pass whole section, parser skips headers
process_file(sec, fname, strip, dir_)
if __name__ == "__main__":
main()
+1 -1
View File
@@ -16,7 +16,7 @@ dependencyResolutionManagement {
} }
} }
rootProject.name = "wireguard-android" rootProject.name = "wire-vpn"
include(":tunnel") include(":tunnel")
include(":ui") include(":ui")
+10 -16
View File
@@ -8,7 +8,6 @@ val pkg: String = providers.gradleProperty("wireguardPackageName").get()
plugins { plugins {
alias(libs.plugins.android.library) alias(libs.plugins.android.library)
`maven-publish` `maven-publish`
signing
} }
android { android {
@@ -83,9 +82,9 @@ publishing {
from(components["release"]) from(components["release"])
} }
pom { pom {
name = "WireGuard Tunnel Library" name = "Wire VPN Tunnel Library"
description = "Embeddable tunnel library for WireGuard for Android" description = "Embeddable tunnel library for Wire VPN for Android"
url = "https://www.wireguard.com/" url = "https://git.obahan.xyz/frank/wirevpn"
licenses { licenses {
license { license {
@@ -95,18 +94,18 @@ publishing {
} }
} }
scm { scm {
connection = "scm:git:https://git.zx2c4.com/wireguard-android" connection = "scm:git:https://git.obahan.xyz/frank/wirevpn.git"
developerConnection = "scm:git:https://git.zx2c4.com/wireguard-android" developerConnection = "scm:git:https://git.obahan.xyz/frank/wirevpn.git"
url = "https://git.zx2c4.com/wireguard-android" url = "https://git.obahan.xyz/frank/wirevpn"
} }
developers { developers {
organization { organization {
name = "WireGuard" name = "Wire VPN"
url = "https://www.wireguard.com/" url = "https://git.obahan.xyz/frank/wirevpn"
} }
developer { developer {
name = "WireGuard" name = "Wire VPN"
email = "team@wireguard.com" email = "frank@onram.page"
} }
} }
} }
@@ -136,8 +135,3 @@ tasks.register<Zip>("zipReleasePublication") {
destinationDirectory.set(layout.buildDirectory.dir("distributions")) destinationDirectory.set(layout.buildDirectory.dir("distributions"))
into("${mavenGroupPath}/${mavenArtifactId}/${mavenVersion}") into("${mavenGroupPath}/${mavenArtifactId}/${mavenVersion}")
} }
signing {
useGpgCmd()
sign(publishing.publications)
}
+1 -1
View File
@@ -7,7 +7,7 @@
<application> <application>
<service <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:permission="android.permission.BIND_VPN_SERVICE"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.backend; package page.onram.wirevpn.backend;
import com.wireguard.config.Config; import page.onram.wirevpn.config.Config;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.util.Set; import java.util.Set;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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 * A subclass of {@link Exception} that encapsulates the reasons for a failure originating in
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.backend; package page.onram.wirevpn.backend;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -12,16 +12,16 @@ import android.os.ParcelFileDescriptor;
import android.system.OsConstants; import android.system.OsConstants;
import android.util.Log; import android.util.Log;
import com.wireguard.android.backend.BackendException.Reason; import page.onram.wirevpn.backend.BackendException.Reason;
import com.wireguard.android.backend.Tunnel.State; import page.onram.wirevpn.backend.Tunnel.State;
import com.wireguard.android.util.SharedLibraryLoader; import page.onram.wirevpn.util.SharedLibraryLoader;
import com.wireguard.config.Config; import page.onram.wirevpn.config.Config;
import com.wireguard.config.InetEndpoint; import page.onram.wirevpn.config.InetEndpoint;
import com.wireguard.config.InetNetwork; import page.onram.wirevpn.config.InetNetwork;
import com.wireguard.config.Peer; import page.onram.wirevpn.config.Peer;
import com.wireguard.crypto.Key; import page.onram.wirevpn.crypto.Key;
import com.wireguard.crypto.KeyFormatException; import page.onram.wirevpn.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.Collections; import java.util.Collections;
@@ -331,8 +331,7 @@ public final class GoBackend implements Backend {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
builder.setMetered(false); builder.setMetered(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) service.setUnderlyingNetworks(null);
service.setUnderlyingNetworks(null);
builder.setBlocking(true); builder.setBlocking(true);
try (final ParcelFileDescriptor tun = builder.establish()) { try (final ParcelFileDescriptor tun = builder.establish()) {
@@ -3,12 +3,12 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.backend; package page.onram.wirevpn.backend;
import android.os.SystemClock; import android.os.SystemClock;
import com.wireguard.crypto.Key; import page.onram.wirevpn.crypto.Key;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -32,11 +32,11 @@ public class Statistics {
* Add a peer and its current stats to the internal map. * Add a peer and its current stats to the internal map.
* *
* @param key A WireGuard public key bound to a particular peer * @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 * 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. * 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. * 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) { 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. * @return a {@link PeerStats} representing various statistics about this peer.
*/ */
@Nullable @Nullable
@@ -68,7 +68,7 @@ public class Statistics {
* Get the list of peers being tracked by this instance. * Get the list of peers being tracked by this instance.
* *
* @return An array of {@link Key} instances representing WireGuard * @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() { public Key[] peers() {
return stats.keySet().toArray(new Key[0]); return stats.keySet().toArray(new Key[0]);
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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; import java.util.regex.Pattern;
@@ -3,19 +3,19 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.backend; package page.onram.wirevpn.backend;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import com.wireguard.android.backend.BackendException.Reason; import page.onram.wirevpn.backend.BackendException.Reason;
import com.wireguard.android.backend.Tunnel.State; import page.onram.wirevpn.backend.Tunnel.State;
import com.wireguard.android.util.RootShell; import page.onram.wirevpn.util.RootShell;
import com.wireguard.android.util.ToolsInstaller; import page.onram.wirevpn.util.ToolsInstaller;
import com.wireguard.config.Config; import page.onram.wirevpn.config.Config;
import com.wireguard.crypto.Key; import page.onram.wirevpn.crypto.Key;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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.Iterator;
import java.util.Optional; import java.util.Optional;
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.config; package page.onram.wirevpn.config;
import com.wireguard.crypto.KeyFormatException; import page.onram.wirevpn.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -3,12 +3,12 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.config; package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location; import page.onram.wirevpn.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason; import page.onram.wirevpn.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section; import page.onram.wirevpn.config.BadConfigException.Section;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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.lang.reflect.Method;
import java.net.Inet4Address; import java.net.Inet4Address;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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.Inet4Address;
import java.net.InetAddress; import java.net.InetAddress;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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.Inet4Address;
import java.net.InetAddress; import java.net.InetAddress;
@@ -3,15 +3,15 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.config; package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location; import page.onram.wirevpn.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason; import page.onram.wirevpn.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section; import page.onram.wirevpn.config.BadConfigException.Section;
import com.wireguard.crypto.Key; import page.onram.wirevpn.crypto.Key;
import com.wireguard.crypto.KeyFormatException; import page.onram.wirevpn.crypto.KeyFormatException;
import com.wireguard.crypto.KeyPair; import page.onram.wirevpn.crypto.KeyPair;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.Collection; import java.util.Collection;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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; import androidx.annotation.Nullable;
@@ -3,14 +3,14 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.config; package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location; import page.onram.wirevpn.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason; import page.onram.wirevpn.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section; import page.onram.wirevpn.config.BadConfigException.Section;
import com.wireguard.crypto.Key; import page.onram.wirevpn.crypto.Key;
import com.wireguard.crypto.KeyFormatException; import page.onram.wirevpn.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -4,9 +4,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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; import java.util.Arrays;
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.crypto; package page.onram.wirevpn.crypto;
import com.wireguard.crypto.KeyFormatException.Type; import page.onram.wirevpn.crypto.KeyFormatException.Type;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.SecureRandom; import java.security.SecureRandom;
@@ -3,9 +3,9 @@
* SPDX-License-Identifier: Apache-2.0 * 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 * 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 * 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. * Represents a Curve25519 key pair as used by WireGuard.
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.util; package page.onram.wirevpn.util;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util; package page.onram.wirevpn.util;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import com.wireguard.android.util.RootShell.RootShellException.Reason; import page.onram.wirevpn.util.RootShell.RootShellException.Reason;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util; package page.onram.wirevpn.util;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@@ -3,14 +3,14 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util; package page.onram.wirevpn.util;
import android.content.Context; import android.content.Context;
import android.system.OsConstants; import android.system.OsConstants;
import android.util.Log; import android.util.Log;
import com.wireguard.android.util.RootShell.RootShellException; import page.onram.wirevpn.util.RootShell.RootShellException;
import com.wireguard.util.NonNullForAll; import page.onram.wirevpn.util.NonNullForAll;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@@ -134,7 +134,7 @@ public final class ToolsInstaller {
@RestrictTo(Scope.LIBRARY_GROUP) @RestrictTo(Scope.LIBRARY_GROUP)
public int install() throws RootShellException, IOException { 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."); throw new SecurityException("The tools may only be installed system-wide from the main WireGuard app.");
return willInstallAsMagiskModule() ? installMagisk() : installSystem(); return willInstallAsMagiskModule() ? installMagisk() : installSystem();
} }
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.config; package page.onram.wirevpn.config;
import com.wireguard.config.BadConfigException.Location; import page.onram.wirevpn.config.BadConfigException.Location;
import com.wireguard.config.BadConfigException.Reason; import page.onram.wirevpn.config.BadConfigException.Reason;
import com.wireguard.config.BadConfigException.Section; import page.onram.wirevpn.config.BadConfigException.Section;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.config; package page.onram.wirevpn.config;
import org.junit.Test; import org.junit.Test;
+22 -10
View File
@@ -1,16 +1,19 @@
@file:Suppress("UnstableApiUsage") @file:Suppress("UnstableApiUsage")
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val pkg: String = providers.gradleProperty("wireguardPackageName").get() val pkg: String = providers.gradleProperty("wireguardPackageName").get()
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.legacy.kapt)
alias(libs.plugins.kotlin.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 { android {
compileSdk = 36 compileSdk = 36
buildFeatures { buildFeatures {
@@ -19,10 +22,20 @@ android {
viewBinding = true viewBinding = true
} }
namespace = pkg 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 { defaultConfig {
applicationId = pkg applicationId = pkg
minSdk = 24 minSdk = 24
targetSdk = 36
versionCode = providers.gradleProperty("wireguardVersionCode").get().toInt() versionCode = providers.gradleProperty("wireguardVersionCode").get().toInt()
versionName = providers.gradleProperty("wireguardVersionName").get() versionName = providers.gradleProperty("wireguardVersionName").get()
buildConfigField("int", "MIN_SDK_VERSION", minSdk.toString()) buildConfigField("int", "MIN_SDK_VERSION", minSdk.toString())
@@ -37,6 +50,9 @@ android {
isMinifyEnabled = true isMinifyEnabled = true
isShrinkResources = true isShrinkResources = true
proguardFiles("proguard-android-optimize.txt") proguardFiles("proguard-android-optimize.txt")
if (releaseSigningEnabled) {
signingConfig = signingConfigs.getByName("release")
}
packaging { packaging {
resources { resources {
excludes += "DebugProbesKt.bin" excludes += "DebugProbesKt.bin"
@@ -87,7 +103,3 @@ tasks.withType<JavaCompile>().configureEach {
options.compilerArgs.add("-Xlint:unchecked") options.compilerArgs.add("-Xlint:unchecked")
options.isDeprecation = true options.isDeprecation = true
} }
tasks.withType<KotlinCompile>().configureEach {
compilerOptions.jvmTarget = JvmTarget.JVM_17
}
+3 -3
View File
@@ -130,9 +130,9 @@
android:exported="true" android:exported="true"
android:permission="${applicationId}.permission.CONTROL_TUNNELS"> android:permission="${applicationId}.permission.CONTROL_TUNNELS">
<intent-filter> <intent-filter>
<action android:name="com.wireguard.android.action.REFRESH_TUNNEL_STATES" /> <action android:name="page.onram.wirevpn.action.REFRESH_TUNNEL_STATES" />
<action android:name="com.wireguard.android.action.SET_TUNNEL_UP" /> <action android:name="page.onram.wirevpn.action.SET_TUNNEL_UP" />
<action android:name="com.wireguard.android.action.SET_TUNNEL_DOWN" /> <action android:name="page.onram.wirevpn.action.SET_TUNNEL_DOWN" />
</intent-filter> </intent-filter>
</receiver> </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. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android package page.onram.wirevpn
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -17,16 +17,16 @@ import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStoreFile import androidx.datastore.preferences.preferencesDataStoreFile
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import com.wireguard.android.backend.Backend import page.onram.wirevpn.backend.Backend
import com.wireguard.android.backend.GoBackend import page.onram.wirevpn.backend.GoBackend
import com.wireguard.android.backend.WgQuickBackend import page.onram.wirevpn.backend.WgQuickBackend
import com.wireguard.android.configStore.FileConfigStore import page.onram.wirevpn.configStore.FileConfigStore
import com.wireguard.android.model.TunnelManager import page.onram.wirevpn.model.TunnelManager
import com.wireguard.android.updater.Updater import page.onram.wirevpn.updater.Updater
import com.wireguard.android.util.RootShell import page.onram.wirevpn.util.RootShell
import com.wireguard.android.util.ToolsInstaller import page.onram.wirevpn.util.ToolsInstaller
import com.wireguard.android.util.UserKnobs import page.onram.wirevpn.util.UserKnobs
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -116,7 +116,9 @@ class Application : android.app.Application() {
Log.e(TAG, Log.getStackTraceString(e)) Log.e(TAG, Log.getStackTraceString(e))
} }
} }
Updater.monitorForUpdates() if (!Updater.installerIsGooglePlay(this) && !isFdroidBuild()) {
Updater.monitorForUpdates()
}
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
StrictMode.setVmPolicy(VmPolicy.Builder().detectAll().penaltyLog().build()) StrictMode.setVmPolicy(VmPolicy.Builder().detectAll().penaltyLog().build())
@@ -124,13 +126,22 @@ class Application : android.app.Application() {
} }
} }
private fun isFdroidBuild(): Boolean {
return try {
packageManager.getPackageInfo("org.fdroid.fdroid", 0)
true
} catch (e: android.content.pm.PackageManager.NameNotFoundException) {
false
}
}
override fun onTerminate() { override fun onTerminate() {
coroutineScope.cancel() coroutineScope.cancel()
super.onTerminate() super.onTerminate()
} }
companion object { companion object {
val USER_AGENT = String.format(Locale.ENGLISH, "WireGuard/%s (Android %d; %s; %s; %s %s; %s)", BuildConfig.VERSION_NAME, Build.VERSION.SDK_INT, if (Build.SUPPORTED_ABIS.isNotEmpty()) Build.SUPPORTED_ABIS[0] else "unknown ABI", Build.BOARD, Build.MANUFACTURER, Build.MODEL, Build.FINGERPRINT) val USER_AGENT = String.format(Locale.ENGLISH, "WireGuard/%s (Android %d; %s; %s; %s %s; %s; %s)", BuildConfig.VERSION_NAME, Build.VERSION.SDK_INT, if (Build.SUPPORTED_ABIS.isNotEmpty()) Build.SUPPORTED_ABIS[0] else "unknown ABI", Build.BOARD, Build.MANUFACTURER, Build.MODEL, Build.FINGERPRINT, BuildConfig.APPLICATION_ID)
private const val TAG = "WireGuard/Application" private const val TAG = "WireGuard/Application"
private lateinit var weakSelf: WeakReference<Application> private lateinit var weakSelf: WeakReference<Application>
@@ -2,14 +2,14 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android package page.onram.wirevpn
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.util.Log import android.util.Log
import com.wireguard.android.backend.WgQuickBackend import page.onram.wirevpn.backend.WgQuickBackend
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class BootShutdownReceiver : BroadcastReceiver() { class BootShutdownReceiver : BroadcastReceiver() {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android package page.onram.wirevpn
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Intent import android.content.Intent
@@ -19,12 +19,12 @@ import android.util.Log
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.databinding.Observable import androidx.databinding.Observable
import androidx.databinding.Observable.OnPropertyChangedCallback import androidx.databinding.Observable.OnPropertyChangedCallback
import com.wireguard.android.activity.MainActivity import page.onram.wirevpn.activity.MainActivity
import com.wireguard.android.activity.TunnelToggleActivity import page.onram.wirevpn.activity.TunnelToggleActivity
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import com.wireguard.android.widget.SlashDrawable import page.onram.wirevpn.widget.SlashDrawable
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/** /**
@@ -2,15 +2,15 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.CallbackRegistry import androidx.databinding.CallbackRegistry
import androidx.databinding.CallbackRegistry.NotifierCallback import androidx.databinding.CallbackRegistry.NotifierCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/** /**
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.content.ClipDescription.compareMimeTypes import android.content.ClipDescription.compareMimeTypes
import android.content.ContentProvider import android.content.ContentProvider
@@ -36,13 +36,13 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textview.MaterialTextView import com.google.android.material.textview.MaterialTextView
import com.wireguard.android.BuildConfig import page.onram.wirevpn.BuildConfig
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.databinding.LogViewerActivityBinding import page.onram.wirevpn.databinding.LogViewerActivityBinding
import com.wireguard.android.util.DownloadsFileSaver import page.onram.wirevpn.util.DownloadsFileSaver
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.resolveAttribute import page.onram.wirevpn.util.resolveAttribute
import com.wireguard.crypto.KeyPair import page.onram.wirevpn.crypto.KeyPair
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
@@ -15,10 +15,10 @@ import androidx.appcompat.app.ActionBar
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.commit import androidx.fragment.app.commit
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.fragment.TunnelDetailFragment import page.onram.wirevpn.fragment.TunnelDetailFragment
import com.wireguard.android.fragment.TunnelEditorFragment import page.onram.wirevpn.fragment.TunnelEditorFragment
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
/** /**
* CRUD interface for WireGuard tunnels. This activity serves as the main entry point to the * 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. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
@@ -16,12 +16,12 @@ import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.QuickTileService import page.onram.wirevpn.QuickTileService
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.WgQuickBackend import page.onram.wirevpn.backend.WgQuickBackend
import com.wireguard.android.preference.PreferencesPreferenceDataStore import page.onram.wirevpn.preference.PreferencesPreferenceDataStore
import com.wireguard.android.util.AdminKnobs import page.onram.wirevpn.util.AdminKnobs
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -2,11 +2,11 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.os.Bundle import android.os.Bundle
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
/** /**
* Standalone activity for creating tunnels. * Standalone activity for creating tunnels.
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.content.ComponentName import android.content.ComponentName
import android.os.Build import android.os.Build
@@ -14,12 +14,12 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.QuickTileService import page.onram.wirevpn.QuickTileService
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.GoBackend import page.onram.wirevpn.backend.GoBackend
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class TunnelToggleActivity : AppCompatActivity() { class TunnelToggleActivity : AppCompatActivity() {
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.activity package page.onram.wirevpn.activity
import android.Manifest import android.Manifest
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
@@ -34,22 +34,22 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.GoBackend import page.onram.wirevpn.backend.GoBackend
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.databinding.Keyed import page.onram.wirevpn.databinding.Keyed
import com.wireguard.android.databinding.ObservableKeyedArrayList import page.onram.wirevpn.databinding.ObservableKeyedArrayList
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter import page.onram.wirevpn.databinding.ObservableKeyedRecyclerViewAdapter
import com.wireguard.android.databinding.TvActivityBinding import page.onram.wirevpn.databinding.TvActivityBinding
import com.wireguard.android.databinding.TvFileListItemBinding import page.onram.wirevpn.databinding.TvFileListItemBinding
import com.wireguard.android.databinding.TvTunnelListItemBinding import page.onram.wirevpn.databinding.TvTunnelListItemBinding
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.QuantityFormatter import page.onram.wirevpn.util.QuantityFormatter
import com.wireguard.android.util.TunnelImporter import page.onram.wirevpn.util.TunnelImporter
import com.wireguard.android.util.UserKnobs import page.onram.wirevpn.util.UserKnobs
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -2,9 +2,9 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * 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. * Interface for persistent storage providers for WireGuard configurations.
@@ -2,13 +2,13 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.configStore package page.onram.wirevpn.configStore
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.config.BadConfigException import page.onram.wirevpn.config.BadConfigException
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileNotFoundException import java.io.FileNotFoundException
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.databinding package page.onram.wirevpn.databinding
import android.text.InputFilter import android.text.InputFilter
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -18,14 +18,14 @@ import androidx.databinding.adapters.ListenerUtil
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler import page.onram.wirevpn.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
import com.wireguard.android.widget.ToggleSwitch import page.onram.wirevpn.widget.ToggleSwitch
import com.wireguard.android.widget.ToggleSwitch.OnBeforeCheckedChangeListener import page.onram.wirevpn.widget.ToggleSwitch.OnBeforeCheckedChangeListener
import com.wireguard.android.widget.TvCardView import page.onram.wirevpn.widget.TvCardView
import com.wireguard.config.Attribute import page.onram.wirevpn.config.Attribute
import com.wireguard.config.InetNetwork import page.onram.wirevpn.config.InetNetwork
import java.net.InetAddress import java.net.InetAddress
import java.util.Optional import java.util.Optional
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.databinding package page.onram.wirevpn.databinding
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -11,7 +11,7 @@ import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableList import androidx.databinding.ObservableList
import androidx.databinding.ViewDataBinding import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.wireguard.android.BR import page.onram.wirevpn.BR
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
/** /**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * 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. * Interface for objects that have a identifying key of the given type.
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.databinding package page.onram.wirevpn.databinding
import androidx.databinding.ObservableArrayList import androidx.databinding.ObservableArrayList
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.databinding package page.onram.wirevpn.databinding
import android.content.Context import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -11,7 +11,7 @@ import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableList import androidx.databinding.ObservableList
import androidx.databinding.ViewDataBinding import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.wireguard.android.BR import page.onram.wirevpn.BR
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
/** /**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.databinding package page.onram.wirevpn.databinding
import java.util.AbstractList import java.util.AbstractList
import java.util.Collections import java.util.Collections
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
@@ -12,13 +12,12 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.core.os.bundleOf
import androidx.fragment.app.setFragmentResult import androidx.fragment.app.setFragmentResult
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.util.resolveAttribute import page.onram.wirevpn.util.resolveAttribute
class AddTunnelsSheet : BottomSheetDialogFragment() { class AddTunnelsSheet : BottomSheetDialogFragment() {
@@ -83,15 +82,15 @@ class AddTunnelsSheet : BottomSheetDialogFragment() {
} }
private fun onRequestCreateConfig() { private fun onRequestCreateConfig() {
setFragmentResult(REQUEST_KEY_NEW_TUNNEL, bundleOf(REQUEST_METHOD to REQUEST_CREATE)) setFragmentResult(REQUEST_KEY_NEW_TUNNEL, Bundle().apply { putString(REQUEST_METHOD, REQUEST_CREATE) })
} }
private fun onRequestImportConfig() { private fun onRequestImportConfig() {
setFragmentResult(REQUEST_KEY_NEW_TUNNEL, bundleOf(REQUEST_METHOD to REQUEST_IMPORT)) setFragmentResult(REQUEST_KEY_NEW_TUNNEL, Bundle().apply { putString(REQUEST_METHOD, REQUEST_IMPORT) })
} }
private fun onRequestScanQRCode() { private fun onRequestScanQRCode() {
setFragmentResult(REQUEST_KEY_NEW_TUNNEL, bundleOf(REQUEST_METHOD to REQUEST_SCAN)) setFragmentResult(REQUEST_KEY_NEW_TUNNEL, Bundle().apply { putString(REQUEST_METHOD, REQUEST_SCAN) })
} }
companion object { companion object {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.Manifest import android.Manifest
import android.app.Dialog import android.app.Dialog
@@ -14,19 +14,18 @@ import android.os.Bundle
import android.widget.Button import android.widget.Button
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.os.bundleOf
import androidx.databinding.Observable import androidx.databinding.Observable
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.setFragmentResult import androidx.fragment.app.setFragmentResult
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.databinding.AppListDialogFragmentBinding import page.onram.wirevpn.databinding.AppListDialogFragmentBinding
import com.wireguard.android.databinding.ObservableKeyedArrayList import page.onram.wirevpn.databinding.ObservableKeyedArrayList
import com.wireguard.android.model.ApplicationData import page.onram.wirevpn.model.ApplicationData
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -145,10 +144,11 @@ class AppListDialogFragment : DialogFragment() {
} }
} }
setFragmentResult( setFragmentResult(
REQUEST_SELECTION, bundleOf( REQUEST_SELECTION,
KEY_SELECTED_APPS to selectedApps.toTypedArray(), Bundle().apply {
KEY_IS_EXCLUDED to (tabs?.selectedTabPosition == 0) putStringArray(KEY_SELECTED_APPS, selectedApps.toTypedArray())
) putBoolean(KEY_IS_EXCLUDED, tabs?.selectedTabPosition == 0)
}
) )
dismiss() dismiss()
} }
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
@@ -14,16 +14,16 @@ import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.activity.BaseActivity import page.onram.wirevpn.activity.BaseActivity
import com.wireguard.android.activity.BaseActivity.OnSelectedTunnelChangedListener import page.onram.wirevpn.activity.BaseActivity.OnSelectedTunnelChangedListener
import com.wireguard.android.backend.GoBackend import page.onram.wirevpn.backend.GoBackend
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.databinding.TunnelDetailFragmentBinding import page.onram.wirevpn.databinding.TunnelDetailFragmentBinding
import com.wireguard.android.databinding.TunnelListItemBinding import page.onram.wirevpn.databinding.TunnelListItemBinding
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/** /**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
@@ -10,11 +10,11 @@ import android.view.WindowManager
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.databinding.ConfigNamingDialogFragmentBinding import page.onram.wirevpn.databinding.ConfigNamingDialogFragmentBinding
import com.wireguard.config.BadConfigException import page.onram.wirevpn.config.BadConfigException
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.IOException import java.io.IOException
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -15,12 +15,12 @@ import androidx.core.view.MenuProvider
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.databinding.TunnelDetailFragmentBinding import page.onram.wirevpn.databinding.TunnelDetailFragmentBinding
import com.wireguard.android.databinding.TunnelDetailPeerBinding import page.onram.wirevpn.databinding.TunnelDetailPeerBinding
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.android.util.QuantityFormatter import page.onram.wirevpn.util.QuantityFormatter
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
@@ -23,16 +23,16 @@ import androidx.core.view.MenuProvider
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.databinding.TunnelEditorFragmentBinding import page.onram.wirevpn.databinding.TunnelEditorFragmentBinding
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.android.util.AdminKnobs import page.onram.wirevpn.util.AdminKnobs
import com.wireguard.android.util.BiometricAuthenticator import page.onram.wirevpn.util.BiometricAuthenticator
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.viewmodel.ConfigProxy import page.onram.wirevpn.viewmodel.ConfigProxy
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/** /**
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.fragment package page.onram.wirevpn.fragment
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
@@ -26,18 +26,18 @@ import com.google.android.material.snackbar.Snackbar
import com.google.zxing.qrcode.QRCodeReader import com.google.zxing.qrcode.QRCodeReader
import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions import com.journeyapps.barcodescanner.ScanOptions
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.activity.TunnelCreatorActivity import page.onram.wirevpn.activity.TunnelCreatorActivity
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler import page.onram.wirevpn.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
import com.wireguard.android.databinding.TunnelListFragmentBinding import page.onram.wirevpn.databinding.TunnelListFragmentBinding
import com.wireguard.android.databinding.TunnelListItemBinding import page.onram.wirevpn.databinding.TunnelListItemBinding
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.android.updater.SnackbarUpdateShower import page.onram.wirevpn.updater.SnackbarUpdateShower
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.QrCodeFromFileScanner import page.onram.wirevpn.util.QrCodeFromFileScanner
import com.wireguard.android.util.TunnelImporter import page.onram.wirevpn.util.TunnelImporter
import com.wireguard.android.widget.MultiselectableRelativeLayout import page.onram.wirevpn.widget.MultiselectableRelativeLayout
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
@@ -2,13 +2,13 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.model package page.onram.wirevpn.model
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import androidx.databinding.BaseObservable import androidx.databinding.BaseObservable
import androidx.databinding.Bindable import androidx.databinding.Bindable
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.android.databinding.Keyed import page.onram.wirevpn.databinding.Keyed
class ApplicationData(val icon: Drawable, val name: String, val packageName: String, isSelected: Boolean) : BaseObservable(), Keyed<String> { class ApplicationData(val icon: Drawable, val name: String, val packageName: String, isSelected: Boolean) : BaseObservable(), Keyed<String> {
override val key = name override val key = name
@@ -2,17 +2,17 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.model package page.onram.wirevpn.model
import android.util.Log import android.util.Log
import androidx.databinding.BaseObservable import androidx.databinding.BaseObservable
import androidx.databinding.Bindable import androidx.databinding.Bindable
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.android.backend.Statistics import page.onram.wirevpn.backend.Statistics
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.databinding.Keyed import page.onram.wirevpn.databinding.Keyed
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.model package page.onram.wirevpn.model
object TunnelComparator : Comparator<String> { object TunnelComparator : Comparator<String> {
private class NaturalSortString(originalString: String) { private class NaturalSortString(originalString: String) {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.model package page.onram.wirevpn.model
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
@@ -12,19 +12,19 @@ import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.databinding.BaseObservable import androidx.databinding.BaseObservable
import androidx.databinding.Bindable import androidx.databinding.Bindable
import com.wireguard.android.Application.Companion.get import page.onram.wirevpn.Application.Companion.get
import com.wireguard.android.Application.Companion.getBackend import page.onram.wirevpn.Application.Companion.getBackend
import com.wireguard.android.Application.Companion.getTunnelManager import page.onram.wirevpn.Application.Companion.getTunnelManager
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.Statistics import page.onram.wirevpn.backend.Statistics
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.configStore.ConfigStore import page.onram.wirevpn.configStore.ConfigStore
import com.wireguard.android.databinding.ObservableSortedKeyedArrayList import page.onram.wirevpn.databinding.ObservableSortedKeyedArrayList
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.UserKnobs import page.onram.wirevpn.util.UserKnobs
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@@ -217,15 +217,15 @@ class TunnelManager(private val configStore: ConfigStore) : BaseObservable() {
val manager = getTunnelManager() val manager = getTunnelManager()
if (intent == null) return@launch if (intent == null) return@launch
val action = intent.action ?: 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() manager.refreshTunnelStates()
return@launch return@launch
} }
if (!UserKnobs.allowRemoteControlIntents.first()) if (!UserKnobs.allowRemoteControlIntents.first())
return@launch return@launch
val state = when (action) { val state = when (action) {
"com.wireguard.android.action.SET_TUNNEL_UP" -> Tunnel.State.UP "page.onram.wirevpn.action.SET_TUNNEL_UP" -> Tunnel.State.UP
"com.wireguard.android.action.SET_TUNNEL_DOWN" -> Tunnel.State.DOWN "page.onram.wirevpn.action.SET_TUNNEL_DOWN" -> Tunnel.State.DOWN
else -> return@launch else -> return@launch
} }
val tunnelName = intent.getStringExtra("tunnel") ?: return@launch val tunnelName = intent.getStringExtra("tunnel") ?: return@launch
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.preference package page.onram.wirevpn.preference
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -10,14 +10,14 @@ import android.util.AttributeSet
import android.util.Log import android.util.Log
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.activity.SettingsActivity import page.onram.wirevpn.activity.SettingsActivity
import com.wireguard.android.backend.Tunnel import page.onram.wirevpn.backend.Tunnel
import com.wireguard.android.backend.WgQuickBackend import page.onram.wirevpn.backend.WgQuickBackend
import com.wireguard.android.util.UserKnobs import page.onram.wirevpn.util.UserKnobs
import com.wireguard.android.util.activity import page.onram.wirevpn.util.activity
import com.wireguard.android.util.lifecycleScope import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async import kotlinx.coroutines.async
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.preference package page.onram.wirevpn.preference
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.preference package page.onram.wirevpn.preference
import android.app.StatusBarManager import android.app.StatusBarManager
import android.content.ComponentName import android.content.ComponentName
@@ -14,8 +14,8 @@ import android.util.AttributeSet
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.preference.Preference import androidx.preference.Preference
import com.wireguard.android.QuickTileService import page.onram.wirevpn.QuickTileService
import com.wireguard.android.R import page.onram.wirevpn.R
@RequiresApi(Build.VERSION_CODES.TIRAMISU) @RequiresApi(Build.VERSION_CODES.TIRAMISU)
class QuickTilePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) { class QuickTilePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
@@ -2,15 +2,15 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.preference package page.onram.wirevpn.preference
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.preference.Preference import androidx.preference.Preference
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.util.ToolsInstaller import page.onram.wirevpn.util.ToolsInstaller
import com.wireguard.android.util.lifecycleScope import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.preference package page.onram.wirevpn.preference
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -10,14 +10,14 @@ import android.net.Uri
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.Toast import android.widget.Toast
import androidx.preference.Preference import androidx.preference.Preference
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.BuildConfig import page.onram.wirevpn.BuildConfig
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.Backend import page.onram.wirevpn.backend.Backend
import com.wireguard.android.backend.GoBackend import page.onram.wirevpn.backend.GoBackend
import com.wireguard.android.backend.WgQuickBackend import page.onram.wirevpn.backend.WgQuickBackend
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.lifecycleScope import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -31,7 +31,7 @@ class VersionPreference(context: Context, attrs: AttributeSet?) : Preference(con
override fun onClick() { override fun onClick() {
val intent = Intent(Intent.ACTION_VIEW) 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 { try {
context.startActivity(intent) context.startActivity(intent)
} catch (e: Throwable) { } catch (e: Throwable) {
@@ -2,21 +2,21 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.preference package page.onram.wirevpn.preference
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log import android.util.Log
import androidx.preference.Preference import androidx.preference.Preference
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.util.AdminKnobs import page.onram.wirevpn.util.AdminKnobs
import com.wireguard.android.util.BiometricAuthenticator import page.onram.wirevpn.util.BiometricAuthenticator
import com.wireguard.android.util.DownloadsFileSaver import page.onram.wirevpn.util.DownloadsFileSaver
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.activity import page.onram.wirevpn.util.activity
import com.wireguard.android.util.lifecycleScope import page.onram.wirevpn.util.lifecycleScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async import kotlinx.coroutines.async
@@ -4,7 +4,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.updater; package page.onram.wirevpn.updater;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.updater package page.onram.wirevpn.updater
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
@@ -15,9 +15,9 @@ import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.util.ErrorMessages import page.onram.wirevpn.util.ErrorMessages
import com.wireguard.android.util.QuantityFormatter import page.onram.wirevpn.util.QuantityFormatter
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.updater package page.onram.wirevpn.updater
import android.Manifest import android.Manifest
import android.app.PendingIntent import android.app.PendingIntent
@@ -17,11 +17,11 @@ import android.util.Base64
import android.util.Log import android.util.Log
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.IntentCompat import androidx.core.content.IntentCompat
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.BuildConfig import page.onram.wirevpn.BuildConfig
import com.wireguard.android.activity.MainActivity import page.onram.wirevpn.activity.MainActivity
import com.wireguard.android.util.UserKnobs import page.onram.wirevpn.util.UserKnobs
import com.wireguard.android.util.applicationScope import page.onram.wirevpn.util.applicationScope
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@@ -46,7 +46,7 @@ import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
object Updater { 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 UPDATE_URL_FMT = "https://download.wireguard.com/android-client/%s"
private const val APK_NAME_PREFIX = BuildConfig.APPLICATION_ID + "-" private const val APK_NAME_PREFIX = BuildConfig.APPLICATION_ID + "-"
private const val APK_NAME_SUFFIX = ".apk" private const val APK_NAME_SUFFIX = ".apk"
@@ -373,6 +373,17 @@ object Updater {
val context = Application.get() val context = Application.get()
/* 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("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)) if (installerIsGooglePlay(context))
return return
@@ -410,18 +421,24 @@ object Updater {
return@launch return@launch
var waitTime = 15 var waitTime = 15
var exceptionCount = 0
while (true) { while (true) {
try { try {
val update = checkForUpdates() ?: continue val update = checkForUpdates() ?: throw Exception("No updates found")
if (update.version > CURRENT_VERSION) { if (update.version > CURRENT_VERSION) {
Log.i(TAG, "Update available: ${update.version}") Log.i(TAG, "Update available: ${update.version}")
UserKnobs.setUpdaterNewerVersionSeen(update.version.toString()) UserKnobs.setUpdaterNewerVersionSeen(update.version.toString())
return@launch return@launch
} }
} catch (_: Throwable) { } catch (_: Throwable) {
if (++exceptionCount <= 6) {
delay((exceptionCount * 8).seconds)
continue
}
} }
delay(waitTime.minutes) delay(waitTime.minutes)
waitTime = 45 waitTime = 45
exceptionCount = 0
} }
} }
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.content.RestrictionsManager import android.content.RestrictionsManager
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import com.wireguard.android.Application import page.onram.wirevpn.Application
object AdminKnobs { object AdminKnobs {
private val restrictions: RestrictionsManager? = Application.get().getSystemService() private val restrictions: RestrictionsManager? = Application.get().getSystemService()
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@@ -13,7 +13,7 @@ import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.Authenticators import androidx.biometric.BiometricManager.Authenticators
import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricPrompt
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.wireguard.android.R import page.onram.wirevpn.R
object BiometricAuthenticator { object BiometricAuthenticator {
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
@@ -12,7 +12,7 @@ import android.widget.TextView
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText 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. * Standalone utilities for interacting with the system clipboard.
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.Manifest import android.Manifest
import android.content.ContentValues import android.content.ContentValues
@@ -17,7 +17,7 @@ import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.wireguard.android.R import page.onram.wirevpn.R
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -2,22 +2,22 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.content.res.Resources import android.content.res.Resources
import android.os.RemoteException import android.os.RemoteException
import com.google.zxing.ChecksumException import com.google.zxing.ChecksumException
import com.google.zxing.NotFoundException import com.google.zxing.NotFoundException
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.backend.BackendException import page.onram.wirevpn.backend.BackendException
import com.wireguard.android.util.RootShell.RootShellException import page.onram.wirevpn.util.RootShell.RootShellException
import com.wireguard.config.BadConfigException import page.onram.wirevpn.config.BadConfigException
import com.wireguard.config.InetEndpoint import page.onram.wirevpn.config.InetEndpoint
import com.wireguard.config.InetNetwork import page.onram.wirevpn.config.InetNetwork
import com.wireguard.config.ParseException import page.onram.wirevpn.config.ParseException
import com.wireguard.crypto.Key import page.onram.wirevpn.crypto.Key
import com.wireguard.crypto.KeyFormatException import page.onram.wirevpn.crypto.KeyFormatException
import java.net.InetAddress import java.net.InetAddress
object ErrorMessages { object ErrorMessages {
@@ -3,15 +3,15 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.content.Context import android.content.Context
import android.util.TypedValue import android.util.TypedValue
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.activity.SettingsActivity import page.onram.wirevpn.activity.SettingsActivity
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
fun Context.resolveAttribute(@AttrRes attrRes: Int): Int { fun Context.resolveAttribute(@AttrRes attrRes: Int): Int {
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.content.ContentResolver import android.content.ContentResolver
import android.graphics.Bitmap import android.graphics.Bitmap
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * 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.ListFormatter
import android.icu.text.MeasureFormat import android.icu.text.MeasureFormat
@@ -11,8 +11,8 @@ import android.icu.text.RelativeDateTimeFormatter
import android.icu.util.Measure import android.icu.util.Measure
import android.icu.util.MeasureUnit import android.icu.util.MeasureUnit
import android.os.Build import android.os.Build
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import java.util.Locale import java.util.Locale
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@@ -3,18 +3,18 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.util package page.onram.wirevpn.util
import android.content.ContentResolver import android.content.ContentResolver
import android.net.Uri import android.net.Uri
import android.provider.OpenableColumns import android.provider.OpenableColumns
import android.util.Log import android.util.Log
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import com.wireguard.android.Application import page.onram.wirevpn.Application
import com.wireguard.android.R import page.onram.wirevpn.R
import com.wireguard.android.fragment.ConfigNamingDialogFragment import page.onram.wirevpn.fragment.ConfigNamingDialogFragment
import com.wireguard.android.model.ObservableTunnel import page.onram.wirevpn.model.ObservableTunnel
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import kotlinx.coroutines.Deferred import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0 * 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.booleanPreferencesKey
import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.core.stringSetPreferencesKey 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.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.viewmodel package page.onram.wirevpn.viewmodel
import android.os.Build import android.os.Build
import android.os.Parcel import android.os.Parcel
@@ -10,9 +10,9 @@ import android.os.Parcelable
import androidx.core.os.ParcelCompat import androidx.core.os.ParcelCompat
import androidx.databinding.ObservableArrayList import androidx.databinding.ObservableArrayList
import androidx.databinding.ObservableList import androidx.databinding.ObservableList
import com.wireguard.config.BadConfigException import page.onram.wirevpn.config.BadConfigException
import com.wireguard.config.Config import page.onram.wirevpn.config.Config
import com.wireguard.config.Peer import page.onram.wirevpn.config.Peer
class ConfigProxy : Parcelable { class ConfigProxy : Parcelable {
val `interface`: InterfaceProxy val `interface`: InterfaceProxy
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.viewmodel package page.onram.wirevpn.viewmodel
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
@@ -10,13 +10,13 @@ import androidx.databinding.BaseObservable
import androidx.databinding.Bindable import androidx.databinding.Bindable
import androidx.databinding.ObservableArrayList import androidx.databinding.ObservableArrayList
import androidx.databinding.ObservableList import androidx.databinding.ObservableList
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.config.Attribute import page.onram.wirevpn.config.Attribute
import com.wireguard.config.BadConfigException import page.onram.wirevpn.config.BadConfigException
import com.wireguard.config.Interface import page.onram.wirevpn.config.Interface
import com.wireguard.crypto.Key import page.onram.wirevpn.crypto.Key
import com.wireguard.crypto.KeyFormatException import page.onram.wirevpn.crypto.KeyFormatException
import com.wireguard.crypto.KeyPair import page.onram.wirevpn.crypto.KeyPair
class InterfaceProxy : BaseObservable, Parcelable { class InterfaceProxy : BaseObservable, Parcelable {
@get:Bindable @get:Bindable
@@ -2,7 +2,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.viewmodel package page.onram.wirevpn.viewmodel
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
@@ -11,10 +11,10 @@ import androidx.databinding.Bindable
import androidx.databinding.Observable import androidx.databinding.Observable
import androidx.databinding.Observable.OnPropertyChangedCallback import androidx.databinding.Observable.OnPropertyChangedCallback
import androidx.databinding.ObservableList import androidx.databinding.ObservableList
import com.wireguard.android.BR import page.onram.wirevpn.BR
import com.wireguard.config.Attribute import page.onram.wirevpn.config.Attribute
import com.wireguard.config.BadConfigException import page.onram.wirevpn.config.BadConfigException
import com.wireguard.config.Peer import page.onram.wirevpn.config.Peer
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class PeerProxy : BaseObservable, Parcelable { class PeerProxy : BaseObservable, Parcelable {
@@ -2,12 +2,12 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.widget package page.onram.wirevpn.widget
import android.text.InputFilter import android.text.InputFilter
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.Spanned 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. * InputFilter for entering WireGuard private/public keys encoded with base64.
@@ -2,13 +2,13 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.widget package page.onram.wirevpn.widget
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import android.widget.RelativeLayout import android.widget.RelativeLayout
import com.wireguard.android.R import page.onram.wirevpn.R
class MultiselectableRelativeLayout @JvmOverloads constructor( class MultiselectableRelativeLayout @JvmOverloads constructor(
context: Context? = null, context: Context? = null,
@@ -2,12 +2,12 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.widget package page.onram.wirevpn.widget
import android.text.InputFilter import android.text.InputFilter
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.Spanned 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). * InputFilter for entering WireGuard configuration names (Linux interface names).
@@ -3,7 +3,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.widget package page.onram.wirevpn.widget
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.content.res.ColorStateList import android.content.res.ColorStateList
@@ -3,7 +3,7 @@
* Copyright © 2017-2025 WireGuard LLC. All Rights Reserved. * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.widget package page.onram.wirevpn.widget
import android.content.Context import android.content.Context
import android.os.Parcelable import android.os.Parcelable
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package com.wireguard.android.widget package page.onram.wirevpn.widget
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import com.google.android.material.card.MaterialCardView 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) { class TvCardView(context: Context?, attrs: AttributeSet?) : MaterialCardView(context, attrs) {
var isUp: Boolean = false var isUp: Boolean = false

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