aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-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))
}
}