mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-04 00:53:36 +02:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
669516c60b | ||
![]() |
a56a29a6c4 | ||
![]() |
4e31f47482 | ||
![]() |
c1f14f9653 | ||
![]() |
2746c52d7b | ||
![]() |
5df323bacb | ||
![]() |
776cc26377 | ||
![]() |
bdfb6a90b6 | ||
![]() |
6db44dfab1 | ||
![]() |
c68ac7db6d | ||
![]() |
e09862e940 | ||
![]() |
c7bd7469a1 | ||
![]() |
b39857fd2e | ||
![]() |
8170f823ab | ||
![]() |
38c0ead45c |
@@ -2,13 +2,14 @@ apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
buildToolsVersion '29.0.3'
|
||||
buildToolsVersion '30.0.3'
|
||||
ndkVersion '17.2.4988734'
|
||||
defaultConfig {
|
||||
applicationId "com.m2049r.xmrwallet"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 1001
|
||||
versionName "2.0.1 'Puginarug'"
|
||||
versionCode 1006
|
||||
versionName "2.0.6 'Puginarug'"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
@@ -123,14 +124,14 @@ dependencies {
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.1.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.2.0'
|
||||
implementation 'androidx.cardview:cardview:1.0.0'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
|
||||
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
||||
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.nulab-inc:zxcvbn:1.3.0'
|
||||
|
@@ -4,6 +4,7 @@
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<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.CAMERA" />
|
||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||
@@ -11,11 +12,11 @@
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
<application
|
||||
android:preserveLegacyExternalStorage="true"
|
||||
android:name=".XmrWalletApplication"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:preserveLegacyExternalStorage="true"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/MyMaterialTheme"
|
||||
android:usesCleartextTraffic="true">
|
||||
@@ -34,7 +35,7 @@
|
||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
||||
android:label="@string/wallet_activity_name"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="behind"/>
|
||||
android:screenOrientation="behind" />
|
||||
<activity
|
||||
android:name=".LoginActivity"
|
||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
||||
|
@@ -44,6 +44,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.m2049r.xmrwallet.data.DefaultNodes;
|
||||
import com.m2049r.xmrwallet.data.Node;
|
||||
@@ -474,6 +475,7 @@ public class LoginActivity extends BaseActivity
|
||||
@Override
|
||||
public void onWalletBackup(String walletName) {
|
||||
Timber.d("backup for wallet ." + walletName + ".");
|
||||
// overwrite any pending backup request
|
||||
zipBackup = new ZipBackup(this, walletName);
|
||||
|
||||
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
||||
@@ -500,14 +502,18 @@ public class LoginActivity extends BaseActivity
|
||||
if (data == null) {
|
||||
// nothing selected
|
||||
Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
|
||||
zipBackup = null;
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (zipBackup == null) return; // ignore unsolicited request
|
||||
zipBackup.writeTo(data.getData());
|
||||
Toast.makeText(this, getString(R.string.backup_success), Toast.LENGTH_SHORT).show();
|
||||
} catch (IOException ex) {
|
||||
Timber.e(ex);
|
||||
Toast.makeText(this, getString(R.string.backup_failed), Toast.LENGTH_LONG).show();
|
||||
} finally {
|
||||
zipBackup = null;
|
||||
}
|
||||
} else if (requestCode == RESTORE_BACKUP_INTENT) {
|
||||
if (data == null) {
|
||||
@@ -549,12 +555,49 @@ public class LoginActivity extends BaseActivity
|
||||
}
|
||||
};
|
||||
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setMessage(getString(R.string.delete_alert_message))
|
||||
final AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
final AlertDialog confirm = builder.setMessage(getString(R.string.delete_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);
|
||||
});
|
||||
}
|
||||
|
||||
@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() {
|
||||
@@ -1024,6 +1067,18 @@ public class LoginActivity extends BaseActivity
|
||||
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 {
|
||||
try (FileChannel inChannel = new FileInputStream(src).getChannel();
|
||||
FileChannel outChannel = new FileOutputStream(dst).getChannel()) {
|
||||
|
@@ -88,6 +88,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
|
||||
void onWalletDelete(String walletName);
|
||||
|
||||
void onWalletDeleteCache(String walletName);
|
||||
|
||||
void onAddWallet(String type);
|
||||
|
||||
void onNodePrefs();
|
||||
@@ -220,6 +222,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
activityCallback.onWalletBackup(listItem.getName());
|
||||
} else if (id == R.id.action_archive) {
|
||||
activityCallback.onWalletDelete(listItem.getName());
|
||||
} else if (id == R.id.action_deletecache) {
|
||||
activityCallback.onWalletDeleteCache(listItem.getName());
|
||||
} else {
|
||||
return super.onContextItemSelected(item);
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@ import android.os.Parcelable;
|
||||
|
||||
import com.m2049r.xmrwallet.model.PendingTransaction;
|
||||
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
|
||||
public class TxData implements Parcelable {
|
||||
@@ -54,7 +55,7 @@ public class TxData implements Parcelable {
|
||||
}
|
||||
|
||||
public double getAmountAsDouble() {
|
||||
return 1.0 * amount / 1000000000000L;
|
||||
return 1.0 * amount / Helper.ONE_XMR;
|
||||
}
|
||||
|
||||
public int getMixin() {
|
||||
|
@@ -183,6 +183,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
|
||||
selectedCrypto = Crypto.XMR;
|
||||
sendListener.setMode(SendFragment.Mode.XMR);
|
||||
}
|
||||
if (!Helper.ALLOW_SHIFT) return;
|
||||
if ((selectedCrypto == null) && isEthAddress(address)) {
|
||||
Timber.d("isEthAddress");
|
||||
possibleCryptos.add(Crypto.ETH);
|
||||
@@ -465,7 +466,8 @@ public class SendAddressWizardFragment extends SendWizardFragment {
|
||||
possibleCryptos.add(barcodeData.asset);
|
||||
selectedCrypto = barcodeData.asset;
|
||||
}
|
||||
updateCryptoButtons(false);
|
||||
if (Helper.ALLOW_SHIFT)
|
||||
updateCryptoButtons(false);
|
||||
if (checkAddress()) {
|
||||
if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC)
|
||||
etAddress.setError(getString(R.string.send_address_no_dnssec));
|
||||
|
@@ -139,7 +139,7 @@ public class SendAmountWizardFragment extends SendWizardFragment {
|
||||
Timber.d("onResumeFragment()");
|
||||
Helper.showKeyboard(getActivity());
|
||||
final long funds = getTotalFunds();
|
||||
maxFunds = 1.0 * funds / 1000000000000L;
|
||||
maxFunds = 1.0 * funds / Helper.ONE_XMR;
|
||||
if (!sendListener.getActivityCallback().isStreetMode()) {
|
||||
tvFunds.setText(getString(R.string.send_available,
|
||||
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.SideShiftApi;
|
||||
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.ServiceHelper;
|
||||
import com.m2049r.xmrwallet.widget.ExchangeOtherEditText;
|
||||
@@ -179,7 +180,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
|
||||
tvXmrToParms.setText(xmrParmText);
|
||||
|
||||
final long funds = getTotalFunds();
|
||||
double availableXmr = 1.0 * funds / 1000000000000L;
|
||||
double availableXmr = 1.0 * funds / Helper.ONE_XMR;
|
||||
|
||||
String availBtcString;
|
||||
String availXmrString;
|
||||
|
@@ -167,7 +167,7 @@ public class ExchangeApiImpl implements ExchangeApi {
|
||||
private Calendar fetchDate = null;
|
||||
|
||||
synchronized private ExchangeRate getRate(String currency) throws ExchangeException {
|
||||
Timber.e("Getting %s", currency);
|
||||
Timber.d("Getting %s", currency);
|
||||
final Double rate = fxEntries.get(currency);
|
||||
if (rate == null) throw new ExchangeException(404, "Currency not supported: " + currency);
|
||||
return new ExchangeRateImpl(currency, rate, fxDate.getTime());
|
||||
|
@@ -80,6 +80,8 @@ public class Helper {
|
||||
static public final String NOCRAZYPASS_FLAGFILE = ".nocrazypass";
|
||||
|
||||
static public final String BASE_CRYPTO = Crypto.XMR.getSymbol();
|
||||
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 ALLOW_SHIFT = true;
|
||||
@@ -159,11 +161,11 @@ public class Helper {
|
||||
}
|
||||
|
||||
static public BigDecimal getDecimalAmount(long amount) {
|
||||
return new BigDecimal(amount).scaleByPowerOfTen(-12);
|
||||
return new BigDecimal(amount).scaleByPowerOfTen(-XMR_DECIMALS);
|
||||
}
|
||||
|
||||
static public String getDisplayAmount(long amount) {
|
||||
return getDisplayAmount(amount, 12);
|
||||
return getDisplayAmount(amount, XMR_DECIMALS);
|
||||
}
|
||||
|
||||
static public String getDisplayAmount(long amount, int maxDecimals) {
|
||||
@@ -195,7 +197,7 @@ public class Helper {
|
||||
static public String getDisplayAmount(double amount) {
|
||||
// a Java bug does not strip zeros properly if the value is 0
|
||||
BigDecimal d = new BigDecimal(amount)
|
||||
.setScale(12, BigDecimal.ROUND_HALF_UP)
|
||||
.setScale(XMR_DECIMALS, BigDecimal.ROUND_HALF_UP)
|
||||
.stripTrailingZeros();
|
||||
if (d.scale() < 1)
|
||||
d = d.setScale(1, BigDecimal.ROUND_UNNECESSARY);
|
||||
|
@@ -53,6 +53,7 @@ public class LegacyStorageHelper {
|
||||
public void migrate() {
|
||||
String addressPrefix = WalletManager.getInstance().addressPrefix();
|
||||
File[] wallets = srcDir.listFiles((dir, filename) -> filename.endsWith(".keys"));
|
||||
if (wallets == null) return;
|
||||
for (File wallet : wallets) {
|
||||
final String walletName = wallet.getName().substring(0, wallet.getName().length() - ".keys".length());
|
||||
if (addressPrefix.indexOf(getAddress(walletName).charAt(0)) < 0) {
|
||||
|
@@ -30,6 +30,7 @@ import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.m2049r.xmrwallet.R;
|
||||
import com.m2049r.xmrwallet.dialog.HelpFragment;
|
||||
import com.m2049r.xmrwallet.ledger.Ledger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -52,12 +53,13 @@ public class Notice {
|
||||
R.string.help_xmrto,
|
||||
1)
|
||||
);
|
||||
notices.add(
|
||||
new Notice(NOTICE_SHOW_LEDGER,
|
||||
R.string.info_ledger_enabled,
|
||||
R.string.help_create_ledger,
|
||||
1)
|
||||
);
|
||||
if (Ledger.ENABLED)
|
||||
notices.add(
|
||||
new Notice(NOTICE_SHOW_LEDGER,
|
||||
R.string.info_ledger_enabled,
|
||||
R.string.help_create_ledger,
|
||||
1)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -26,6 +26,8 @@ import java.util.TimeZone;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class RestoreHeight {
|
||||
static final int DIFFICULTY_TARGET = 120; // seconds
|
||||
|
||||
static private RestoreHeight Singleton = null;
|
||||
|
||||
static public RestoreHeight getInstance() {
|
||||
@@ -190,7 +192,7 @@ public class RestoreHeight {
|
||||
} else {
|
||||
long days = TimeUnit.DAYS.convert(query.getTimeInMillis() - prevTime,
|
||||
TimeUnit.MILLISECONDS);
|
||||
height = Math.round(prevBc + 1.0 * days * (24 * 60 / 2));
|
||||
height = Math.round(prevBc + 1.0 * days * (24f * 60 * 60 / DIFFICULTY_TARGET));
|
||||
}
|
||||
return height;
|
||||
}
|
||||
|
@@ -349,11 +349,13 @@ public class ExchangeEditText extends LinearLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String CLEAN_FORMAT = "%." + Helper.XMR_DECIMALS + "f";
|
||||
|
||||
private String getCleanAmountString(String enteredAmount) {
|
||||
try {
|
||||
double amount = Double.parseDouble(enteredAmount);
|
||||
if (amount >= 0) {
|
||||
return String.format(Locale.US, "%,.12f", amount);
|
||||
return String.format(Locale.US, CLEAN_FORMAT, amount);
|
||||
} else {
|
||||
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_gravity="center"
|
||||
android:layout_marginTop="-8dp"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingBottom="12dp"
|
||||
android:src="@drawable/ic_logo_horizontol_xmrujo"
|
||||
android:visibility="visible" />
|
||||
|
||||
|
@@ -26,4 +26,8 @@
|
||||
android:orderInCategory="500"
|
||||
android:title="@string/menu_info" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_deletecache"
|
||||
android:orderInCategory="500"
|
||||
android:title="@string/menu_deletecache" />
|
||||
</menu>
|
@@ -417,10 +417,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -266,7 +266,7 @@
|
||||
<string name="details_alert_no">Nein, doch nicht!</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_no">Nein, danke!</string>
|
||||
|
||||
@@ -424,4 +424,7 @@
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -419,10 +419,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -419,10 +419,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -207,7 +207,7 @@
|
||||
<string name="details_alert_no">¡Llévame de vuelta!</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_no">¡No, gracias!</string>
|
||||
|
||||
@@ -416,4 +416,7 @@
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -417,10 +417,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -267,7 +267,7 @@
|
||||
<string name="details_alert_no">Non merci !</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_no">Non merci !</string>
|
||||
|
||||
@@ -429,4 +429,7 @@
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -421,10 +421,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -266,7 +266,7 @@
|
||||
<string name="details_alert_no">Torna indietro!</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_no">No grazie!</string>
|
||||
|
||||
@@ -366,7 +366,7 @@
|
||||
|
||||
<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_ready">I\'m ready!</string>
|
||||
|
||||
@@ -428,4 +428,7 @@
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -422,10 +422,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -419,10 +419,13 @@
|
||||
<string name="subaddress_select_label">Select a subaddress</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -261,7 +261,7 @@
|
||||
<string name="details_alert_no">Ga terug!</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_no">Nee, niet doen!</string>
|
||||
|
||||
@@ -425,4 +425,7 @@
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
@@ -411,10 +411,13 @@
|
||||
<string name="subaddress_select_label">Selecione um subendereço</string>
|
||||
<string name="subaddress_details_hint">Toque e segure para mais detalhes</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="delete_failed">Delete failed!</string>
|
||||
|
||||
<string name="menu_restore">Import wallet</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>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user