From 7752b3aba3d9b14c81ec48c51906d86266850f53 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 30 Sep 2021 11:44:18 -0300 Subject: [PATCH] Move FiatMoney object to core-util module. --- .../securesms/payments/FiatMoneyUtil.java | 2 +- .../payments/confirm/ConfirmPaymentState.java | 2 +- .../confirm/ConfirmPaymentViewModel.java | 2 +- .../create/CreatePaymentViewModel.java | 2 +- .../securesms/payments/create/InputState.java | 2 +- .../payments/currency/CurrencyExchange.java | 1 + .../payments/currency/FiatMoney.java | 34 ----------- .../preferences/PaymentsHomeState.java | 2 +- .../preferences/PaymentsHomeViewModel.java | 2 +- .../currency/ExchangeRate_exchange.java | 2 +- .../org/signal/core/util/money/FiatMoney.java | 59 ++++++++++++++++++ .../signal/core/util/money/FiatMoneyTest.java | 60 +++++++++++++++++++ 12 files changed, 128 insertions(+), 42 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/payments/currency/FiatMoney.java create mode 100644 core-util/src/main/java/org/signal/core/util/money/FiatMoney.java create mode 100644 core-util/src/test/java/org/signal/core/util/money/FiatMoneyTest.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/FiatMoneyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/payments/FiatMoneyUtil.java index 4d7e4e715f..be07524bfd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/FiatMoneyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/FiatMoneyUtil.java @@ -9,7 +9,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.whispersystems.libsignal.util.guava.Optional; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentState.java b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentState.java index dbcf498a7a..e6c10df0d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentState.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.payments.Payee; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.whispersystems.signalservice.api.payments.Money; import java.util.UUID; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentViewModel.java index d703b5dbd3..5bee84824f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentViewModel.java @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.payments.FiatMoneyUtil; import org.thoughtcrime.securesms.payments.PaymentTransactionLiveData; import org.thoughtcrime.securesms.payments.PaymentsAddressException; import org.thoughtcrime.securesms.payments.confirm.ConfirmPaymentRepository.ConfirmPaymentResult; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java index bf2cb846da..f5ec25a4d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.payments.Balance; import org.thoughtcrime.securesms.payments.CreatePaymentDetails; import org.thoughtcrime.securesms.payments.FiatMoneyUtil; import org.thoughtcrime.securesms.payments.currency.CurrencyExchange; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.thoughtcrime.securesms.payments.preferences.model.PayeeParcelable; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.DefaultValueLiveData; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/create/InputState.java b/app/src/main/java/org/thoughtcrime/securesms/payments/create/InputState.java index 66f7b8bee9..db77fb91c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/create/InputState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/create/InputState.java @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.payments.create; import androidx.annotation.NonNull; import org.thoughtcrime.securesms.payments.currency.CurrencyExchange; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.payments.Money; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/currency/CurrencyExchange.java b/app/src/main/java/org/thoughtcrime/securesms/payments/currency/CurrencyExchange.java index ce5df39b53..97d238cfff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/currency/CurrencyExchange.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/currency/CurrencyExchange.java @@ -4,6 +4,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.signal.core.util.money.FiatMoney; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.payments.Money; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/currency/FiatMoney.java b/app/src/main/java/org/thoughtcrime/securesms/payments/currency/FiatMoney.java deleted file mode 100644 index 2d9b6b4860..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/currency/FiatMoney.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.thoughtcrime.securesms.payments.currency; - -import androidx.annotation.NonNull; - -import java.math.BigDecimal; -import java.util.Currency; - -public class FiatMoney { - private final BigDecimal amount; - private final Currency currency; - private final long timestamp; - - public FiatMoney(@NonNull BigDecimal amount, @NonNull Currency currency) { - this(amount, currency, 0); - } - - public FiatMoney(@NonNull BigDecimal amount, @NonNull Currency currency, long timestamp) { - this.amount = amount; - this.currency = currency; - this.timestamp = timestamp; - } - - public @NonNull BigDecimal getAmount() { - return amount; - } - - public @NonNull Currency getCurrency() { - return currency; - } - - public long getTimestamp() { - return timestamp; - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeState.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeState.java index d2454a1dda..00795efa9f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeState.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.payments.currency.CurrencyExchange; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.thoughtcrime.securesms.payments.preferences.model.PaymentItem; import java.util.Collections; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java index 0df85f2ba9..ac5354a643 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java @@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.payments.Payment; import org.thoughtcrime.securesms.payments.UnreadPaymentsRepository; import org.thoughtcrime.securesms.payments.currency.CurrencyExchange; import org.thoughtcrime.securesms.payments.currency.CurrencyExchangeRepository; -import org.thoughtcrime.securesms.payments.currency.FiatMoney; +import org.signal.core.util.money.FiatMoney; import org.thoughtcrime.securesms.payments.preferences.model.InProgress; import org.thoughtcrime.securesms.payments.preferences.model.InfoCard; import org.thoughtcrime.securesms.payments.preferences.model.IntroducingPayments; diff --git a/app/src/test/java/org/thoughtcrime/securesms/payments/currency/ExchangeRate_exchange.java b/app/src/test/java/org/thoughtcrime/securesms/payments/currency/ExchangeRate_exchange.java index dbb67b7e22..e546242796 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/payments/currency/ExchangeRate_exchange.java +++ b/app/src/test/java/org/thoughtcrime/securesms/payments/currency/ExchangeRate_exchange.java @@ -5,6 +5,7 @@ import androidx.annotation.NonNull; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.signal.core.util.money.FiatMoney; import org.whispersystems.signalservice.api.payments.Money; import java.math.BigDecimal; @@ -12,7 +13,6 @@ import java.math.RoundingMode; import java.util.Arrays; import java.util.Collection; import java.util.Currency; -import java.util.HashMap; import static org.junit.Assert.assertEquals; diff --git a/core-util/src/main/java/org/signal/core/util/money/FiatMoney.java b/core-util/src/main/java/org/signal/core/util/money/FiatMoney.java new file mode 100644 index 0000000000..d1cfc4ea59 --- /dev/null +++ b/core-util/src/main/java/org/signal/core/util/money/FiatMoney.java @@ -0,0 +1,59 @@ +package org.signal.core.util.money; + +import androidx.annotation.NonNull; + +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.util.Currency; + +public class FiatMoney { + private final BigDecimal amount; + private final Currency currency; + private final long timestamp; + + public FiatMoney(@NonNull BigDecimal amount, @NonNull Currency currency) { + this(amount, currency, 0); + } + + public FiatMoney(@NonNull BigDecimal amount, @NonNull Currency currency, long timestamp) { + this.amount = amount; + this.currency = currency; + this.timestamp = timestamp; + } + + public @NonNull BigDecimal getAmount() { + return amount; + } + + public @NonNull Currency getCurrency() { + return currency; + } + + public long getTimestamp() { + return timestamp; + } + + /** + * @return amount, rounded to the default fractional amount. + */ + public @NonNull String getDefaultPrecisionString() { + NumberFormat formatter = NumberFormat.getInstance(); + formatter.setMinimumFractionDigits(currency.getDefaultFractionDigits()); + formatter.setGroupingUsed(false); + + return formatter.format(amount); + } + + /** + * @return amount, in smallest possible units (cents, yen, etc.) + */ + public @NonNull String getMinimumUnitPrecisionString() { + NumberFormat formatter = NumberFormat.getInstance(); + formatter.setMaximumFractionDigits(0); + formatter.setGroupingUsed(false); + BigDecimal multiplicand = BigDecimal.TEN.pow(currency.getDefaultFractionDigits()); + + + return formatter.format(amount.multiply(multiplicand)); + } +} diff --git a/core-util/src/test/java/org/signal/core/util/money/FiatMoneyTest.java b/core-util/src/test/java/org/signal/core/util/money/FiatMoneyTest.java new file mode 100644 index 0000000000..c9f0c0a2b5 --- /dev/null +++ b/core-util/src/test/java/org/signal/core/util/money/FiatMoneyTest.java @@ -0,0 +1,60 @@ +package org.signal.core.util.money; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Currency; + +import static org.junit.Assert.assertEquals; + +public class FiatMoneyTest { + + @Test + public void given100USD_whenIGetDefaultPrecisionString_thenIExpect100dot00() { + // GIVEN + FiatMoney fiatMoney = new FiatMoney(BigDecimal.valueOf(100), Currency.getInstance("USD")); + + // WHEN + String result = fiatMoney.getDefaultPrecisionString(); + + // THEN + assertEquals("100.00", result); + } + + @Test + public void given100USD_whenIGetMinimumUnitPrecisionString_thenIExpect10000() { + // GIVEN + FiatMoney fiatMoney = new FiatMoney(BigDecimal.valueOf(100), Currency.getInstance("USD")); + + // WHEN + String result = fiatMoney.getMinimumUnitPrecisionString(); + + // THEN + assertEquals("10000", result); + } + + @Test + public void given100JPY_whenIGetDefaultPrecisionString_thenIExpect100() { + // GIVEN + FiatMoney fiatMoney = new FiatMoney(BigDecimal.valueOf(100), Currency.getInstance("JPY")); + + // WHEN + String result = fiatMoney.getDefaultPrecisionString(); + + // THEN + assertEquals("100", result); + } + + @Test + public void given100JPY_whenIGetMinimumUnitPrecisionString_thenIExpect100() { + // GIVEN + FiatMoney fiatMoney = new FiatMoney(BigDecimal.valueOf(100), Currency.getInstance("JPY")); + + // WHEN + String result = fiatMoney.getMinimumUnitPrecisionString(); + + // THEN + assertEquals("100", result); + } + +} \ No newline at end of file