aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java35
-rw-r--r--ui/build.gradle.kts2
-rw-r--r--ui/src/main/java/com/wireguard/android/QuickTileService.kt1
-rw-r--r--ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt4
-rw-r--r--ui/src/main/java/com/wireguard/android/activity/TunnelToggleActivity.kt1
-rw-r--r--ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt31
-rw-r--r--ui/src/main/java/com/wireguard/android/model/TunnelManager.kt5
-rw-r--r--ui/src/main/java/com/wireguard/android/updater/Updater.kt2
-rw-r--r--ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt3
-rw-r--r--ui/src/main/java/com/wireguard/android/widget/SlashDrawable.kt1
-rw-r--r--ui/src/main/res/values-v23/styles.xml10
-rw-r--r--ui/src/main/res/values/styles.xml3
12 files changed, 15 insertions, 83 deletions
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
index 46f68b4b..c9a13b2b 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
@@ -24,12 +24,10 @@ import com.wireguard.crypto.KeyFormatException;
import com.wireguard.util.NonNullForAll;
import java.net.InetAddress;
-import java.time.Instant;
import java.util.Collections;
import java.util.Set;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -45,7 +43,7 @@ public final class GoBackend implements Backend {
private static final int DNS_RESOLUTION_RETRIES = 10;
private static final String TAG = "WireGuard/GoBackend";
@Nullable private static AlwaysOnCallback alwaysOnCallback;
- private static GhettoCompletableFuture<VpnService> vpnService = new GhettoCompletableFuture<>();
+ private static CompletableFuture<VpnService> vpnService = new CompletableFuture<>();
private final Context context;
@Nullable private Config currentConfig;
@Nullable private Tunnel currentTunnel;
@@ -377,35 +375,6 @@ public final class GoBackend implements Backend {
void alwaysOnTriggered();
}
- // TODO: When we finally drop API 21 and move to API 24, delete this and replace with the ordinary CompletableFuture.
- private static final class GhettoCompletableFuture<V> {
- private final LinkedBlockingQueue<V> completion = new LinkedBlockingQueue<>(1);
- private final FutureTask<V> result = new FutureTask<>(completion::peek);
-
- public boolean complete(final V value) {
- final boolean offered = completion.offer(value);
- if (offered)
- result.run();
- return offered;
- }
-
- public V get() throws ExecutionException, InterruptedException {
- return result.get();
- }
-
- public V get(final long timeout, final TimeUnit unit) throws ExecutionException, InterruptedException, TimeoutException {
- return result.get(timeout, unit);
- }
-
- public boolean isDone() {
- return !completion.isEmpty();
- }
-
- public GhettoCompletableFuture<V> newIncompleteFuture() {
- return new GhettoCompletableFuture<>();
- }
- }
-
/**
* {@link android.net.VpnService} implementation for {@link GoBackend}
*/
diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts
index f64c9a8e..39bc753e 100644
--- a/ui/build.gradle.kts
+++ b/ui/build.gradle.kts
@@ -21,7 +21,7 @@ android {
namespace = pkg
defaultConfig {
applicationId = pkg
- minSdk = 21
+ minSdk = 24
targetSdk = 36
versionCode = providers.gradleProperty("wireguardVersionCode").get().toInt()
versionName = providers.gradleProperty("wireguardVersionName").get()
diff --git a/ui/src/main/java/com/wireguard/android/QuickTileService.kt b/ui/src/main/java/com/wireguard/android/QuickTileService.kt
index a8650b78..a849c481 100644
--- a/ui/src/main/java/com/wireguard/android/QuickTileService.kt
+++ b/ui/src/main/java/com/wireguard/android/QuickTileService.kt
@@ -32,7 +32,6 @@ import kotlinx.coroutines.launch
* system framework as necessary to update the appearance of the tile in the system UI, and to
* forward click events to the application.
*/
-@RequiresApi(Build.VERSION_CODES.N)
class QuickTileService : TileService() {
private val onStateChangedCallback = OnStateChangedCallback()
private val onTunnelChangedCallback = OnTunnelChangedCallback()
diff --git a/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt b/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
index 5ce71792..33f44cd6 100644
--- a/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
+++ b/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
@@ -72,10 +72,6 @@ class SettingsActivity : AppCompatActivity() {
darkTheme?.parent?.removePreference(darkTheme)
--preferenceScreen.initialExpandedChildrenCount
}
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
- val remoteApps = preferenceManager.findPreference<Preference>("allow_remote_control_intents")
- remoteApps?.parent?.removePreference(remoteApps)
- }
if (AdminKnobs.disableConfigExport) {
val zipExporter = preferenceManager.findPreference<Preference>("zip_exporter")
zipExporter?.parent?.removePreference(zipExporter)
diff --git a/ui/src/main/java/com/wireguard/android/activity/TunnelToggleActivity.kt b/ui/src/main/java/com/wireguard/android/activity/TunnelToggleActivity.kt
index dfc1f5b8..a0e9aa06 100644
--- a/ui/src/main/java/com/wireguard/android/activity/TunnelToggleActivity.kt
+++ b/ui/src/main/java/com/wireguard/android/activity/TunnelToggleActivity.kt
@@ -22,7 +22,6 @@ import com.wireguard.android.backend.Tunnel
import com.wireguard.android.util.ErrorMessages
import kotlinx.coroutines.launch
-@RequiresApi(Build.VERSION_CODES.N)
class TunnelToggleActivity : AppCompatActivity() {
private val permissionActivityResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { toggleTunnelWithPermissionsResult() }
diff --git a/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt b/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt
index 3084d314..a20c983c 100644
--- a/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt
+++ b/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt
@@ -266,31 +266,14 @@ class TvMainActivity : AppCompatActivity() {
private suspend fun makeStorageRoots(): Collection<KeyedFile> = withContext(Dispatchers.IO) {
cachedRoots?.let { return@withContext it }
val list = HashSet<KeyedFile>()
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- val storageManager: StorageManager = getSystemService() ?: return@withContext list
- list.addAll(storageManager.storageVolumes.mapNotNull { volume ->
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- volume.directory?.let { KeyedFile(it, volume.getDescription(this@TvMainActivity)) }
- } else {
- KeyedFile((StorageVolume::class.java.getMethod("getPathFile").invoke(volume) as File), volume.getDescription(this@TvMainActivity))
- }
- })
- } else {
- @Suppress("DEPRECATION")
- list.add(KeyedFile(Environment.getExternalStorageDirectory()))
- try {
- File("/storage").listFiles()?.forEach {
- if (!it.isDirectory) return@forEach
- try {
- if (Environment.isExternalStorageRemovable(it)) {
- list.add(KeyedFile(it))
- }
- } catch (_: Throwable) {
- }
- }
- } catch (_: Throwable) {
+ val storageManager: StorageManager = getSystemService() ?: return@withContext list
+ list.addAll(storageManager.storageVolumes.mapNotNull { volume ->
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ volume.directory?.let { KeyedFile(it, volume.getDescription(this@TvMainActivity)) }
+ } else {
+ KeyedFile((StorageVolume::class.java.getMethod("getPathFile").invoke(volume) as File), volume.getDescription(this@TvMainActivity))
}
- }
+ })
cachedRoots = list
list
}
diff --git a/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt b/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt
index d7c1391f..e08623d1 100644
--- a/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt
+++ b/ui/src/main/java/com/wireguard/android/model/TunnelManager.kt
@@ -221,10 +221,9 @@ class TunnelManager(private val configStore: ConfigStore) : BaseObservable() {
manager.refreshTunnelStates()
return@launch
}
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || !UserKnobs.allowRemoteControlIntents.first())
+ if (!UserKnobs.allowRemoteControlIntents.first())
return@launch
- val state: Tunnel.State
- state = when (action) {
+ val state = when (action) {
"com.wireguard.android.action.SET_TUNNEL_UP" -> Tunnel.State.UP
"com.wireguard.android.action.SET_TUNNEL_DOWN" -> Tunnel.State.DOWN
else -> return@launch
diff --git a/ui/src/main/java/com/wireguard/android/updater/Updater.kt b/ui/src/main/java/com/wireguard/android/updater/Updater.kt
index 46d0fe34..27e2cba0 100644
--- a/ui/src/main/java/com/wireguard/android/updater/Updater.kt
+++ b/ui/src/main/java/com/wireguard/android/updater/Updater.kt
@@ -264,7 +264,7 @@ object Updater {
throw IOException("Update could not be fetched: ${connection.responseCode}")
var downloadedByteLen: ULong = 0UL
- val totalByteLen = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) connection.contentLengthLong else connection.contentLength).toLong().toULong()
+ val totalByteLen = connection.contentLengthLong.toULong()
val fileBytes = ByteArray(1024 * 32 /* 32 KiB */)
val digest = MessageDigest.getInstance("SHA-256")
emitProgress(Progress.Downloading(downloadedByteLen, totalByteLen), true)
diff --git a/ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt b/ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt
index 2fbb5c29..abac57c5 100644
--- a/ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt
+++ b/ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt
@@ -31,9 +31,6 @@ object QuantityFormatter {
fun formatEpochAgo(epochMillis: Long): String {
var span = (System.currentTimeMillis() - epochMillis) / 1000
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
- return Application.get().applicationContext.getString(R.string.latest_handshake_ago, span.seconds.toString())
-
if (span <= 0L)
return RelativeDateTimeFormatter.getInstance().format(RelativeDateTimeFormatter.Direction.PLAIN, RelativeDateTimeFormatter.AbsoluteUnit.NOW)
val measureFormat = MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.WIDE)
diff --git a/ui/src/main/java/com/wireguard/android/widget/SlashDrawable.kt b/ui/src/main/java/com/wireguard/android/widget/SlashDrawable.kt
index 79dc3338..c69e6d8b 100644
--- a/ui/src/main/java/com/wireguard/android/widget/SlashDrawable.kt
+++ b/ui/src/main/java/com/wireguard/android/widget/SlashDrawable.kt
@@ -15,7 +15,6 @@ import androidx.annotation.ColorInt
import androidx.annotation.IntRange
import androidx.annotation.RequiresApi
-@RequiresApi(Build.VERSION_CODES.N)
class SlashDrawable(private val mDrawable: Drawable) : Drawable() {
private val mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
private val mPath = Path()
diff --git a/ui/src/main/res/values-v23/styles.xml b/ui/src/main/res/values-v23/styles.xml
deleted file mode 100644
index 0068c91e..00000000
--- a/ui/src/main/res/values-v23/styles.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
- ~ SPDX-License-Identifier: Apache-2.0
- -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="AppTheme" parent="AppThemeBase">
- <item name="android:statusBarColor">?android:colorBackground</item>
- <item name="android:windowLightStatusBar">@bool/light_status_bar</item>
- </style>
-</resources>
diff --git a/ui/src/main/res/values/styles.xml b/ui/src/main/res/values/styles.xml
index 09e96a45..28e9fc2f 100644
--- a/ui/src/main/res/values/styles.xml
+++ b/ui/src/main/res/values/styles.xml
@@ -12,7 +12,8 @@
<item name="materialCardViewStyle">@style/WireGuardTheme.MaterialCardView</item>
<item name="toolbarStyle">@style/WireGuardTheme.Toolbar</item>
<item name="bottomSheetDialogTheme">@style/WireGuardTheme.BottomSheetDialog</item>
- <item name="android:statusBarColor">@null</item>
+ <item name="android:statusBarColor">?android:colorBackground</item>
+ <item name="android:windowLightStatusBar">@bool/light_status_bar</item>
</style>
<!-- Various additional API-specific features in values-v*/styles.xml -->