mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-03 08:23:04 +02:00
Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
af68c5e51f | ||
![]() |
5a2b48a087 | ||
![]() |
0776b7b6a3 | ||
![]() |
c2eed85a83 | ||
![]() |
d7c2b4a727 | ||
![]() |
085e41f5da | ||
![]() |
6c6b3061a8 | ||
![]() |
5fc15779b7 | ||
![]() |
520d151f3c | ||
![]() |
7aad941dab | ||
![]() |
01e7693425 |
@@ -7,8 +7,8 @@ android {
|
||||
applicationId "com.m2049r.xmrwallet"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 25
|
||||
versionCode 97
|
||||
versionName "1.5.7 'Maximum Nacho'"
|
||||
versionCode 100
|
||||
versionName "1.5.10 'Maximum Nacho'"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
|
@@ -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
|
||||
@@ -850,10 +852,10 @@ Java_com_m2049r_xmrwallet_model_Wallet_createTransactionJ(JNIEnv *env, jobject i
|
||||
|
||||
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) {
|
||||
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);
|
||||
@@ -988,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);
|
||||
|
||||
@@ -1027,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;
|
||||
|
||||
@@ -1079,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(),
|
||||
@@ -1094,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);
|
||||
@@ -1104,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");
|
||||
@@ -1161,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);
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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),
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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();
|
||||
|
@@ -19,6 +19,9 @@ 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;
|
||||
|
||||
@@ -86,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();
|
||||
|
||||
@@ -109,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);
|
||||
@@ -323,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) {
|
||||
@@ -342,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();
|
||||
}
|
||||
|
9
app/src/main/res/drawable/ic_settings_gray_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_settings_gray_24dp.xml
Normal file
File diff suppressed because one or more lines are too long
@@ -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"
|
||||
|
@@ -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…]</string>
|
||||
<string name="prompt_open_wallet">Wallet wird geöffnet …</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>
|
||||
@@ -310,12 +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="send_sweepall">Send all confirmed funds in this 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>
|
||||
|
@@ -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…]</string>
|
||||
<string name="prompt_open_wallet">Abriendo el monedero…</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,12 +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>
|
||||
|
@@ -313,12 +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">Ouvrir le Tiroir des Comptes</string>
|
||||
<string name="accounts_drawer_close">Fermer le Tiroir des Comptes</string>
|
||||
<string name="accounts_drawer_new">Créer un Compte</string>
|
||||
<string name="accounts_drawer_title">Comptes</string>
|
||||
<string name="accounts_balance">%1$s XMR</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>
|
||||
|
@@ -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…]</string>
|
||||
<string name="prompt_open_wallet">Aprendo il portafoglio…</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,12 +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">Send all confirmed funds in this 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>
|
||||
|
@@ -309,12 +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>
|
||||
|
62
app/src/main/res/values-pt/about.xml
Normal file
62
app/src/main/res/values-pt/about.xml
Normal 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>
|
239
app/src/main/res/values-pt/help.xml
Normal file
239
app/src/main/res/values-pt/help.xml
Normal 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 & 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>
|
324
app/src/main/res/values-pt/strings.xml
Normal file
324
app/src/main/res/values-pt/strings.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -307,12 +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>
|
||||
|
@@ -308,12 +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>
|
||||
|
@@ -258,18 +258,12 @@
|
||||
|
||||
<string name="send_create_tx_error_title">Create Transaction Error</string>
|
||||
|
||||
<string name="send_sweepall">Send all confirmed funds in this account!</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>
|
||||
@@ -360,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>
|
||||
|
Reference in New Issue
Block a user