allow seed offset generation & wallet restore (#804)

This commit is contained in:
m2049r 2022-01-02 20:50:07 +01:00 committed by GitHub
parent 341df6c6a3
commit 0712efec78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 412 additions and 122 deletions

View File

@ -8,8 +8,8 @@ android {
applicationId "com.m2049r.xmrwallet" applicationId "com.m2049r.xmrwallet"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
versionCode 1201 versionCode 1301
versionName "2.2.1 'René'" versionName "2.3.1 'Doménikos'"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild { externalNativeBuild {
cmake { cmake {

View File

@ -229,7 +229,7 @@ std::vector<std::string> java2cpp(JNIEnv *env, jobject arrayList) {
return result; return result;
} }
jobject cpp2java(JNIEnv *env, const std::vector<std::string>& vector) { jobject cpp2java(JNIEnv *env, const std::vector<std::string> &vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V"); jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add", jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add",
@ -301,12 +301,13 @@ Java_com_m2049r_xmrwallet_model_WalletManager_openWalletJ(JNIEnv *env, jobject i
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobject instance, Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobject instance,
jstring path, jstring password, jstring path, jstring password,
jstring mnemonic, jstring mnemonic, jstring offset,
jint networkType, jint networkType,
jlong restoreHeight) { jlong restoreHeight) {
const char *_path = env->GetStringUTFChars(path, nullptr); const char *_path = env->GetStringUTFChars(path, nullptr);
const char *_password = env->GetStringUTFChars(password, nullptr); const char *_password = env->GetStringUTFChars(password, nullptr);
const char *_mnemonic = env->GetStringUTFChars(mnemonic, nullptr); const char *_mnemonic = env->GetStringUTFChars(mnemonic, nullptr);
const char *_offset = env->GetStringUTFChars(offset, nullptr);
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType); Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
Bitmonero::Wallet *wallet = Bitmonero::Wallet *wallet =
@ -315,11 +316,14 @@ Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobje
std::string(_password), std::string(_password),
std::string(_mnemonic), std::string(_mnemonic),
_networkType, _networkType,
(uint64_t) restoreHeight); (uint64_t) restoreHeight,
1, // kdf_rounds
std::string(_offset));
env->ReleaseStringUTFChars(path, _path); env->ReleaseStringUTFChars(path, _path);
env->ReleaseStringUTFChars(password, _password); env->ReleaseStringUTFChars(password, _password);
env->ReleaseStringUTFChars(mnemonic, _mnemonic); env->ReleaseStringUTFChars(mnemonic, _mnemonic);
env->ReleaseStringUTFChars(offset, _offset);
return reinterpret_cast<jlong>(wallet); return reinterpret_cast<jlong>(wallet);
} }
@ -533,7 +537,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_resolveOpenAlias(JNIEnv *env, jobj
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_setProxy(JNIEnv *env, jobject instance, Java_com_m2049r_xmrwallet_model_WalletManager_setProxy(JNIEnv *env, jobject instance,
jstring address) { jstring address) {
const char *_address = env->GetStringUTFChars(address, nullptr); const char *_address = env->GetStringUTFChars(address, nullptr);
bool rc = bool rc =
Bitmonero::WalletManagerFactory::getWalletManager()->setProxy(std::string(_address)); Bitmonero::WalletManagerFactory::getWalletManager()->setProxy(std::string(_address));
@ -570,9 +574,12 @@ Java_com_m2049r_xmrwallet_model_WalletManager_closeJ(JNIEnv *env, jobject instan
/**********************************/ /**********************************/
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSeed(JNIEnv *env, jobject instance) { Java_com_m2049r_xmrwallet_model_Wallet_getSeed(JNIEnv *env, jobject instance, jstring seedOffset) {
const char *_seedOffset = env->GetStringUTFChars(seedOffset, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance); Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
return env->NewStringUTF(wallet->seed().c_str()); jstring seed = env->NewStringUTF(wallet->seed(std::string(_seedOffset)).c_str());
env->ReleaseStringUTFChars(seedOffset, _seedOffset);
return seed;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
@ -740,7 +747,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getConnectionStatusJ(JNIEnv *env, jobject
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setProxy(JNIEnv *env, jobject instance, Java_com_m2049r_xmrwallet_model_Wallet_setProxy(JNIEnv *env, jobject instance,
jstring address) { jstring address) {
const char *_address = env->GetStringUTFChars(address, nullptr); const char *_address = env->GetStringUTFChars(address, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance); Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
bool rc = wallet->setProxy(std::string(_address)); bool rc = wallet->setProxy(std::string(_address));
@ -1262,7 +1269,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *>& vector) { jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *> &vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V"); jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add", jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add",

View File

@ -81,6 +81,9 @@ public class GenerateFragment extends Fragment {
private TextInputLayout etWalletRestoreHeight; private TextInputLayout etWalletRestoreHeight;
private Button bGenerate; private Button bGenerate;
private Button bSeedOffset;
private TextInputLayout etSeedOffset;
private String type = null; private String type = null;
private void clearErrorOnTextEntry(final TextInputLayout textInputLayout) { private void clearErrorOnTextEntry(final TextInputLayout textInputLayout) {
@ -118,6 +121,8 @@ public class GenerateFragment extends Fragment {
etWalletSpendKey = view.findViewById(R.id.etWalletSpendKey); etWalletSpendKey = view.findViewById(R.id.etWalletSpendKey);
etWalletRestoreHeight = view.findViewById(R.id.etWalletRestoreHeight); etWalletRestoreHeight = view.findViewById(R.id.etWalletRestoreHeight);
bGenerate = view.findViewById(R.id.bGenerate); bGenerate = view.findViewById(R.id.bGenerate);
bSeedOffset = view.findViewById(R.id.bSeedOffset);
etSeedOffset = view.findViewById(R.id.etSeedOffset);
etWalletAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etWalletAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etWalletViewKey.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etWalletViewKey.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
@ -222,6 +227,8 @@ public class GenerateFragment extends Fragment {
} }
return false; return false;
}); });
bSeedOffset.setVisibility(View.VISIBLE);
bSeedOffset.setOnClickListener(v -> toggleSeedOffset());
break; break;
case TYPE_KEY: case TYPE_KEY:
case TYPE_VIEWONLY: case TYPE_VIEWONLY:
@ -288,6 +295,18 @@ public class GenerateFragment extends Fragment {
return view; return view;
} }
void toggleSeedOffset() {
if (etSeedOffset.getVisibility() == View.VISIBLE) {
etSeedOffset.getEditText().getText().clear();
etSeedOffset.setVisibility(View.GONE);
bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0);
} else {
etSeedOffset.setVisibility(View.VISIBLE);
bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0);
etSeedOffset.requestFocusFromTouch();
}
}
private boolean checkName() { private boolean checkName() {
String name = etWalletName.getEditText().getText().toString(); String name = etWalletName.getEditText().getText().toString();
boolean ok = true; boolean ok = true;
@ -422,12 +441,13 @@ public class GenerateFragment extends Fragment {
break; break;
case TYPE_SEED: case TYPE_SEED:
if (!checkMnemonic()) return; if (!checkMnemonic()) return;
String seed = etWalletMnemonic.getEditText().getText().toString(); final String seed = etWalletMnemonic.getEditText().getText().toString();
bGenerate.setEnabled(false); bGenerate.setEnabled(false);
if (fingerprintAuthAllowed) { if (fingerprintAuthAllowed) {
KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password); KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
} }
activityCallback.onGenerate(name, crazyPass, seed, height); final String offset = etSeedOffset.getEditText().getText().toString();
activityCallback.onGenerate(name, crazyPass, seed, offset, height);
break; break;
case TYPE_LEDGER: case TYPE_LEDGER:
bGenerate.setEnabled(false); bGenerate.setEnabled(false);
@ -491,7 +511,7 @@ public class GenerateFragment extends Fragment {
public interface Listener { public interface Listener {
void onGenerate(String name, String password); void onGenerate(String name, String password);
void onGenerate(String name, String password, String seed, long height); void onGenerate(String name, String password, String seed, String offset, long height);
void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height); void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height);

View File

@ -32,6 +32,7 @@ import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.Button; import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
@ -45,6 +46,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.progressindicator.CircularProgressIndicator;
import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.switchmaterial.SwitchMaterial;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
import com.m2049r.xmrwallet.ledger.Ledger; import com.m2049r.xmrwallet.ledger.Ledger;
@ -77,6 +79,7 @@ public class GenerateReviewFragment extends Fragment {
private ProgressBar pbProgress; private ProgressBar pbProgress;
private TextView tvWalletPassword; private TextView tvWalletPassword;
private TextView tvWalletAddress; private TextView tvWalletAddress;
private FrameLayout flWalletMnemonic;
private TextView tvWalletMnemonic; private TextView tvWalletMnemonic;
private TextView tvWalletHeight; private TextView tvWalletHeight;
private TextView tvWalletViewKey; private TextView tvWalletViewKey;
@ -90,6 +93,9 @@ public class GenerateReviewFragment extends Fragment {
private Button bAdvancedInfo; private Button bAdvancedInfo;
private Button bAccept; private Button bAccept;
private Button bSeedOffset;
private TextInputLayout etSeedOffset;
private String walletPath; private String walletPath;
private String walletName; private String walletName;
@ -106,6 +112,7 @@ public class GenerateReviewFragment extends Fragment {
tvWalletViewKey = view.findViewById(R.id.tvWalletViewKey); tvWalletViewKey = view.findViewById(R.id.tvWalletViewKey);
tvWalletSpendKey = view.findViewById(R.id.tvWalletSpendKey); tvWalletSpendKey = view.findViewById(R.id.tvWalletSpendKey);
tvWalletMnemonic = view.findViewById(R.id.tvWalletMnemonic); tvWalletMnemonic = view.findViewById(R.id.tvWalletMnemonic);
flWalletMnemonic = view.findViewById(R.id.flWalletMnemonic);
tvWalletHeight = view.findViewById(R.id.tvWalletHeight); tvWalletHeight = view.findViewById(R.id.tvWalletHeight);
bCopyAddress = view.findViewById(R.id.bCopyAddress); bCopyAddress = view.findViewById(R.id.bCopyAddress);
bAdvancedInfo = view.findViewById(R.id.bAdvancedInfo); bAdvancedInfo = view.findViewById(R.id.bAdvancedInfo);
@ -115,6 +122,9 @@ public class GenerateReviewFragment extends Fragment {
llSpendKey = view.findViewById(R.id.llSpendKey); llSpendKey = view.findViewById(R.id.llSpendKey);
llViewKey = view.findViewById(R.id.llViewKey); llViewKey = view.findViewById(R.id.llViewKey);
etSeedOffset = view.findViewById(R.id.etSeedOffset);
bSeedOffset = view.findViewById(R.id.bSeedOffset);
bAccept = view.findViewById(R.id.bAccept); bAccept = view.findViewById(R.id.bAccept);
boolean allowCopy = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet; boolean allowCopy = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
@ -126,7 +136,25 @@ public class GenerateReviewFragment extends Fragment {
view.findViewById(R.id.bCopyViewKey).setOnClickListener(v -> copyViewKey()); view.findViewById(R.id.bCopyViewKey).setOnClickListener(v -> copyViewKey());
bCopyAddress.setEnabled(false); bCopyAddress.setEnabled(false);
bCopyAddress.setOnClickListener(v -> copyAddress()); bCopyAddress.setOnClickListener(v -> copyAddress());
view.findViewById(R.id.bAdvancedInfo).setOnClickListener(v -> showAdvancedInfo()); bAdvancedInfo.setOnClickListener(v -> toggleAdvancedInfo());
bSeedOffset.setOnClickListener(v -> toggleSeedOffset());
etSeedOffset.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
showSeed();
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
}
});
Bundle args = getArguments(); Bundle args = getArguments();
type = args.getString(REQUEST_TYPE); type = args.getString(REQUEST_TYPE);
@ -136,18 +164,32 @@ public class GenerateReviewFragment extends Fragment {
return view; return view;
} }
String getSeedOffset() {
return etSeedOffset.getEditText().getText().toString();
}
boolean seedOffsetInProgress = false;
void showSeed() {
synchronized (this) {
if (seedOffsetInProgress) return;
seedOffsetInProgress = true;
}
new AsyncShowSeed().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
}
void showDetails() { void showDetails() {
tvWalletPassword.setText(null); tvWalletPassword.setText(null);
new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath); new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
} }
void copyViewKey() { void copyViewKey() {
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_viewkey), tvWalletViewKey.getText().toString()); Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_viewkey), tvWalletViewKey.getText().toString());
Toast.makeText(getActivity(), getString(R.string.message_copy_viewkey), Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), getString(R.string.message_copy_viewkey), Toast.LENGTH_SHORT).show();
} }
void copyAddress() { void copyAddress() {
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_address), tvWalletAddress.getText().toString()); Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_address), tvWalletAddress.getText().toString());
Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show();
} }
@ -155,15 +197,27 @@ public class GenerateReviewFragment extends Fragment {
Toast.makeText(getActivity(), getString(R.string.message_nocopy), Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), getString(R.string.message_nocopy), Toast.LENGTH_SHORT).show();
} }
void showAdvancedInfo() { void toggleAdvancedInfo() {
llAdvancedInfo.setVisibility(View.VISIBLE); if (llAdvancedInfo.getVisibility() == View.VISIBLE) {
bAdvancedInfo.setVisibility(View.GONE); llAdvancedInfo.setVisibility(View.GONE);
scrollview.post(new Runnable() { bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0);
@Override } else {
public void run() { llAdvancedInfo.setVisibility(View.VISIBLE);
scrollview.fullScroll(ScrollView.FOCUS_DOWN); bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0);
} scrollview.post(() -> scrollview.fullScroll(ScrollView.FOCUS_DOWN));
}); }
}
void toggleSeedOffset() {
if (etSeedOffset.getVisibility() == View.VISIBLE) {
etSeedOffset.getEditText().getText().clear();
etSeedOffset.setVisibility(View.GONE);
bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0);
} else {
etSeedOffset.setVisibility(View.VISIBLE);
bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0);
etSeedOffset.requestFocusFromTouch();
}
} }
String type; String type;
@ -215,14 +269,13 @@ public class GenerateReviewFragment extends Fragment {
name = wallet.getName(); name = wallet.getName();
walletStatus = wallet.getStatus(); walletStatus = wallet.getStatus();
if (!walletStatus.isOk()) { if (!walletStatus.isOk()) {
Timber.e(walletStatus.getErrorString());
if (closeWallet) wallet.close(); if (closeWallet) wallet.close();
return false; return false;
} }
address = wallet.getAddress(); address = wallet.getAddress();
height = wallet.getRestoreHeight(); height = wallet.getRestoreHeight();
seed = wallet.getSeed(); seed = wallet.getSeed(getSeedOffset());
switch (wallet.getDeviceType()) { switch (wallet.getDeviceType()) {
case Device_Ledger: case Device_Ledger:
viewKey = Ledger.Key(); viewKey = Ledger.Key();
@ -367,7 +420,7 @@ public class GenerateReviewFragment extends Fragment {
} }
public void hideProgress() { public void hideProgress() {
pbProgress.setVisibility(View.GONE); pbProgress.setVisibility(View.INVISIBLE);
} }
boolean backOk() { boolean backOk() {
@ -408,8 +461,6 @@ public class GenerateReviewFragment extends Fragment {
if (walletStatus.isOk()) { if (walletStatus.isOk()) {
wallet.setPassword(newPassword); wallet.setPassword(newPassword);
ok = true; ok = true;
} else {
Timber.e(walletStatus.getErrorString());
} }
if (closeWallet) wallet.close(); if (closeWallet) wallet.close();
return ok; return ok;
@ -469,7 +520,7 @@ public class GenerateReviewFragment extends Fragment {
LayoutInflater li = LayoutInflater.from(getActivity()); LayoutInflater li = LayoutInflater.from(getActivity());
View promptsView = li.inflate(R.layout.prompt_changepw, null); View promptsView = li.inflate(R.layout.prompt_changepw, null);
AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(getActivity()); AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(requireActivity());
alertDialogBuilder.setView(promptsView); alertDialogBuilder.setView(promptsView);
final PasswordEntryView etPasswordA = promptsView.findViewById(R.id.etWalletPasswordA); final PasswordEntryView etPasswordA = promptsView.findViewById(R.id.etWalletPasswordA);
@ -483,23 +534,20 @@ public class GenerateReviewFragment extends Fragment {
if (FingerprintHelper.isDeviceSupported(getActivity())) { if (FingerprintHelper.isDeviceSupported(getActivity())) {
llFingerprintAuth.setVisibility(View.VISIBLE); llFingerprintAuth.setVisibility(View.VISIBLE);
swFingerprintAllowed.setOnClickListener(new View.OnClickListener() { swFingerprintAllowed.setOnClickListener(view -> {
@Override if (!swFingerprintAllowed.isChecked()) return;
public void onClick(View view) {
if (!swFingerprintAllowed.isChecked()) return;
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity()); AlertDialog.Builder builder = new MaterialAlertDialogBuilder(requireActivity());
builder.setMessage(Html.fromHtml(getString(R.string.generate_fingerprint_warn))) builder.setMessage(Html.fromHtml(getString(R.string.generate_fingerprint_warn)))
.setCancelable(false) .setCancelable(false)
.setPositiveButton(getString(R.string.label_ok), null) .setPositiveButton(getString(R.string.label_ok), null)
.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() { .setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
swFingerprintAllowed.setChecked(false); swFingerprintAllowed.setChecked(false);
} }
}) })
.show(); .show();
}
}); });
swFingerprintAllowed.setChecked(FingerprintHelper.isFingerPassValid(getActivity(), walletName)); swFingerprintAllowed.setChecked(FingerprintHelper.isFingerPassValid(getActivity(), walletName));
@ -550,7 +598,7 @@ public class GenerateReviewFragment extends Fragment {
.setNegativeButton(getString(R.string.label_cancel), .setNegativeButton(getString(R.string.label_cancel),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
Helper.hideKeyboardAlways(getActivity()); Helper.hideKeyboardAlways(requireActivity());
dialog.cancel(); dialog.cancel();
openDialog = null; openDialog = null;
} }
@ -566,7 +614,7 @@ public class GenerateReviewFragment extends Fragment {
etPasswordB.setError(getString(R.string.generate_bad_passwordB)); etPasswordB.setError(getString(R.string.generate_bad_passwordB));
} else { } else {
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked())); new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
Helper.hideKeyboardAlways(getActivity()); Helper.hideKeyboardAlways(requireActivity());
openDialog.dismiss(); openDialog.dismiss();
openDialog = null; openDialog = null;
} }
@ -574,25 +622,23 @@ public class GenerateReviewFragment extends Fragment {
}); });
// accept keyboard "ok" // accept keyboard "ok"
etPasswordB.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { etPasswordB.getEditText().setOnEditorActionListener((v, actionId, event) -> {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
|| (actionId == EditorInfo.IME_ACTION_DONE)) { String newPasswordA = etPasswordA.getEditText().getText().toString();
String newPasswordA = etPasswordA.getEditText().getText().toString(); String newPasswordB = etPasswordB.getEditText().getText().toString();
String newPasswordB = etPasswordB.getEditText().getText().toString(); // disallow empty passwords
// disallow empty passwords if (!newPasswordA.equals(newPasswordB)) {
if (!newPasswordA.equals(newPasswordB)) { etPasswordB.setError(getString(R.string.generate_bad_passwordB));
etPasswordB.setError(getString(R.string.generate_bad_passwordB)); } else {
} else { new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked())); Helper.hideKeyboardAlways(requireActivity());
Helper.hideKeyboardAlways(getActivity()); openDialog.dismiss();
openDialog.dismiss(); openDialog = null;
openDialog = null;
}
return true;
} }
return false; return true;
} }
return false;
}); });
if (Helper.preventScreenshot()) { if (Helper.preventScreenshot()) {
@ -608,4 +654,61 @@ public class GenerateReviewFragment extends Fragment {
&& !key.toLowerCase().equals("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); && !key.toLowerCase().equals("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
// ledger implmenetation returns the spend key as f's // ledger implmenetation returns the spend key as f's
} }
private class AsyncShowSeed extends AsyncTask<String, Void, Boolean> {
String seed;
String offset;
Wallet.Status walletStatus;
@Override
protected void onPreExecute() {
super.onPreExecute();
offset = getSeedOffset();
flWalletMnemonic.setAlpha(0.1f);
}
@Override
protected Boolean doInBackground(String... params) {
if (params.length != 1) return false;
String walletPath = params[0];
Wallet wallet;
boolean closeWallet;
if (type.equals(GenerateReviewFragment.VIEW_TYPE_WALLET)) {
wallet = GenerateReviewFragment.this.walletCallback.getWallet();
closeWallet = false;
} else {
wallet = WalletManager.getInstance().openWallet(walletPath, getPassword());
closeWallet = true;
}
walletStatus = wallet.getStatus();
if (!walletStatus.isOk()) {
if (closeWallet) wallet.close();
return false;
}
seed = wallet.getSeed(offset);
if (closeWallet) wallet.close();
return true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (!isAdded()) return; // never mind
if (result) {
if (!seed.isEmpty()) {
llMnemonic.setVisibility(View.VISIBLE);
tvWalletMnemonic.setText(seed);
}
} else {
tvWalletMnemonic.setText(walletStatus.toString());
}
seedOffsetInProgress = false;
if (!getSeedOffset().equals(offset)) { // make sure we have encrypted with the correct offset
showSeed(); // seed has changed in the meantime - recalc
} else
flWalletMnemonic.setAlpha(1);
}
}
} }

View File

@ -929,7 +929,8 @@ public class LoginActivity extends BaseActivity
} }
@Override @Override
public void onGenerate(final String name, final String password, final String seed, public void onGenerate(final String name, final String password,
final String seed, final String offset,
final long restoreHeight) { final long restoreHeight) {
createWallet(name, password, createWallet(name, password,
new WalletCreator() { new WalletCreator() {
@ -941,7 +942,7 @@ public class LoginActivity extends BaseActivity
@Override @Override
public boolean createWallet(File aFile, String password) { public boolean createWallet(File aFile, String password) {
Wallet newWallet = WalletManager.getInstance() Wallet newWallet = WalletManager.getInstance()
.recoveryWallet(aFile, password, seed, restoreHeight); .recoveryWallet(aFile, password, seed, offset, restoreHeight);
return checkAndCloseWallet(newWallet); return checkAndCloseWallet(newWallet);
} }
}); });

View File

@ -129,7 +129,7 @@ public class Wallet {
ConnectionStatus_WrongVersion ConnectionStatus_WrongVersion
} }
public native String getSeed(); public native String getSeed(String offset);
public native String getSeedLanguage(); public native String getSeedLanguage();

View File

@ -124,19 +124,19 @@ public class WalletManager {
private native long openWalletJ(String path, String password, int networkType); private native long openWalletJ(String path, String password, int networkType);
public Wallet recoveryWallet(File aFile, String password, String mnemonic) { public Wallet recoveryWallet(File aFile, String password,
return recoveryWallet(aFile, password, mnemonic, 0); String mnemonic, String offset,
} long restoreHeight) {
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password,
public Wallet recoveryWallet(File aFile, String password, String mnemonic, long restoreHeight) { mnemonic, offset,
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password, mnemonic,
getNetworkType().getValue(), restoreHeight); getNetworkType().getValue(), restoreHeight);
Wallet wallet = new Wallet(walletHandle); Wallet wallet = new Wallet(walletHandle);
manageWallet(wallet); manageWallet(wallet);
return wallet; return wallet;
} }
private native long recoveryWalletJ(String path, String password, String mnemonic, private native long recoveryWalletJ(String path, String password,
String mnemonic, String offset,
int networkType, long restoreHeight); int networkType, long restoreHeight);
public Wallet createWalletWithKeys(File aFile, String password, String language, long restoreHeight, public Wallet createWalletWithKeys(File aFile, String password, String language, long restoreHeight,

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?colorPrimaryVariant"
android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorPrimaryVariant"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?colorPrimaryVariant"
android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorPrimaryVariant"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?colorPrimaryVariant"
android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z" />
</vector>

View File

@ -15,7 +15,6 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
app:errorEnabled="true"> app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
@ -34,7 +33,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first" android:layout_marginTop="@dimen/header_top_first"
app:boxStrokeErrorColor="@color/monerujoPrimary" app:boxStrokeErrorColor="@color/monerujoPrimary"
app:errorEnabled="true" app:errorEnabled="true"
app:errorIconDrawable="@drawable/ic_smiley_gunther_filled" app:errorIconDrawable="@drawable/ic_smiley_gunther_filled"
@ -78,7 +77,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first" android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone" android:visibility="gone"
app:errorEnabled="true"> app:errorEnabled="true">
@ -92,12 +91,41 @@
android:textAlignment="textStart" /> android:textAlignment="textStart" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/bSeedOffset"
style="@style/MoneroIconButton.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:background="?android:selectableItemBackground"
android:text="@string/label_seed_offset_encrypt"
app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/etSeedOffset"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:visibility="gone">
<com.google.android.material.textfield.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/seed_offset_hint"
android:inputType="textVisiblePassword"
android:maxLines="1"
android:textAlignment="textStart" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/etWalletAddress" android:id="@+id/etWalletAddress"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first" android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone" android:visibility="gone"
app:counterEnabled="true" app:counterEnabled="true"
app:counterMaxLength="95" app:counterMaxLength="95"
@ -118,7 +146,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first" android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone" android:visibility="gone"
app:counterEnabled="true" app:counterEnabled="true"
app:counterMaxLength="64" app:counterMaxLength="64"
@ -139,7 +167,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first" android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone" android:visibility="gone"
app:counterEnabled="true" app:counterEnabled="true"
app:counterMaxLength="64" app:counterMaxLength="64"
@ -160,7 +188,7 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first" android:layout_marginTop="@dimen/header_top_first"
android:visibility="gone" android:visibility="gone"
app:errorEnabled="true"> app:errorEnabled="true">
@ -179,7 +207,7 @@
style="@style/MoneroButton" style="@style/MoneroButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginTop="@dimen/header_top_first"
android:text="@string/generate_buttonGenerate" /> android:text="@string/generate_buttonGenerate" />
</LinearLayout> </LinearLayout>

View File

@ -18,12 +18,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:indeterminate="true" android:indeterminate="true"
android:visibility="gone" /> android:visibility="invisible" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:layout_marginTop="@dimen/header_top">
<TextView <TextView
style="@style/MoneroLabel.Heading" style="@style/MoneroLabel.Heading"
@ -57,7 +56,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top" android:layout_marginTop="@dimen/header_top"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"> android:visibility="visible">
<TextView <TextView
style="@style/MoneroLabel.Heading" style="@style/MoneroLabel.Heading"
@ -66,15 +65,49 @@
android:layout_gravity="center" android:layout_gravity="center"
android:text="@string/generate_mnemonic_label" /> android:text="@string/generate_mnemonic_label" />
<TextView <FrameLayout
android:id="@+id/tvWalletMnemonic" android:id="@+id/flWalletMnemonic"
style="@style/MoneroText.Monospace.Mnemonic"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top" android:layout_marginTop="@dimen/data_top">
android:background="@drawable/backgound_seed"
android:textAlignment="center" <TextView
tools:text="tucks slackens vehicle doctor oaks aloof balding knife rays wise haggled cuisine navy ladder suitcase dusted last thorn pixels karate ticket nibs violin zapped slackens" /> android:id="@+id/tvWalletMnemonic"
style="@style/MoneroText.Monospace.Mnemonic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/backgound_seed"
android:textAlignment="center"
tools:text="tucks slackens vehicle doctor oaks aloof balding knife rays wise haggled cuisine navy ladder suitcase dusted last thorn pixels karate ticket nibs violin zapped slackens" />
</FrameLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/bSeedOffset"
style="@style/MoneroIconButton.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="?android:selectableItemBackground"
android:text="@string/label_seed_offset_encrypt"
app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/etSeedOffset"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/header_top_first"
android:visibility="gone">
<com.google.android.material.textfield.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/seed_offset_hint"
android:inputType="textVisiblePassword"
android:maxLines="1"
android:textAlignment="textStart" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -148,7 +181,7 @@
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:text="@string/label_wallet_advanced_details" android:text="@string/label_wallet_advanced_details"
android:visibility="gone" android:visibility="gone"
app:icon="@drawable/ic_add_circle_outline" /> app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
<LinearLayout <LinearLayout
android:id="@+id/llAdvancedInfo" android:id="@+id/llAdvancedInfo"
@ -163,7 +196,6 @@
android:id="@+id/llViewKey" android:id="@+id/llViewKey"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"> android:visibility="gone">

View File

@ -23,7 +23,7 @@
<string name="label_ok">D\'acord</string> <string name="label_ok">D\'acord</string>
<string name="label_cancel">Cancel·lar</string> <string name="label_cancel">Cancel·lar</string>
<string name="label_close">Tancar</string> <string name="label_close">Tancar</string>
<string name="label_wallet_advanced_details">Premi aquí per informació més detallada</string> <string name="label_wallet_advanced_details">Informació més detallada</string>
<string name="label_send_success">Enviat correctament!</string> <string name="label_send_success">Enviat correctament!</string>
<string name="label_send_done">Fet</string> <string name="label_send_done">Fet</string>
@ -431,4 +431,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -24,7 +24,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Abbrechen</string> <string name="label_cancel">Abbrechen</string>
<string name="label_close">Schließen</string> <string name="label_close">Schließen</string>
<string name="label_wallet_advanced_details">Berühren für Detailinfos</string> <string name="label_wallet_advanced_details">Detailinfos</string>
<string name="label_send_success">Erfolgreich gesendet</string> <string name="label_send_success">Erfolgreich gesendet</string>
<string name="label_send_done">Fertig</string> <string name="label_send_done">Fertig</string>
@ -432,4 +432,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -22,7 +22,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Άκυρο</string> <string name="label_cancel">Άκυρο</string>
<string name="label_close">Κλείσιμο</string> <string name="label_close">Κλείσιμο</string>
<string name="label_wallet_advanced_details">Πάτησε για λεπτομερείς πληροφορίες</string> <string name="label_wallet_advanced_details">Λεπτομερείς πληροφορίες</string>
<string name="label_send_success">Αποστολή με επιτυχία</string> <string name="label_send_success">Αποστολή με επιτυχία</string>
<string name="label_send_done">Έγινε</string> <string name="label_send_done">Έγινε</string>
@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Nuligi</string> <string name="label_cancel">Nuligi</string>
<string name="label_close">Fermi</string> <string name="label_close">Fermi</string>
<string name="label_wallet_advanced_details">Tuŝi por pli detalaj informoj.</string> <string name="label_wallet_advanced_details">Detalaj informoj</string>
<string name="label_send_success">Sukcese sendis</string> <string name="label_send_success">Sukcese sendis</string>
<string name="label_send_done">Farite</string> <string name="label_send_done">Farite</string>
@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">Aceptar</string> <string name="label_ok">Aceptar</string>
<string name="label_cancel">Cancelar</string> <string name="label_cancel">Cancelar</string>
<string name="label_close">Cerrar</string> <string name="label_close">Cerrar</string>
<string name="label_wallet_advanced_details">Toca para información más detallada</string> <string name="label_wallet_advanced_details">Información más detallada</string>
<string name="label_send_success">¡Éxito!</string> <string name="label_send_success">¡Éxito!</string>
<string name="label_send_done">Hecho</string> <string name="label_send_done">Hecho</string>
@ -424,4 +424,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Katkesta</string> <string name="label_cancel">Katkesta</string>
<string name="label_close">Sulge</string> <string name="label_close">Sulge</string>
<string name="label_wallet_advanced_details">Puuduta lisainfo saamiseks</string> <string name="label_wallet_advanced_details">Lisainfo</string>
<string name="label_send_success">Edukalt saadetud</string> <string name="label_send_success">Edukalt saadetud</string>
<string name="label_send_done">Tehtud</string> <string name="label_send_done">Tehtud</string>
@ -431,4 +431,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Annuler</string> <string name="label_cancel">Annuler</string>
<string name="label_close">Fermer</string> <string name="label_close">Fermer</string>
<string name="label_wallet_advanced_details">Toucher pour plus d\'infos</string> <string name="label_wallet_advanced_details">Plus d\'infos</string>
<string name="label_send_success">Envoi réussi</string> <string name="label_send_success">Envoi réussi</string>
<string name="label_send_done">Fait</string> <string name="label_send_done">Fait</string>
@ -437,4 +437,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Mégsem</string> <string name="label_cancel">Mégsem</string>
<string name="label_close">Bezárás</string> <string name="label_close">Bezárás</string>
<string name="label_wallet_advanced_details">Koppints a részletes informcáióért</string> <string name="label_wallet_advanced_details">Részletes információk</string>
<string name="label_send_success">Sikeresen elküldve</string> <string name="label_send_success">Sikeresen elküldve</string>
<string name="label_send_done">Kész</string> <string name="label_send_done">Kész</string>
@ -435,4 +435,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Cancella</string> <string name="label_cancel">Cancella</string>
<string name="label_close">Chiudi</string> <string name="label_close">Chiudi</string>
<string name="label_wallet_advanced_details">Tocca per informazioni dettagliate</string> <string name="label_wallet_advanced_details">Informazioni dettagliate</string>
<string name="label_send_success">Invio riuscito</string> <string name="label_send_success">Invio riuscito</string>
<string name="label_send_done">Fatto</string> <string name="label_send_done">Fatto</string>
@ -430,10 +430,13 @@
<string name="restore_failed">Importazione fallita!</string> <string name="restore_failed">Importazione fallita!</string>
<string name="menu_deletecache">Resetta portafogli!</string> <string name="menu_deletecache">Resetta portafogli!</string>
<string name="deletecache_alert_message">Il reset del portafogli cancellerà tutte le informazioni locali (note, nomi di account &amp; sottoindirizzi, chiavi di transazione private, ...)! Procedi solo se il portafogli è corrotto e non si carica!</string> <string name="deletecache_alert_message"><![CDATA[Il reset del portafogli cancellerà tutte le informazioni locali (note, nomi di account & sottoindirizzi, chiavi di transazione private, …)! Procedi solo se il portafogli è corrotto e non si carica!]]></string>
<string name="node_tor_error">Tor required</string> <string name="node_tor_error">Tor required</string>
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,6 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">キャンセル</string> <string name="label_cancel">キャンセル</string>
<string name="label_close">閉じる</string> <string name="label_close">閉じる</string>
<string name="label_wallet_advanced_details">タッチして詳細情報を見る</string>
<string name="label_send_success">送金成功</string> <string name="label_send_success">送金成功</string>
<string name="label_send_done">完了</string> <string name="label_send_done">完了</string>
@ -436,4 +435,8 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_wallet_advanced_details">タッチして詳細情報を見る</string> <!-- Please chnage to "Detailed information" -->
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Avbryt</string> <string name="label_cancel">Avbryt</string>
<string name="label_close">Lukk</string> <string name="label_close">Lukk</string>
<string name="label_wallet_advanced_details">Trykk for detaljert informasjon</string> <string name="label_wallet_advanced_details">Detaljert informasjon</string>
<string name="label_send_success">Sendt suksessfullt!</string> <string name="label_send_success">Sendt suksessfullt!</string>
<string name="label_send_done">Ferdig</string> <string name="label_send_done">Ferdig</string>
@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Annuleren</string> <string name="label_cancel">Annuleren</string>
<string name="label_close">Sluiten</string> <string name="label_close">Sluiten</string>
<string name="label_wallet_advanced_details">Tik voor meer informatie</string> <string name="label_wallet_advanced_details">Meer informatie</string>
<string name="label_send_success">Verzonden</string> <string name="label_send_success">Verzonden</string>
<string name="label_send_done">Klaar</string> <string name="label_send_done">Klaar</string>
@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Cancelar</string> <string name="label_cancel">Cancelar</string>
<string name="label_close">Fechar</string> <string name="label_close">Fechar</string>
<string name="label_wallet_advanced_details">Toque para mais detalhes</string> <string name="label_wallet_advanced_details">Mais detalhes</string>
<string name="label_send_success">Enviado com sucesso</string> <string name="label_send_success">Enviado com sucesso</string>
<string name="label_send_done">Concluído</string> <string name="label_send_done">Concluído</string>
@ -420,10 +420,13 @@ aqui.</string>
<string name="restore_failed">Importação falhou!</string> <string name="restore_failed">Importação falhou!</string>
<string name="menu_deletecache">Resetar carteira!</string> <string name="menu_deletecache">Resetar carteira!</string>
<string name="deletecache_alert_message">Esta carteira será resetada, perdendo todos os dados "off-chain" (como notas, contas &amp; nomes de subendereços, chaves de transações privadas, ...)! Use isso SOMENTE se esta carteira estiver corrompida e não carrega!</string> <string name="deletecache_alert_message"><![CDATA[Esta carteira será resetada, perdendo todos os dados "off-chain" (como notas, contas & nomes de subendereços, chaves de transações privadas, )! Use isso SOMENTE se esta carteira estiver corrompida e não carrega!]]></string>
<string name="node_tor_error">Tor required</string> <string name="node_tor_error">Tor required</string>
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Cancelar</string> <string name="label_cancel">Cancelar</string>
<string name="label_close">Fechar</string> <string name="label_close">Fechar</string>
<string name="label_wallet_advanced_details">Toca para informação detalhada</string> <string name="label_wallet_advanced_details">Informação detalhada</string>
<string name="label_send_success">Enviado com sucesso</string> <string name="label_send_success">Enviado com sucesso</string>
<string name="label_send_done">Feito</string> <string name="label_send_done">Feito</string>
@ -437,4 +437,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -22,7 +22,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Anulează</string> <string name="label_cancel">Anulează</string>
<string name="label_close">Închide</string> <string name="label_close">Închide</string>
<string name="label_wallet_advanced_details">Atinge pentru informații detaliate</string> <string name="label_wallet_advanced_details">Informații detaliate</string>
<string name="label_send_success">Trimis cu succes</string> <string name="label_send_success">Trimis cu succes</string>
<string name="label_send_done">Gata</string> <string name="label_send_done">Gata</string>
@ -433,4 +433,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">Ок</string> <string name="label_ok">Ок</string>
<string name="label_cancel">Отмена</string> <string name="label_cancel">Отмена</string>
<string name="label_close">Закрыть</string> <string name="label_close">Закрыть</string>
<string name="label_wallet_advanced_details">Нажмите для доп. информации</string> <string name="label_wallet_advanced_details">Дополнительная информация</string>
<string name="label_send_success">Успешно отправлено</string> <string name="label_send_success">Успешно отправлено</string>
<string name="label_send_done">Готово</string> <string name="label_send_done">Готово</string>
@ -437,4 +437,7 @@
<string name="node_waiting">\u00A0ОЖИДАНИЕ УЗЛА\u00A0</string> <string name="node_waiting">\u00A0ОЖИДАНИЕ УЗЛА\u00A0</string>
<string name="tor_enable_background">Необходимо выбрать "Allow Background Starts" в настройках Orbot для использования Tor!</string> <string name="tor_enable_background">Необходимо выбрать "Allow Background Starts" в настройках Orbot для использования Tor!</string>
<string name="tor_noshift">SideShift.ai не поддерживает Tor.\nОтключите Tor для обмена XMR.</string> <string name="tor_noshift">SideShift.ai не поддерживает Tor.\nОтключите Tor для обмена XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Zrušiť</string> <string name="label_cancel">Zrušiť</string>
<string name="label_close">Zatvoriť</string> <string name="label_close">Zatvoriť</string>
<string name="label_wallet_advanced_details">Klepni pre viac info</string> <string name="label_wallet_advanced_details">Viac info</string>
<string name="label_send_success">úspešne odoslané</string> <string name="label_send_success">úspešne odoslané</string>
<string name="label_send_done">Hotovo</string> <string name="label_send_done">Hotovo</string>
@ -434,4 +434,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Otkaži</string> <string name="label_cancel">Otkaži</string>
<string name="label_close">Zatvori</string> <string name="label_close">Zatvori</string>
<string name="label_wallet_advanced_details">Takni za detaljne informacije</string> <string name="label_wallet_advanced_details">Detaljne informacije</string>
<string name="label_send_success">Uspešno poslato</string> <string name="label_send_success">Uspešno poslato</string>
<string name="label_send_done">Gotovo</string> <string name="label_send_done">Gotovo</string>
@ -432,4 +432,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Avbryt</string> <string name="label_cancel">Avbryt</string>
<string name="label_close">Stäng</string> <string name="label_close">Stäng</string>
<string name="label_wallet_advanced_details">Tryck för detaljerad information</string> <string name="label_wallet_advanced_details">Detaljerad information</string>
<string name="label_send_success">Har skickats</string> <string name="label_send_success">Har skickats</string>
<string name="label_send_done">Färdig</string> <string name="label_send_done">Färdig</string>
@ -425,4 +425,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,7 @@
<string name="label_ok">Ok</string> <string name="label_ok">Ok</string>
<string name="label_cancel">Відміна</string> <string name="label_cancel">Відміна</string>
<string name="label_close">Закрити</string> <string name="label_close">Закрити</string>
<string name="label_wallet_advanced_details">Натисніть для дод. інформації</string> <string name="label_wallet_advanced_details">Додатковій інформації</string>
<string name="label_send_success">Успішно відправлено</string> <string name="label_send_success">Успішно відправлено</string>
<string name="label_send_done">Готово</string> <string name="label_send_done">Готово</string>
@ -437,4 +437,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -19,7 +19,6 @@
<string name="label_ok">确认</string> <string name="label_ok">确认</string>
<string name="label_cancel">取消</string> <string name="label_cancel">取消</string>
<string name="label_close">关闭</string> <string name="label_close">关闭</string>
<string name="label_wallet_advanced_details">点击以查看详情</string>
<string name="label_send_success">发送成功</string> <string name="label_send_success">发送成功</string>
<string name="label_send_done">完成</string> <string name="label_send_done">完成</string>
<string name="label_receive_info_gen_qr_code">点此获取QR码</string> <string name="label_receive_info_gen_qr_code">点此获取QR码</string>
@ -357,4 +356,8 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_wallet_advanced_details">点击以查看详情</string> <!-- Please chnage to "Detailed information" -->
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -23,7 +23,6 @@
<string name="label_ok">好的</string> <string name="label_ok">好的</string>
<string name="label_cancel">取消</string> <string name="label_cancel">取消</string>
<string name="label_close">關閉</string> <string name="label_close">關閉</string>
<string name="label_wallet_advanced_details">點選以獲得詳細資訊</string>
<string name="label_send_success">已成功發送</string> <string name="label_send_success">已成功發送</string>
<string name="label_send_done">完成</string> <string name="label_send_done">完成</string>
@ -432,4 +431,8 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_wallet_advanced_details">點選以獲得詳細資訊</string> <!-- Please chnage to "Detailed information" -->
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>

View File

@ -25,7 +25,7 @@
<string name="label_ok">OK</string> <string name="label_ok">OK</string>
<string name="label_cancel">Cancel</string> <string name="label_cancel">Cancel</string>
<string name="label_close">Close</string> <string name="label_close">Close</string>
<string name="label_wallet_advanced_details">Touch for detailed information</string> <string name="label_wallet_advanced_details">Detailed information</string>
<string name="label_send_success">Successfully sent</string> <string name="label_send_success">Successfully sent</string>
<string name="label_send_done">Done</string> <string name="label_send_done">Done</string>
@ -507,4 +507,7 @@
<string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string> <string name="node_waiting">\u00A0WAITING FOR NODE\u00A0</string>
<string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string> <string name="tor_enable_background">"Allow Background Starts" in Orbot Settings to use Tor!</string>
<string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string> <string name="tor_noshift">SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR.</string>
<string name="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
</resources> </resources>