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