mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-04 17:28:42 +02:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cc7cdb383c | ||
![]() |
ac1ea05ef6 | ||
![]() |
1ddd4f30b9 | ||
![]() |
1dc081834f | ||
![]() |
ce084927e1 | ||
![]() |
3610781f43 | ||
![]() |
ef3ddbac71 | ||
![]() |
0512af1496 | ||
![]() |
bd2c49669a | ||
![]() |
ac7831d0f9 | ||
![]() |
0f0b9a38c7 | ||
![]() |
807db19603 | ||
![]() |
c956f38899 | ||
![]() |
db68f517d3 | ||
![]() |
d4b293af80 | ||
![]() |
f7bbfc2fac | ||
![]() |
e08964749e | ||
![]() |
a05fa9d177 | ||
![]() |
7fe2fbe37d | ||
![]() |
40e30fed08 | ||
![]() |
320c7865ff | ||
![]() |
5e8cf8010e | ||
![]() |
e671fa19e0 | ||
![]() |
20d5b9a100 |
@@ -121,7 +121,7 @@ set_target_properties(easylogging PROPERTIES IMPORTED_LOCATION
|
||||
|
||||
add_library(unbound STATIC IMPORTED)
|
||||
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
|
||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libunbound.a)
|
||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libunbound.a)
|
||||
|
||||
add_library(epee STATIC IMPORTED)
|
||||
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
|
||||
|
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "com.m2049r.xmrwallet"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 31
|
||||
versionCode 1402
|
||||
versionName "2.4.2 'Baldaŭ'"
|
||||
versionCode 3004
|
||||
versionName "3.0.4 'Fluorine Fermi'"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
@@ -72,7 +72,7 @@ android {
|
||||
abi {
|
||||
enable true
|
||||
reset()
|
||||
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||
include 'armeabi-v7a', 'arm64-v8a', 'x86_64'
|
||||
universalApk true
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -916,9 +916,9 @@ public class LoginActivity extends BaseActivity
|
||||
@Override
|
||||
public boolean createWallet(File aFile, String password) {
|
||||
NodeInfo currentNode = getNode();
|
||||
// get it from the connected node if we have one, and go back ca. 4 days
|
||||
// get it from the connected node if we have one
|
||||
final long restoreHeight =
|
||||
(currentNode != null) ? currentNode.getHeight() - 2000 : -1;
|
||||
(currentNode != null) ? currentNode.getHeight() : -1;
|
||||
Wallet newWallet = WalletManager.getInstance()
|
||||
.createWallet(aFile, password, MNEMONIC_LANGUAGE, restoreHeight);
|
||||
return checkAndCloseWallet(newWallet);
|
||||
|
@@ -238,4 +238,5 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
|
||||
activityCallback.showSubaddress(view, subaddress.getAddressIndex());
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -46,7 +46,7 @@ import java.util.List;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class SubaddressInfoFragment extends Fragment
|
||||
implements TransactionInfoAdapter.OnInteractionListener, OnBlockUpdateListener {
|
||||
implements TransactionInfoAdapter.Listener, OnBlockUpdateListener {
|
||||
private TransactionInfoAdapter adapter;
|
||||
|
||||
private Subaddress subaddress;
|
||||
@@ -145,6 +145,8 @@ public class SubaddressInfoFragment extends Fragment
|
||||
void setTitle(String title, String subtitle);
|
||||
|
||||
void setSubtitle(String subtitle);
|
||||
|
||||
long getDaemonHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -170,4 +172,9 @@ public class SubaddressInfoFragment extends Fragment
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDaemonHeight() {
|
||||
return activityCallback.getDaemonHeight();
|
||||
}
|
||||
}
|
||||
|
@@ -44,6 +44,8 @@ import com.m2049r.xmrwallet.data.UserNotes;
|
||||
import com.m2049r.xmrwallet.model.TransactionInfo;
|
||||
import com.m2049r.xmrwallet.model.Transfer;
|
||||
import com.m2049r.xmrwallet.model.Wallet;
|
||||
import com.m2049r.xmrwallet.model.WalletManager;
|
||||
import com.m2049r.xmrwallet.service.WalletService;
|
||||
import com.m2049r.xmrwallet.util.Helper;
|
||||
import com.m2049r.xmrwallet.util.ThemeHelper;
|
||||
import com.m2049r.xmrwallet.widget.Toolbar;
|
||||
@@ -83,6 +85,9 @@ public class TxFragment extends Fragment {
|
||||
private TextView tvTxTransfers;
|
||||
private TextView etTxNotes;
|
||||
|
||||
private View llWarning;
|
||||
private TextView tvWarning;
|
||||
|
||||
// XMRTO stuff
|
||||
private View cvXmrTo;
|
||||
private TextView tvTxXmrToKey;
|
||||
@@ -116,9 +121,11 @@ public class TxFragment extends Fragment {
|
||||
tvTxFee = view.findViewById(R.id.tvTxFee);
|
||||
tvTxTransfers = view.findViewById(R.id.tvTxTransfers);
|
||||
etTxNotes = view.findViewById(R.id.etTxNotes);
|
||||
|
||||
etTxNotes.setRawInputType(InputType.TYPE_CLASS_TEXT);
|
||||
|
||||
llWarning = view.findViewById(R.id.llWarning);
|
||||
tvWarning = view.findViewById(R.id.tvWarning);
|
||||
|
||||
tvTxXmrToKey.setOnClickListener(v -> {
|
||||
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString());
|
||||
Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show();
|
||||
@@ -299,6 +306,20 @@ public class TxFragment extends Fragment {
|
||||
tvTxTransfers.setText(sb.toString());
|
||||
tvDestination.setText(dstSb.toString());
|
||||
showBtcInfo();
|
||||
|
||||
showLock();
|
||||
}
|
||||
|
||||
private void showLock() {
|
||||
llWarning.setVisibility(View.GONE);
|
||||
if (info.unlockTime == 0) return;
|
||||
final long blockheight = activityCallback.getDaemonHeight();
|
||||
final long blocks = info.unlockTime - blockheight;
|
||||
final double unlockDays = blocks / (30. * 24);
|
||||
if (unlockDays > 0) {
|
||||
llWarning.setVisibility(View.VISIBLE);
|
||||
tvWarning.setText(getString(R.string.tx_locked, info.unlockTime, blocks, unlockDays));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
@@ -370,6 +391,7 @@ public class TxFragment extends Fragment {
|
||||
|
||||
void showSubaddress(View view, final int subaddressIndex);
|
||||
|
||||
long getDaemonHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -62,7 +62,7 @@ import java.util.List;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class WalletFragment extends Fragment
|
||||
implements TransactionInfoAdapter.OnInteractionListener {
|
||||
implements TransactionInfoAdapter.Listener {
|
||||
private TransactionInfoAdapter adapter;
|
||||
private final NumberFormat formatter = NumberFormat.getInstance();
|
||||
|
||||
@@ -118,9 +118,9 @@ public class WalletFragment extends Fragment
|
||||
tvProgress = view.findViewById(R.id.tvProgress);
|
||||
pbProgress = view.findViewById(R.id.pbProgress);
|
||||
tvBalance = view.findViewById(R.id.tvBalance);
|
||||
showBalance(Helper.getDisplayAmount(0));
|
||||
showBalance();
|
||||
tvUnconfirmedAmount = view.findViewById(R.id.tvUnconfirmedAmount);
|
||||
showUnconfirmed(0);
|
||||
showUnconfirmed();
|
||||
ivSynced = view.findViewById(R.id.ivSynced);
|
||||
|
||||
sCurrency = view.findViewById(R.id.sCurrency);
|
||||
@@ -205,7 +205,18 @@ public class WalletFragment extends Fragment
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
}
|
||||
|
||||
void showBalance(String balance) {
|
||||
String amountToString(double amount) {
|
||||
if (!Helper.BASE_CRYPTO.equals(balanceCurrency)) { // not XMR
|
||||
double amountB = amount * balanceRate;
|
||||
return Helper.getFormattedAmount(amountB, false);
|
||||
} else { // XMR
|
||||
return Helper.getFormattedAmount(amount, true);
|
||||
}
|
||||
}
|
||||
|
||||
void showBalance() {
|
||||
double amountA = Helper.getDecimalAmount(unlockedBalance).doubleValue();
|
||||
String balance = amountToString(amountA);
|
||||
tvBalance.setText(balance);
|
||||
final boolean streetMode = activityCallback.isStreetMode();
|
||||
if (!streetMode) {
|
||||
@@ -218,13 +229,14 @@ public class WalletFragment extends Fragment
|
||||
setStreetModeBackground(streetMode);
|
||||
}
|
||||
|
||||
void showUnconfirmed(double unconfirmedAmount) {
|
||||
void showUnconfirmed() {
|
||||
double unconfirmedAmount = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue();
|
||||
if (activityCallback.isStreetMode() || unconfirmedAmount == 0) {
|
||||
tvUnconfirmedAmount.setText(null);
|
||||
tvUnconfirmedAmount.setVisibility(View.GONE);
|
||||
} else {
|
||||
String unconfirmed = Helper.getFormattedAmount(unconfirmedAmount, true);
|
||||
tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, unconfirmed));
|
||||
String unconfirmed = amountToString(unconfirmedAmount);
|
||||
tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, unconfirmed, balanceCurrency));
|
||||
tvUnconfirmedAmount.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
@@ -232,15 +244,8 @@ public class WalletFragment extends Fragment
|
||||
void updateBalance() {
|
||||
if (isExchanging) return; // wait for exchange to finish - it will fire this itself then.
|
||||
// at this point selection is XMR in case of error
|
||||
String displayB;
|
||||
double amountA = Helper.getDecimalAmount(unlockedBalance).doubleValue();
|
||||
if (!Helper.BASE_CRYPTO.equals(balanceCurrency)) { // not XMR
|
||||
double amountB = amountA * balanceRate;
|
||||
displayB = Helper.getFormattedAmount(amountB, false);
|
||||
} else { // XMR
|
||||
displayB = Helper.getFormattedAmount(amountA, true);
|
||||
}
|
||||
showBalance(displayB);
|
||||
showBalance();
|
||||
showUnconfirmed();
|
||||
}
|
||||
|
||||
String balanceCurrency = Helper.BASE_CRYPTO;
|
||||
@@ -249,11 +254,11 @@ public class WalletFragment extends Fragment
|
||||
private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
|
||||
|
||||
void refreshBalance() {
|
||||
double unconfirmedXmr = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue();
|
||||
showUnconfirmed(unconfirmedXmr);
|
||||
if (sCurrency.getSelectedItemPosition() == 0) { // XMR
|
||||
double amountXmr = Helper.getDecimalAmount(unlockedBalance).doubleValue();
|
||||
showBalance(Helper.getFormattedAmount(amountXmr, true));
|
||||
balanceCurrency = Helper.BASE_CRYPTO;
|
||||
balanceRate = 1.0;
|
||||
showBalance();
|
||||
showUnconfirmed();
|
||||
} else { // not XMR
|
||||
String currency = (String) sCurrency.getSelectedItem();
|
||||
Timber.d(currency);
|
||||
@@ -298,8 +303,7 @@ public class WalletFragment extends Fragment
|
||||
|
||||
public void exchangeFailed() {
|
||||
sCurrency.setSelection(0, true); // default to XMR
|
||||
double amountXmr = Helper.getDecimalAmount(unlockedBalance).doubleValue();
|
||||
showBalance(Helper.getFormattedAmount(amountXmr, true));
|
||||
showBalance();
|
||||
hideExchanging();
|
||||
}
|
||||
|
||||
@@ -446,9 +450,9 @@ public class WalletFragment extends Fragment
|
||||
Wallet.ConnectionStatus daemonConnected = activityCallback.getConnectionStatus();
|
||||
if (daemonConnected == Wallet.ConnectionStatus.ConnectionStatus_Connected) {
|
||||
if (!wallet.isSynchronized()) {
|
||||
long daemonHeight = activityCallback.getDaemonHeight();
|
||||
long walletHeight = wallet.getBlockChainHeight();
|
||||
long n = daemonHeight - walletHeight;
|
||||
final long daemonHeight = getDaemonHeight();
|
||||
final long walletHeight = wallet.getBlockChainHeight();
|
||||
final long n = daemonHeight - walletHeight;
|
||||
sync = getString(R.string.status_syncing) + " " + formatter.format(n) + " " + getString(R.string.status_remaining);
|
||||
if (firstBlock == 0) {
|
||||
firstBlock = walletHeight;
|
||||
@@ -556,4 +560,9 @@ public class WalletFragment extends Fragment
|
||||
} else
|
||||
ivStreetGunther.setImageDrawable(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDaemonHeight() {
|
||||
return activityCallback.getDaemonHeight();
|
||||
}
|
||||
}
|
||||
|
@@ -35,6 +35,8 @@ import com.m2049r.xmrwallet.R;
|
||||
import com.m2049r.xmrwallet.data.Crypto;
|
||||
import com.m2049r.xmrwallet.data.UserNotes;
|
||||
import com.m2049r.xmrwallet.model.TransactionInfo;
|
||||
import com.m2049r.xmrwallet.model.WalletManager;
|
||||
import com.m2049r.xmrwallet.service.WalletService;
|
||||
import com.m2049r.xmrwallet.util.Helper;
|
||||
import com.m2049r.xmrwallet.util.ThemeHelper;
|
||||
|
||||
@@ -61,12 +63,19 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
||||
void onInteraction(View view, TransactionInfo item);
|
||||
}
|
||||
|
||||
public interface DaemonHeightProvider {
|
||||
long getDaemonHeight();
|
||||
}
|
||||
|
||||
public interface Listener extends OnInteractionListener, DaemonHeightProvider {
|
||||
}
|
||||
|
||||
private final List<TransactionInfo> infoItems;
|
||||
private final OnInteractionListener listener;
|
||||
private final Listener listener;
|
||||
|
||||
private final Context context;
|
||||
|
||||
public TransactionInfoAdapter(Context context, OnInteractionListener listener) {
|
||||
public TransactionInfoAdapter(Context context, Listener listener) {
|
||||
this.context = context;
|
||||
inboundColour = ThemeHelper.getThemedColor(context, R.attr.positiveColor);
|
||||
outboundColour = ThemeHelper.getThemedColor(context, R.attr.negativeColor);
|
||||
@@ -158,6 +167,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
||||
final TextView tvDateTime;
|
||||
final CircularProgressIndicator pbConfirmations;
|
||||
final TextView tvConfirmations;
|
||||
final ImageView ivLock;
|
||||
TransactionInfo infoItem;
|
||||
|
||||
ViewHolder(View itemView) {
|
||||
@@ -170,6 +180,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
||||
pbConfirmations = itemView.findViewById(R.id.pbConfirmations);
|
||||
pbConfirmations.setMax(TransactionInfo.CONFIRMATION);
|
||||
tvConfirmations = itemView.findViewById(R.id.tvConfirmations);
|
||||
ivLock = itemView.findViewById(R.id.ivLock);
|
||||
}
|
||||
|
||||
private String getDateTime(long time) {
|
||||
@@ -180,6 +191,21 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
||||
tvAmount.setTextColor(clr);
|
||||
}
|
||||
|
||||
private void showLock() {
|
||||
Timber.d("UNLOCK %d:%d", infoItem.unlockTime, infoItem.blockheight);
|
||||
if (infoItem.unlockTime == 0) {
|
||||
ivLock.setVisibility(View.GONE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (getDaemonHeight() < infoItem.unlockTime) {
|
||||
tvConfirmations.setVisibility(View.GONE);
|
||||
ivLock.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
ivLock.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
void bind(int position) {
|
||||
infoItem = infoItems.get(position);
|
||||
itemView.setTransitionName(context.getString(R.string.tx_item_transition_name, infoItem.hash));
|
||||
@@ -238,6 +264,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
||||
pbConfirmations.setVisibility(View.GONE);
|
||||
tvConfirmations.setVisibility(View.GONE);
|
||||
}
|
||||
showLock();
|
||||
|
||||
String tag = null;
|
||||
String info = "";
|
||||
@@ -275,4 +302,8 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private long getDaemonHeight() {
|
||||
return listener.getDaemonHeight();
|
||||
}
|
||||
}
|
||||
|
@@ -46,7 +46,7 @@ public class Ledger {
|
||||
public static final int SW_OK = 0x9000;
|
||||
public static final int SW_INS_NOT_SUPPORTED = 0x6D00;
|
||||
public static final int OK[] = {SW_OK};
|
||||
public static final int MINIMUM_LEDGER_VERSION = (1 << 16) + (6 << 8) + (0); // 1.6.0
|
||||
public static final int MINIMUM_LEDGER_VERSION = (1 << 16) + (8 << 8) + (0); // 1.6.0
|
||||
|
||||
public static UsbDevice findDevice(UsbManager usbManager) {
|
||||
if (!ENABLED) return null;
|
||||
|
@@ -62,6 +62,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
public int accountIndex;
|
||||
public int addressIndex;
|
||||
public long confirmations;
|
||||
public long unlockTime;
|
||||
public String subaddressLabel;
|
||||
public List<Transfer> transfers;
|
||||
|
||||
@@ -82,6 +83,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
int accountIndex,
|
||||
int addressIndex,
|
||||
long confirmations,
|
||||
long unlockTime,
|
||||
String subaddressLabel,
|
||||
List<Transfer> transfers) {
|
||||
this.direction = Direction.values()[direction];
|
||||
@@ -96,6 +98,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
this.accountIndex = accountIndex;
|
||||
this.addressIndex = addressIndex;
|
||||
this.confirmations = confirmations;
|
||||
this.unlockTime = unlockTime;
|
||||
this.subaddressLabel = subaddressLabel;
|
||||
this.transfers = transfers;
|
||||
}
|
||||
@@ -129,6 +132,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
out.writeInt(accountIndex);
|
||||
out.writeInt(addressIndex);
|
||||
out.writeLong(confirmations);
|
||||
out.writeLong(unlockTime);
|
||||
out.writeString(subaddressLabel);
|
||||
out.writeList(transfers);
|
||||
out.writeString(txKey);
|
||||
@@ -159,6 +163,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
accountIndex = in.readInt();
|
||||
addressIndex = in.readInt();
|
||||
confirmations = in.readLong();
|
||||
unlockTime = in.readLong();
|
||||
subaddressLabel = in.readString();
|
||||
transfers = in.readArrayList(Transfer.class.getClassLoader());
|
||||
txKey = in.readString();
|
||||
|
@@ -24,6 +24,7 @@ import com.m2049r.xmrwallet.util.RestoreHeight;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@@ -96,8 +97,11 @@ public class WalletManager {
|
||||
if (wallet.getStatus().isOk()) {
|
||||
// (Re-)Estimate restore height based on what we know
|
||||
final long oldHeight = wallet.getRestoreHeight();
|
||||
// Go back 4 days if we don't have a precise restore height
|
||||
Calendar restoreDate = Calendar.getInstance();
|
||||
restoreDate.add(Calendar.DAY_OF_MONTH, -4);
|
||||
final long restoreHeight =
|
||||
(height > -1) ? height : RestoreHeight.getInstance().getHeight(new Date());
|
||||
(height > -1) ? height : RestoreHeight.getInstance().getHeight(restoreDate.getTime());
|
||||
wallet.setRestoreHeight(restoreHeight);
|
||||
Timber.d("Changed Restore Height from %d to %d", oldHeight, wallet.getRestoreHeight());
|
||||
wallet.setPassword(password); // this rewrites the keys file (which contains the restore height)
|
||||
|
@@ -35,7 +35,8 @@ public class LocaleHelper {
|
||||
String[] availableLocales = context.getString(R.string.available_locales).split(",");
|
||||
|
||||
for (String localeName : availableLocales) {
|
||||
locales.add(Locale.forLanguageTag(localeName));
|
||||
if (!localeName.startsWith("night") && !localeName.matches("v[0-9]+"))
|
||||
locales.add(Locale.forLanguageTag(localeName));
|
||||
}
|
||||
|
||||
return locales;
|
||||
|
@@ -56,7 +56,9 @@ import timber.log.Timber;
|
||||
@RequiredArgsConstructor
|
||||
public class NetCipherHelper implements StatusCallback {
|
||||
public static final String USER_AGENT = "Monerujo/1.0";
|
||||
public static final int HTTP_TIMEOUT = 1000; //ms
|
||||
public static final int HTTP_TIMEOUT_CONNECT = 1000; //ms
|
||||
public static final int HTTP_TIMEOUT_READ = 2000; //ms
|
||||
public static final int HTTP_TIMEOUT_WRITE = 1000; //ms
|
||||
public static final int TOR_TIMEOUT_CONNECT = 5000; //ms
|
||||
public static final int TOR_TIMEOUT = 2000; //ms
|
||||
|
||||
@@ -117,9 +119,9 @@ public class NetCipherHelper implements StatusCallback {
|
||||
private void createClearnetClient() {
|
||||
try {
|
||||
client = new OkHttpClient.Builder()
|
||||
.connectTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS)
|
||||
.writeTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS)
|
||||
.readTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS)
|
||||
.connectTimeout(HTTP_TIMEOUT_CONNECT, TimeUnit.MILLISECONDS)
|
||||
.writeTimeout(HTTP_TIMEOUT_WRITE, TimeUnit.MILLISECONDS)
|
||||
.readTimeout(HTTP_TIMEOUT_READ, TimeUnit.MILLISECONDS)
|
||||
.build();
|
||||
Helper.ALLOW_SHIFT = true;
|
||||
} catch (Exception ex) {
|
||||
|
9
app/src/main/res/drawable/ic_lock_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_lock_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="?android:textColorSecondary"
|
||||
android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" />
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_warning_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_warning_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="?attr/colorPrimaryVariant"
|
||||
android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z" />
|
||||
</vector>
|
@@ -45,7 +45,7 @@
|
||||
android:id="@+id/rlSweep"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="visible">
|
||||
android:visibility="gone">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/ivSweep"
|
||||
|
@@ -11,6 +11,30 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/llWarning"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:background="?attr/colorError"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvWarning"
|
||||
style="@style/MoneroLabel.Heading"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:drawablePadding="8dp"
|
||||
android:gravity="start|center_vertical"
|
||||
android:padding="8dp"
|
||||
android:textColor="?colorOnError"
|
||||
app:drawableStartCompat="@drawable/ic_warning_24dp"
|
||||
app:drawableTint="?colorOnError"
|
||||
tools:text="Transaction amount locked until block 322229877 (approx. 2.4 months)" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@@ -11,10 +11,10 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingBottom="12dp"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="8dp">
|
||||
android:paddingTop="12dp"
|
||||
android:paddingRight="8dp"
|
||||
android:paddingBottom="12dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
@@ -58,6 +58,14 @@
|
||||
android:gravity="center"
|
||||
android:paddingBottom="1dp"
|
||||
android:text="8"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/ivLock"
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_gravity="center"
|
||||
android:src="@drawable/ic_lock_24dp"
|
||||
android:visibility="visible" />
|
||||
</FrameLayout>
|
||||
|
||||
|
@@ -134,7 +134,7 @@
|
||||
<string name="label_wallet_receive">Rebre</string>
|
||||
<string name="label_wallet_send">Enviar</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR sense confirmar</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s sense confirmar</string>
|
||||
|
||||
<string name="service_description">Servei de monerujo</string>
|
||||
|
||||
@@ -447,4 +447,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -135,7 +135,7 @@
|
||||
<string name="label_wallet_receive">Empfange</string>
|
||||
<string name="label_wallet_send">Sende</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR unbestätigt</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s unbestätigt</string>
|
||||
|
||||
<string name="service_description">monerujo Service</string>
|
||||
|
||||
@@ -448,4 +448,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -123,7 +123,7 @@
|
||||
<string name="label_wallet_receive">Λήψη</string>
|
||||
<string name="label_wallet_send">Αποστολή</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR μη επιβεβαιωμένα</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s μη επιβεβαιωμένα</string>
|
||||
|
||||
<string name="service_description">Υπηρεσία monerujo</string>
|
||||
|
||||
@@ -449,4 +449,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -134,7 +134,7 @@
|
||||
<string name="label_wallet_receive">Ricevi</string>
|
||||
<string name="label_wallet_send">Doni</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR nekonfirmite</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s nekonfirmite</string>
|
||||
|
||||
<string name="service_description">monerujo Servo</string>
|
||||
|
||||
@@ -449,4 +449,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -86,7 +86,7 @@
|
||||
<string name="label_wallet_receive">Recibir</string>
|
||||
<string name="label_wallet_send">Enviar</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR sin confirmar</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s sin confirmar</string>
|
||||
|
||||
<string name="service_description">Servicio de Monerujo</string>
|
||||
|
||||
@@ -440,4 +440,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -132,7 +132,7 @@
|
||||
<string name="label_wallet_receive">Küsi raha</string>
|
||||
<string name="label_wallet_send">Saada</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR kinnitamata</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s kinnitamata</string>
|
||||
|
||||
<string name="service_description">monerujo teenus</string>
|
||||
|
||||
@@ -447,4 +447,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
59
app/src/main/res/values-fa/about.xml
Normal file
59
app/src/main/res/values-fa/about.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
|
||||
<string name="about_close">بستن</string>
|
||||
<string name="about_whoami">من مونروجو هستم</string>
|
||||
<string name="about_version">
|
||||
نسخهٔ
|
||||
%1$s (%2$d)
|
||||
</string>
|
||||
|
||||
<string name="credits_text"><![CDATA[
|
||||
<b>دست اندرکاران</b>
|
||||
<br/>
|
||||
m2049r, baltsar777, anhdres, keejef,
|
||||
rehrar, EarlOfEgo, ErCiccione et al.
|
||||
<br/><br/>
|
||||
<a href="https://monerujo.app">monerujo.app</a>
|
||||
]]></string>
|
||||
|
||||
<string name="privacy_policy"><![CDATA[
|
||||
<h1>خطمشی رازداری</h1>
|
||||
<p>این صفحه شما را از سیاستهای ما در مورد جمعآوری، استفاده و افشای اطلاعات شخصی که از کاربران برنامهٔ خود (مونروجو به معنای «کیفپول مونرو») دریافت میکنیم مطلع میکند.</p>
|
||||
<p>با استفاده از برنامه، با جمعآوری و استفاده از اطلاعات، مطابق با این سیاست، موافقت میکنید.</p>
|
||||
<h2>دادههای جمعآوری شده</h2>
|
||||
<p>دادههای شخصی هر نوع دادهای است که بتواند یک فرد را شناسایی کند.</p>
|
||||
<p>کلیدها و آدرسهای عمومی مونرو توسط برنامه به صورت داخلی برای پردازش تراکنشها جمعآوری و پردازش میشوند و به شکل رمزگذاری شده به شبکه مونرو منتقل می شوند.</p>
|
||||
<p>سایر اطلاعات شخصی توسط برنامه جمعآوری نمیشوند.</p>
|
||||
<p>
|
||||
اگر از قابلیت اختیاری تبدیل رمزارز استفاده کنید، این برنامه نرخ ارز را از طریق API عمومی coinmarketcap.com دریافت میکند. برای اطلاع از جزئیات نحوهٔ جمعآوری دادههای درخواستهایتان، خطمشی رازداری آنها را در
|
||||
<a href="https://coinmarketcap.com/privacy">coinmarketcap.com/privacy</a>
|
||||
ببینید.
|
||||
</p>
|
||||
<p>
|
||||
اگر از برنامه برای پرداخت به آدرسهای بیتکوین استفاده میکنید، از سرویس SideShift.ai استفاده خواهید کرد. برای جزئیات بیشتر به خطمشی رازداری آنها در
|
||||
<a href="https://sideshift.ai">sideshift.ai</a>
|
||||
مراجعه کنید. مونروجو مقدار و آدرس مقصد بیتکوین را برای آنها ارسال میکند. آدرس IP شما نیز قابل جمعآوری خواهد بود.
|
||||
</p>
|
||||
<h2>دسترسیهای نرمافزار</h2>
|
||||
<ul>
|
||||
<li>اینترنت: اتصال به شبکهٔ مونرو</li>
|
||||
<li>خوانش حافظهٔ خارجی: خواندن فایلهای کیفپول ذخیره شده برروی دستگاه</li>
|
||||
<li>نوشتار حافظهٔ خارجی: نوشتن فایلهای کیفپول ذخیره شده برروی دستگاه</li>
|
||||
<li>قفل بیداری: بیدار نگه داشتن دستگاه در هنگام همگامسازی</li>
|
||||
<li>دوربین: اسکن کدهای کیوآر برای ارسال مونرو</li>
|
||||
</ul>
|
||||
<h2>تغییرات در این خطمشی رازداری</h2>
|
||||
<p>
|
||||
ممکن است هرازچندگاهی این خطمشی رازداری را بهروز کنیم. ما با ارسال خطمشی رازداری جدید در برنامه و وبسایت
|
||||
<a href="https://monerujo.app">(www.monerujo.app)</a>
|
||||
شما را از هرگونه تغییر مطلع خواهیم کرد. به شما توصیه میشود برای هرگونه تغییر، این خطمشی رازداری را به صورت دورهای مرور کنید.
|
||||
</p>
|
||||
<p>آخرین بهروزرسانی این خطمشی رازداری: 10 نوامبر 2017</p>
|
||||
<h2>تماس با ما</h2>
|
||||
<p>
|
||||
اگر در مورد خطمشی رازداری ما یا نحوهٔ جمعآوری و پردازش دادههای خود سؤالی دارید، لطفا به
|
||||
<a href="mailto:privacy@monerujo.io">privacy@monerujo.io</a>
|
||||
ایمیل بزنید.
|
||||
</p>
|
||||
]]></string>
|
||||
</resources>
|
425
app/src/main/res/values-fa/help.xml
Normal file
425
app/src/main/res/values-fa/help.xml
Normal file
File diff suppressed because it is too large
Load Diff
705
app/src/main/res/values-fa/strings.xml
Normal file
705
app/src/main/res/values-fa/strings.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -134,7 +134,7 @@
|
||||
<string name="label_wallet_receive">Recevoir</string>
|
||||
<string name="label_wallet_send">Envoyer</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR non confirmés</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s non confirmés</string>
|
||||
|
||||
<string name="service_description">Service monerujo</string>
|
||||
|
||||
@@ -453,4 +453,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -132,7 +132,7 @@
|
||||
<string name="label_wallet_receive">Fogadás</string>
|
||||
<string name="label_wallet_send">Küldés</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR függőben</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s függőben</string>
|
||||
|
||||
<string name="service_description">monerujo szolgáltatás</string>
|
||||
|
||||
@@ -451,4 +451,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -134,7 +134,7 @@
|
||||
<string name="label_wallet_receive">Ricevi</string>
|
||||
<string name="label_wallet_send">Invia</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR non confermati</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s non confermati</string>
|
||||
|
||||
<string name="service_description">Servizio monerujo</string>
|
||||
|
||||
@@ -452,4 +452,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
@@ -134,7 +134,7 @@
|
||||
<string name="label_wallet_receive">受取り</string>
|
||||
<string name="label_wallet_send">送金</string>
|
||||
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s XMR が未承認</string>
|
||||
<string name="xmr_unconfirmed_amount">+ %1$s %2$s が未承認</string>
|
||||
|
||||
<string name="service_description">monerujo のサービス</string>
|
||||
|
||||
@@ -452,4 +452,6 @@
|
||||
</string-array>
|
||||
|
||||
<string name="message_qr_failed">Failed to create QR for sharing!</string>
|
||||
|
||||
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
|
||||
</resources>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user