1
mirror of https://github.com/m2049r/xmrwallet synced 2025-09-10 22:10:49 +02:00

Compare commits

..

8 Commits

Author SHA1 Message Date
m2049r
c6d4de8599 bump version 2018-11-26 23:39:01 +01:00
m2049r
2ef7f8571c adjust & tweak tx details layout (#489) 2018-11-26 23:08:32 +01:00
m2049r
d2612a26e5 show my tx (sub)address (#487) 2018-11-26 12:05:40 +01:00
m2049r
7e14572756 (optional) disable crazypass generation (#486)
* (optional) disable crazypass generation

* update FAQ about disabling crazypass
2018-11-26 12:05:25 +01:00
hrumag
6f840dcacf [IT-Translation] help.xml / strings.xml - First Issue (#480)
* [IT-Translation] help.xml / strings.xml

* [IT-Translation] Fixes from @erciccione and @serhack
2018-11-26 12:05:03 +01:00
m2049r
36b389cd0f USE_FINGERPRINT & bump version 2018-11-24 23:39:35 +01:00
m2049r
ed2b95ea37 Fix android9 permissions (#484)
* FOREGROUND_SERVICE for Android 9

* USE_BIOMETRIC for Android 9
2018-11-24 23:03:20 +01:00
m2049r
8d41d1d03e Stagenet build config (#483)
* combine gitignores

* stagenet build config
2018-11-24 22:28:33 +01:00
16 changed files with 173 additions and 114 deletions

3
.gitignore vendored
View File

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

@@ -1,5 +0,0 @@
.externalNativeBuild
build
app.iml
prod
alpha

View File

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

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">monerujo - Debug</string>
</resources>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 &amp; bookmark 3&#8211;5 nodes to allow Monerujo <p>Aggiorna la lista dei nodi tirando giù &amp; contrassegna 3&#8211;5 i nodi per consentire a Monerujo
to choose the best one for you!</p> di scegliere il migliore per te!</p>
<h2>What&apos;s a Node?</h2> <h2>Cos&apos;è 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&apos;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&#8230;</p> effettui la scansione della rete per te. O entrambe le cose. Leggi su&#8230;</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&apos;ultimo blocco conosciuto ad ogni nodo. Accanto ad ogni nodo viene visualizzata un&apos;icona che
representing the node&apos;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&apos;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 &quot;Aggiungi nodo&quot; in fondo, ti verrà chiesto di
<p>By touching the &quot;Add Node&quot; 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&apos;&quot;Indirizzo&quot; è il nome host o l&apos;indirizzo IP del nodo - questa è l&apos;unica informazione necessaria.
The &quot;Address&quot; is the hostname or IP-address of the node - this is the only Inserisci la &quot;Porta&quot; 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 &quot;Port&quot; 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 &amp;
You can also optionally name the node, so you can identify it easier later on. password forniti. Ora puoi &quot;Effettuare un Test&quot; con queste impostazioni.
Some nodes require credentials to use them. Enter the provided username &amp; I &quot;Risultati del Test&quot; visualizzeranno l&apos;altezza di blocco, il tempo di risposta e l&apos;IP correntemente utilizzato.
password in the appropriate fields. Now you can &quot;Test&quot; these setting. Il risultato potrebbe essere anche un errore - molte volte perché il nome host fornito non è
The &quot;Test Results&quot; 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 &quot;OK&quot; per salvare&amp;
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&apos;re set to press &quot;OK&quot; to save &amp; <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&apos;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&apos;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>

View File

@@ -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&#8211;65535</string> <string name="node_port_range">Deve essere 1&#8211;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 &#8230;</string> <string name="node_testing">Controllo IP: %1$s &#8230;</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&#8230;</string> <string name="node_scanning">Scansione rete&#8230;</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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Stagenet</string>
</resources>

View File

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