Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
### Added
- Added digital data converter with binary and decimal units

## [1.4.0] - 2026-01-30
### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ interface Converter {
TimeConverter,
SpeedConverter,
PressureConverter,
EnergyConverter
EnergyConverter,
DataConverter
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
package org.fossify.math.helpers.converters

import org.fossify.math.R
import java.math.BigDecimal

object DataConverter : Converter {
override val nameResId: Int = R.string.unit_data
override val imageResId: Int = R.drawable.ic_data_vector
override val key: String = "DataConverter"

private val BITS_IN_BYTE = BigDecimal("8")
private val KILO = BigDecimal("1000")
private val KIBI = BigDecimal("1024")

private const val EXPONENT_2 = 2
private const val EXPONENT_3 = 3
private const val EXPONENT_4 = 4
private const val EXPONENT_5 = 5

sealed class Unit(nameResId: Int, symbolResId: Int, factor: BigDecimal, key: String) :
Converter.Unit(nameResId, symbolResId, factor, key) {
data object Bit : Unit(
nameResId = R.string.unit_data_bit,
symbolResId = R.string.unit_data_bit_symbol,
factor = BigDecimal.ONE,
key = "Bit"
)

data object Nibble : Unit(
nameResId = R.string.unit_data_nibble,
symbolResId = R.string.unit_data_nibble_symbol,
factor = BigDecimal("4"),
key = "Nibble"
)

data object Byte : Unit(
nameResId = R.string.unit_data_byte,
symbolResId = R.string.unit_data_byte_symbol,
factor = BITS_IN_BYTE,
key = "Byte"
)

// Decimal Bits (1000^n)
data object Kilobit : Unit(
nameResId = R.string.unit_data_kilobit,
symbolResId = R.string.unit_data_kilobit_symbol,
factor = KILO,
key = "Kilobit"
)

data object Megabit : Unit(
nameResId = R.string.unit_data_megabit,
symbolResId = R.string.unit_data_megabit_symbol,
factor = KILO.pow(EXPONENT_2),
key = "Megabit"
)

data object Gigabit : Unit(
nameResId = R.string.unit_data_gigabit,
symbolResId = R.string.unit_data_gigabit_symbol,
factor = KILO.pow(EXPONENT_3),
key = "Gigabit"
)

data object Terabit : Unit(
nameResId = R.string.unit_data_terabit,
symbolResId = R.string.unit_data_terabit_symbol,
factor = KILO.pow(EXPONENT_4),
key = "Terabit"
)

data object Petabit : Unit(
nameResId = R.string.unit_data_petabit,
symbolResId = R.string.unit_data_petabit_symbol,
factor = KILO.pow(EXPONENT_5),
key = "Petabit"
)

// Binary Bits (1024^n)
data object Kibibit : Unit(
nameResId = R.string.unit_data_kibibit,
symbolResId = R.string.unit_data_kibibit_symbol,
factor = KIBI,
key = "Kibibit"
)

data object Mebibit : Unit(
nameResId = R.string.unit_data_mebibit,
symbolResId = R.string.unit_data_mebibit_symbol,
factor = KIBI.pow(EXPONENT_2),
key = "Mebibit"
)

data object Gibibit : Unit(
nameResId = R.string.unit_data_gibibit,
symbolResId = R.string.unit_data_gibibit_symbol,
factor = KIBI.pow(EXPONENT_3),
key = "Gibibit"
)

data object Tebibit : Unit(
nameResId = R.string.unit_data_tebibit,
symbolResId = R.string.unit_data_tebibit_symbol,
factor = KIBI.pow(EXPONENT_4),
key = "Tebibit"
)

data object Pebibit : Unit(
nameResId = R.string.unit_data_pebibit,
symbolResId = R.string.unit_data_pebibit_symbol,
factor = KIBI.pow(EXPONENT_5),
key = "Pebibit"
)

// Decimal Bytes (8 * 1000^n)
data object Kilobyte : Unit(
nameResId = R.string.unit_data_kilobyte,
symbolResId = R.string.unit_data_kilobyte_symbol,
factor = BITS_IN_BYTE.multiply(KILO),
key = "Kilobyte"
)

data object Megabyte : Unit(
nameResId = R.string.unit_data_megabyte,
symbolResId = R.string.unit_data_megabyte_symbol,
factor = BITS_IN_BYTE.multiply(KILO.pow(EXPONENT_2)),
key = "Megabyte"
)

data object Gigabyte : Unit(
nameResId = R.string.unit_data_gigabyte,
symbolResId = R.string.unit_data_gigabyte_symbol,
factor = BITS_IN_BYTE.multiply(KILO.pow(EXPONENT_3)),
key = "Gigabyte"
)

data object Terabyte : Unit(
nameResId = R.string.unit_data_terabyte,
symbolResId = R.string.unit_data_terabyte_symbol,
factor = BITS_IN_BYTE.multiply(KILO.pow(EXPONENT_4)),
key = "Terabyte"
)

data object Petabyte : Unit(
nameResId = R.string.unit_data_petabyte,
symbolResId = R.string.unit_data_petabyte_symbol,
factor = BITS_IN_BYTE.multiply(KILO.pow(EXPONENT_5)),
key = "Petabyte"
)

// Binary Bytes (8 * 1024^n)
data object Kibibyte : Unit(
nameResId = R.string.unit_data_kibibyte,
symbolResId = R.string.unit_data_kibibyte_symbol,
factor = BITS_IN_BYTE.multiply(KIBI),
key = "Kibibyte"
)

data object Mebibyte : Unit(
nameResId = R.string.unit_data_mebibyte,
symbolResId = R.string.unit_data_mebibyte_symbol,
factor = BITS_IN_BYTE.multiply(KIBI.pow(EXPONENT_2)),
key = "Mebibyte"
)

data object Gibibyte : Unit(
nameResId = R.string.unit_data_gibibyte,
symbolResId = R.string.unit_data_gibibyte_symbol,
factor = BITS_IN_BYTE.multiply(KIBI.pow(EXPONENT_3)),
key = "Gibibyte"
)

data object Tebibyte : Unit(
nameResId = R.string.unit_data_tebibyte,
symbolResId = R.string.unit_data_tebibyte_symbol,
factor = BITS_IN_BYTE.multiply(KIBI.pow(EXPONENT_4)),
key = "Tebibyte"
)

data object Pebibyte : Unit(
nameResId = R.string.unit_data_pebibyte,
symbolResId = R.string.unit_data_pebibyte_symbol,
factor = BITS_IN_BYTE.multiply(KIBI.pow(EXPONENT_5)),
key = "Pebibyte"
)
}

override val units: List<Unit> = listOf(
Unit.Bit,
Unit.Nibble,
Unit.Byte,
Unit.Kilobit,
Unit.Kibibit,
Unit.Megabit,
Unit.Mebibit,
Unit.Gigabit,
Unit.Gibibit,
Unit.Terabit,
Unit.Tebibit,
Unit.Petabit,
Unit.Pebibit,
Unit.Kilobyte,
Unit.Kibibyte,
Unit.Megabyte,
Unit.Mebibyte,
Unit.Gigabyte,
Unit.Gibibyte,
Unit.Terabyte,
Unit.Tebibyte,
Unit.Petabyte,
Unit.Pebibyte,
)

override val defaultTopUnit: Unit = Unit.Kilobyte
override val defaultBottomUnit: Unit = Unit.Byte
}
3 changes: 3 additions & 0 deletions app/src/main/res/drawable/ic_data_vector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="6.35" android:viewportHeight="6.35">
<path android:fillColor="@android:color/white" android:pathData="m3.1864,0.0113c-0.6046,0 -1.2568,0.0897 -1.7724,0.2954C1.1563,0.4095 0.93,0.5416 0.7641,0.7146 0.5979,0.8879 0.4935,1.1069 0.4935,1.3568v3.6154c0,0.2576 0.1045,0.482 0.2706,0.6594 0.1658,0.1771 0.3916,0.3119 0.6499,0.4155 0.5165,0.2071 1.1688,0.2916 1.7724,0.2916 0.6037,0 1.2496,-0.0843 1.761,-0.2916C5.2032,5.9434 5.426,5.8088 5.5897,5.6316 5.7537,5.454 5.8565,5.2292 5.8565,4.9722v-3.6154c0,-0.2487 -0.1028,-0.4671 -0.2668,-0.6404C5.4259,0.5435 5.2025,0.4117 4.9474,0.3086 4.437,0.1023 3.7912,0.0113 3.1864,0.0113ZM3.1864,0.5278c0.8267,0 1.3793,0.1483 1.7172,0.3164 0.1689,0.084 0.2834,0.1729 0.3526,0.2478 0.0681,0.0737 0.0858,0.1477 0.0858,0.1429 0,-0.0048 -0.0173,0.0668 -0.0858,0.141C5.187,1.4508 5.0725,1.5395 4.9036,1.6237 4.5658,1.7918 4.0131,1.94 3.1864,1.94 2.3598,1.94 1.807,1.7918 1.4693,1.6237 1.3002,1.5394 1.1834,1.4503 1.1148,1.3759 1.0468,1.3022 1.0309,1.2327 1.0309,1.2349c0,0.0021 0.0163,-0.0697 0.0839,-0.1429C1.1835,1.0176 1.3002,0.9283 1.4693,0.8442 1.807,0.6761 2.3598,0.5278 3.1864,0.5278ZM1.01,1.9381c0.0011,0.0008 0.0008,0.0011 0.0019,0.0019 0.0717,0.0504 0.1749,0.111 0.3335,0.1811 0.3835,0.1695 0.9819,0.3354 1.841,0.3354 0.8592,0 1.4556,-0.166 1.8391,-0.3354 0.1583,-0.0699 0.2618,-0.1307 0.3335,-0.1811 0.0011,-0.0008 0.0008,-0.0011 0.0019,-0.0019v0.5279c0,0.0295 -0.023,0.1018 -0.0934,0.1849C5.1973,2.7339 5.0817,2.8305 4.9113,2.9177 4.5823,3.086 3.7708,3.2379 3.1865,3.2379 2.6021,3.2379 1.7905,3.0861 1.4617,2.9177 1.2913,2.8304 1.1762,2.7341 1.1053,2.6509 1.0343,2.5677 1.01,2.4947 1.01,2.466ZM1.01,3.236c0.0011,0.0008 0.0008,0.0011 0.0019,0.0019 0.0717,0.0504 0.1749,0.111 0.3335,0.1811 0.3835,0.1695 0.9819,0.3354 1.841,0.3354 0.8592,0 1.4556,-0.166 1.8391,-0.3354 0.1583,-0.0699 0.2618,-0.1307 0.3335,-0.1811 0.0011,-0.0008 0.0008,-0.0011 0.0019,-0.0019v0.5279c0,0.0295 -0.023,0.1018 -0.0934,0.1849 -0.0704,0.083 -0.186,0.1796 -0.3564,0.2668C4.5697,4.3904 4.0133,4.5358 3.1865,4.5358 2.3597,4.5358 1.8031,4.3905 1.4617,4.2156 1.2913,4.1283 1.1762,4.032 1.1053,3.9488 1.0343,3.8656 1.01,3.7925 1.01,3.7639ZM1.01,4.5243c0.0011,0.0008 0.0008,0.0011 0.0019,0.0019 0.0717,0.0504 0.1749,0.111 0.3335,0.1811 0.3835,0.1695 0.9819,0.3354 1.841,0.3354 0.8592,0 1.4556,-0.166 1.8391,-0.3354 0.1583,-0.0699 0.2618,-0.1307 0.3335,-0.1811 0.0011,-0.0008 0.0008,-0.0011 0.0019,-0.0019v0.5279c0,0.0295 -0.023,0.1018 -0.0934,0.1849 -0.0704,0.083 -0.186,0.1796 -0.3564,0.2668 -0.3415,0.1748 -0.898,0.3202 -1.7248,0.3202 -0.8268,0 -1.3834,-0.1453 -1.7248,-0.3202C1.2913,5.4166 1.1762,5.3203 1.1053,5.2371 1.0343,5.1539 1.01,5.0809 1.01,5.0522Z"/>
</vector>
24 changes: 24 additions & 0 deletions app/src/main/res/values/donottranslate.xml
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,28 @@
<string name="unit_energy_therm_symbol">thm</string>
<string name="unit_energy_foot_pound_symbol">ft⋅lbf</string>
<string name="unit_energy_erg_symbol">erg</string>

<string name="unit_data_bit_symbol">b</string>
<string name="unit_data_nibble_symbol">nib</string>
<string name="unit_data_byte_symbol">B</string>
<string name="unit_data_kilobit_symbol">kb</string>
<string name="unit_data_kibibit_symbol">Kib</string>
<string name="unit_data_megabit_symbol">Mb</string>
<string name="unit_data_mebibit_symbol">Mib</string>
<string name="unit_data_gigabit_symbol">Gb</string>
<string name="unit_data_gibibit_symbol">Gib</string>
<string name="unit_data_terabit_symbol">Tb</string>
<string name="unit_data_tebibit_symbol">Tib</string>
<string name="unit_data_petabit_symbol">Pb</string>
<string name="unit_data_pebibit_symbol">Pib</string>
<string name="unit_data_kilobyte_symbol">kB</string>
<string name="unit_data_kibibyte_symbol">KiB</string>
<string name="unit_data_megabyte_symbol">MB</string>
<string name="unit_data_mebibyte_symbol">MiB</string>
<string name="unit_data_gigabyte_symbol">GB</string>
<string name="unit_data_gibibyte_symbol">GiB</string>
<string name="unit_data_terabyte_symbol">TB</string>
<string name="unit_data_tebibyte_symbol">TiB</string>
<string name="unit_data_petabyte_symbol">PB</string>
<string name="unit_data_pebibyte_symbol">PiB</string>
</resources>
25 changes: 25 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,31 @@
<string name="unit_energy_foot_pound">Foot-pound</string>
<string name="unit_energy_erg">Erg</string>

<string name="unit_data">Data</string>
<string name="unit_data_bit">Bit</string>
<string name="unit_data_nibble">Nibble</string>
<string name="unit_data_byte">Byte</string>
<string name="unit_data_kilobit">Kilobit</string>
<string name="unit_data_kibibit">Kibibit</string>
<string name="unit_data_megabit">Megabit</string>
<string name="unit_data_mebibit">Mebibit</string>
<string name="unit_data_gigabit">Gigabit</string>
<string name="unit_data_gibibit">Gibibit</string>
<string name="unit_data_terabit">Terabit</string>
<string name="unit_data_tebibit">Tebibit</string>
<string name="unit_data_petabit">Petabit</string>
<string name="unit_data_pebibit">Pebibit</string>
<string name="unit_data_kilobyte">Kilobyte</string>
<string name="unit_data_kibibyte">Kibibyte</string>
<string name="unit_data_megabyte">Megabyte</string>
<string name="unit_data_mebibyte">Mebibyte</string>
<string name="unit_data_gigabyte">Gigabyte</string>
<string name="unit_data_gibibyte">Gibibyte</string>
<string name="unit_data_terabyte">Terabyte</string>
<string name="unit_data_tebibyte">Tebibyte</string>
<string name="unit_data_petabyte">Petabyte</string>
<string name="unit_data_pebibyte">Pebibyte</string>

<!-- FAQ -->
<string name="faq_1_title">How does the C (Clear) button work?</string>
<string name="faq_1_text">Tapping on it will remove one character at a time. Long pressing it will reset all fields at once.</string>
Expand Down
Loading