mirror of https://github.com/m2049r/xmrwallet.git
allow seed offset generation & wallet restore (#804)
This commit is contained in:
parent
341df6c6a3
commit
0712efec78
|
@ -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 {
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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">
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 & 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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 & 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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue