diff options
author | 2023-04-25 14:00:44 +0200 | |
---|---|---|
committer | 2023-04-25 14:00:55 +0200 | |
commit | 888bb817f426164368748a779451dcb5b6ff1a62 (patch) | |
tree | d8d70829d84ed43a33c8cb290c13ba84d3c2b09d | |
parent | ui: display latest handshake time (diff) | |
download | wireguard-android-jd/icu-units.tar.xz wireguard-android-jd/icu-units.zip |
wip: use icu class for resolving byte measurementsjd/icu-units
Dunno if I'll complete this. Doesn't seem worth the bloat.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt | 35 |
1 files changed, 30 insertions, 5 deletions
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 1d19ea9e..14444c7f 100644 --- a/ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt +++ b/ui/src/main/java/com/wireguard/android/util/QuantityFormatter.kt @@ -11,6 +11,7 @@ import android.icu.text.RelativeDateTimeFormatter import android.icu.util.Measure import android.icu.util.MeasureUnit import android.os.Build +import androidx.annotation.RequiresApi import com.wireguard.android.Application import com.wireguard.android.R import java.util.Locale @@ -18,14 +19,38 @@ import kotlin.time.DurationUnit import kotlin.time.toDuration object QuantityFormatter { + @RequiresApi(Build.VERSION_CODES.N) + private fun resolveDigitalMeasureUnit(identifier: String): MeasureUnit { + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + MeasureUnit::class.java.getMethod("internalGetInstance", String::class.java, String::class.java).invoke(null, "digital", identifier) as MeasureUnit + } else { + MeasureUnit.forIdentifier(identifier) + } + } + private lateinit var KIBIBYTE : MeasureUnit + private lateinit var MEBIBYTE : MeasureUnit + private lateinit var GIBIBYTE : MeasureUnit + private lateinit var TEBIBYTE : MeasureUnit + + init { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + KIBIBYTE = resolveDigitalMeasureUnit("kibibyte") + MEBIBYTE = resolveDigitalMeasureUnit("mebibyte") + GIBIBYTE = resolveDigitalMeasureUnit("gibibyte") + TEBIBYTE = resolveDigitalMeasureUnit("tebibyte") + } + } + fun formatBytes(bytes: Long): String { val context = Application.get().applicationContext + val measureFormat = MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.NARROW) + return when { - bytes < 1024 -> context.getString(R.string.transfer_bytes, bytes) - bytes < 1024 * 1024 -> context.getString(R.string.transfer_kibibytes, bytes / 1024.0) - bytes < 1024 * 1024 * 1024 -> context.getString(R.string.transfer_mibibytes, bytes / (1024.0 * 1024.0)) - bytes < 1024 * 1024 * 1024 * 1024L -> context.getString(R.string.transfer_gibibytes, bytes / (1024.0 * 1024.0 * 1024.0)) - else -> context.getString(R.string.transfer_tibibytes, bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0) + bytes < 1024 -> measureFormat.format(Measure(bytes, MeasureUnit.BYTE)) + bytes < 1024 * 1024 -> measureFormat.format(Measure(bytes / 1024.0, KIBIBYTE)) + bytes < 1024 * 1024 * 1024 -> measureFormat.format(Measure(bytes / (1024.0 * 1024.0), MEBIBYTE)) + bytes < 1024 * 1024 * 1024 * 1024L -> measureFormat.format(Measure(bytes / (1024.0 * 1024.0 * 1024.0), GIBIBYTE)) + else -> measureFormat.format(Measure(bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0, TEBIBYTE)) } } |