diff options
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 --> |
