1
mirror of https://github.com/m2049r/xmrwallet synced 2025-09-03 08:23:04 +02:00

Compare commits

...

11 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
22 changed files with 966 additions and 116 deletions

View File

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

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

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

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

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

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

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

View File

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

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

View File

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

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

View File

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

View File

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