allow seed offset generation & wallet restore (#804)

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

View File

@ -8,8 +8,8 @@ android {
applicationId "com.m2049r.xmrwallet"
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 {

View File

@ -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);
}
@ -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
@ -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",

View File

@ -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);

View File

@ -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() {
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.setVisibility(View.GONE);
scrollview.post(new Runnable() {
@Override
public void run() {
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;
@ -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,12 +534,10 @@ public class GenerateReviewFragment extends Fragment {
if (FingerprintHelper.isDeviceSupported(getActivity())) {
llFingerprintAuth.setVisibility(View.VISIBLE);
swFingerprintAllowed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
swFingerprintAllowed.setOnClickListener(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)))
.setCancelable(false)
.setPositiveButton(getString(R.string.label_ok), null)
@ -499,7 +548,6 @@ public class GenerateReviewFragment extends Fragment {
}
})
.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,8 +622,7 @@ public class GenerateReviewFragment extends Fragment {
});
// accept keyboard "ok"
etPasswordB.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
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();
@ -585,14 +632,13 @@ 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;
}
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);
}
}
}

View File

@ -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);
}
});

View File

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

View File

@ -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,

View File

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

View File

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

View File

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

View File

@ -15,7 +15,6 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
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>

View File

@ -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" />
<FrameLayout
android:id="@+id/flWalletMnemonic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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: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" />
</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">

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 &amp; sottoindirizzi, chiavi di transazione private, ...)! Procedi solo se il portafogli è corrotto e non si carica!</string>
<string name="deletecache_alert_message"><![CDATA[Il reset del portafogli cancellerà tutte le informazioni locali (note, nomi di account & sottoindirizzi, chiavi di transazione private, …)! Procedi solo se il portafogli è corrotto e non si carica!]]></string>
<string name="node_tor_error">Tor required</string>
<string name="node_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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 &amp; nomes de subendereços, chaves de transações privadas, ...)! Use isso SOMENTE se esta carteira estiver corrompida e não carrega!</string>
<string name="deletecache_alert_message"><![CDATA[Esta carteira será resetada, perdendo todos os dados "off-chain" (como notas, contas & nomes de subendereços, chaves de transações privadas, )! Use isso SOMENTE se esta carteira estiver corrompida e não carrega!]]></string>
<string name="node_tor_error">Tor required</string>
<string name="node_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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>