1
mirror of https://github.com/m2049r/xmrwallet synced 2025-09-05 09:58:42 +02:00

Compare commits

..

20 Commits

Author SHA1 Message Date
m2049r
af68c5e51f new version 1.5.10 2018-06-22 22:11:49 +02:00
m2049r
5a2b48a087 fix displayed subaddress # 2018-06-22 22:09:44 +02:00
m2049r
0776b7b6a3 avoid NPE (#330) 2018-06-21 22:15:14 +02:00
m2049r
c2eed85a83 v1.5.9 2018-06-21 21:51:39 +02:00
m2049r
d7c2b4a727 restore deleted it/string 2018-06-21 20:22:54 +02:00
erciccione
085e41f5da update italian strings (#323) 2018-06-21 20:20:43 +02:00
Re-Diculous
6c6b3061a8 Update strings.xml (#325) 2018-06-21 20:19:32 +02:00
m2049r
5fc15779b7 Update Translations (#329)
* Portuguese

* update italian

* update german
2018-06-21 20:14:30 +02:00
m2049r
520d151f3c new subaddress bump effect (#327) 2018-06-20 18:33:28 +02:00
m2049r
7aad941dab new version v1.5.8 2018-06-18 09:43:11 +02:00
m2049r
01e7693425 subaddresses (#322) 2018-06-18 09:43:32 +02:00
m2049r
091538752b add our stagenet server to defaults (#321) 2018-06-17 13:53:01 +02:00
m2049r
d5b95dd976 new version v1.5.7 2018-06-17 13:31:33 +02:00
m2049r
008f06959c remove mixin settings (#320) 2018-06-17 13:22:29 +02:00
m2049r
817816cd34 Layout tweaks (#319)
* sweep layout tweak

* reduce label to fit

* change sweep message
2018-06-17 13:21:59 +02:00
m2049r
9d41d5da52 new version v1.5.6 2018-06-16 15:27:28 +02:00
m2049r
ad76a7ffc1 Fixes to v1.5.5 (#318)
* fix disappearing hamburger

* german fixes to fit space
2018-06-16 15:20:13 +02:00
el00ruobuob
475542c4f3 French Strings updated to #297 (#316)
+ Missing update to #312
+ enhancement on "wrapping things up"
2018-06-16 15:19:40 +02:00
m2049r
b5d0659ca9 sweep all (#317) 2018-06-16 15:17:48 +02:00
m2049r
781bfbc78b Update FAQ.md 2018-06-14 23:40:41 +02:00
31 changed files with 1162 additions and 185 deletions

View File

@@ -7,8 +7,8 @@ android {
applicationId "com.m2049r.xmrwallet"
minSdkVersion 21
targetSdkVersion 25
versionCode 95
versionName "1.5.5 'Accounts Nacho'"
versionCode 100
versionName "1.5.10 'Maximum Nacho'"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {

View File

@@ -552,9 +552,11 @@ Java_com_m2049r_xmrwallet_model_Wallet_setPassword(JNIEnv *env, jobject instance
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getAddressJ(JNIEnv *env, jobject instance,
jint accountIndex) {
jint accountIndex,
jint addressIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
return env->NewStringUTF(wallet->address((uint32_t) accountIndex).c_str());
return env->NewStringUTF(
wallet->address((uint32_t) accountIndex, (uint32_t) addressIndex).c_str());
}
JNIEXPORT jstring JNICALL
@@ -848,6 +850,31 @@ Java_com_m2049r_xmrwallet_model_Wallet_createTransactionJ(JNIEnv *env, jobject i
return reinterpret_cast<jlong>(tx);
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_createSweepTransaction(JNIEnv *env, jobject instance,
jstring dst_addr, jstring payment_id,
jint mixin_count,
jint priority,
jint accountIndex) {
const char *_dst_addr = env->GetStringUTFChars(dst_addr, NULL);
const char *_payment_id = env->GetStringUTFChars(payment_id, NULL);
Bitmonero::PendingTransaction::Priority _priority =
static_cast<Bitmonero::PendingTransaction::Priority>(priority);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::optional<uint64_t> empty;
Bitmonero::PendingTransaction *tx = wallet->createTransaction(_dst_addr, _payment_id,
empty, (uint32_t) mixin_count,
_priority,
(uint32_t) accountIndex);
env->ReleaseStringUTFChars(dst_addr, _dst_addr);
env->ReleaseStringUTFChars(payment_id, _payment_id);
return reinterpret_cast<jlong>(tx);
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_createSweepUnmixableTransactionJ(JNIEnv *env,
jobject instance) {
@@ -963,7 +990,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getTxKey(JNIEnv *env, jobject instance,
//virtual void addSubaddressAccount(const std::string& label) = 0;
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_addAccount(JNIEnv *env, jobject instance,
jstring label) {
jstring label) {
const char *_label = env->GetStringUTFChars(label, NULL);
@@ -1002,13 +1029,44 @@ Java_com_m2049r_xmrwallet_model_Wallet_setSubaddressLabel(JNIEnv *env, jobject i
// virtual size_t numSubaddressAccounts() const = 0;
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_numSubaddressAccounts(JNIEnv *env, jobject instance) {
Java_com_m2049r_xmrwallet_model_Wallet_getNumAccounts(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
return wallet->numSubaddressAccounts();
return static_cast<jint>(wallet->numSubaddressAccounts());
}
//virtual size_t numSubaddresses(uint32_t accountIndex) const = 0;
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getNumSubaddresses(JNIEnv *env, jobject instance,
jint accountIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
return static_cast<jint>(wallet->numSubaddresses(accountIndex));
}
//virtual void addSubaddress(uint32_t accountIndex, const std::string &label) = 0;
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_addSubaddress(JNIEnv *env, jobject instance,
jint accountIndex,
jstring label) {
const char *_label = env->GetStringUTFChars(label, NULL);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
wallet->addSubaddress(accountIndex, _label);
env->ReleaseStringUTFChars(label, _label);
}
/*JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getLastSubaddress(JNIEnv *env, jobject instance,
jint accountIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
size_t num = wallet->numSubaddresses(accountIndex);
//wallet->subaddress()->getAll()[num]->getAddress().c_str()
Monero::Subaddress *s = wallet->subaddress();
s->refresh(accountIndex);
std::vector<Monero::SubaddressRow *> v = s->getAll();
return env->NewStringUTF(v[num - 1]->getAddress().c_str());
}
*/
//virtual std::string signMessage(const std::string &message) = 0;
//virtual bool verifySignedMessage(const std::string &message, const std::string &addres, const std::string &signature) const = 0;
@@ -1054,10 +1112,13 @@ jobject newTransferList(JNIEnv *env, Bitmonero::TransactionInfo *info) {
jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
jmethodID c = env->GetMethodID(class_TransactionInfo, "<init>",
"(IZZJJJLjava/lang/String;JLjava/lang/String;IJLjava/util/List;)V");
"(IZZJJJLjava/lang/String;JLjava/lang/String;IIJLjava/util/List;)V");
jobject transfers = newTransferList(env, info);
jstring _hash = env->NewStringUTF(info->hash().c_str());
jstring _paymentId = env->NewStringUTF(info->paymentId().c_str());
uint32_t subaddrIndex = 0;
if (info->direction() == Bitmonero::TransactionInfo::Direction_In)
subaddrIndex = *(info->subaddrIndex().begin());
jobject result = env->NewObject(class_TransactionInfo, c,
info->direction(),
info->isPending(),
@@ -1069,6 +1130,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
static_cast<jlong> (info->timestamp()),
_paymentId,
info->subaddrAccount(),
subaddrIndex,
info->confirmations(),
transfers);
env->DeleteLocalRef(transfers);
@@ -1079,6 +1141,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
#include <stdio.h>
#include <stdlib.h>
jobject cpp2java(JNIEnv *env, std::vector<Bitmonero::TransactionInfo *> vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
@@ -1136,11 +1199,13 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_getAmount(JNIEnv *env, jobjec
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
return tx->amount();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getDust(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
return tx->dust();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getFee(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);

View File

@@ -372,7 +372,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
"node.moneroworld.com:18089;node.xmrbackb.one;node.xmr.be";
private static final String PREF_DAEMONLIST_STAGENET =
"stagenet.xmr-tw.org";
"stagenet.monerujo.io;stagenet.xmr-tw.org";
private NodeList daemonStageNet;
private NodeList daemonMainNet;

View File

@@ -62,6 +62,8 @@ import timber.log.Timber;
public class ReceiveFragment extends Fragment {
private ProgressBar pbProgress;
private View llAddress;
private TextView tvAddressLabel;
private TextView tvAddress;
private TextInputLayout etPaymentId;
private ExchangeView evAmount;
@@ -71,6 +73,10 @@ public class ReceiveFragment extends Fragment {
private ImageView qrCodeFull;
private EditText etDummy;
private ImageButton bCopyAddress;
private Button bSubaddress;
private Wallet wallet = null;
private boolean isMyWallet = false;
public interface Listener {
void setToolbarButton(int type);
@@ -87,6 +93,8 @@ public class ReceiveFragment extends Fragment {
View view = inflater.inflate(R.layout.fragment_receive, container, false);
pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress);
llAddress = view.findViewById(R.id.llAddress);
tvAddressLabel = (TextView) view.findViewById(R.id.tvAddressLabel);
tvAddress = (TextView) view.findViewById(R.id.tvAddress);
etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId);
evAmount = (ExchangeView) view.findViewById(R.id.evAmount);
@@ -96,6 +104,7 @@ public class ReceiveFragment extends Fragment {
qrCodeFull = (ImageView) view.findViewById(R.id.qrCodeFull);
etDummy = (EditText) view.findViewById(R.id.etDummy);
bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress);
bSubaddress = (Button) view.findViewById(R.id.bSubaddress);
etPaymentId.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
@@ -106,7 +115,7 @@ public class ReceiveFragment extends Fragment {
copyAddress();
}
});
bCopyAddress.setClickable(false);
enableCopyAddress(false);
evAmount.setOnNewAmountListener(new ExchangeView.OnNewAmountListener() {
@Override
@@ -162,6 +171,37 @@ public class ReceiveFragment extends Fragment {
}
});
bSubaddress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enableSubaddressButton(false);
enableCopyAddress(false);
final Runnable resetSize = new Runnable() {
public void run() {
tvAddress.animate().setDuration(125).scaleX(1).scaleY(1).start();
}
};
final Runnable newAddress = new Runnable() {
public void run() {
tvAddress.setText(wallet.getNewSubaddress());
tvAddressLabel.setText(getString(R.string.generate_address_label_sub,
wallet.getNumSubaddresses() - 1));
storeWallet();
generateQr();
enableCopyAddress(true);
tvAddress.animate().alpha(1).setDuration(125)
.scaleX(1.2f).scaleY(1.2f)
.withEndAction(resetSize).start();
}
};
tvAddress.animate().alpha(0).setDuration(250)
.withEndAction(newAddress).start();
}
});
qrCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -194,11 +234,25 @@ public class ReceiveFragment extends Fragment {
String password = b.getString("password");
loadAndShow(path, password);
} else {
show(walletName, address);
if (getActivity() instanceof GenerateReviewFragment.ListenerWithWallet) {
wallet = ((GenerateReviewFragment.ListenerWithWallet) getActivity()).getWallet();
show();
} else {
throw new IllegalStateException("no wallet info");
}
}
return view;
}
void enableSubaddressButton(boolean enable) {
bSubaddress.setEnabled(enable);
if (enable) {
bSubaddress.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_settings_orange_24dp, 0, 0);
} else {
bSubaddress.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_settings_gray_24dp, 0, 0);
}
}
void copyAddress() {
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_address), tvAddress.getText().toString());
Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show();
@@ -228,25 +282,38 @@ public class ReceiveFragment extends Fragment {
super.onResume();
Timber.d("onResume()");
listenerCallback.setToolbarButton(Toolbar.BUTTON_BACK);
listenerCallback.setSubtitle(getString(R.string.receive_title));
generateQr();
if (wallet != null) {
listenerCallback.setSubtitle(wallet.getAccountLabel());
generateQr();
} else {
listenerCallback.setSubtitle(getString(R.string.status_wallet_loading));
clearQR();
}
}
private boolean isLoaded = false;
private void show(String name, String address) {
Timber.d("name=%s", name);
private void show() {
Timber.d("name=%s", wallet.getName());
isLoaded = true;
listenerCallback.setTitle(name);
tvAddress.setText(address);
listenerCallback.setTitle(wallet.getName());
listenerCallback.setSubtitle(wallet.getAccountLabel());
tvAddress.setText(wallet.getAddress());
etPaymentId.setEnabled(true);
bPaymentId.setEnabled(true);
bCopyAddress.setClickable(true);
bCopyAddress.setImageResource(R.drawable.ic_content_copy_black_24dp);
enableCopyAddress(true);
hideProgress();
generateQr();
}
private void enableCopyAddress(boolean enable) {
bCopyAddress.setClickable(enable);
if (enable)
bCopyAddress.setImageResource(R.drawable.ic_content_copy_black_24dp);
else
bCopyAddress.setImageResource(R.drawable.ic_content_nocopy_black_24dp);
}
private void loadAndShow(String walletPath, String password) {
new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR,
walletPath, password);
@@ -254,18 +321,14 @@ public class ReceiveFragment extends Fragment {
private class AsyncShow extends AsyncTask<String, Void, Boolean> {
String password;
String address;
String name;
@Override
protected Boolean doInBackground(String... params) {
if (params.length != 2) return false;
String walletPath = params[0];
password = params[1];
Wallet wallet = WalletManager.getInstance().openWallet(walletPath, password);
address = wallet.getAddress();
name = wallet.getName();
wallet.close();
wallet = WalletManager.getInstance().openWallet(walletPath, password);
isMyWallet = true;
return true;
}
@@ -274,7 +337,7 @@ public class ReceiveFragment extends Fragment {
super.onPostExecute(result);
if (!isAdded()) return; // never mind
if (result) {
show(name, address);
show();
} else {
Toast.makeText(getActivity(), getString(R.string.receive_cannot_open), Toast.LENGTH_LONG).show();
hideProgress();
@@ -282,6 +345,27 @@ public class ReceiveFragment extends Fragment {
}
}
private void storeWallet() {
new AsyncStore().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR);
}
private class AsyncStore extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
if (params.length != 0) return false;
if (wallet != null) wallet.store();
return true;
}
@Override
protected void onPostExecute(Boolean result) {
enableSubaddressButton(true);
super.onPostExecute(result);
}
}
private boolean checkPaymentId() {
String paymentId = etPaymentId.getEditText().getText().toString();
boolean ok = paymentId.isEmpty() || Wallet.isPaymentIdValid(paymentId);
@@ -418,4 +502,15 @@ public class ReceiveFragment extends Fragment {
Timber.d("onPause()");
super.onPause();
}
@Override
public void onDetach() {
Timber.d("onDetach()");
if ((wallet != null) && (isMyWallet)) {
wallet.close();
wallet = null;
isMyWallet = false;
}
super.onDetach();
}
}

View File

@@ -224,7 +224,7 @@ public class TxFragment extends Fragment {
activityCallback.setSubtitle(getString(R.string.tx_title));
activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
tvAccount.setText("" + info.subaddrAccount);
tvAccount.setText(getString(R.string.tx_account_formatted, info.account, info.subaddress));
tvTxTimestamp.setText(TS_FORMATTER.format(new Date(info.timestamp * 1000)));
tvTxId.setText(info.hash);
@@ -287,7 +287,10 @@ public class TxFragment extends Fragment {
}
} else {
sb.append("-");
dstSb.append(info.direction == TransactionInfo.Direction.Direction_In ? activityCallback.getWalletAddress() : "-");
dstSb.append(info.direction ==
TransactionInfo.Direction.Direction_In ?
activityCallback.getWalletSubaddress(info.account, info.subaddress) :
"-");
}
tvTxTransfers.setText(sb.toString());
tvDestination.setText(dstSb.toString());
@@ -322,7 +325,7 @@ public class TxFragment extends Fragment {
Listener activityCallback;
public interface Listener {
String getWalletAddress();
String getWalletSubaddress(int accountIndex, int subaddressIndex);
String getTxKey(String hash);

View File

@@ -179,7 +179,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
saveWallet();
}
stopWalletService();
drawer.removeDrawerListener(drawerToggle);
if (drawer != null) drawer.removeDrawerListener(drawerToggle);
super.onDestroy();
}
@@ -286,8 +286,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
});
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.accounts_drawer_open, R.string.accounts_drawer_close);
drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, 0, 0);
drawer.addDrawerListener(drawerToggle);
drawerToggle.syncState();
setDrawerEnabled(false); // disable until synced
@@ -491,8 +490,8 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
@Override
public boolean onRefreshed(final Wallet wallet, final boolean full) {
Timber.d("onRefreshed()");
if (numAccounts != wallet.numAccounts()) {
numAccounts = wallet.numAccounts();
if (numAccounts != wallet.getNumAccounts()) {
numAccounts = wallet.getNumAccounts();
runOnUiThread(new Runnable() {
public void run() {
updateAccountsList();
@@ -740,8 +739,8 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
}
@Override
public String getWalletAddress() {
return getWallet().getAddress();
public String getWalletSubaddress(int accountIndex, int subaddressIndex) {
return getWallet().getSubaddress(accountIndex, subaddressIndex);
}
public String getWalletName() {
@@ -891,7 +890,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
@Override
public void onWalletReceive() {
startReceive(getWalletAddress());
startReceive(getWallet().getAddress());
}
void startReceive(String address) {
@@ -966,7 +965,8 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
Helper.getDisplayAmount(wallet.getBalanceAll(), 5)));
Menu menu = accountsView.getMenu();
menu.removeGroup(R.id.accounts_list);
for (int i = 0; i < wallet.numAccounts(); i++) {
final int n = wallet.getNumAccounts();
for (int i = 0; i < n; i++) {
final String label = wallet.getAccountLabel(i);
final MenuItem item = menu.add(R.id.accounts_list, getAccountId(i), 2 * i, label);
item.setIcon(R.drawable.ic_account_balance_wallet_black_24dp);
@@ -1050,7 +1050,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
switch (id) {
case R.id.account_new:
getWallet().addAccount();
int newIdx = getWallet().numAccounts() - 1;
int newIdx = getWallet().getNumAccounts() - 1;
getWallet().setAccountIndex(newIdx);
Toast.makeText(this,
getString(R.string.accounts_new, newIdx),

View File

@@ -422,6 +422,7 @@ public class WalletFragment extends Fragment
setProgress(syncProgress);
setProgress(syncText);
showReceive();
if (activityCallback.isSynced()) enableAccountsList(true);
}
@Override

View File

@@ -20,6 +20,9 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.m2049r.xmrwallet.R;
@@ -57,8 +60,9 @@ public class SendAmountWizardFragment extends SendWizardFragment {
private TextView tvFunds;
private ExchangeTextView evAmount;
//private Button bSendAll;
private NumberPadView numberPad;
private View llAmount;
private View rlSweep;
private ImageButton ibSweep;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -73,37 +77,64 @@ public class SendAmountWizardFragment extends SendWizardFragment {
tvFunds = (TextView) view.findViewById(R.id.tvFunds);
evAmount = (ExchangeTextView) view.findViewById(R.id.evAmount);
numberPad = (NumberPadView) view.findViewById(R.id.numberPad);
numberPad.setListener(evAmount);
((NumberPadView) view.findViewById(R.id.numberPad)).setListener(evAmount);
/*
bSendAll = (Button) view.findViewById(R.id.bSendAll);
bSendAll.setOnClickListener(new View.OnClickListener() {
rlSweep = view.findViewById(R.id.rlSweep);
llAmount = view.findViewById(R.id.llAmount);
view.findViewById(R.id.ivSweep).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: send all - figure out how to display this
sweepAll(false);
}
});
ibSweep = (ImageButton) view.findViewById(R.id.ibSweep);
ibSweep.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sweepAll(true);
}
});
*/
Helper.hideKeyboard(getActivity());
return view;
}
private boolean spendAllMode = false;
private void sweepAll(boolean spendAllMode) {
if (spendAllMode) {
ibSweep.setVisibility(View.INVISIBLE);
llAmount.setVisibility(View.GONE);
rlSweep.setVisibility(View.VISIBLE);
} else {
ibSweep.setVisibility(View.VISIBLE);
llAmount.setVisibility(View.VISIBLE);
rlSweep.setVisibility(View.GONE);
}
this.spendAllMode = spendAllMode;
}
@Override
public boolean onValidateFields() {
if (!evAmount.validate(maxFunds)) {
return false;
}
if (spendAllMode) {
if (sendListener != null) {
sendListener.getTxData().setAmount(Wallet.SWEEP_ALL);
}
} else {
if (!evAmount.validate(maxFunds)) {
return false;
}
if (sendListener != null) {
String xmr = evAmount.getAmount();
if (xmr != null) {
sendListener.getTxData().setAmount(Wallet.getAmountFromString(xmr));
} else {
sendListener.getTxData().setAmount(0L);
if (sendListener != null) {
String xmr = evAmount.getAmount();
if (xmr != null) {
sendListener.getTxData().setAmount(Wallet.getAmountFromString(xmr));
} else {
sendListener.getTxData().setAmount(0L);
}
}
}
return true;

View File

@@ -36,6 +36,7 @@ import com.m2049r.xmrwallet.util.UserNotes;
import timber.log.Timber;
public class SendSettingsWizardFragment extends SendWizardFragment {
final static public int MIXIN = 6;
public static SendSettingsWizardFragment newInstance(Listener listener) {
SendSettingsWizardFragment instance = new SendSettingsWizardFragment();
@@ -54,15 +55,12 @@ public class SendSettingsWizardFragment extends SendWizardFragment {
TxData getTxData();
}
// Mixin = Ringsize - 1
final static int Mixins[] = {6, 9, 12, 25}; // must match the layout XML / "@array/mixin"
final static PendingTransaction.Priority Priorities[] =
{PendingTransaction.Priority.Priority_Default,
PendingTransaction.Priority.Priority_Low,
PendingTransaction.Priority.Priority_Medium,
PendingTransaction.Priority.Priority_High}; // must match the layout XML
private Spinner sMixin;
private Spinner sPriority;
private EditText etNotes;
private EditText etDummy;
@@ -77,7 +75,6 @@ public class SendSettingsWizardFragment extends SendWizardFragment {
View view = inflater.inflate(
R.layout.fragment_send_settings, container, false);
sMixin = (Spinner) view.findViewById(R.id.sMixin);
sPriority = (Spinner) view.findViewById(R.id.sPriority);
etNotes = (EditText) view.findViewById(R.id.etNotes);
@@ -104,7 +101,7 @@ public class SendSettingsWizardFragment extends SendWizardFragment {
if (sendListener != null) {
TxData txData = sendListener.getTxData();
txData.setPriority(Priorities[sPriority.getSelectedItemPosition()]);
txData.setMixin(Mixins[sMixin.getSelectedItemPosition()]);
txData.setMixin(MIXIN);
txData.setUserNotes(new UserNotes(etNotes.getText().toString()));
}
return true;

View File

@@ -166,7 +166,11 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
}
if ((userNotes.note.isEmpty())) {
this.tvPaymentId.setText(infoItem.paymentId.equals("0000000000000000") ? "" : infoItem.paymentId);
this.tvPaymentId.setText(infoItem.paymentId.equals("0000000000000000") ?
(infoItem.subaddress != 0 ?
(context.getString(R.string.tx_subaddress, infoItem.subaddress)) :
"") :
infoItem.paymentId);
} else {
this.tvPaymentId.setText(userNotes.note);
}

View File

@@ -75,7 +75,7 @@ public class TransactionHistory {
Timber.d("refreshed %d", t.size());
for (Iterator<TransactionInfo> iterator = t.iterator(); iterator.hasNext(); ) {
TransactionInfo info = iterator.next();
if (info.subaddrAccount != accountIndex) {
if (info.account != accountIndex) {
iterator.remove();
Timber.d("removed %s", info.hash);
} else {

View File

@@ -67,7 +67,8 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
public String hash;
public long timestamp;
public String paymentId;
public int subaddrAccount;
public int account;
public int subaddress;
public long confirmations;
public List<Transfer> transfers;
@@ -84,7 +85,8 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
String hash,
long timestamp,
String paymentId,
int subaddrAccount,
int account,
int subaddress,
long confirmations,
List<Transfer> transfers) {
this.direction = Direction.values()[direction];
@@ -96,7 +98,8 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
this.hash = hash;
this.timestamp = timestamp;
this.paymentId = paymentId;
this.subaddrAccount = subaddrAccount;
this.account = account;
this.subaddress = subaddress;
this.confirmations = confirmations;
this.transfers = transfers;
}
@@ -116,7 +119,8 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
out.writeString(hash);
out.writeLong(timestamp);
out.writeString(paymentId);
out.writeInt(subaddrAccount);
out.writeInt(account);
out.writeInt(subaddress);
out.writeLong(confirmations);
out.writeList(transfers);
out.writeString(txKey);
@@ -143,7 +147,8 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
hash = in.readString();
timestamp = in.readLong();
paymentId = in.readString();
subaddrAccount = in.readInt();
account = in.readInt();
subaddress = in.readInt();
confirmations = in.readLong();
transfers = in.readArrayList(Transfer.class.getClassLoader());
txKey = in.readString();

View File

@@ -19,10 +19,15 @@ package com.m2049r.xmrwallet.model;
import com.m2049r.xmrwallet.data.TxData;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import timber.log.Timber;
public class Wallet {
final static public long SWEEP_ALL = Long.MAX_VALUE;
static {
System.loadLibrary("monerujo");
}
@@ -84,10 +89,22 @@ public class Wallet {
public native boolean setPassword(String password);
public String getAddress() {
return getAddressJ(accountIndex);
return getAddress(accountIndex);
}
private native String getAddressJ(int accountIndex);
public String getAddress(int accountIndex) {
return getAddressJ(accountIndex, 0);
}
public String getSubaddress(int addressIndex) {
return getAddressJ(accountIndex, addressIndex);
}
public String getSubaddress(int accountIndex, int addressIndex) {
return getAddressJ(accountIndex, addressIndex);
}
private native String getAddressJ(int accountIndex, int addressIndex);
public native String getPath();
@@ -107,7 +124,9 @@ public class Wallet {
public native String getSecretSpendKey();
public boolean store() {
return store("");
final boolean ok = store("");
Timber.d("stored");
return ok;
}
public native boolean store(String path);
@@ -231,8 +250,12 @@ public class Wallet {
PendingTransaction.Priority priority) {
disposePendingTransaction();
int _priority = priority.getValue();
long txHandle = createTransactionJ(dst_addr, payment_id, amount, mixin_count, _priority,
accountIndex);
long txHandle =
(amount == SWEEP_ALL ?
createSweepTransaction(dst_addr, payment_id, mixin_count, _priority,
accountIndex) :
createTransactionJ(dst_addr, payment_id, amount, mixin_count, _priority,
accountIndex));
pendingTransaction = new PendingTransaction(txHandle);
return pendingTransaction;
}
@@ -241,6 +264,10 @@ public class Wallet {
long amount, int mixin_count,
int priority, int accountIndex);
private native long createSweepTransaction(String dst_addr, String payment_id,
int mixin_count,
int priority, int accountIndex);
public PendingTransaction createSweepUnmixableTransaction() {
disposePendingTransaction();
@@ -313,17 +340,21 @@ public class Wallet {
public String getAccountLabel(int accountIndex) {
String label = getSubaddressLabel(accountIndex, 0);
if (label.equals(NEW_ACCOUNT_NAME)) {
String address = getAddressJ(accountIndex);
String address = getAddress(accountIndex);
int len = address.length();
return address.substring(0, 6) +
"\u2026" + address.substring(len - 6, len);
} else return label;
}
public String getSubaddressLabel(int addressIndex) {
return getSubaddressLabel(accountIndex, addressIndex);
}
public native String getSubaddressLabel(int accountIndex, int addressIndex);
public void setAccountLabel(String label) {
setSubaddressLabel(accountIndex, 0, label);
setAccountLabel(accountIndex, label);
}
public void setAccountLabel(int accountIndex, String label) {
@@ -332,9 +363,30 @@ public class Wallet {
public native void setSubaddressLabel(int accountIndex, int addressIndex, String label);
public int numAccounts() {
return numSubaddressAccounts();
public native int getNumAccounts();
public int getNumSubaddresses() {
return getNumSubaddresses(accountIndex);
}
public native int getNumSubaddresses(int accountIndex);
public String getNewSubaddress() {
return getNewSubaddress(accountIndex);
}
public String getNewSubaddress(int accountIndex) {
String timeStamp = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss", Locale.US).format(new Date());
addSubaddress(accountIndex, timeStamp);
String subaddress = getLastSubaddress(accountIndex);
Timber.d("%d: %s", getNumSubaddresses(accountIndex) - 1, subaddress);
return subaddress;
}
public native void addSubaddress(int accountIndex, String label);
public String getLastSubaddress(int accountIndex) {
return getSubaddress(accountIndex, getNumSubaddresses(accountIndex) - 1);
}
public native int numSubaddressAccounts();
}

View File

@@ -25,6 +25,7 @@ import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
@@ -45,6 +46,8 @@ import timber.log.Timber;
public class ExchangeTextView extends LinearLayout
implements NumberPadView.NumberPadListener {
private static String MAX = "\u221E";
String xmrAmount = null;
String notXmrAmount = null;
@@ -68,7 +71,7 @@ public class ExchangeTextView extends LinearLayout
if (amount > max) {
ok = false;
}
if (amount <= 0) {
if (amount <= 0) { /////////////////////////////
ok = false;
}
} catch (NumberFormatException ex) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -24,11 +24,14 @@
android:indeterminate="true"
android:visibility="gone" />
<FrameLayout
<LinearLayout
android:id="@+id/llAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:id="@+id/tvAddressLabel"
style="@style/MoneroLabel.Heading"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@@ -39,20 +42,44 @@
android:id="@+id/bCopyAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="80dp"
android:layout_marginStart="8dp"
android:background="?android:selectableItemBackground"
android:clickable="false"
android:src="@drawable/ic_content_nocopy_black_24dp" />
</FrameLayout>
</LinearLayout>
<TextView
android:id="@+id/tvAddress"
style="@style/MoneroText.Medium"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
tools:text="9wZnnNctRc7RaLya1rxykH21dUwfQpNGmVLjAvkvqe7nKT2Mw848AJNGMunW5xjoSZ5vCCU3uDnUoVqSSHxzRtQBE3f6crx" />
android:layout_marginTop="8dp"
android:orientation="horizontal"
android:weightSum="10">
<TextView
android:id="@+id/tvAddress"
style="@style/MoneroText.Medium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="10"
android:textAlignment="center"
tools:text="9wZnnNctRc7RaLya1rxykH21dUwfQpNGmVLjAvkvqe7nKT2Mw848AJNGMunW5xjoSZ5vCCU3uDnUoVqSSHxzRtQBE3f6crx" />
<Button
android:id="@+id/bSubaddress"
style="@style/MoneroText.Button.Small"
android:layout_width="56dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="8dp"
android:layout_weight="0"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:drawableTop="@drawable/ic_settings_orange_24dp"
android:text="@string/send_generate_paymentid_hint"
android:textColor="@color/moneroGray"
android:visibility="visible" />
</LinearLayout>
<com.m2049r.xmrwallet.widget.ExchangeView
android:id="@+id/evAmount"
@@ -96,7 +123,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="0"
android:background="?android:selectableItemBackground"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:drawableTop="@drawable/ic_settings_orange_24dp"
android:text="@string/send_generate_paymentid_hint"
android:textColor="@color/moneroGray"
@@ -122,10 +149,10 @@
android:visibility="invisible" />
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_margin="16dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="16dp"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardCornerRadius="2dp"

View File

@@ -1,30 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvFunds"
style="@style/MoneroText.Funds"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center" />
android:orientation="horizontal">
<com.m2049r.xmrwallet.widget.ExchangeTextView
android:id="@+id/evAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:orientation="vertical" />
<TextView
android:id="@+id/tvFunds"
style="@style/MoneroText.Funds"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_toStartOf="@id/ibSweep"
android:gravity="center"
tools:text="Balance: 70.198276354123 XMR" />
<com.m2049r.xmrwallet.widget.NumberPadView
android:id="@+id/numberPad"
<ImageButton
android:id="@+id/ibSweep"
style="@style/MoneroLabel.NumPad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:paddingEnd="12dp"
android:paddingStart="12dp"
android:src="@drawable/ic_all_inclusive_24dp"
android:visibility="visible" />
</RelativeLayout>
<LinearLayout
android:id="@+id/llAmount"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center" />
android:orientation="vertical"
android:visibility="visible">
<com.m2049r.xmrwallet.widget.ExchangeTextView
android:id="@+id/evAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:orientation="vertical" />
<com.m2049r.xmrwallet.widget.NumberPadView
android:id="@+id/numberPad"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center" />
</LinearLayout>
<RelativeLayout
android:id="@+id/rlSweep"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
<ImageView
android:id="@+id/ivSweep"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/tvSweep"
android:layout_alignParentTop="true"
android:padding="16dp"
android:src="@drawable/ic_all_inclusive_24dp" />
<TextView
android:id="@+id/tvSweep"
style="@style/MoneroLabel.Heading.Donation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="16dp"
android:gravity="center"
android:text="@string/send_sweepall" />
</RelativeLayout>
</LinearLayout>

View File

@@ -27,20 +27,10 @@
android:text="@string/label_send_settings_advanced"
android:textAlignment="textEnd" />
<Spinner
android:id="@+id/sMixin"
style="@style/MoneroSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:entries="@array/mixin"
android:textAlignment="center" />
<Spinner
android:id="@+id/sPriority"
style="@style/MoneroSpinner"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:entries="@array/priority"

View File

@@ -86,7 +86,7 @@
<string name="label_send_btc_xmrto_key_lb">Geheimer Schlüssel\nXMR.TO</string>
<string name="label_send_btc_xmrto_key">XMR.TO Geheimer Schlüssel</string>
<string name="label_send_btc_address">BTC Zieladresse</string>
<string name="label_send_btc_amount">Menge</string>
<string name="label_send_btc_amount">Betrag</string>
<string name="label_send_txid">Transaktions-ID</string>
<string name="label_send_address">Zieladresse</string>
@@ -133,10 +133,10 @@
<string name="prompt_password">Passwort für %1$s</string>
<string name="prompt_fingerprint_auth">Fingerabdruck-Authentifizierung möglich.\nBitte Sensor berühren.</string>
<string name="prompt_send_password">Passwort bestätigen</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="prompt_open_wallet">Wallet wird geöffnet &#8230;</string>
<string name="bad_fingerprint">Fingerabdruck nicht erkannt. Nochmals versuchen.</string>
<string name="bad_password">Falsches Passwort!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_saved_password">Gespeichertes Passwort ist inkorrekt.\nBitte Passwort manuell eingeben.</string>
<string name="bad_wallet">Wallet existiert nicht!</string>
<string name="prompt_daemon_missing">Daemonadresse muss gesetzt sein!</string>
<string name="prompt_wrong_net">Wallet entspricht nicht dem ausgewähltem Netz</string>
@@ -235,12 +235,12 @@
<string name="send_title">Senden</string>
<string name="send_available">Saldo: %1$s XMR</string>
<string name="send_address_title">Adresse</string>
<string name="send_amount_title">Menge</string>
<string name="send_settings_title">Einstellungen</string>
<string name="send_confirm_title">Bestätigen</string>
<string name="send_amount_title">Betrag</string>
<string name="send_settings_title">Optionen</string>
<string name="send_confirm_title">Gebühr</string>
<string name="send_success_title">Fertig</string>
<string name="send_amount_label">Menge</string>
<string name="send_amount_label">Betrag</string>
<string name="send_fee_btc_label">Gebühr (XMR)</string>
<string name="send_fee_label">Gebühr</string>
<string name="send_total_btc_label">Total (XMR)</string>
@@ -264,8 +264,8 @@
<string name="tx_destination_btc">Ziel\n(BTC)</string>
<string name="tx_paymentId">Zahlungs-ID</string>
<string name="tx_blockheight">Block</string>
<string name="tx_amount">Menge</string>
<string name="tx_amount_btc">Menge\n(BTC)</string>
<string name="tx_amount">Betrag</string>
<string name="tx_amount_btc">Betrag\n(BTC)</string>
<string name="tx_fee">Gebühr</string>
<string name="tx_transfers">Transfers</string>
<string name="tx_notes">Notizen</string>
@@ -278,7 +278,7 @@
<string name="tx_failed">FEHLGESCHLAGEN</string>
<string name="receive_paymentid_hint">Zahlungs-ID (optional)</string>
<string name="receive_amount_hint">Menge</string>
<string name="receive_amount_hint">Betrag</string>
<string name="receive_cannot_open">Konnte Wallet nicht öffnen!</string>
<string name="receive_paymentid_invalid">16 oder 64 Hex-Zeichen (0&#8211;9,a&#8211;f)</string>
<string name="receive_integrated_paymentid_invalid">Muss bei einer integrierten Adresse leer sein</string>
@@ -310,11 +310,12 @@
<string name="fab_restore_key">Wallet mit privaten Schlüsseln wiederherstellen</string>
<string name="fab_restore_seed">Wallet mit 25 Wörter Seed wiederherstellen</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="accounts_drawer_new">Konto erstellen</string>
<string name="accounts_drawer_title">Konten</string>
<string name="accounts_new">Neues Konto #%1$d hinzugefügt</string>
<string name="tx_account">Konto #</string>
<string name="send_sweepall">Versende alle verfügbaren Gelder aus diesem Konto!</string>
<string name="tx_subaddress">Subadresse #%1$d</string>
<string name="generate_address_label_sub">Öffentliche Subadresse #%1$d</string>
</resources>

View File

@@ -80,10 +80,10 @@
<string name="prompt_password">Contraseña para %1$s</string>
<string name="prompt_fingerprint_auth">Puedes poner tu dedo en el sensor para autorizar con tu huella.</string>
<string name="prompt_send_password">Confirmar Contraseña</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="prompt_open_wallet">Abriendo el monedero&#8230;</string>
<string name="bad_fingerprint">Huella no reconocida. Inténtalo nuevamente.</string>
<string name="bad_password">¡Contraseña incorrecta!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_saved_password">La contraseña guardada es incorrecta.\nIngresela manualmente.</string>
<string name="bad_wallet">¡El monedero no existe!</string>
<string name="prompt_daemon_missing">¡La dirección del daemon debe estar configurada!</string>
<string name="prompt_wrong_net">El monedero no coincide con la red seleccionada</string>
@@ -295,11 +295,12 @@
<string name="info_xmrto_enabled">Pago en BTC activado, toca para más info.</string>
<string name="info_crazypass_enabled">CrAzYpass activado, toca para más info.</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="accounts_drawer_new">Crear Cuenta</string>
<string name="accounts_drawer_title">Cuentas</string>
<string name="accounts_new">Nueva cuenta agregada #%1$d</string>
<string name="tx_account"># de cuenta</string>
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
</resources>

View File

@@ -100,7 +100,7 @@
<string name="open_progress">Vérification de la connexion au démon</string>
<string name="changepw_progress">Modification du mot de passe en cours</string>
<string name="service_progress">Récapitulation &#8230;\nCela peut prendre un moment !</string>
<string name="service_progress">Remise en ordre &#8230;\nCela peut prendre un moment !</string>
<string name="backup_failed">Sauvegarde Échouée !</string>
<string name="archive_failed">Archivage Échouée !</string>
@@ -134,10 +134,10 @@
<string name="prompt_password">Mot de passe pour %1$s</string>
<string name="prompt_fingerprint_auth">Vous pouvez également ouvrir le portefeuille avec votre empreinte digitale.\nMerci de toucher le capteur.</string>
<string name="prompt_send_password">Confirmez le mot de passe</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="prompt_open_wallet">Ouverture du portefeuille &#8230;</string>
<string name="bad_fingerprint">Empreinte digitale non reconnue. Résessayez.</string>
<string name="bad_password">Mot de passe incorrect !</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_saved_password">Mot de passe sauvegardé incorrect.\nVeuillez entrer le mot de passe manuellement.</string>
<string name="bad_wallet">Portefeuille inexistant !</string>
<string name="prompt_daemon_missing">L\'adresse du démon ne peut pas être configurée !</string>
<string name="prompt_wrong_net">Portefeuille incompatible avec le réseau sélectionné</string>
@@ -313,11 +313,12 @@
<string name="fab_restore_key">Restaurer un portefeuille depuis la clef privée</string>
<string name="fab_restore_seed">Restaurer un portefeuille depuis la phrase mnémonique</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="accounts_drawer_new">Créer un Compte</string>
<string name="accounts_drawer_title">Comptes</string>
<string name="accounts_new">Nouveau Compte #%1$d ajouté</string>
<string name="tx_account">Compte #</string>
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
</resources>

View File

@@ -133,10 +133,10 @@
<string name="prompt_password">Password per %1$s</string>
<string name="prompt_fingerprint_auth">Puoi aprire il portafoglio anche usando la tua impronta digitale./nTocca il sensore.</string>
<string name="prompt_send_password">Conferma Password</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="prompt_open_wallet">Aprendo il portafoglio&#8230;</string>
<string name="bad_fingerprint">Impronta digitale non riconosciuta. Prova di nuovo.</string>
<string name="bad_password">Password errata!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_saved_password">La password salvata è scorretta.\nInserisci la password manualmente.</string>
<string name="bad_wallet">Il portafoglio non esiste!</string>
<string name="prompt_daemon_missing">Deve essere impostato l\'indirizzo del Daemon!</string>
<string name="prompt_wrong_net">Il portafoglio non si abbina con la rete selezionata</string>
@@ -311,11 +311,12 @@
<string name="fab_restore_key">Recupera un portafoglio dalle chiavi private</string>
<string name="fab_restore_seed">Recupera un portafoglio da un seed di 25 parole</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_new">Crea Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="accounts_new">Aggiunto nuovo account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="send_sweepall">Manda tutti i fondi confermati in questo account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Subaddress pubblico #%1$d</string>
</resources>

View File

@@ -309,11 +309,12 @@
<string name="fab_restore_key">Gjenoprett lommebok fra private nøkler</string>
<string name="fab_restore_seed">Gjenoprett lommebok fra 25-ord seed</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
</resources>

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="about_close">Fechar</string>
<string name="about_whoami">Eu sou o monerujo</string>
<string name="about_version">Versão %1$s (%2$d)</string>
<string name="credits_text"><![CDATA[
<b>Créditos</b>
<br/>
m2049r, baltsar777, anhdres, keejef,
rehrar, EarlOfEgo et al.
<br/><br/>
<a href="https://monerujo.io/">monerujo.io</a>
]]></string>
<string name="privacy_policy"><![CDATA[
<h1>Política de Privacidade</h1>
<p>Esta página contém informação acerca das nossas políticas de recolha, uso
e divulgação das informações pessoais que recebemos dos utilizadores
da nossa app (monerujo: Monero Wallet).
</p>
<p>Ao utilizar esta app está a concordar com a recolha e uso de
informação de acordo com esta política.
</p>
<h2>Dados Recolhidos</h2>
<p> Dados pessoais são todo o tipo de dados que permitem identificar um indivíduo.
</p>
<p>As chaves e endereços Monero são recolhidos e processados pela app localmente
para o propósito de processar transacções e transmiti-las à rede Monero de forma
encriptada.
</p>
<p>Quaisquer outros dados pessoais não são recolhidos pela app.</p>
<p>Se utilizar a conversão para USD/EUR, o monerujo obtém as taxas de conversão a
partir da API pública do kraken.com.
Confirme a política de privacidade deste serviço em https://www.kraken.com/legal/privacy para
mais detalhes em como estes pedidos são processados (especialmente a
secção "Informação que recolhemos automaticament").</p>
<p>Se utilizar esta app para pagar em BTC, você estará a utilizar o serviço XMR.TO.
Veja a sua política de privacidade em https://xmr.to/ para mais detalhes. O monerujo envia
para este serviço a quantidade e o endereço de destino das BTC. O seu IP vai ser registado.</p>
<h2>Permissões da app</h2>
<ul>
<li>INTERNET : Ligar à rede Monero</li>
<li>READ_EXTERNAL_STORAGE : Ler as carteiras Monero guardadas no dispositivo</li>
<li>WRITE_EXTERNAL_STORAGE : Escrever as carteiras Monero no dispositivo</li>
<li>WAKE_LOCK : Manter o dispositivo ligado enquanto sincroniza</li>
<li>CAMERA : Ler códigos QR para receber Monero</li>
</ul>
<h2>Alterações a esta política de privacidade</h2>
<p>Nós podemos alterar esta política de privacidade de tempos em temps. Iremos notificar
quaisquer alterações actualizando esta política de privacidade na app e no
website oficial (www.monerujo.io)
É aconselhável que reveja esta política de privacidade periodicamente para conferir quaisquer alterações.
<p>A última actualização à política de privacidade foi em: 10 de Novembro de 2017.
</p>
<h2>Contacte-nos</h2>
<p>Se tiver alguma questão acerca da nossa política de privacidade,
ou sobre como os seus dados são recolhidos e processados,
por favor envie um email para privacy@monerujo.io.
</p>
]]></string>
</resources>

View File

@@ -0,0 +1,239 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="help_create_new"><![CDATA[
<h1>Criar Carteira - Nova</h1>
<p>Se precisas de um endereço Monero novo!</p>
<p>Introduz nome e palavra passe únicos para a carteira.
A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte -
melhor ainda é utilizar uma frase passe.</p>
<h2>Toma nota da tua Semente Mnemónica!</h2>
<p>No próximo ecrã vai estar a tua \"Semente Mnemónica\" de 25 palavras.
Esta semente é suficiente para recuperar a tua carteira mais tarde
e ganhar total acesso aos teus fundos.
Mantê-la segura e privada é muito importante, já que pode dar acesso total aos
teus fundos a <em>qualquer pessoa</em>!
<p>Se perderes a palavra passe da tua carteira, podes recuperar a carteira com a Semente Mnemónica.</p>
<p>Não há forma de recuperar a Semente Mnemónica, se a perderes todos os teus fundos serão perdidos!
A Semente Mnemónica não pode ser alterada, e se for roubada ou comprometida de outra forma,
tens de transferir os teus fundos para uma carteira nova (com uma nova Semente Mnemónica). Por isso,
é melhor fazer uma cópia de segurança da Semente escrevendo-a fisicamente e guardando-a em
<em>vários</em> lugares seguros.</p>
]]></string>
<string name="help_create_seed"><![CDATA[
<h1>Crirar Carteira - Semente</h1>
<p>Se já tens um Endereço Monero e queres recuperar as transacções da blockchain!</p>
<p>Introduz nome e palavra passe únicos para a carteira. A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte - melhor ainda é utilizar uma frase passe.</p>
<p>Introduz a tua Semente no campo \"Semente Mnemónica\".<p>
<p>Se sabes o número do bloco da primeira transacção deste endereço, introduz no campo
\"Restaurar de Altura\" - deixar em branco vai verificar <em>toda</em> a blockchain para
encontrar as transacções do teu endereço. Isto demora <em>imenso</em> tempo.</p>
]]></string>
<string name="help_create_keys"><![CDATA[
<h1>Criar Carteira - Chaves</h1>
<p>Se estás a recuperar a tua carteira a partir das tuas chaves!</p>
<p>Introduz nome e palavra passe únicos para a carteira. A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte - melhor ainda é utilizar uma frase passe.</p>
<p>Introduz o teu Endereço Monero no campo \"Endereço público\" e preenche a \"Chave de Visualização\" e a \"Chave de utilização\".</p>
<p>Se sabes o número do bloco da primeira transacção deste endereço, introduz no campo
\"Restaurar de Altura\" - deixar em branco vai verificar <em>toda</em> a blockchain para
encontrar as transacções do teu endereço. Isto demora <em>imenso</em> tempo.</p>
]]></string>
<string name="help_create_view"><![CDATA[
<h1>Criar Carteira - Visualização</h1>
<p>Se apenas queres ver as transacções de depósito numa carteira!</p>
<p>Introduz nome e palavra passe únicos para a carteira. A palavra passe é utilizada para proteger os dados da carteira. Utiliza uma passe forte - melhor ainda é utilizar uma frase passe.</p>
<p>Introduz o teu Endereço Monero no campo \"Endereço público\" e preenche a \"Chave de Visualização\".</p>
<p>Se sabes o número do bloco da primeira transacção deste endereço, introduz no campo
\"Restaurar de Altura\" - deixar em branco vai verificar <em>toda</em> a blockchain para
encontrar as transacções do teu endereço. Isto demora <em>imenso</em> tempo.</p>
]]></string>
<string name="help_details"><![CDATA[
<h1>Detalhes da Carteira</h1>
<h2>Endereço público</h2>
O teu endereço público é como o teu número de conta bancário e podes partilhá-lo livremente
sem qualquer receio de perderes os teus Monero. As pessoas enviam dinheiro para a tua carteira
através deste endereço.
<h2>Semente Mnemónica</h2>
Este é o único dado necessário para recuperar a tua carteira no futuro e ganhar acesso total aos
teus fundos. Manter esta informação privada e protegida é muito importante, já que dá a <em>qualquer</em>
pessoa acesso aos teus Monero! Se não escreveste a semente nalgum sítio seguro, por favor fá-lo!
<h2>Palavra passe dos Ficheiros da Carteira</h2>
Certifica-te que escreves esta palavra passe. Se formatares o teu dispositivo ou desinstalares esta
app, vais precisar precisar disto para acederes à tua carteira.<br/>
<h3>passLoUCa</h3>
Se a palavra passe mostrada aqui tem 52 caracteres alfanuméricos em grupos de 4 - parabéns!
Os teus ficheiros estão seguros com uma chave de 256-bits gerada pelas funcionalidades de segurança
do teu dispositivo através da frase passe que escolheste (na criação ou alterando-a). Isto
torna-a extremamente difícil de piratear!<br/>
Esta funcionalidade é obrigatória para todas as carteiras novas.
<h3>Palavra passe antiga</h3>
Se vês a tua frase passe aqui, os ficheiros da tua carteira não estão tão seguros quanto
se estivesses a usar a passLoUCa. Para corrigir isto, selecciona \"Alterar palavra passe\" no
menu. Após introduzir a nova palavra passe (podes usar a mesma) a aplicação gera uma passLoUCa para
ti e protege os ficheiros da tua carteira com ela. Escreve-a nalgum lado!
<h3>Carteiras com passLoUCa</h3>
Se precisares de reinstalar o Monerujo (por exemplo, depois de formatares o telemóvel ou trocares
para um novo) ou quiseres utilizar os ficheiros da carteira num dispositivo diferente ou PC, tens
que usar esta Palavra passe de Recuperação de forma a aceder à tua carteira novamente.<br/>
Ao seleccionar \"Alterar palavra passe\" do menu, podes escolher uma palavra passe nova. Cuidado
que isto vai fazer gerar uma nova Palavra passe de Recuperação. Escreve-a nalgum lado!
<h2>Chave de Visualização</h2>
A tua chave de visualização pode ser usada para ver as transacções de depósito sem dar permissão
para gastar os fundos da tua carteira.
<h2>Spend key</h2>
A tua chave de utilização permite a qualquer pessoa de gaster os Monero associados à tua carteira,
por isso não a reveles a ninguém, mantém-a segura assim como a tua Semente Mnemónica.
]]></string>
<string name="help_list"><![CDATA[
<h1>Lista de Carteiras</h1>
<h2>Nó</h2>
<p>O Monerujo utiliza um Nó Remoto para comunicar com a rede Monero sem ter que descarregar e
guardar uma cópia da blockchain inteira. Podes encontrar uma lista de nós remotos populares ou
aprende como correr o teu próprio nó remoto em https://moneroworld.com/<p>
<p>O Monerujo vem com alguns Nós Remotos predefinidos. O histórico dos últimos 5 nós é guardado.</p>
<h2>Carteiras</h2>
<p>Aqui vês as tuas carteiras. Estão localizadas na pasta <tt>monerujo</tt>
na memória interna do teu dispositivo. Podes utilizar um explorador de ficheiros
para vê-las. Deves fazer cópias de segurança desta pasta regularmente para outro
dispositivo para o caso dele explodir ou ser roubado.</p>
<p>Selecciona u carteir para a abrir ou pressiona \"+\" para criar uma nova.
Ou selecciona uma das operações:</p>
<h3>Detalhes</h3>
<p>Mostra os detalhes da carteira, semente &amp; chaves.</p>
<h3>Receber</h3>
<p>Cria um código QR para receber Moneroj.</p>
<h3>Renomear</h3>
<p>Renomeia a carteira. As cópias de segurança não são renomeadas.</p>
<h3>Cópia de segurança</h3>
<p>Faz uma cópia da carteira na pasta <tt>cópias de segurança</tt> dentro do
<tt>monerujo</tt> reescrevendo cópias anteriores que lá estejam.</p>
<h3>Arquivar</h3>
<p>Faz uma cópia de segurança e de seguida apaga a carteira. a cópia permanece na pasta de
<tt>cópias de segurança</tt>. Se já não precisas das tuas cópias de segurança, deves apagá-las
num sistema de gestão de ficheiros ou com uma app que apaga de forma segura.</p>
]]></string>
<string name="help_wallet"><![CDATA[
<h1>A Carteira</h1>
<h2>A Examinar</h2>
Como o Monero gosta de manter as coisas privadas, cada vez que abres uma carteira Monerujo temos
que examinar a blockchain para ver se novos Moneroj foram enviados para a tua carteira. Apenas
informação correspondente à tua carteira é guardada no telefone. Por vezes pode demorar algum tempo
por já não sincronizares há algum tempo.
<h2>O Saldo</h2>
<p><b>Ajudem! O saldo da minha carteira desapareceu ou está não-confirmado!</b><br/>
Não entres em pânico! Quando envias fundos da tua carteira, algum do teu saldo aparece temporariamente
como não confirmado.
Isto acontece como resultado da forma como os Moneroj são trocados na blockchain.
Podes ler mais sobre iston em https://getmonero.org/resources/moneropedia/change.html
<h2>Lista de Transacções</h2>
<p>Uma lista de transacções da carteira. Em carteiras de visualização, apenas são mostradas transacções
de depósito.</p>
]]></string>
<string name="help_tx_details"><![CDATA[
<h1>Detalhes da Transacção</h1>
<h2>Destino</h2>
O endereço público para o qual enviaste Moneroj
<h2>ID do Pagamento</h2>
Utiliza-se o ID do Pagamento para identificar a razão porque foram transaccionados Moneroj.
Isto é opcional e privado. Por exemplo, isto permite que um negócio identifique que item
é que uma determinada transacção está a pagar.
<h2>ID TX</h2>
Este é o ID da tua Transacção que podes utilizar para identificar a tua transacção ofuscada
num explorador da Monero Blockchain como o <a href="https://xmrchain.net/">https://xmrchain.net/</a>
<h2>Chave TX (Chave da Transacção)</h2>
Esta é a chave privada da tua transacção, mantém-a segura já que revelá-la a um terceiro
revela qual a tua assinatura num anel, fazendo com que a tua transacção seja transparente.
<h2>Bloco</h2>
O bloco em que a tua transacção foi incluída.
]]></string>
<string name="help_send"><![CDATA[
<h1>Enviar</h1>
<h2>Endereço do Destinatário</h2>
<p> Este é o endereço público da carteira para a qual vais enviar Moneroj, podes copiar esta
informação da área de transferência, capturara um código QR, ou introduzir manualmente. Confirma
atentamente que não estás a enviar para o endereço errado.</p>
<p>Em adição a enviar XMR, podes enviar BTC através do serviço XMR.TO (ver https://xmr.to
para mais detalhes). Vê a secção de enviar BTC mais abaixo.</p>
<h2>ID do Pagamento</h2>
<p>Utiliza-se o ID do Pagamento para identificar a razão porque foram transaccionados Moneroj.
Isto é opcional e privado. Por exemplo, isto permite que um negócio identifique que item
é que uma determinada transacção está a pagar.</p>
<h2>Tamanho do anel</h2>
<p>Existem várias opções de tamanho do anel que podes escolher. Se és principiate recomendamos
que te mantenhas um tamanho do anel de 7. Aumentar o tamanho acima de 7 aumenta a
quantidade de signatários num anel de assinaturas, teoricamente aumentando a possibilidade
de negação plausível. Contudo aumentar o tamanho do anel faz com que a tua transacção se
destaque na blockchain.</p>
<h2>Prioridade</h2>
<p>Esta opção determina a velocidade com que a tua transacção será incluída na blockchain.
Uma prioridade alta está correlacionada com uma taxa de transacção mais elevada, e o inverso
é verdade para uma prioridade baixa. Nota que ao definiras a transacção como sendo de baixa
prioridade, pode demorar horas até que seja incluída na blockchain. A prioridade vem, por
defeito, a \"Média\".</p>
<h1>Enviar BTC</h1>
<h2>XMR.TO</h2>
<p>XMR.TO é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin.
Nós utilizamos a API do XMR.TO para integrar pagamentos de Bitcoin no Monerujo. Por favor
vai a https://xmr.to e decide por ti próprio se queres utilizar este serviço. A equipa
do Monerujo não está associada com o XMR.TO e não te pode ajudar com este serviço.</p>
<h2>Taxa de câmbio XMR.TO<h2>
<p>No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço XMR.TO. Estes
incluem a taxa de câmbio assim como os limites superiores e inferiores em BTC. Nota que
esta taxa ainda não é garantido. Também vais ver a quantidade máxima de BTC para que
a transação seja executada instantaneamente sem ter que esperar pelas confirmações XMR
(ver o FAQ do XMR.TO para mais detalhes). Nota que o XMR.TO não cobra nenhumas taxas
extra - isto não é brutal?</p>
<h2>Pedido XMR.TO<h2>
<p>No ecrão de \"Confirmação\", vais ver o pedido actual XMR.TO. Este pedido é válido
por um período limitado de tempo - podes reparar que exite uma contagem decrescente no
botão de \"Enviar\". A taxa de câmbio pode ser diferente da taxa indicativa mostrada
nos ecrãs anteriores.</p>
<h2>Chave Secreta XMR.TO<h2>
<p>Como o Monerujo só controla a parte Monero da transacção, a chave secreta XMR.TO
pode ser utilizada para monitorar a parte Bitcoin da transacção na página pricipal do
XMR.TO.</p>
<p>Nota que esta chave secreta só é válida por 24 horas depois de a transacção ter
iniciado!</p>
<h2>Contagem decrescente XMR.TO!</h2>
<p>Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do XMR.TO
indo ao passo anterior e depois voltando ao ecrã de \"Confirmar\".</p>
]]></string>
<string name="help_xmrto"><![CDATA[
<h1>Enviar BTC</h1>
<h2>XMR.TO</h2>
<p>XMR.TO é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin.
Nós utilizamos a API do XMR.TO para integrar pagamentos de Bitcoin no Monerujo. Por favor
vai a https://xmr.to e decide por ti próprio se queres utilizar este serviço. A equipa
do Monerujo não está associada com o XMR.TO e não te pode ajudar com este serviço.</p>
<h2>Taxa de câmbio XMR.TO<h2>
<p>No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço XMR.TO. Estes
incluem a taxa de câmbio assim como os limites superiores e inferiores em BTC. Nota que
este taxa ainda não é garantido. Também vais ver a quantidade máxima de BTC para que
a transação seja executada instantaneamente sem ter que esperar pelas confirmações XMR
(ver o FAQ do XMR.TO para mais detalhes). Nota que o XMR.TO não cobra nenhumas taxas
extra - isto não é brutal?</p>
<h2>Pedido XMR.TO<h2>
<p>No ecrão de \"Confirmação\", vais ver o pedido actual XMR.TO. Este pedido é válido
por um período limitado de tempo - podes reparar que exite uma contagem decrescente no
botão de \"Enviar\". A taxa de câmbio pode ser diferente da taxa indicativa mostrada
nos ecrãs anteriores.</p>
<h2>Chave Secreta XMR.TO<h2>
<p>Como o Monerujo só controla a parte Monero da transacção, a chave secreta XMR.TO
pode ser utilizada para monitorar a parte Bitcoin da transacção na página pricipal do
XMR.TO.</p>
<p>Nota que esta chave secreta só é válida por 24 horas depois de a transacção ter
iniciado!</p>
<h2>Contagem decrescente XMR.TO!</h2>
<p>Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do XMR.TO
indo ao passo anterior e depois voltando ao ecrã de \"Confirmar\".</p>
]]></string>
</resources>

File diff suppressed because it is too large Load Diff

View File

@@ -307,11 +307,12 @@
<string name="fab_restore_key">从私钥恢复钱包</string>
<string name="fab_restore_seed">从25字种子码恢复钱包</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
</resources>

View File

@@ -308,11 +308,12 @@
<string name="fab_restore_key">從私鑰回復錢包</string>
<string name="fab_restore_seed">從25字種子碼回復錢包</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
</resources>

View File

@@ -258,16 +258,12 @@
<string name="send_create_tx_error_title">Create Transaction Error</string>
<string name="accounts_balance">%1$s XMR</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_list_fee">- Fee %1$s</string>
<string name="tx_list_amount_failed">(%1$s)</string>
<string name="tx_list_failed_text">failed</string>
<string name="tx_list_amount_negative">- %1$s</string>
<string name="tx_list_amount_positive">+ %1$s</string>
<string name="tx_account">Account #</string>
<string name="tx_timestamp">Timestamp</string>
<string name="tx_id">TX ID</string>
<string name="tx_key">TX Key</string>
@@ -309,13 +305,6 @@
<string name="archive_alert_yes">Yes, do that!</string>
<string name="archive_alert_no">No thanks!</string>
<string-array name="mixin" translatable="false">
<item>Ringsize 7</item>
<item>Ringsize 10</item>
<item>Ringsize 13</item>
<item>Ringsize 26</item>
</string-array>
<string-array name="priority">
<item>Priority Default</item>
<item>Priority Low</item>
@@ -365,9 +354,15 @@
<string name="fab_restore_key">Restore wallet from private keys</string>
<string name="fab_restore_seed">Restore wallet 25 word seed</string>
<string name="accounts_drawer_open">Open Accounts Drawer</string>
<string name="accounts_drawer_close">Close Accounts Drawer</string>
<string name="accounts_balance" translatable="false">%1$s XMR</string>
<string name="tx_account_formatted" translatable="false">(%1$d, %2$d)</string>
<string name="accounts_drawer_new">Create Account</string>
<string name="accounts_drawer_title">Accounts</string>
<string name="accounts_new">Added new account #%1$d</string>
<string name="tx_account">Account #</string>
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
</resources>

View File

@@ -6,14 +6,15 @@
## What features does it have?
- Seamless XMR.TO integration - instantly pay BTC with XMR using third-party XMR.TO service
- Speaks spanish
- Uses Monero v0.12
- Speaks spanish and whole lot more
- Uses Monero v0.12.2
- Support for Android >= 5.0
- Testnet and Mainnet
- Generate new wallets
- Recover wallets from mnemonic seed or from keys
- Create *Watch Only* wallets from address + viewkey
- Multiple wallets
- Support for accounts
- View wallet details (address, keys, etc.)
- View transactions including details and copy to clipboard
- Spend Moneroj (handle with care on mainnet!)
@@ -29,6 +30,9 @@
- Archive (=Backup and delete)
- 3 Default nodes + History of last 5 used nodes
## How do I use a node with username & password?
```username:password@node.address:portnumber```
## The app always crashes as soon as I open a wallet!
Users of Zenfone MAX & Zenfone 2 Laser (possibly others) **MUST** use the armeabi-v7a APK as the arm64-v8a build uses hardware AES
functionality these models don't have. If this does not help, please report the problem.