aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2023-04-25 14:00:44 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2023-04-25 14:00:55 +0200
commit888bb817f426164368748a779451dcb5b6ff1a62 (patch)
treed8d70829d84ed43a33c8cb290c13ba84d3c2b09d
parentui: display latest handshake time (diff)
downloadwireguard-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.kt35
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))
}
}