mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-10 22:10:49 +02:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c6d4de8599 | ||
![]() |
2ef7f8571c | ||
![]() |
d2612a26e5 | ||
![]() |
7e14572756 | ||
![]() |
6f840dcacf | ||
![]() |
36b389cd0f | ||
![]() |
ed2b95ea37 | ||
![]() |
8d41d1d03e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,7 +6,10 @@
|
|||||||
/captures
|
/captures
|
||||||
.externalNativeBuild
|
.externalNativeBuild
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
/app/build
|
||||||
/app/release
|
/app/release
|
||||||
|
/app/alpha
|
||||||
|
/app/prod
|
||||||
/app/alphaMainnet
|
/app/alphaMainnet
|
||||||
/app/prodMainnet
|
/app/prodMainnet
|
||||||
/app/alphaStagenet
|
/app/alphaStagenet
|
||||||
|
5
app/.gitignore
vendored
5
app/.gitignore
vendored
@@ -1,5 +0,0 @@
|
|||||||
.externalNativeBuild
|
|
||||||
build
|
|
||||||
app.iml
|
|
||||||
prod
|
|
||||||
alpha
|
|
@@ -7,8 +7,8 @@ android {
|
|||||||
applicationId "com.m2049r.xmrwallet"
|
applicationId "com.m2049r.xmrwallet"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
versionCode 155
|
versionCode 159
|
||||||
versionName "1.10.5 'Node-O-matiC'"
|
versionName "1.10.9 'Node-O-matiC'"
|
||||||
|
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
@@ -27,6 +27,7 @@ android {
|
|||||||
stagenet {
|
stagenet {
|
||||||
dimension 'net'
|
dimension 'net'
|
||||||
applicationIdSuffix '.stage'
|
applicationIdSuffix '.stage'
|
||||||
|
versionNameSuffix ' (stage)'
|
||||||
}
|
}
|
||||||
alpha {
|
alpha {
|
||||||
dimension 'type'
|
dimension 'type'
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<string name="app_name" translatable="false">monerujo - Debug</string>
|
|
||||||
</resources>
|
|
@@ -7,8 +7,10 @@
|
|||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||||
<uses-permission android:name="android.permission.NFC" />
|
<uses-permission android:name="android.permission.NFC" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".XmrWalletApplication"
|
android:name=".XmrWalletApplication"
|
||||||
|
@@ -417,8 +417,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_verifyWalletPassword(JNIEnv *env,
|
|||||||
//virtual int queryWalletHardware(const std::string &keys_file_name, const std::string &password) const = 0;
|
//virtual int queryWalletHardware(const std::string &keys_file_name, const std::string &password) const = 0;
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
Java_com_m2049r_xmrwallet_model_WalletManager_queryWalletDeviceJ(JNIEnv *env, jobject instance,
|
Java_com_m2049r_xmrwallet_model_WalletManager_queryWalletDeviceJ(JNIEnv *env, jobject instance,
|
||||||
jstring keys_file_name,
|
jstring keys_file_name,
|
||||||
jstring password) {
|
jstring password) {
|
||||||
const char *_keys_file_name = env->GetStringUTFChars(keys_file_name, NULL);
|
const char *_keys_file_name = env->GetStringUTFChars(keys_file_name, NULL);
|
||||||
const char *_password = env->GetStringUTFChars(password, NULL);
|
const char *_password = env->GetStringUTFChars(password, NULL);
|
||||||
Bitmonero::Wallet::Device device_type;
|
Bitmonero::Wallet::Device device_type;
|
||||||
@@ -1185,10 +1185,11 @@ jobject newTransferList(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
|||||||
|
|
||||||
jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
||||||
jmethodID c = env->GetMethodID(class_TransactionInfo, "<init>",
|
jmethodID c = env->GetMethodID(class_TransactionInfo, "<init>",
|
||||||
"(IZZJJJLjava/lang/String;JLjava/lang/String;IIJLjava/util/List;)V");
|
"(IZZJJJLjava/lang/String;JLjava/lang/String;IIJLjava/lang/String;Ljava/util/List;)V");
|
||||||
jobject transfers = newTransferList(env, info);
|
jobject transfers = newTransferList(env, info);
|
||||||
jstring _hash = env->NewStringUTF(info->hash().c_str());
|
jstring _hash = env->NewStringUTF(info->hash().c_str());
|
||||||
jstring _paymentId = env->NewStringUTF(info->paymentId().c_str());
|
jstring _paymentId = env->NewStringUTF(info->paymentId().c_str());
|
||||||
|
jstring _label = env->NewStringUTF(info->label().c_str());
|
||||||
uint32_t subaddrIndex = 0;
|
uint32_t subaddrIndex = 0;
|
||||||
if (info->direction() == Bitmonero::TransactionInfo::Direction_In)
|
if (info->direction() == Bitmonero::TransactionInfo::Direction_In)
|
||||||
subaddrIndex = *(info->subaddrIndex().begin());
|
subaddrIndex = *(info->subaddrIndex().begin());
|
||||||
@@ -1205,6 +1206,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
|||||||
info->subaddrAccount(),
|
info->subaddrAccount(),
|
||||||
subaddrIndex,
|
subaddrIndex,
|
||||||
info->confirmations(),
|
info->confirmations(),
|
||||||
|
_label,
|
||||||
transfers);
|
transfers);
|
||||||
env->DeleteLocalRef(transfers);
|
env->DeleteLocalRef(transfers);
|
||||||
env->DeleteLocalRef(_hash);
|
env->DeleteLocalRef(_hash);
|
||||||
@@ -1397,7 +1399,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jclass cl
|
|||||||
*
|
*
|
||||||
* @return length of received data in response or -1 if error
|
* @return length of received data in response or -1 if error
|
||||||
*/
|
*/
|
||||||
int LedgerExchange(
|
int LedgerExchange(
|
||||||
unsigned char *command,
|
unsigned char *command,
|
||||||
unsigned int cmd_len,
|
unsigned int cmd_len,
|
||||||
unsigned char *response,
|
unsigned char *response,
|
||||||
|
@@ -60,6 +60,7 @@ public class TxFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TextView tvAccount;
|
private TextView tvAccount;
|
||||||
|
private TextView tvAddress;
|
||||||
private TextView tvTxTimestamp;
|
private TextView tvTxTimestamp;
|
||||||
private TextView tvTxId;
|
private TextView tvTxId;
|
||||||
private TextView tvTxKey;
|
private TextView tvTxKey;
|
||||||
@@ -90,6 +91,7 @@ public class TxFragment extends Fragment {
|
|||||||
tvTxAmountBtc = view.findViewById(R.id.tvTxAmountBtc);
|
tvTxAmountBtc = view.findViewById(R.id.tvTxAmountBtc);
|
||||||
|
|
||||||
tvAccount = view.findViewById(R.id.tvAccount);
|
tvAccount = view.findViewById(R.id.tvAccount);
|
||||||
|
tvAddress = view.findViewById(R.id.tvAddress);
|
||||||
tvTxTimestamp = view.findViewById(R.id.tvTxTimestamp);
|
tvTxTimestamp = view.findViewById(R.id.tvTxTimestamp);
|
||||||
tvTxId = view.findViewById(R.id.tvTxId);
|
tvTxId = view.findViewById(R.id.tvTxId);
|
||||||
tvTxKey = view.findViewById(R.id.tvTxKey);
|
tvTxKey = view.findViewById(R.id.tvTxKey);
|
||||||
@@ -219,12 +221,16 @@ public class TxFragment extends Fragment {
|
|||||||
if (info.txKey == null) {
|
if (info.txKey == null) {
|
||||||
info.txKey = activityCallback.getTxKey(info.hash);
|
info.txKey = activityCallback.getTxKey(info.hash);
|
||||||
}
|
}
|
||||||
|
if (info.address == null) {
|
||||||
|
info.address = activityCallback.getTxAddress(info.account, info.subaddress);
|
||||||
|
}
|
||||||
loadNotes(info);
|
loadNotes(info);
|
||||||
|
|
||||||
activityCallback.setSubtitle(getString(R.string.tx_title));
|
activityCallback.setSubtitle(getString(R.string.tx_title));
|
||||||
activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
|
activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
|
||||||
|
|
||||||
tvAccount.setText(getString(R.string.tx_account_formatted, info.account, info.subaddress));
|
tvAccount.setText(getString(R.string.tx_account_formatted, info.account, info.subaddress));
|
||||||
|
tvAddress.setText(info.address);
|
||||||
|
|
||||||
tvTxTimestamp.setText(TS_FORMATTER.format(new Date(info.timestamp * 1000)));
|
tvTxTimestamp.setText(TS_FORMATTER.format(new Date(info.timestamp * 1000)));
|
||||||
tvTxId.setText(info.hash);
|
tvTxId.setText(info.hash);
|
||||||
@@ -331,6 +337,8 @@ public class TxFragment extends Fragment {
|
|||||||
|
|
||||||
String getTxNotes(String hash);
|
String getTxNotes(String hash);
|
||||||
|
|
||||||
|
String getTxAddress(int major, int minor);
|
||||||
|
|
||||||
void onSetNote(String txId, String notes);
|
void onSetNote(String txId, String notes);
|
||||||
|
|
||||||
void setToolbarButton(int type);
|
void setToolbarButton(int type);
|
||||||
|
@@ -168,6 +168,11 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
|||||||
return getWallet().getUserNote(txId);
|
return getWallet().getUserNote(txId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTxAddress(int major, int minor) {
|
||||||
|
return getWallet().getSubaddress(major, minor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart() {
|
protected void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
|
@@ -18,10 +18,8 @@ package com.m2049r.xmrwallet.model;
|
|||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
// this is not the TransactionInfo from the API as that is owned by the TransactionHistory
|
// this is not the TransactionInfo from the API as that is owned by the TransactionHistory
|
||||||
// this is a POJO for the TransactionInfoAdapter
|
// this is a POJO for the TransactionInfoAdapter
|
||||||
@@ -53,11 +51,6 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtual std::set<uint32_t> subaddrIndex() const = 0;
|
|
||||||
// virtual uint32_t subaddrAccount() const = 0;
|
|
||||||
// virtual std::string label() const = 0;
|
|
||||||
// virtual uint64_t confirmations() const = 0;
|
|
||||||
|
|
||||||
public Direction direction;
|
public Direction direction;
|
||||||
public boolean isPending;
|
public boolean isPending;
|
||||||
public boolean isFailed;
|
public boolean isFailed;
|
||||||
@@ -70,10 +63,12 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
|||||||
public int account;
|
public int account;
|
||||||
public int subaddress;
|
public int subaddress;
|
||||||
public long confirmations;
|
public long confirmations;
|
||||||
|
public String subaddressLabel;
|
||||||
public List<Transfer> transfers;
|
public List<Transfer> transfers;
|
||||||
|
|
||||||
public String txKey = null;
|
public String txKey = null;
|
||||||
public String notes = null;
|
public String notes = null;
|
||||||
|
public String address = null;
|
||||||
|
|
||||||
public TransactionInfo(
|
public TransactionInfo(
|
||||||
int direction,
|
int direction,
|
||||||
@@ -88,6 +83,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
|||||||
int account,
|
int account,
|
||||||
int subaddress,
|
int subaddress,
|
||||||
long confirmations,
|
long confirmations,
|
||||||
|
String subaddressLabel,
|
||||||
List<Transfer> transfers) {
|
List<Transfer> transfers) {
|
||||||
this.direction = Direction.values()[direction];
|
this.direction = Direction.values()[direction];
|
||||||
this.isPending = isPending;
|
this.isPending = isPending;
|
||||||
@@ -101,6 +97,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
|||||||
this.account = account;
|
this.account = account;
|
||||||
this.subaddress = subaddress;
|
this.subaddress = subaddress;
|
||||||
this.confirmations = confirmations;
|
this.confirmations = confirmations;
|
||||||
|
this.subaddressLabel = subaddressLabel;
|
||||||
this.transfers = transfers;
|
this.transfers = transfers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,9 +119,11 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
|||||||
out.writeInt(account);
|
out.writeInt(account);
|
||||||
out.writeInt(subaddress);
|
out.writeInt(subaddress);
|
||||||
out.writeLong(confirmations);
|
out.writeLong(confirmations);
|
||||||
|
out.writeString(subaddressLabel);
|
||||||
out.writeList(transfers);
|
out.writeList(transfers);
|
||||||
out.writeString(txKey);
|
out.writeString(txKey);
|
||||||
out.writeString(notes);
|
out.writeString(notes);
|
||||||
|
out.writeString(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Parcelable.Creator<TransactionInfo> CREATOR = new Parcelable.Creator<TransactionInfo>() {
|
public static final Parcelable.Creator<TransactionInfo> CREATOR = new Parcelable.Creator<TransactionInfo>() {
|
||||||
@@ -150,9 +149,11 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
|||||||
account = in.readInt();
|
account = in.readInt();
|
||||||
subaddress = in.readInt();
|
subaddress = in.readInt();
|
||||||
confirmations = in.readLong();
|
confirmations = in.readLong();
|
||||||
|
subaddressLabel = in.readString();
|
||||||
transfers = in.readArrayList(Transfer.class.getClassLoader());
|
transfers = in.readArrayList(Transfer.class.getClassLoader());
|
||||||
txKey = in.readString();
|
txKey = in.readString();
|
||||||
notes = in.readString();
|
notes = in.readString();
|
||||||
|
address = in.readString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -81,6 +81,8 @@ public class Helper {
|
|||||||
(BuildConfig.FLAVOR.startsWith("prod") ? "" : "." + BuildConfig.FLAVOR)
|
(BuildConfig.FLAVOR.startsWith("prod") ? "" : "." + BuildConfig.FLAVOR)
|
||||||
+ (BuildConfig.DEBUG ? "-debug" : "");
|
+ (BuildConfig.DEBUG ? "-debug" : "");
|
||||||
|
|
||||||
|
static public final String NOCRAZYPASS_FLAGFILE = ".nocrazypass";
|
||||||
|
|
||||||
static public final String CRYPTO = "XMR";
|
static public final String CRYPTO = "XMR";
|
||||||
|
|
||||||
static private final String WALLET_DIR = "monerujo" + FLAVOR_SUFFIX;
|
static private final String WALLET_DIR = "monerujo" + FLAVOR_SUFFIX;
|
||||||
@@ -347,6 +349,11 @@ public class Helper {
|
|||||||
WalletManager.setLogLevel(level);
|
WalletManager.setLogLevel(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public boolean useCrazyPass(Context context) {
|
||||||
|
File flagFile = new File(getWalletRoot(context), NOCRAZYPASS_FLAGFILE);
|
||||||
|
return !flagFile.exists();
|
||||||
|
}
|
||||||
|
|
||||||
// try to figure out what the real wallet password is given the user password
|
// try to figure out what the real wallet password is given the user password
|
||||||
// which could be the actual wallet password or a (maybe malformed) CrAzYpass
|
// which could be the actual wallet password or a (maybe malformed) CrAzYpass
|
||||||
// or the password used to derive the CrAzYpass for the wallet
|
// or the password used to derive the CrAzYpass for the wallet
|
||||||
|
@@ -84,7 +84,10 @@ public class KeyStoreHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getCrazyPass(Context context, String password) {
|
public static String getCrazyPass(Context context, String password) {
|
||||||
return getCrazyPass(context, password, 0);
|
if (Helper.useCrazyPass(context))
|
||||||
|
return getCrazyPass(context, password, 0);
|
||||||
|
else
|
||||||
|
return password;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getBrokenCrazyPass(Context context, String password, int brokenVariant) {
|
public static String getBrokenCrazyPass(Context context, String password, int brokenVariant) {
|
||||||
|
@@ -79,8 +79,8 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:drawablePadding="8dp"
|
|
||||||
android:drawableStart="@drawable/ic_xmrto_32dp"
|
android:drawableStart="@drawable/ic_xmrto_32dp"
|
||||||
|
android:drawablePadding="8dp"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:text="@string/label_send_btc_xmrto_info" />
|
android:text="@string/label_send_btc_xmrto_info" />
|
||||||
|
|
||||||
@@ -115,6 +115,7 @@
|
|||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_destination_btc" />
|
android:text="@string/tx_destination_btc" />
|
||||||
@@ -152,10 +153,10 @@
|
|||||||
android:background="@color/dotGray"
|
android:background="@color/dotGray"
|
||||||
android:drawableEnd="@drawable/ic_content_copy_white_24dp"
|
android:drawableEnd="@drawable/ic_content_copy_white_24dp"
|
||||||
android:drawablePadding="16dp"
|
android:drawablePadding="16dp"
|
||||||
android:paddingBottom="8dp"
|
|
||||||
android:paddingEnd="8dp"
|
|
||||||
android:paddingStart="24dp"
|
android:paddingStart="24dp"
|
||||||
android:paddingTop="8dp"
|
android:paddingTop="8dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
tools:text="XMR.TO-d2KQ" />
|
tools:text="XMR.TO-d2KQ" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@@ -175,25 +176,51 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_account" />
|
android:text="@string/tx_account" />
|
||||||
|
|
||||||
<TextView
|
<RelativeLayout
|
||||||
android:id="@+id/tvAccount"
|
android:layout_width="wrap_content"
|
||||||
style="@style/MoneroText"
|
android:layout_height="wrap_content">
|
||||||
android:gravity="start"
|
|
||||||
android:padding="8dp"
|
<TextView
|
||||||
android:selectAllOnFocus="true"
|
android:id="@+id/tvAccount"
|
||||||
android:textIsSelectable="true" />
|
style="@style/MoneroText"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:gravity="start"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
|
android:selectAllOnFocus="true"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
tools:text="(0,1)" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvAddress"
|
||||||
|
style="@style/MoneroText"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/tvAccount"
|
||||||
|
android:gravity="start"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:selectAllOnFocus="true"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
tools:text="4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJXW9sghopxXgQSh1RTd54JdvvCRsXiF41xvfeW5" />
|
||||||
|
</RelativeLayout>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
|
|
||||||
<TableRow>
|
<TableRow>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8sp"
|
android:padding="8sp"
|
||||||
android:text="@string/tx_notes" />
|
android:text="@string/tx_notes" />
|
||||||
@@ -221,8 +248,8 @@
|
|||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_centerInParent="true"
|
android:layout_centerInParent="true"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:paddingEnd="8dp"
|
|
||||||
android:paddingStart="8dp"
|
android:paddingStart="8dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
android:text="@string/tx_button_notes" />
|
android:text="@string/tx_button_notes" />
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
@@ -232,7 +259,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_destination" />
|
android:text="@string/tx_destination" />
|
||||||
@@ -250,7 +277,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_paymentId" />
|
android:text="@string/tx_paymentId" />
|
||||||
@@ -268,7 +295,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_id" />
|
android:text="@string/tx_id" />
|
||||||
@@ -286,7 +313,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_key" />
|
android:text="@string/tx_key" />
|
||||||
@@ -304,7 +331,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_blockheight" />
|
android:text="@string/tx_blockheight" />
|
||||||
@@ -322,7 +349,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/MoneroLabel.Small"
|
style="@style/MoneroLabel.Small"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="top"
|
||||||
android:gravity="end"
|
android:gravity="end"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:text="@string/tx_transfers" />
|
android:text="@string/tx_transfers" />
|
||||||
|
@@ -240,51 +240,49 @@
|
|||||||
]]></string>
|
]]></string>
|
||||||
|
|
||||||
<string name="help_node"><![CDATA[
|
<string name="help_node"><![CDATA[
|
||||||
<h1>Nodes</h1>
|
<h1>Nodi</h1>
|
||||||
<h2>TL;DR</h2>
|
<h2>In breve</h2>
|
||||||
<p>Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
|
<p>Aggiorna la lista dei nodi tirando giù & contrassegna 3–5 i nodi per consentire a Monerujo
|
||||||
to choose the best one for you!</p>
|
di scegliere il migliore per te!</p>
|
||||||
<h2>What's a Node?</h2>
|
<h2>Cos'è un nodo?</h2>
|
||||||
<p>Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
|
<p>Monerujo usa un nodo remoto (talvolta chiamato Daemon) per comunicare con la
|
||||||
the Monero Network without having to download and store a copy of the
|
rete Monero senza dover scaricare e tenere in memoria una copia
|
||||||
whole blockchain itself.<p>
|
dell'intera blockchain</p>
|
||||||
<h2>Node List</h2>
|
<h2>Lista dei nodi</h2>
|
||||||
<p>If the list is empty, you can either add new nodes manually or let Monerujo
|
<p>Se la lista è vuota, puoi aggiungere nuovi nodi manualmente o lasciare che Monerujo
|
||||||
scan the network for you. Or both. Read on…</p>
|
effettui la scansione della rete per te. O entrambe le cose. Leggi su…</p>
|
||||||
<p>The node list shows all currently known nodes. Additionally, the timestamp
|
<p>La lista dei nodi mostra tutti i nodi conosciuti. Inoltre, sotto il nome del nodo viene visualizzato il timestamp
|
||||||
of the latest block known to each node is shown under the node name. An icon
|
dell'ultimo blocco conosciuto ad ogni nodo. Accanto ad ogni nodo viene visualizzata un'icona che
|
||||||
representing the node's response behaviour
|
rappresenta il comportamento in risposta di quel nodo
|
||||||
(which indicates the level of connectivity to be expected)
|
(che in sostanza indica il livello di connettività atteso).</p>
|
||||||
is shown next to each node.</p>
|
<p>Ogni nodo della lista può essere aggiunto come segnalibro per un utilizzo successivo.
|
||||||
<p>Any node in the list can be bookmarked for later use.
|
Nodi che non vengono aggiunti come segnalibro saranno dimenticati successivamente.<p>
|
||||||
Nodes which are not bookmarked will be forgotten.<p>
|
<p>Monerujo sceglie il miglior nodo registrato ogni volta che lo usi.
|
||||||
<p>Monerujo will choose the optimal bookmarked node each time you use it.
|
Il nodo migliore viene selezionato controllando l'altezza di blocco (quanto è aggiornato
|
||||||
It does this by checking the blockheight (how up-to-date
|
il nodo?) nonché il suo comportamento in risposta (quanto velocemente il nodo risponde alle richieste?).</p>
|
||||||
is the node?) as well as the response behaviour (how fast does the node respond to requests?).</p>
|
<p>La lista è ordinata per queste caratteristiche, in modo tale che il nodo in cima alla lista è quello che Monerujo
|
||||||
<p>The list is sorted by these characteristics, so the top node would be the one Monerujo
|
selezionerebbe adesso. In fondo alla lista compaiono i nodi ritenuti molto lenti o non disponibili.</p>
|
||||||
would choose right now. The bottom of the list would show very slow or unavailable nodes.</p>
|
<h2>Aggiungere un nodo</h2>
|
||||||
<h2>Add a Node</h2>
|
<p>Toccando il pulsante "Aggiungi nodo" in fondo, ti verrà chiesto di
|
||||||
<p>By touching the "Add Node" button at the bottom, you will be asked to
|
inserire i dettagli del nodo nella schermata successiva.
|
||||||
enter the node details in the following dialog.
|
L'"Indirizzo" è il nome host o l'indirizzo IP del nodo - questa è l'unica informazione necessaria.
|
||||||
The "Address" is the hostname or IP-address of the node - this is the only
|
Inserisci la "Porta" se il nodo utilizza una porta diversa da quella di default (es. 18089).
|
||||||
mandatory entry.
|
Puoi inoltre assegnare un nome al nodo, in modo tale da poterlo facilmente identificare in futuro.
|
||||||
Enter the "Port" if the node runs on a non-default port (e.g. 18089).
|
Alcuni nodi richiedono delle credenziali per poter essere usati. Inserisci negli appositi campi il nome utente &
|
||||||
You can also optionally name the node, so you can identify it easier later on.
|
password forniti. Ora puoi "Effettuare un Test" con queste impostazioni.
|
||||||
Some nodes require credentials to use them. Enter the provided username &
|
I "Risultati del Test" visualizzeranno l'altezza di blocco, il tempo di risposta e l'IP correntemente utilizzato.
|
||||||
password in the appropriate fields. Now you can "Test" these setting.
|
Il risultato potrebbe essere anche un errore - molte volte perché il nome host fornito non è
|
||||||
The "Test Results" will display the blockheight, response time and actual IP used.
|
raggiungibile per un ragionevole lasso di tempo o le credenziali non sono corrette.
|
||||||
The result may also be an error - usually because the hostname provided is
|
O se la combinazione nome host/porta non punta a un vero nodo Monero!
|
||||||
not reachable in a sensible amount of time or the credentials are incorrect.
|
Una volta che il test ha dato esito positivo (nessun errore) - hai la possibilità di premere "OK" per salvare&
|
||||||
Or the hostname/port combination does not point to an actual Monero Node!
|
aggiungere questo nodo ai segnalibri.</p>
|
||||||
Once the test passes (no error) - you're set to press "OK" to save &
|
<h2>Esegui scansione alla ricerca di nodi</h2>
|
||||||
bookmark this node.</p>
|
<p>Puoi anche eseguire una scansione su rete alla ricerca di nodi. Monerujo inizierà
|
||||||
<h2>Scan for Nodes</h2>
|
la scansione della rete alla ricerca di nodi sulla porta 18089, chiedendo dapprima ai tuoi
|
||||||
<p>Additionally, you can scan the network for nodes. Monerujo will start
|
nodi salvati i loro peer all'interno della rete P2P di Monero per poi proseguire
|
||||||
scanning the network for Remote Nodes on port 18089. It begins by asking your
|
chiedendo peer a questi ultimi e così via. Se non hai nodi salvati
|
||||||
bookmarked nodes for other peers in the Monero P2P network and then continues
|
(o se essi non ci comunicano i loro peer),
|
||||||
by asking those for their peers, and so on. If you have no bookmarked nodes
|
Monerujo proseguirà con i nodi seed codificati in Monero. La scansione
|
||||||
(or they don't tell us about their peers),
|
termina quando vengono trovati 10 nodi in totale.</p>
|
||||||
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
|
|
||||||
scan stops when it finds 10 remote nodes in total.</p>
|
|
||||||
]]></string>
|
]]></string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -340,30 +340,30 @@
|
|||||||
<string name="menu_info">Mostra i segreti!</string>
|
<string name="menu_info">Mostra i segreti!</string>
|
||||||
<string name="menu_streetmode">Modalità strada</string>
|
<string name="menu_streetmode">Modalità strada</string>
|
||||||
|
|
||||||
<string name="info_nodes_enabled">Node-o-matiC enabled, tap for more info.</string>
|
<string name="info_nodes_enabled">Node-o-matiC abilitato, tocca per maggiori informazioni.</string>
|
||||||
<string name="node_height">Last block updated: %1$s</string>
|
<string name="node_height">Ultimo blocco aggiornato: %1$s</string>
|
||||||
<string name="label_nodes">Nodes</string>
|
<string name="label_nodes">Nodi</string>
|
||||||
<string name="node_name_hint">Node Name (Optional)</string>
|
<string name="node_name_hint">Nome nodo (opzionale)</string>
|
||||||
<string name="node_address_hint">Hostname</string>
|
<string name="node_address_hint">Nome host</string>
|
||||||
<string name="node_port_hint">Port</string>
|
<string name="node_port_hint">Porta</string>
|
||||||
<string name="node_user_hint">Username (Optional)</string>
|
<string name="node_user_hint">Nome utente (opzionale)</string>
|
||||||
<string name="node_pass_hint">Password (Optional)</string>
|
<string name="node_pass_hint">Password (opzionale)</string>
|
||||||
<string name="node_host_unresolved">Cannot resolve host</string>
|
<string name="node_host_unresolved">Host non risolvibile</string>
|
||||||
<string name="node_host_empty">We need this!</string>
|
<string name="node_host_empty">Abbiamo bisogno di questo!</string>
|
||||||
<string name="node_port_numeric">Must be numeric</string>
|
<string name="node_port_numeric">Deve essere numerico</string>
|
||||||
<string name="node_port_range">Must be 1–65535</string>
|
<string name="node_port_range">Deve essere 1–65535</string>
|
||||||
<string name="node_fab_add">Add Node</string>
|
<string name="node_fab_add">Aggiungi nodo</string>
|
||||||
<string name="node_refresh_hint">Touch to refresh!</string>
|
<string name="node_refresh_hint">Tocca per aggiornare!</string>
|
||||||
<string name="node_test_error">CONNECTION ERROR %1$d</string>
|
<string name="node_test_error">ERRORE CONNESSIONE %1$d</string>
|
||||||
<string name="node_general_error">CONNECTION ERROR</string>
|
<string name="node_general_error">ERRORE CONNESSIONE</string>
|
||||||
<string name="node_auth_error">AUTHENTICATION FAILED</string>
|
<string name="node_auth_error">AUTENTICAZIONE FALLITA</string>
|
||||||
<string name="node_result_label">Test Result:</string>
|
<string name="node_result_label">Risultato del test:</string>
|
||||||
<string name="node_result">Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
<string name="node_result">Altezza: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||||
<string name="node_testing">Testing IP: %1$s …</string>
|
<string name="node_testing">Controllo IP: %1$s …</string>
|
||||||
<string name="node_refresh_wait">Please wait for scan to finish</string>
|
<string name="node_refresh_wait">Attendi il termine della scansione</string>
|
||||||
<string name="node_create_hint">Touch to select or add nodes</string>
|
<string name="node_create_hint">Tocca per selezionare o aggiungere nodi</string>
|
||||||
<string name="node_pull_hint">Add nodes manually or pull down to scan</string>
|
<string name="node_pull_hint">Aggiungi nodi manualmente o tira giù per effettuare scansione</string>
|
||||||
<string name="node_scanning">Scanning network…</string>
|
<string name="node_scanning">Scansione rete…</string>
|
||||||
<string name="node_nobookmark">Automatically bookmarked best %1$d nodes</string>
|
<string name="node_nobookmark">Aggiunti automaticamente ai segnalibri i %1$d nodi migliori</string>
|
||||||
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
|
<string name="label_test">Effettua Test</string><!--note: as in "Test a network connection"-->
|
||||||
</resources>
|
</resources>
|
||||||
|
4
app/src/stagenet/res/values/strings.xml
Normal file
4
app/src/stagenet/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name" translatable="false">Stagenet</string>
|
||||||
|
</resources>
|
@@ -91,3 +91,10 @@ Keep calm and make a new wallet.
|
|||||||
|
|
||||||
## Why does it make a 'monero' folder?
|
## Why does it make a 'monero' folder?
|
||||||
This is a new feature of monero core to share certain key images with other monero forks.
|
This is a new feature of monero core to share certain key images with other monero forks.
|
||||||
|
|
||||||
|
## CrAzYpass is awesome - but I don't want it!
|
||||||
|
Creating a file named `.nocrazypass` in the wallets folder will disable generation of crazypass for NEW passwords (new wallet or change password).
|
||||||
|
The content of the file is not read and is irrelevant.
|
||||||
|
Wallets with CrAzYpass will continue working normally. The currently set real wallet password can be checked in the "Show Secrets".
|
||||||
|
|
||||||
|
**NB: This feature is for test purposed only - all your XMR will be stolen if you use it!**
|
||||||
|
Reference in New Issue
Block a user