mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-06 02:27:11 +02:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
aa768596a4 | ||
![]() |
c4958f6c54 | ||
![]() |
2c2a5314d4 | ||
![]() |
669516c60b | ||
![]() |
a56a29a6c4 | ||
![]() |
4e31f47482 | ||
![]() |
c1f14f9653 | ||
![]() |
2746c52d7b | ||
![]() |
5df323bacb | ||
![]() |
776cc26377 | ||
![]() |
bdfb6a90b6 | ||
![]() |
6db44dfab1 | ||
![]() |
c68ac7db6d | ||
![]() |
e09862e940 | ||
![]() |
c7bd7469a1 | ||
![]() |
b39857fd2e |
@@ -2,13 +2,14 @@ apply plugin: 'com.android.application'
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 30
|
compileSdkVersion 30
|
||||||
buildToolsVersion '29.0.3'
|
buildToolsVersion '30.0.3'
|
||||||
|
ndkVersion '17.2.4988734'
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.m2049r.xmrwallet"
|
applicationId "com.m2049r.xmrwallet"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
versionCode 1002
|
versionCode 1008
|
||||||
versionName "2.0.2 'Puginarug'"
|
versionName "2.0.8 'Puginarug'"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
@@ -130,7 +131,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
||||||
implementation "com.squareup.okhttp3:okhttp:4.9.0"
|
implementation "com.squareup.okhttp3:okhttp:4.9.0"
|
||||||
implementation "com.burgstaller:okhttp-digest:2.1"
|
implementation "io.github.rburgst:okhttp-digest:2.5"
|
||||||
implementation "com.jakewharton.timber:timber:4.7.1"
|
implementation "com.jakewharton.timber:timber:4.7.1"
|
||||||
|
|
||||||
implementation 'com.nulab-inc:zxcvbn:1.3.0'
|
implementation 'com.nulab-inc:zxcvbn:1.3.0'
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||||
@@ -11,11 +12,11 @@
|
|||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:preserveLegacyExternalStorage="true"
|
|
||||||
android:name=".XmrWalletApplication"
|
android:name=".XmrWalletApplication"
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
android:preserveLegacyExternalStorage="true"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/MyMaterialTheme"
|
android:theme="@style/MyMaterialTheme"
|
||||||
android:usesCleartextTraffic="true">
|
android:usesCleartextTraffic="true">
|
||||||
@@ -34,7 +35,7 @@
|
|||||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
android:configChanges="orientation|keyboardHidden|uiMode"
|
||||||
android:label="@string/wallet_activity_name"
|
android:label="@string/wallet_activity_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:screenOrientation="behind"/>
|
android:screenOrientation="behind" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".LoginActivity"
|
android:name=".LoginActivity"
|
||||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
android:configChanges="orientation|keyboardHidden|uiMode"
|
||||||
|
@@ -44,6 +44,7 @@ import androidx.fragment.app.Fragment;
|
|||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
|
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.m2049r.xmrwallet.data.DefaultNodes;
|
import com.m2049r.xmrwallet.data.DefaultNodes;
|
||||||
import com.m2049r.xmrwallet.data.Node;
|
import com.m2049r.xmrwallet.data.Node;
|
||||||
@@ -474,6 +475,7 @@ public class LoginActivity extends BaseActivity
|
|||||||
@Override
|
@Override
|
||||||
public void onWalletBackup(String walletName) {
|
public void onWalletBackup(String walletName) {
|
||||||
Timber.d("backup for wallet ." + walletName + ".");
|
Timber.d("backup for wallet ." + walletName + ".");
|
||||||
|
// overwrite any pending backup request
|
||||||
zipBackup = new ZipBackup(this, walletName);
|
zipBackup = new ZipBackup(this, walletName);
|
||||||
|
|
||||||
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
||||||
@@ -500,14 +502,18 @@ public class LoginActivity extends BaseActivity
|
|||||||
if (data == null) {
|
if (data == null) {
|
||||||
// nothing selected
|
// nothing selected
|
||||||
Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
|
Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
|
||||||
|
zipBackup = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
if (zipBackup == null) return; // ignore unsolicited request
|
||||||
zipBackup.writeTo(data.getData());
|
zipBackup.writeTo(data.getData());
|
||||||
Toast.makeText(this, getString(R.string.backup_success), Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, getString(R.string.backup_success), Toast.LENGTH_SHORT).show();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
Timber.e(ex);
|
Timber.e(ex);
|
||||||
Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
|
Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
|
||||||
|
} finally {
|
||||||
|
zipBackup = null;
|
||||||
}
|
}
|
||||||
} else if (requestCode == RESTORE_BACKUP_INTENT) {
|
} else if (requestCode == RESTORE_BACKUP_INTENT) {
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
@@ -549,12 +555,49 @@ public class LoginActivity extends BaseActivity
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
final AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||||
builder.setMessage(getString(R.string.delete_alert_message))
|
final AlertDialog confirm = builder.setMessage(getString(R.string.delete_alert_message))
|
||||||
.setTitle(walletName)
|
.setTitle(walletName)
|
||||||
.setPositiveButton(getString(R.string.delete_alert_yes), dialogClickListener)
|
.setPositiveButton(getString(R.string.delete_alert_yes), dialogClickListener)
|
||||||
.setNegativeButton(getString(R.string.delete_alert_no), dialogClickListener)
|
.setNegativeButton(getString(R.string.delete_alert_no), dialogClickListener)
|
||||||
|
.setView(View.inflate(builder.getContext(), R.layout.checkbox_confirm, null))
|
||||||
.show();
|
.show();
|
||||||
|
confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
|
||||||
|
final MaterialCheckBox checkBox = confirm.findViewById(R.id.checkbox);
|
||||||
|
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
|
confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(isChecked);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWalletDeleteCache(final String walletName) {
|
||||||
|
Timber.d("delete cache for wallet ." + walletName + ".");
|
||||||
|
if (checkServiceRunning()) return;
|
||||||
|
DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
|
||||||
|
switch (which) {
|
||||||
|
case DialogInterface.BUTTON_POSITIVE:
|
||||||
|
if (!deleteWalletCache(Helper.getWalletFile(LoginActivity.this, walletName))) {
|
||||||
|
Toast.makeText(LoginActivity.this, getString(R.string.delete_failed), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DialogInterface.BUTTON_NEGATIVE:
|
||||||
|
// do nothing
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
final AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||||
|
final AlertDialog confirm = builder.setMessage(getString(R.string.deletecache_alert_message))
|
||||||
|
.setTitle(walletName)
|
||||||
|
.setPositiveButton(getString(R.string.delete_alert_yes), dialogClickListener)
|
||||||
|
.setNegativeButton(getString(R.string.delete_alert_no), dialogClickListener)
|
||||||
|
.setView(View.inflate(builder.getContext(), R.layout.checkbox_confirm, null))
|
||||||
|
.show();
|
||||||
|
confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
|
||||||
|
final MaterialCheckBox checkBox = confirm.findViewById(R.id.checkbox);
|
||||||
|
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
|
confirm.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(isChecked);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void reloadWalletList() {
|
void reloadWalletList() {
|
||||||
@@ -1024,6 +1067,18 @@ public class LoginActivity extends BaseActivity
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean deleteWalletCache(File walletFile) {
|
||||||
|
Timber.d("deleteWalletCache %s", walletFile.getAbsolutePath());
|
||||||
|
File dir = walletFile.getParentFile();
|
||||||
|
String name = walletFile.getName();
|
||||||
|
boolean success = true;
|
||||||
|
File cacheFile = new File(dir, name);
|
||||||
|
if (cacheFile.exists()) {
|
||||||
|
success = cacheFile.delete();
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
void copyFile(File src, File dst) throws IOException {
|
void copyFile(File src, File dst) throws IOException {
|
||||||
try (FileChannel inChannel = new FileInputStream(src).getChannel();
|
try (FileChannel inChannel = new FileInputStream(src).getChannel();
|
||||||
FileChannel outChannel = new FileOutputStream(dst).getChannel()) {
|
FileChannel outChannel = new FileOutputStream(dst).getChannel()) {
|
||||||
|
@@ -88,6 +88,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
|
|
||||||
void onWalletDelete(String walletName);
|
void onWalletDelete(String walletName);
|
||||||
|
|
||||||
|
void onWalletDeleteCache(String walletName);
|
||||||
|
|
||||||
void onAddWallet(String type);
|
void onAddWallet(String type);
|
||||||
|
|
||||||
void onNodePrefs();
|
void onNodePrefs();
|
||||||
@@ -220,6 +222,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
activityCallback.onWalletBackup(listItem.getName());
|
activityCallback.onWalletBackup(listItem.getName());
|
||||||
} else if (id == R.id.action_archive) {
|
} else if (id == R.id.action_archive) {
|
||||||
activityCallback.onWalletDelete(listItem.getName());
|
activityCallback.onWalletDelete(listItem.getName());
|
||||||
|
} else if (id == R.id.action_deletecache) {
|
||||||
|
activityCallback.onWalletDeleteCache(listItem.getName());
|
||||||
} else {
|
} else {
|
||||||
return super.onContextItemSelected(item);
|
return super.onContextItemSelected(item);
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@ import android.os.Parcelable;
|
|||||||
|
|
||||||
import com.m2049r.xmrwallet.model.PendingTransaction;
|
import com.m2049r.xmrwallet.model.PendingTransaction;
|
||||||
import com.m2049r.xmrwallet.model.Wallet;
|
import com.m2049r.xmrwallet.model.Wallet;
|
||||||
|
import com.m2049r.xmrwallet.util.Helper;
|
||||||
|
|
||||||
// https://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents
|
// https://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents
|
||||||
public class TxData implements Parcelable {
|
public class TxData implements Parcelable {
|
||||||
@@ -54,7 +55,7 @@ public class TxData implements Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getAmountAsDouble() {
|
public double getAmountAsDouble() {
|
||||||
return 1.0 * amount / 1000000000000L;
|
return 1.0 * amount / Helper.ONE_XMR;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMixin() {
|
public int getMixin() {
|
||||||
|
@@ -349,7 +349,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
|
|||||||
|
|
||||||
private boolean checkAddress() {
|
private boolean checkAddress() {
|
||||||
boolean ok = checkAddressNoError();
|
boolean ok = checkAddressNoError();
|
||||||
if (!ok) {
|
if (possibleCryptos.isEmpty()) {
|
||||||
etAddress.setError(getString(R.string.send_address_invalid));
|
etAddress.setError(getString(R.string.send_address_invalid));
|
||||||
} else {
|
} else {
|
||||||
etAddress.setError(null);
|
etAddress.setError(null);
|
||||||
|
@@ -139,7 +139,7 @@ public class SendAmountWizardFragment extends SendWizardFragment {
|
|||||||
Timber.d("onResumeFragment()");
|
Timber.d("onResumeFragment()");
|
||||||
Helper.showKeyboard(getActivity());
|
Helper.showKeyboard(getActivity());
|
||||||
final long funds = getTotalFunds();
|
final long funds = getTotalFunds();
|
||||||
maxFunds = 1.0 * funds / 1000000000000L;
|
maxFunds = 1.0 * funds / Helper.ONE_XMR;
|
||||||
if (!sendListener.getActivityCallback().isStreetMode()) {
|
if (!sendListener.getActivityCallback().isStreetMode()) {
|
||||||
tvFunds.setText(getString(R.string.send_available,
|
tvFunds.setText(getString(R.string.send_available,
|
||||||
Wallet.getDisplayAmount(funds)));
|
Wallet.getDisplayAmount(funds)));
|
||||||
|
@@ -34,6 +34,7 @@ import com.m2049r.xmrwallet.service.shift.ShiftException;
|
|||||||
import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
|
import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
|
||||||
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
|
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
|
||||||
import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
|
import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
|
||||||
|
import com.m2049r.xmrwallet.util.Helper;
|
||||||
import com.m2049r.xmrwallet.util.OkHttpHelper;
|
import com.m2049r.xmrwallet.util.OkHttpHelper;
|
||||||
import com.m2049r.xmrwallet.util.ServiceHelper;
|
import com.m2049r.xmrwallet.util.ServiceHelper;
|
||||||
import com.m2049r.xmrwallet.widget.ExchangeOtherEditText;
|
import com.m2049r.xmrwallet.widget.ExchangeOtherEditText;
|
||||||
@@ -89,7 +90,6 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onValidateFields() {
|
public boolean onValidateFields() {
|
||||||
Timber.i(maxBtc + "/" + minBtc);
|
Timber.i(maxBtc + "/" + minBtc);
|
||||||
@@ -179,7 +179,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
|
|||||||
tvXmrToParms.setText(xmrParmText);
|
tvXmrToParms.setText(xmrParmText);
|
||||||
|
|
||||||
final long funds = getTotalFunds();
|
final long funds = getTotalFunds();
|
||||||
double availableXmr = 1.0 * funds / 1000000000000L;
|
double availableXmr = 1.0 * funds / Helper.ONE_XMR;
|
||||||
|
|
||||||
String availBtcString;
|
String availBtcString;
|
||||||
String availXmrString;
|
String availXmrString;
|
||||||
|
@@ -359,40 +359,22 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private RequestQuote xmrtoQuote = null;
|
private RequestQuote xmrtoQuote = null;
|
||||||
private int stageARetries = 0;
|
|
||||||
private final int RETRIES = 3;
|
|
||||||
private double stageAPrice = 0;
|
|
||||||
|
|
||||||
private void processStageA(final RequestQuote requestQuote) {
|
private void processStageA(final RequestQuote requestQuote) {
|
||||||
Timber.d("processCreateOrder %s", requestQuote.getId());
|
Timber.d("processCreateOrder %s", requestQuote.getId());
|
||||||
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
|
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
|
||||||
// verify the BTC amount is correct (price can change and we can only specify XMR amount)
|
// verify the BTC amount is correct
|
||||||
if (requestQuote.getBtcAmount() != txDataBtc.getBtcAmount()) {
|
if (requestQuote.getBtcAmount() != txDataBtc.getBtcAmount()) {
|
||||||
if (--stageARetries <= 0) {
|
Timber.d("Failed to get quote");
|
||||||
Timber.d("Failed to get quote");
|
getView().post(() -> showStageError(ShiftError.Error.SERVICE.toString(),
|
||||||
getView().post(() ->
|
getString(R.string.shift_noquote),
|
||||||
showStageError(ShiftError.Error.SERVICE.toString(),
|
getString(R.string.shift_checkamount)));
|
||||||
getString(R.string.shift_noquote),
|
return; // just stop for now
|
||||||
getString(R.string.shift_checkamount)));
|
|
||||||
return; // just stop for now
|
|
||||||
}
|
|
||||||
if (stageAPrice == requestQuote.getPrice()) {
|
|
||||||
// same price but different BTC amount - something else is wrong (e.g. too many decimals)
|
|
||||||
Timber.d("Price unchanged");
|
|
||||||
getView().post(() ->
|
|
||||||
showStageError(ShiftError.Error.SERVICE.toString(),
|
|
||||||
getString(R.string.shift_noquote),
|
|
||||||
getString(R.string.shift_checkamount)));
|
|
||||||
return; // just stop for now
|
|
||||||
}
|
|
||||||
stageAPrice = requestQuote.getPrice();
|
|
||||||
// recalc XMR and try again
|
|
||||||
txDataBtc.setAmount(txDataBtc.getBtcAmount() / requestQuote.getPrice());
|
|
||||||
getView().post(this::stageAOneShot);
|
|
||||||
return; // stageA will run in the main thread
|
|
||||||
}
|
}
|
||||||
xmrtoQuote = requestQuote;
|
xmrtoQuote = requestQuote;
|
||||||
|
txDataBtc.setAmount(xmrtoQuote.getXmrAmount());
|
||||||
getView().post(() -> {
|
getView().post(() -> {
|
||||||
|
// show data from the actual quote as that is what is used to
|
||||||
NumberFormat df = NumberFormat.getInstance(Locale.US);
|
NumberFormat df = NumberFormat.getInstance(Locale.US);
|
||||||
df.setMaximumFractionDigits(12);
|
df.setMaximumFractionDigits(12);
|
||||||
final String btcAmount = df.format(xmrtoQuote.getBtcAmount());
|
final String btcAmount = df.format(xmrtoQuote.getBtcAmount());
|
||||||
@@ -438,18 +420,12 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void stageA() {
|
private void stageA() {
|
||||||
stageARetries = RETRIES;
|
|
||||||
stageAOneShot();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void stageAOneShot() {
|
|
||||||
if (!isResumed) return;
|
if (!isResumed) return;
|
||||||
Timber.d("Request Quote");
|
Timber.d("Request Quote");
|
||||||
xmrtoQuote = null;
|
xmrtoQuote = null;
|
||||||
xmrtoOrder = null;
|
xmrtoOrder = null;
|
||||||
showProgress(1, getString(R.string.label_send_progress_xmrto_create));
|
showProgress(1, getString(R.string.label_send_progress_xmrto_create));
|
||||||
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
|
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
|
||||||
stageAPrice = 0;
|
|
||||||
|
|
||||||
ShiftCallback<RequestQuote> callback = new ShiftCallback<RequestQuote>() {
|
ShiftCallback<RequestQuote> callback = new ShiftCallback<RequestQuote>() {
|
||||||
@Override
|
@Override
|
||||||
@@ -473,7 +449,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
getXmrToApi().requestQuote(txDataBtc.getAmountAsDouble(), callback);
|
getXmrToApi().requestQuote(txDataBtc.getBtcAmount(), callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CreateOrder xmrtoOrder = null;
|
private CreateOrder xmrtoOrder = null;
|
||||||
|
@@ -167,7 +167,7 @@ public class ExchangeApiImpl implements ExchangeApi {
|
|||||||
private Calendar fetchDate = null;
|
private Calendar fetchDate = null;
|
||||||
|
|
||||||
synchronized private ExchangeRate getRate(String currency) throws ExchangeException {
|
synchronized private ExchangeRate getRate(String currency) throws ExchangeException {
|
||||||
Timber.e("Getting %s", currency);
|
Timber.d("Getting %s", currency);
|
||||||
final Double rate = fxEntries.get(currency);
|
final Double rate = fxEntries.get(currency);
|
||||||
if (rate == null) throw new ExchangeException(404, "Currency not supported: " + currency);
|
if (rate == null) throw new ExchangeException(404, "Currency not supported: " + currency);
|
||||||
return new ExchangeRateImpl(currency, rate, fxDate.getTime());
|
return new ExchangeRateImpl(currency, rate, fxDate.getTime());
|
||||||
|
@@ -74,10 +74,10 @@ class RequestQuoteImpl implements RequestQuote {
|
|||||||
price = jsonObject.getDouble("rate");
|
price = jsonObject.getDouble("rate");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void call(@NonNull final ShiftApiCall api, final double xmrAmount,
|
public static void call(@NonNull final ShiftApiCall api, final double btcAmount,
|
||||||
@NonNull final ShiftCallback<RequestQuote> callback) {
|
@NonNull final ShiftCallback<RequestQuote> callback) {
|
||||||
try {
|
try {
|
||||||
final JSONObject request = createRequest(xmrAmount);
|
final JSONObject request = createRequest(btcAmount);
|
||||||
api.call("quotes", request, new NetworkCallback() {
|
api.call("quotes", request, new NetworkCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(JSONObject jsonObject) {
|
public void onSuccess(JSONObject jsonObject) {
|
||||||
@@ -104,13 +104,13 @@ class RequestQuoteImpl implements RequestQuote {
|
|||||||
* @param xmrAmount how much XMR to shift to BTC
|
* @param xmrAmount how much XMR to shift to BTC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static JSONObject createRequest(final double xmrAmount) throws JSONException {
|
static JSONObject createRequest(final double btcAmount) throws JSONException {
|
||||||
final JSONObject jsonObject = new JSONObject();
|
final JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put("depositMethod", "xmr");
|
jsonObject.put("depositMethod", "xmr");
|
||||||
jsonObject.put("settleMethod", ServiceHelper.ASSET);
|
jsonObject.put("settleMethod", ServiceHelper.ASSET);
|
||||||
// #sideshift is silly and likes numbers as strings
|
// #sideshift is silly and likes numbers as strings
|
||||||
String amount = AmountFormatter.format(xmrAmount);
|
String amount = AmountFormatter.format(btcAmount);
|
||||||
jsonObject.put("depositAmount", amount);
|
jsonObject.put("settleAmount", amount);
|
||||||
return jsonObject;
|
return jsonObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -64,8 +64,8 @@ public class SideShiftApiImpl implements SideShiftApi, ShiftApiCall {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void requestQuote(final double xmrAmount, @NonNull final ShiftCallback<RequestQuote> callback) {
|
public void requestQuote(final double btcAmount, @NonNull final ShiftCallback<RequestQuote> callback) {
|
||||||
RequestQuoteImpl.call(this, xmrAmount, callback);
|
RequestQuoteImpl.call(this, btcAmount, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -81,6 +81,7 @@ public class Helper {
|
|||||||
|
|
||||||
static public final String BASE_CRYPTO = Crypto.XMR.getSymbol();
|
static public final String BASE_CRYPTO = Crypto.XMR.getSymbol();
|
||||||
static public final int XMR_DECIMALS = 12;
|
static public final int XMR_DECIMALS = 12;
|
||||||
|
static public final long ONE_XMR = Math.round(Math.pow(10, Helper.XMR_DECIMALS));
|
||||||
|
|
||||||
static public final boolean SHOW_EXCHANGERATES = true;
|
static public final boolean SHOW_EXCHANGERATES = true;
|
||||||
static public final boolean ALLOW_SHIFT = true;
|
static public final boolean ALLOW_SHIFT = true;
|
||||||
|
@@ -31,8 +31,7 @@ public class LegacyStorageHelper {
|
|||||||
try {
|
try {
|
||||||
if (isStorageMigrated(context)) return;
|
if (isStorageMigrated(context)) return;
|
||||||
if (!hasReadPermission(context)) {
|
if (!hasReadPermission(context)) {
|
||||||
// nothing to migrate, so don't try again
|
// can't migrate - don't remember this, as the user may turn on permissions later
|
||||||
setStorageMigrated(context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final File oldRoot = getWalletRoot();
|
final File oldRoot = getWalletRoot();
|
||||||
|
@@ -349,11 +349,13 @@ public class ExchangeEditText extends LinearLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String CLEAN_FORMAT = "%." + Helper.XMR_DECIMALS + "f";
|
||||||
|
|
||||||
private String getCleanAmountString(String enteredAmount) {
|
private String getCleanAmountString(String enteredAmount) {
|
||||||
try {
|
try {
|
||||||
double amount = Double.parseDouble(enteredAmount);
|
double amount = Double.parseDouble(enteredAmount);
|
||||||
if (amount >= 0) {
|
if (amount >= 0) {
|
||||||
return String.format(Locale.US, "%,.12f", amount);
|
return String.format(Locale.US, CLEAN_FORMAT, amount);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
13
app/src/main/res/layout/checkbox_confirm.xml
Normal file
13
app/src/main/res/layout/checkbox_confirm.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
|
android:id="@+id/checkbox"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:paddingEnd="16dp"
|
||||||
|
android:text="@string/onboarding_agree" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
@@ -22,6 +22,8 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginTop="-8dp"
|
android:layout_marginTop="-8dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
android:src="@drawable/ic_logo_horizontol_xmrujo"
|
android:src="@drawable/ic_logo_horizontol_xmrujo"
|
||||||
android:visibility="visible" />
|
android:visibility="visible" />
|
||||||
|
|
||||||
|
@@ -26,4 +26,8 @@
|
|||||||
android:orderInCategory="500"
|
android:orderInCategory="500"
|
||||||
android:title="@string/menu_info" />
|
android:title="@string/menu_info" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_deletecache"
|
||||||
|
android:orderInCategory="500"
|
||||||
|
android:title="@string/menu_deletecache" />
|
||||||
</menu>
|
</menu>
|
@@ -417,10 +417,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -266,7 +266,7 @@
|
|||||||
<string name="details_alert_no">Nein, doch nicht!</string>
|
<string name="details_alert_no">Nein, doch nicht!</string>
|
||||||
<string name="details_title">Details</string>
|
<string name="details_title">Details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">Das Wallet wird gelöscht!</string>
|
<string name="delete_alert_message">Das Wallet wird gelöscht. Dein Geld wird für immer verloren sein, außer wenn Du den Seed oder ein funktionierendes Backup hast um es wiederherzustellen.</string>
|
||||||
<string name="delete_alert_yes">Ja, mach das!</string>
|
<string name="delete_alert_yes">Ja, mach das!</string>
|
||||||
<string name="delete_alert_no">Nein, danke!</string>
|
<string name="delete_alert_no">Nein, danke!</string>
|
||||||
|
|
||||||
@@ -424,4 +424,7 @@
|
|||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -419,10 +419,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -419,10 +419,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -207,7 +207,7 @@
|
|||||||
<string name="details_alert_no">¡Llévame de vuelta!</string>
|
<string name="details_alert_no">¡Llévame de vuelta!</string>
|
||||||
<string name="details_title">Detalles</string>
|
<string name="details_title">Detalles</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">¡El monedero será borrado!</string>
|
<string name="delete_alert_message">Este monedero será borrado. Tus fondos se irán para siempre a menos que tengas tu semilla o una copia de seguridad funcional para recuperarlo.</string>
|
||||||
<string name="delete_alert_yes">¡Sí, hazlo!</string>
|
<string name="delete_alert_yes">¡Sí, hazlo!</string>
|
||||||
<string name="delete_alert_no">¡No, gracias!</string>
|
<string name="delete_alert_no">¡No, gracias!</string>
|
||||||
|
|
||||||
@@ -416,4 +416,7 @@
|
|||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -417,10 +417,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -267,7 +267,7 @@
|
|||||||
<string name="details_alert_no">Non merci !</string>
|
<string name="details_alert_no">Non merci !</string>
|
||||||
<string name="details_title">Détails</string>
|
<string name="details_title">Détails</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">Le portefeuille sera supprimé !</string>
|
<string name="delete_alert_message">Ce portefeuille sera supprimé. Vos fonds seront perdus à jamais, sauf si vous disposez de votre semence ou d\'une sauvegarde fonctionnelle pour les récupérer.</string>
|
||||||
<string name="delete_alert_yes">Oui, procéder !</string>
|
<string name="delete_alert_yes">Oui, procéder !</string>
|
||||||
<string name="delete_alert_no">Non merci !</string>
|
<string name="delete_alert_no">Non merci !</string>
|
||||||
|
|
||||||
@@ -429,4 +429,7 @@
|
|||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -421,10 +421,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -266,7 +266,7 @@
|
|||||||
<string name="details_alert_no">Torna indietro!</string>
|
<string name="details_alert_no">Torna indietro!</string>
|
||||||
<string name="details_title">Dettagli</string>
|
<string name="details_title">Dettagli</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">Il portafoglio verrà eliminato!</string>
|
<string name="delete_alert_message">Questo portafoglio sarà cancellato. I tuoi fondi saranno andati per sempre a meno che tu non abbia il tuo seme o un backup funzionante per recuperarli.</string>
|
||||||
<string name="delete_alert_yes">Sì, procedi!</string>
|
<string name="delete_alert_yes">Sì, procedi!</string>
|
||||||
<string name="delete_alert_no">No grazie!</string>
|
<string name="delete_alert_no">No grazie!</string>
|
||||||
|
|
||||||
@@ -366,7 +366,7 @@
|
|||||||
|
|
||||||
<string name="menu_rescan">Rescan!</string>
|
<string name="menu_rescan">Rescan!</string>
|
||||||
|
|
||||||
<string name="onboarding_agree">I get it!</string>
|
<string name="onboarding_agree">Ho capito!</string>
|
||||||
<string name="onboarding_button_next">Next</string>
|
<string name="onboarding_button_next">Next</string>
|
||||||
<string name="onboarding_button_ready">I\'m ready!</string>
|
<string name="onboarding_button_ready">I\'m ready!</string>
|
||||||
|
|
||||||
@@ -428,4 +428,7 @@
|
|||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -422,10 +422,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -419,10 +419,13 @@
|
|||||||
<string name="subaddress_select_label">Select a subaddress</string>
|
<string name="subaddress_select_label">Select a subaddress</string>
|
||||||
<string name="subaddress_details_hint">Long-press for details</string>
|
<string name="subaddress_details_hint">Long-press for details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">The wallet will be deleted!</string>
|
<string name="delete_alert_message">This wallet will be deleted. Your funds will be gone forever unless you have your seed or a working backup to recover it.</string>
|
||||||
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
<string name="menu_delete">Delete</string><!-- like: "Delete wallet!" -->
|
||||||
<string name="delete_failed">Delete failed!</string>
|
<string name="delete_failed">Delete failed!</string>
|
||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -261,7 +261,7 @@
|
|||||||
<string name="details_alert_no">Ga terug!</string>
|
<string name="details_alert_no">Ga terug!</string>
|
||||||
<string name="details_title">Details</string>
|
<string name="details_title">Details</string>
|
||||||
|
|
||||||
<string name="delete_alert_message">Er wordt de portemonnee verwijderd!</string>
|
<string name="delete_alert_message">Deze portemonnee zal worden verwijderd. Uw geld zal voor altijd weg zijn, tenzij u uw zaad of een werkende back-up hebt om het te herstellen.</string>
|
||||||
<string name="delete_alert_yes">Ja, doe dat!</string>
|
<string name="delete_alert_yes">Ja, doe dat!</string>
|
||||||
<string name="delete_alert_no">Nee, niet doen!</string>
|
<string name="delete_alert_no">Nee, niet doen!</string>
|
||||||
|
|
||||||
@@ -425,4 +425,7 @@
|
|||||||
|
|
||||||
<string name="menu_restore">Import wallet</string>
|
<string name="menu_restore">Import wallet</string>
|
||||||
<string name="restore_failed">Import failed!</string>
|
<string name="restore_failed">Import failed!</string>
|
||||||
|
|
||||||
|
<string name="menu_deletecache">Reset wallet!</string>
|
||||||
|
<string name="deletecache_alert_message">This wallet will be reset, losing all off-chain data (like notes, account & subaddress names, private transaction keys, ...)! Use this ONLY if this wallet is corrupt and does not load!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user