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"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 1201
|
||||
versionName "2.2.1 'René'"
|
||||
versionCode 1301
|
||||
versionName "2.3.1 'Doménikos'"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
|
|
|
@ -229,7 +229,7 @@ std::vector<std::string> java2cpp(JNIEnv *env, jobject arrayList) {
|
|||
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_add = env->GetMethodID(class_ArrayList, "add",
|
||||
|
@ -301,12 +301,13 @@ Java_com_m2049r_xmrwallet_model_WalletManager_openWalletJ(JNIEnv *env, jobject i
|
|||
JNIEXPORT jlong JNICALL
|
||||
Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobject instance,
|
||||
jstring path, jstring password,
|
||||
jstring mnemonic,
|
||||
jstring mnemonic, jstring offset,
|
||||
jint networkType,
|
||||
jlong restoreHeight) {
|
||||
const char *_path = env->GetStringUTFChars(path, nullptr);
|
||||
const char *_password = env->GetStringUTFChars(password, nullptr);
|
||||
const char *_mnemonic = env->GetStringUTFChars(mnemonic, nullptr);
|
||||
const char *_offset = env->GetStringUTFChars(offset, nullptr);
|
||||
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
|
||||
|
||||
Bitmonero::Wallet *wallet =
|
||||
|
@ -315,11 +316,14 @@ Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobje
|
|||
std::string(_password),
|
||||
std::string(_mnemonic),
|
||||
_networkType,
|
||||
(uint64_t) restoreHeight);
|
||||
(uint64_t) restoreHeight,
|
||||
1, // kdf_rounds
|
||||
std::string(_offset));
|
||||
|
||||
env->ReleaseStringUTFChars(path, _path);
|
||||
env->ReleaseStringUTFChars(password, _password);
|
||||
env->ReleaseStringUTFChars(mnemonic, _mnemonic);
|
||||
env->ReleaseStringUTFChars(offset, _offset);
|
||||
return reinterpret_cast<jlong>(wallet);
|
||||
}
|
||||
|
||||
|
@ -533,7 +537,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_resolveOpenAlias(JNIEnv *env, jobj
|
|||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_com_m2049r_xmrwallet_model_WalletManager_setProxy(JNIEnv *env, jobject instance,
|
||||
jstring address) {
|
||||
jstring address) {
|
||||
const char *_address = env->GetStringUTFChars(address, nullptr);
|
||||
bool rc =
|
||||
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
|
||||
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);
|
||||
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
|
||||
|
@ -740,7 +747,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getConnectionStatusJ(JNIEnv *env, jobject
|
|||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_com_m2049r_xmrwallet_model_Wallet_setProxy(JNIEnv *env, jobject instance,
|
||||
jstring address) {
|
||||
jstring address) {
|
||||
const char *_address = env->GetStringUTFChars(address, nullptr);
|
||||
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
|
||||
bool rc = wallet->setProxy(std::string(_address));
|
||||
|
@ -1262,7 +1269,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
|||
#include <stdio.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_add = env->GetMethodID(class_ArrayList, "add",
|
||||
|
|
|
@ -81,6 +81,9 @@ public class GenerateFragment extends Fragment {
|
|||
private TextInputLayout etWalletRestoreHeight;
|
||||
private Button bGenerate;
|
||||
|
||||
private Button bSeedOffset;
|
||||
private TextInputLayout etSeedOffset;
|
||||
|
||||
private String type = null;
|
||||
|
||||
private void clearErrorOnTextEntry(final TextInputLayout textInputLayout) {
|
||||
|
@ -118,6 +121,8 @@ public class GenerateFragment extends Fragment {
|
|||
etWalletSpendKey = view.findViewById(R.id.etWalletSpendKey);
|
||||
etWalletRestoreHeight = view.findViewById(R.id.etWalletRestoreHeight);
|
||||
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);
|
||||
etWalletViewKey.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
|
||||
|
@ -222,6 +227,8 @@ public class GenerateFragment extends Fragment {
|
|||
}
|
||||
return false;
|
||||
});
|
||||
bSeedOffset.setVisibility(View.VISIBLE);
|
||||
bSeedOffset.setOnClickListener(v -> toggleSeedOffset());
|
||||
break;
|
||||
case TYPE_KEY:
|
||||
case TYPE_VIEWONLY:
|
||||
|
@ -288,6 +295,18 @@ public class GenerateFragment extends Fragment {
|
|||
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() {
|
||||
String name = etWalletName.getEditText().getText().toString();
|
||||
boolean ok = true;
|
||||
|
@ -422,12 +441,13 @@ public class GenerateFragment extends Fragment {
|
|||
break;
|
||||
case TYPE_SEED:
|
||||
if (!checkMnemonic()) return;
|
||||
String seed = etWalletMnemonic.getEditText().getText().toString();
|
||||
final String seed = etWalletMnemonic.getEditText().getText().toString();
|
||||
bGenerate.setEnabled(false);
|
||||
if (fingerprintAuthAllowed) {
|
||||
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;
|
||||
case TYPE_LEDGER:
|
||||
bGenerate.setEnabled(false);
|
||||
|
@ -491,7 +511,7 @@ public class GenerateFragment extends Fragment {
|
|||
public interface Listener {
|
||||
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);
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ import android.view.ViewGroup;
|
|||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
|
@ -45,6 +46,7 @@ import androidx.appcompat.app.AlertDialog;
|
|||
import androidx.fragment.app.Fragment;
|
||||
|
||||
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.textfield.TextInputLayout;
|
||||
import com.m2049r.xmrwallet.ledger.Ledger;
|
||||
|
@ -77,6 +79,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||
private ProgressBar pbProgress;
|
||||
private TextView tvWalletPassword;
|
||||
private TextView tvWalletAddress;
|
||||
private FrameLayout flWalletMnemonic;
|
||||
private TextView tvWalletMnemonic;
|
||||
private TextView tvWalletHeight;
|
||||
private TextView tvWalletViewKey;
|
||||
|
@ -90,6 +93,9 @@ public class GenerateReviewFragment extends Fragment {
|
|||
private Button bAdvancedInfo;
|
||||
private Button bAccept;
|
||||
|
||||
private Button bSeedOffset;
|
||||
private TextInputLayout etSeedOffset;
|
||||
|
||||
private String walletPath;
|
||||
private String walletName;
|
||||
|
||||
|
@ -106,6 +112,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||
tvWalletViewKey = view.findViewById(R.id.tvWalletViewKey);
|
||||
tvWalletSpendKey = view.findViewById(R.id.tvWalletSpendKey);
|
||||
tvWalletMnemonic = view.findViewById(R.id.tvWalletMnemonic);
|
||||
flWalletMnemonic = view.findViewById(R.id.flWalletMnemonic);
|
||||
tvWalletHeight = view.findViewById(R.id.tvWalletHeight);
|
||||
bCopyAddress = view.findViewById(R.id.bCopyAddress);
|
||||
bAdvancedInfo = view.findViewById(R.id.bAdvancedInfo);
|
||||
|
@ -115,6 +122,9 @@ public class GenerateReviewFragment extends Fragment {
|
|||
llSpendKey = view.findViewById(R.id.llSpendKey);
|
||||
llViewKey = view.findViewById(R.id.llViewKey);
|
||||
|
||||
etSeedOffset = view.findViewById(R.id.etSeedOffset);
|
||||
bSeedOffset = view.findViewById(R.id.bSeedOffset);
|
||||
|
||||
bAccept = view.findViewById(R.id.bAccept);
|
||||
|
||||
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());
|
||||
bCopyAddress.setEnabled(false);
|
||||
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();
|
||||
type = args.getString(REQUEST_TYPE);
|
||||
|
@ -136,18 +164,32 @@ public class GenerateReviewFragment extends Fragment {
|
|||
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() {
|
||||
tvWalletPassword.setText(null);
|
||||
new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -155,15 +197,27 @@ public class GenerateReviewFragment extends Fragment {
|
|||
Toast.makeText(getActivity(), getString(R.string.message_nocopy), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
void showAdvancedInfo() {
|
||||
llAdvancedInfo.setVisibility(View.VISIBLE);
|
||||
bAdvancedInfo.setVisibility(View.GONE);
|
||||
scrollview.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
scrollview.fullScroll(ScrollView.FOCUS_DOWN);
|
||||
}
|
||||
});
|
||||
void toggleAdvancedInfo() {
|
||||
if (llAdvancedInfo.getVisibility() == View.VISIBLE) {
|
||||
llAdvancedInfo.setVisibility(View.GONE);
|
||||
bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0);
|
||||
} else {
|
||||
llAdvancedInfo.setVisibility(View.VISIBLE);
|
||||
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;
|
||||
|
@ -215,14 +269,13 @@ public class GenerateReviewFragment extends Fragment {
|
|||
name = wallet.getName();
|
||||
walletStatus = wallet.getStatus();
|
||||
if (!walletStatus.isOk()) {
|
||||
Timber.e(walletStatus.getErrorString());
|
||||
if (closeWallet) wallet.close();
|
||||
return false;
|
||||
}
|
||||
|
||||
address = wallet.getAddress();
|
||||
height = wallet.getRestoreHeight();
|
||||
seed = wallet.getSeed();
|
||||
seed = wallet.getSeed(getSeedOffset());
|
||||
switch (wallet.getDeviceType()) {
|
||||
case Device_Ledger:
|
||||
viewKey = Ledger.Key();
|
||||
|
@ -367,7 +420,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||
}
|
||||
|
||||
public void hideProgress() {
|
||||
pbProgress.setVisibility(View.GONE);
|
||||
pbProgress.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
boolean backOk() {
|
||||
|
@ -408,8 +461,6 @@ public class GenerateReviewFragment extends Fragment {
|
|||
if (walletStatus.isOk()) {
|
||||
wallet.setPassword(newPassword);
|
||||
ok = true;
|
||||
} else {
|
||||
Timber.e(walletStatus.getErrorString());
|
||||
}
|
||||
if (closeWallet) wallet.close();
|
||||
return ok;
|
||||
|
@ -469,7 +520,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||
LayoutInflater li = LayoutInflater.from(getActivity());
|
||||
View promptsView = li.inflate(R.layout.prompt_changepw, null);
|
||||
|
||||
AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(getActivity());
|
||||
AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(requireActivity());
|
||||
alertDialogBuilder.setView(promptsView);
|
||||
|
||||
final PasswordEntryView etPasswordA = promptsView.findViewById(R.id.etWalletPasswordA);
|
||||
|
@ -483,23 +534,20 @@ public class GenerateReviewFragment extends Fragment {
|
|||
if (FingerprintHelper.isDeviceSupported(getActivity())) {
|
||||
llFingerprintAuth.setVisibility(View.VISIBLE);
|
||||
|
||||
swFingerprintAllowed.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (!swFingerprintAllowed.isChecked()) return;
|
||||
swFingerprintAllowed.setOnClickListener(view -> {
|
||||
if (!swFingerprintAllowed.isChecked()) return;
|
||||
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity());
|
||||
builder.setMessage(Html.fromHtml(getString(R.string.generate_fingerprint_warn)))
|
||||
.setCancelable(false)
|
||||
.setPositiveButton(getString(R.string.label_ok), null)
|
||||
.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
swFingerprintAllowed.setChecked(false);
|
||||
}
|
||||
})
|
||||
.show();
|
||||
}
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(requireActivity());
|
||||
builder.setMessage(Html.fromHtml(getString(R.string.generate_fingerprint_warn)))
|
||||
.setCancelable(false)
|
||||
.setPositiveButton(getString(R.string.label_ok), null)
|
||||
.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
swFingerprintAllowed.setChecked(false);
|
||||
}
|
||||
})
|
||||
.show();
|
||||
});
|
||||
|
||||
swFingerprintAllowed.setChecked(FingerprintHelper.isFingerPassValid(getActivity(), walletName));
|
||||
|
@ -550,7 +598,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||
.setNegativeButton(getString(R.string.label_cancel),
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
Helper.hideKeyboardAlways(getActivity());
|
||||
Helper.hideKeyboardAlways(requireActivity());
|
||||
dialog.cancel();
|
||||
openDialog = null;
|
||||
}
|
||||
|
@ -566,7 +614,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||
etPasswordB.setError(getString(R.string.generate_bad_passwordB));
|
||||
} else {
|
||||
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
|
||||
Helper.hideKeyboardAlways(getActivity());
|
||||
Helper.hideKeyboardAlways(requireActivity());
|
||||
openDialog.dismiss();
|
||||
openDialog = null;
|
||||
}
|
||||
|
@ -574,25 +622,23 @@ public class GenerateReviewFragment extends Fragment {
|
|||
});
|
||||
|
||||
// accept keyboard "ok"
|
||||
etPasswordB.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
||||
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
|
||||
|| (actionId == EditorInfo.IME_ACTION_DONE)) {
|
||||
String newPasswordA = etPasswordA.getEditText().getText().toString();
|
||||
String newPasswordB = etPasswordB.getEditText().getText().toString();
|
||||
// disallow empty passwords
|
||||
if (!newPasswordA.equals(newPasswordB)) {
|
||||
etPasswordB.setError(getString(R.string.generate_bad_passwordB));
|
||||
} else {
|
||||
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
|
||||
Helper.hideKeyboardAlways(getActivity());
|
||||
openDialog.dismiss();
|
||||
openDialog = null;
|
||||
}
|
||||
return true;
|
||||
etPasswordB.getEditText().setOnEditorActionListener((v, actionId, event) -> {
|
||||
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
|
||||
|| (actionId == EditorInfo.IME_ACTION_DONE)) {
|
||||
String newPasswordA = etPasswordA.getEditText().getText().toString();
|
||||
String newPasswordB = etPasswordB.getEditText().getText().toString();
|
||||
// disallow empty passwords
|
||||
if (!newPasswordA.equals(newPasswordB)) {
|
||||
etPasswordB.setError(getString(R.string.generate_bad_passwordB));
|
||||
} else {
|
||||
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
|
||||
Helper.hideKeyboardAlways(requireActivity());
|
||||
openDialog.dismiss();
|
||||
openDialog = null;
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
if (Helper.preventScreenshot()) {
|
||||
|
@ -608,4 +654,61 @@ public class GenerateReviewFragment extends Fragment {
|
|||
&& !key.toLowerCase().equals("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||
// 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
|
||||
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) {
|
||||
createWallet(name, password,
|
||||
new WalletCreator() {
|
||||
|
@ -941,7 +942,7 @@ public class LoginActivity extends BaseActivity
|
|||
@Override
|
||||
public boolean createWallet(File aFile, String password) {
|
||||
Wallet newWallet = WalletManager.getInstance()
|
||||
.recoveryWallet(aFile, password, seed, restoreHeight);
|
||||
.recoveryWallet(aFile, password, seed, offset, restoreHeight);
|
||||
return checkAndCloseWallet(newWallet);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -129,7 +129,7 @@ public class Wallet {
|
|||
ConnectionStatus_WrongVersion
|
||||
}
|
||||
|
||||
public native String getSeed();
|
||||
public native String getSeed(String offset);
|
||||
|
||||
public native String getSeedLanguage();
|
||||
|
||||
|
|
|
@ -124,19 +124,19 @@ public class WalletManager {
|
|||
|
||||
private native long openWalletJ(String path, String password, int networkType);
|
||||
|
||||
public Wallet recoveryWallet(File aFile, String password, String mnemonic) {
|
||||
return recoveryWallet(aFile, password, mnemonic, 0);
|
||||
}
|
||||
|
||||
public Wallet recoveryWallet(File aFile, String password, String mnemonic, long restoreHeight) {
|
||||
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password, mnemonic,
|
||||
public Wallet recoveryWallet(File aFile, String password,
|
||||
String mnemonic, String offset,
|
||||
long restoreHeight) {
|
||||
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password,
|
||||
mnemonic, offset,
|
||||
getNetworkType().getValue(), restoreHeight);
|
||||
Wallet wallet = new Wallet(walletHandle);
|
||||
manageWallet(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);
|
||||
|
||||
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"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
app:errorEnabled="true">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
|
@ -34,7 +33,7 @@
|
|||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
app:boxStrokeErrorColor="@color/monerujoPrimary"
|
||||
app:errorEnabled="true"
|
||||
app:errorIconDrawable="@drawable/ic_smiley_gunther_filled"
|
||||
|
@ -78,7 +77,7 @@
|
|||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:visibility="gone"
|
||||
app:errorEnabled="true">
|
||||
|
||||
|
@ -92,12 +91,41 @@
|
|||
android:textAlignment="textStart" />
|
||||
</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
|
||||
android:id="@+id/etWalletAddress"
|
||||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:visibility="gone"
|
||||
app:counterEnabled="true"
|
||||
app:counterMaxLength="95"
|
||||
|
@ -118,7 +146,7 @@
|
|||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:visibility="gone"
|
||||
app:counterEnabled="true"
|
||||
app:counterMaxLength="64"
|
||||
|
@ -139,7 +167,7 @@
|
|||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:visibility="gone"
|
||||
app:counterEnabled="true"
|
||||
app:counterMaxLength="64"
|
||||
|
@ -160,7 +188,7 @@
|
|||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/header_top_first"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:visibility="gone"
|
||||
app:errorEnabled="true">
|
||||
|
||||
|
@ -179,7 +207,7 @@
|
|||
style="@style/MoneroButton"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:text="@string/generate_buttonGenerate" />
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
@ -18,12 +18,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:indeterminate="true"
|
||||
android:visibility="gone" />
|
||||
android:visibility="invisible" />
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/header_top">
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Heading"
|
||||
|
@ -57,7 +56,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/header_top"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
android:visibility="visible">
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Heading"
|
||||
|
@ -66,15 +65,49 @@
|
|||
android:layout_gravity="center"
|
||||
android:text="@string/generate_mnemonic_label" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvWalletMnemonic"
|
||||
style="@style/MoneroText.Monospace.Mnemonic"
|
||||
<FrameLayout
|
||||
android:id="@+id/flWalletMnemonic"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/data_top"
|
||||
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" />
|
||||
android:layout_marginTop="@dimen/data_top">
|
||||
|
||||
<TextView
|
||||
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
|
||||
|
@ -148,7 +181,7 @@
|
|||
android:drawablePadding="4dp"
|
||||
android:text="@string/label_wallet_advanced_details"
|
||||
android:visibility="gone"
|
||||
app:icon="@drawable/ic_add_circle_outline" />
|
||||
app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llAdvancedInfo"
|
||||
|
@ -163,7 +196,6 @@
|
|||
android:id="@+id/llViewKey"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/header_top"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">D\'acord</string>
|
||||
<string name="label_cancel">Cancel·lar</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_done">Fet</string>
|
||||
|
@ -431,4 +431,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Abbrechen</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_done">Fertig</string>
|
||||
|
@ -432,4 +432,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Άκυρο</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_done">Έγινε</string>
|
||||
|
@ -433,4 +433,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Nuligi</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_done">Farite</string>
|
||||
|
@ -433,4 +433,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">Aceptar</string>
|
||||
<string name="label_cancel">Cancelar</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_done">Hecho</string>
|
||||
|
@ -424,4 +424,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Katkesta</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_done">Tehtud</string>
|
||||
|
@ -431,4 +431,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Annuler</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_done">Fait</string>
|
||||
|
@ -437,4 +437,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Mégsem</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_done">Kész</string>
|
||||
|
@ -435,4 +435,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Cancella</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_done">Fatto</string>
|
||||
|
@ -430,10 +430,13 @@
|
|||
<string name="restore_failed">Importazione fallita!</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_waiting">\u00A0WAITING FOR NODE\u00A0</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="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
|
||||
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
|
||||
</resources>
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">キャンセル</string>
|
||||
<string name="label_close">閉じる</string>
|
||||
<string name="label_wallet_advanced_details">タッチして詳細情報を見る</string>
|
||||
|
||||
<string name="label_send_success">送金成功</string>
|
||||
<string name="label_send_done">完了</string>
|
||||
|
@ -436,4 +435,8 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Avbryt</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_done">Ferdig</string>
|
||||
|
@ -433,4 +433,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Annuleren</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_done">Klaar</string>
|
||||
|
@ -433,4 +433,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Cancelar</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_done">Concluído</string>
|
||||
|
@ -420,10 +420,13 @@ aqui.</string>
|
|||
<string name="restore_failed">Importação falhou!</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_waiting">\u00A0WAITING FOR NODE\u00A0</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="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
|
||||
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
|
||||
</resources>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Cancelar</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_done">Feito</string>
|
||||
|
@ -437,4 +437,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Anulează</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_done">Gata</string>
|
||||
|
@ -433,4 +433,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">Ок</string>
|
||||
<string name="label_cancel">Отмена</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_done">Готово</string>
|
||||
|
@ -437,4 +437,7 @@
|
|||
<string name="node_waiting">\u00A0ОЖИДАНИЕ УЗЛА\u00A0</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="label_seed_offset_encrypt">Seed encryption (EXPERIMENTAL)</string>
|
||||
<string name="seed_offset_hint">Seed Offset Phrase (optional)</string>
|
||||
</resources>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Zrušiť</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_done">Hotovo</string>
|
||||
|
@ -434,4 +434,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Otkaži</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_done">Gotovo</string>
|
||||
|
@ -432,4 +432,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Avbryt</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_done">Färdig</string>
|
||||
|
@ -425,4 +425,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="label_ok">Ok</string>
|
||||
<string name="label_cancel">Відміна</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_done">Готово</string>
|
||||
|
@ -437,4 +437,7 @@
|
|||
<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_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>
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
<string name="label_ok">确认</string>
|
||||
<string name="label_cancel">取消</string>
|
||||
<string name="label_close">关闭</string>
|
||||
<string name="label_wallet_advanced_details">点击以查看详情</string>
|
||||
<string name="label_send_success">发送成功</string>
|
||||
<string name="label_send_done">完成</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="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="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>
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
<string name="label_ok">好的</string>
|
||||
<string name="label_cancel">取消</string>
|
||||
<string name="label_close">關閉</string>
|
||||
<string name="label_wallet_advanced_details">點選以獲得詳細資訊</string>
|
||||
|
||||
<string name="label_send_success">已成功發送</string>
|
||||
<string name="label_send_done">完成</string>
|
||||
|
@ -432,4 +431,8 @@
|
|||
<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_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>
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
<string name="label_ok">OK</string>
|
||||
<string name="label_cancel">Cancel</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_done">Done</string>
|
||||
|
@ -507,4 +507,7 @@
|
|||
<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_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>
|
||||
|
|
Loading…
Reference in New Issue