Move FiatMoney object to core-util module.
This commit is contained in:
parent
0fa13eb097
commit
7752b3aba3
12 changed files with 128 additions and 42 deletions
|
@ -9,7 +9,7 @@ import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
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.DateUtils;
|
||||||
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
|
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.payments.Payee;
|
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 org.whispersystems.signalservice.api.payments.Money;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
|
@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.payments.FiatMoneyUtil;
|
||||||
import org.thoughtcrime.securesms.payments.PaymentTransactionLiveData;
|
import org.thoughtcrime.securesms.payments.PaymentTransactionLiveData;
|
||||||
import org.thoughtcrime.securesms.payments.PaymentsAddressException;
|
import org.thoughtcrime.securesms.payments.PaymentsAddressException;
|
||||||
import org.thoughtcrime.securesms.payments.confirm.ConfirmPaymentRepository.ConfirmPaymentResult;
|
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.DefaultValueLiveData;
|
||||||
import org.thoughtcrime.securesms.util.SingleLiveEvent;
|
import org.thoughtcrime.securesms.util.SingleLiveEvent;
|
||||||
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
|
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
|
||||||
|
|
|
@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.payments.Balance;
|
||||||
import org.thoughtcrime.securesms.payments.CreatePaymentDetails;
|
import org.thoughtcrime.securesms.payments.CreatePaymentDetails;
|
||||||
import org.thoughtcrime.securesms.payments.FiatMoneyUtil;
|
import org.thoughtcrime.securesms.payments.FiatMoneyUtil;
|
||||||
import org.thoughtcrime.securesms.payments.currency.CurrencyExchange;
|
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.payments.preferences.model.PayeeParcelable;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.util.DefaultValueLiveData;
|
import org.thoughtcrime.securesms.util.DefaultValueLiveData;
|
||||||
|
|
|
@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.payments.create;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.payments.currency.CurrencyExchange;
|
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.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.payments.Money;
|
import org.whispersystems.signalservice.api.payments.Money;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
|
import org.signal.core.util.money.FiatMoney;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.payments.Money;
|
import org.whispersystems.signalservice.api.payments.Money;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.payments.currency.CurrencyExchange;
|
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 org.thoughtcrime.securesms.payments.preferences.model.PaymentItem;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
|
@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.payments.Payment;
|
||||||
import org.thoughtcrime.securesms.payments.UnreadPaymentsRepository;
|
import org.thoughtcrime.securesms.payments.UnreadPaymentsRepository;
|
||||||
import org.thoughtcrime.securesms.payments.currency.CurrencyExchange;
|
import org.thoughtcrime.securesms.payments.currency.CurrencyExchange;
|
||||||
import org.thoughtcrime.securesms.payments.currency.CurrencyExchangeRepository;
|
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.InProgress;
|
||||||
import org.thoughtcrime.securesms.payments.preferences.model.InfoCard;
|
import org.thoughtcrime.securesms.payments.preferences.model.InfoCard;
|
||||||
import org.thoughtcrime.securesms.payments.preferences.model.IntroducingPayments;
|
import org.thoughtcrime.securesms.payments.preferences.model.IntroducingPayments;
|
||||||
|
|
|
@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.junit.runners.Parameterized;
|
import org.junit.runners.Parameterized;
|
||||||
|
import org.signal.core.util.money.FiatMoney;
|
||||||
import org.whispersystems.signalservice.api.payments.Money;
|
import org.whispersystems.signalservice.api.payments.Money;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
@ -12,7 +13,6 @@ import java.math.RoundingMode;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Currency;
|
import java.util.Currency;
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue