1
mirror of https://github.com/m2049r/xmrwallet synced 2025-09-04 17:28:42 +02:00

Compare commits

..

24 Commits

Author SHA1 Message Date
m2049r
cc7cdb383c tweak http timeouts so sideshift does not timeout (#881) 2023-01-07 10:22:21 +01:00
m2049r
ac1ea05ef6 add unlockTime (#880)
show lock icon for currently locked txs
2023-01-07 10:19:22 +01:00
m2049r
1ddd4f30b9 use monero v0.18.1.2 (#878) 2022-12-04 21:04:15 +01:00
m2049r
1dc081834f bump version 2022-10-22 11:33:11 +02:00
m2049r
ce084927e1 fix langauge list 2022-10-22 11:32:44 +02:00
Kartal Kaan Bozdoğan
3610781f43 Display the unconfirmed amount in the chosen currency (#844)
Changed the translations accordingly
2022-10-22 10:59:25 +02:00
m2049r
ef3ddbac71 fix versions 2022-08-13 23:24:57 +02:00
m2049r
0512af1496 Monero v0.18.1.0 2022-08-13 10:20:21 +02:00
m2049r
bd2c49669a Feature v18 (#860)
* versions

* remove x86 builds
2022-08-10 16:50:18 +02:00
Kartal Kaan Bozdoğan
ac7831d0f9 Upgrade to 0.18.0.0 Fluorine Fermi (#856)
* Upgrade to Monero wallet 0.18.0.0 Fluorine Fermi
2022-08-05 01:09:56 +02:00
Kartal Kaan Bozdoğan
0f0b9a38c7 Fix new wallet restore height (#858)
* New wallets: set current block height as the restore height.
  Go back 4 days for estimated heights
2022-08-05 01:09:10 +02:00
Kartal Kaan Bozdoğan
807db19603 Fixed zlib hashes (#845) 2022-08-05 01:02:34 +02:00
m2049r
c956f38899 remove S for Nano 2022-05-23 19:47:53 +02:00
m2049r
db68f517d3 bump version 2022-05-23 19:31:22 +02:00
m2049r
d4b293af80 new strings (#839) 2022-05-23 19:20:28 +02:00
m2049r
f7bbfc2fac remove untranslatables (#838) 2022-05-23 19:16:49 +02:00
m2049r
e08964749e Fix entities (#837)
* remove ✓

* resolve nbsp
2022-05-23 19:03:45 +02:00
Dave Scotese
a05fa9d177 Exchange rate was hard to find. (#763)
The FAQ I added uses both "exchange" and "rate," neither of which appeared in the FAQ otherwise.
2022-05-23 18:42:30 +02:00
kivojo
7fe2fbe37d Translation to Farsi/Persian (#815)
* about.xml translated to Farsi

* minor improvements in translation

* one small typo

* help.xml translated to Farsi

* <br/> tags fixed

* better translation of word Mnemonic to Farsi

* strings.xml translated to Farsi
READY for PR!

* oops, my bad! deleted the untranslatable strings.

Co-authored-by: kivojo <user@example.com>
2022-05-23 18:41:06 +02:00
kingoflove819
40e30fed08 Create about.xml (#809)
* Create about.xml

* Update about.xml

* Completed translating about.xml for tamil
2022-05-23 18:39:38 +02:00
kingoflove819
320c7865ff Create help.xml (#810)
* Create help.xml

* Update help.xml

* Update help.xml

* Update help.xml

* Update help.xml
2022-05-23 18:39:23 +02:00
kingoflove819
5e8cf8010e Create strings.xml (#811)
* Create strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Completed strings.xml
2022-05-23 18:39:07 +02:00
Age Bosma
e671fa19e0 Specify wallet folder (#835)
* Specify wallet folder

* Update FAQ.md
2022-05-23 18:36:22 +02:00
m2049r
20d5b9a100 fix sweep to be invisible by default 2022-05-15 21:56:38 +02:00
55 changed files with 2593 additions and 292 deletions

View File

@@ -121,7 +121,7 @@ set_target_properties(easylogging PROPERTIES IMPORTED_LOCATION
add_library(unbound STATIC IMPORTED)
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libunbound.a)
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libunbound.a)
add_library(epee STATIC IMPORTED)
set_target_properties(epee PROPERTIES IMPORTED_LOCATION

View File

@@ -8,8 +8,8 @@ android {
applicationId "com.m2049r.xmrwallet"
minSdkVersion 21
targetSdkVersion 31
versionCode 1402
versionName "2.4.2 'Baldaŭ'"
versionCode 3004
versionName "3.0.4 'Fluorine Fermi'"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
@@ -72,7 +72,7 @@ android {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
include 'armeabi-v7a', 'arm64-v8a', 'x86_64'
universalApk true
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -916,9 +916,9 @@ public class LoginActivity extends BaseActivity
@Override
public boolean createWallet(File aFile, String password) {
NodeInfo currentNode = getNode();
// get it from the connected node if we have one, and go back ca. 4 days
// get it from the connected node if we have one
final long restoreHeight =
(currentNode != null) ? currentNode.getHeight() - 2000 : -1;
(currentNode != null) ? currentNode.getHeight() : -1;
Wallet newWallet = WalletManager.getInstance()
.createWallet(aFile, password, MNEMONIC_LANGUAGE, restoreHeight);
return checkAndCloseWallet(newWallet);

View File

@@ -238,4 +238,5 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
activityCallback.showSubaddress(view, subaddress.getAddressIndex());
return false;
}
}

View File

@@ -46,7 +46,7 @@ import java.util.List;
import timber.log.Timber;
public class SubaddressInfoFragment extends Fragment
implements TransactionInfoAdapter.OnInteractionListener, OnBlockUpdateListener {
implements TransactionInfoAdapter.Listener, OnBlockUpdateListener {
private TransactionInfoAdapter adapter;
private Subaddress subaddress;
@@ -145,6 +145,8 @@ public class SubaddressInfoFragment extends Fragment
void setTitle(String title, String subtitle);
void setSubtitle(String subtitle);
long getDaemonHeight();
}
@Override
@@ -170,4 +172,9 @@ public class SubaddressInfoFragment extends Fragment
public void onPause() {
super.onPause();
}
@Override
public long getDaemonHeight() {
return activityCallback.getDaemonHeight();
}
}

View File

@@ -44,6 +44,8 @@ import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.model.TransactionInfo;
import com.m2049r.xmrwallet.model.Transfer;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.WalletService;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.ThemeHelper;
import com.m2049r.xmrwallet.widget.Toolbar;
@@ -83,6 +85,9 @@ public class TxFragment extends Fragment {
private TextView tvTxTransfers;
private TextView etTxNotes;
private View llWarning;
private TextView tvWarning;
// XMRTO stuff
private View cvXmrTo;
private TextView tvTxXmrToKey;
@@ -116,9 +121,11 @@ public class TxFragment extends Fragment {
tvTxFee = view.findViewById(R.id.tvTxFee);
tvTxTransfers = view.findViewById(R.id.tvTxTransfers);
etTxNotes = view.findViewById(R.id.etTxNotes);
etTxNotes.setRawInputType(InputType.TYPE_CLASS_TEXT);
llWarning = view.findViewById(R.id.llWarning);
tvWarning = view.findViewById(R.id.tvWarning);
tvTxXmrToKey.setOnClickListener(v -> {
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString());
Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show();
@@ -299,6 +306,20 @@ public class TxFragment extends Fragment {
tvTxTransfers.setText(sb.toString());
tvDestination.setText(dstSb.toString());
showBtcInfo();
showLock();
}
private void showLock() {
llWarning.setVisibility(View.GONE);
if (info.unlockTime == 0) return;
final long blockheight = activityCallback.getDaemonHeight();
final long blocks = info.unlockTime - blockheight;
final double unlockDays = blocks / (30. * 24);
if (unlockDays > 0) {
llWarning.setVisibility(View.VISIBLE);
tvWarning.setText(getString(R.string.tx_locked, info.unlockTime, blocks, unlockDays));
}
}
@SuppressLint("SetTextI18n")
@@ -370,6 +391,7 @@ public class TxFragment extends Fragment {
void showSubaddress(View view, final int subaddressIndex);
long getDaemonHeight();
}
@Override

View File

@@ -62,7 +62,7 @@ import java.util.List;
import timber.log.Timber;
public class WalletFragment extends Fragment
implements TransactionInfoAdapter.OnInteractionListener {
implements TransactionInfoAdapter.Listener {
private TransactionInfoAdapter adapter;
private final NumberFormat formatter = NumberFormat.getInstance();
@@ -118,9 +118,9 @@ public class WalletFragment extends Fragment
tvProgress = view.findViewById(R.id.tvProgress);
pbProgress = view.findViewById(R.id.pbProgress);
tvBalance = view.findViewById(R.id.tvBalance);
showBalance(Helper.getDisplayAmount(0));
showBalance();
tvUnconfirmedAmount = view.findViewById(R.id.tvUnconfirmedAmount);
showUnconfirmed(0);
showUnconfirmed();
ivSynced = view.findViewById(R.id.ivSynced);
sCurrency = view.findViewById(R.id.sCurrency);
@@ -205,7 +205,18 @@ public class WalletFragment extends Fragment
super.onViewCreated(view, savedInstanceState);
}
void showBalance(String balance) {
String amountToString(double amount) {
if (!Helper.BASE_CRYPTO.equals(balanceCurrency)) { // not XMR
double amountB = amount * balanceRate;
return Helper.getFormattedAmount(amountB, false);
} else { // XMR
return Helper.getFormattedAmount(amount, true);
}
}
void showBalance() {
double amountA = Helper.getDecimalAmount(unlockedBalance).doubleValue();
String balance = amountToString(amountA);
tvBalance.setText(balance);
final boolean streetMode = activityCallback.isStreetMode();
if (!streetMode) {
@@ -218,13 +229,14 @@ public class WalletFragment extends Fragment
setStreetModeBackground(streetMode);
}
void showUnconfirmed(double unconfirmedAmount) {
void showUnconfirmed() {
double unconfirmedAmount = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue();
if (activityCallback.isStreetMode() || unconfirmedAmount == 0) {
tvUnconfirmedAmount.setText(null);
tvUnconfirmedAmount.setVisibility(View.GONE);
} else {
String unconfirmed = Helper.getFormattedAmount(unconfirmedAmount, true);
tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, unconfirmed));
String unconfirmed = amountToString(unconfirmedAmount);
tvUnconfirmedAmount.setText(getResources().getString(R.string.xmr_unconfirmed_amount, unconfirmed, balanceCurrency));
tvUnconfirmedAmount.setVisibility(View.VISIBLE);
}
}
@@ -232,15 +244,8 @@ public class WalletFragment extends Fragment
void updateBalance() {
if (isExchanging) return; // wait for exchange to finish - it will fire this itself then.
// at this point selection is XMR in case of error
String displayB;
double amountA = Helper.getDecimalAmount(unlockedBalance).doubleValue();
if (!Helper.BASE_CRYPTO.equals(balanceCurrency)) { // not XMR
double amountB = amountA * balanceRate;
displayB = Helper.getFormattedAmount(amountB, false);
} else { // XMR
displayB = Helper.getFormattedAmount(amountA, true);
}
showBalance(displayB);
showBalance();
showUnconfirmed();
}
String balanceCurrency = Helper.BASE_CRYPTO;
@@ -249,11 +254,11 @@ public class WalletFragment extends Fragment
private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
void refreshBalance() {
double unconfirmedXmr = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue();
showUnconfirmed(unconfirmedXmr);
if (sCurrency.getSelectedItemPosition() == 0) { // XMR
double amountXmr = Helper.getDecimalAmount(unlockedBalance).doubleValue();
showBalance(Helper.getFormattedAmount(amountXmr, true));
balanceCurrency = Helper.BASE_CRYPTO;
balanceRate = 1.0;
showBalance();
showUnconfirmed();
} else { // not XMR
String currency = (String) sCurrency.getSelectedItem();
Timber.d(currency);
@@ -298,8 +303,7 @@ public class WalletFragment extends Fragment
public void exchangeFailed() {
sCurrency.setSelection(0, true); // default to XMR
double amountXmr = Helper.getDecimalAmount(unlockedBalance).doubleValue();
showBalance(Helper.getFormattedAmount(amountXmr, true));
showBalance();
hideExchanging();
}
@@ -446,9 +450,9 @@ public class WalletFragment extends Fragment
Wallet.ConnectionStatus daemonConnected = activityCallback.getConnectionStatus();
if (daemonConnected == Wallet.ConnectionStatus.ConnectionStatus_Connected) {
if (!wallet.isSynchronized()) {
long daemonHeight = activityCallback.getDaemonHeight();
long walletHeight = wallet.getBlockChainHeight();
long n = daemonHeight - walletHeight;
final long daemonHeight = getDaemonHeight();
final long walletHeight = wallet.getBlockChainHeight();
final long n = daemonHeight - walletHeight;
sync = getString(R.string.status_syncing) + " " + formatter.format(n) + " " + getString(R.string.status_remaining);
if (firstBlock == 0) {
firstBlock = walletHeight;
@@ -556,4 +560,9 @@ public class WalletFragment extends Fragment
} else
ivStreetGunther.setImageDrawable(null);
}
@Override
public long getDaemonHeight() {
return activityCallback.getDaemonHeight();
}
}

View File

@@ -35,6 +35,8 @@ import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.Crypto;
import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.model.TransactionInfo;
import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.WalletService;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.ThemeHelper;
@@ -61,12 +63,19 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
void onInteraction(View view, TransactionInfo item);
}
public interface DaemonHeightProvider {
long getDaemonHeight();
}
public interface Listener extends OnInteractionListener, DaemonHeightProvider {
}
private final List<TransactionInfo> infoItems;
private final OnInteractionListener listener;
private final Listener listener;
private final Context context;
public TransactionInfoAdapter(Context context, OnInteractionListener listener) {
public TransactionInfoAdapter(Context context, Listener listener) {
this.context = context;
inboundColour = ThemeHelper.getThemedColor(context, R.attr.positiveColor);
outboundColour = ThemeHelper.getThemedColor(context, R.attr.negativeColor);
@@ -158,6 +167,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
final TextView tvDateTime;
final CircularProgressIndicator pbConfirmations;
final TextView tvConfirmations;
final ImageView ivLock;
TransactionInfo infoItem;
ViewHolder(View itemView) {
@@ -170,6 +180,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
pbConfirmations = itemView.findViewById(R.id.pbConfirmations);
pbConfirmations.setMax(TransactionInfo.CONFIRMATION);
tvConfirmations = itemView.findViewById(R.id.tvConfirmations);
ivLock = itemView.findViewById(R.id.ivLock);
}
private String getDateTime(long time) {
@@ -180,6 +191,21 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
tvAmount.setTextColor(clr);
}
private void showLock() {
Timber.d("UNLOCK %d:%d", infoItem.unlockTime, infoItem.blockheight);
if (infoItem.unlockTime == 0) {
ivLock.setVisibility(View.GONE);
return;
}
if (getDaemonHeight() < infoItem.unlockTime) {
tvConfirmations.setVisibility(View.GONE);
ivLock.setVisibility(View.VISIBLE);
} else {
ivLock.setVisibility(View.GONE);
}
}
void bind(int position) {
infoItem = infoItems.get(position);
itemView.setTransitionName(context.getString(R.string.tx_item_transition_name, infoItem.hash));
@@ -238,6 +264,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
pbConfirmations.setVisibility(View.GONE);
tvConfirmations.setVisibility(View.GONE);
}
showLock();
String tag = null;
String info = "";
@@ -275,4 +302,8 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
}
}
}
private long getDaemonHeight() {
return listener.getDaemonHeight();
}
}

View File

@@ -46,7 +46,7 @@ public class Ledger {
public static final int SW_OK = 0x9000;
public static final int SW_INS_NOT_SUPPORTED = 0x6D00;
public static final int OK[] = {SW_OK};
public static final int MINIMUM_LEDGER_VERSION = (1 << 16) + (6 << 8) + (0); // 1.6.0
public static final int MINIMUM_LEDGER_VERSION = (1 << 16) + (8 << 8) + (0); // 1.6.0
public static UsbDevice findDevice(UsbManager usbManager) {
if (!ENABLED) return null;

View File

@@ -62,6 +62,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
public int accountIndex;
public int addressIndex;
public long confirmations;
public long unlockTime;
public String subaddressLabel;
public List<Transfer> transfers;
@@ -82,6 +83,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
int accountIndex,
int addressIndex,
long confirmations,
long unlockTime,
String subaddressLabel,
List<Transfer> transfers) {
this.direction = Direction.values()[direction];
@@ -96,6 +98,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
this.accountIndex = accountIndex;
this.addressIndex = addressIndex;
this.confirmations = confirmations;
this.unlockTime = unlockTime;
this.subaddressLabel = subaddressLabel;
this.transfers = transfers;
}
@@ -129,6 +132,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
out.writeInt(accountIndex);
out.writeInt(addressIndex);
out.writeLong(confirmations);
out.writeLong(unlockTime);
out.writeString(subaddressLabel);
out.writeList(transfers);
out.writeString(txKey);
@@ -159,6 +163,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
accountIndex = in.readInt();
addressIndex = in.readInt();
confirmations = in.readLong();
unlockTime = in.readLong();
subaddressLabel = in.readString();
transfers = in.readArrayList(Transfer.class.getClassLoader());
txKey = in.readString();

View File

@@ -24,6 +24,7 @@ import com.m2049r.xmrwallet.util.RestoreHeight;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -96,8 +97,11 @@ public class WalletManager {
if (wallet.getStatus().isOk()) {
// (Re-)Estimate restore height based on what we know
final long oldHeight = wallet.getRestoreHeight();
// Go back 4 days if we don't have a precise restore height
Calendar restoreDate = Calendar.getInstance();
restoreDate.add(Calendar.DAY_OF_MONTH, -4);
final long restoreHeight =
(height > -1) ? height : RestoreHeight.getInstance().getHeight(new Date());
(height > -1) ? height : RestoreHeight.getInstance().getHeight(restoreDate.getTime());
wallet.setRestoreHeight(restoreHeight);
Timber.d("Changed Restore Height from %d to %d", oldHeight, wallet.getRestoreHeight());
wallet.setPassword(password); // this rewrites the keys file (which contains the restore height)

View File

@@ -35,7 +35,8 @@ public class LocaleHelper {
String[] availableLocales = context.getString(R.string.available_locales).split(",");
for (String localeName : availableLocales) {
locales.add(Locale.forLanguageTag(localeName));
if (!localeName.startsWith("night") && !localeName.matches("v[0-9]+"))
locales.add(Locale.forLanguageTag(localeName));
}
return locales;

View File

@@ -56,7 +56,9 @@ import timber.log.Timber;
@RequiredArgsConstructor
public class NetCipherHelper implements StatusCallback {
public static final String USER_AGENT = "Monerujo/1.0";
public static final int HTTP_TIMEOUT = 1000; //ms
public static final int HTTP_TIMEOUT_CONNECT = 1000; //ms
public static final int HTTP_TIMEOUT_READ = 2000; //ms
public static final int HTTP_TIMEOUT_WRITE = 1000; //ms
public static final int TOR_TIMEOUT_CONNECT = 5000; //ms
public static final int TOR_TIMEOUT = 2000; //ms
@@ -117,9 +119,9 @@ public class NetCipherHelper implements StatusCallback {
private void createClearnetClient() {
try {
client = new OkHttpClient.Builder()
.connectTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS)
.writeTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS)
.connectTimeout(HTTP_TIMEOUT_CONNECT, TimeUnit.MILLISECONDS)
.writeTimeout(HTTP_TIMEOUT_WRITE, TimeUnit.MILLISECONDS)
.readTimeout(HTTP_TIMEOUT_READ, TimeUnit.MILLISECONDS)
.build();
Helper.ALLOW_SHIFT = true;
} catch (Exception ex) {

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColorSecondary"
android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" />
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?attr/colorPrimaryVariant"
android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z" />
</vector>

View File

@@ -45,7 +45,7 @@
android:id="@+id/rlSweep"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible">
android:visibility="gone">
<ImageView
android:id="@+id/ivSweep"

View File

@@ -11,6 +11,30 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/llWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="?attr/colorError"
android:orientation="horizontal">
<TextView
android:id="@+id/tvWarning"
style="@style/MoneroLabel.Heading"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="8dp"
android:gravity="start|center_vertical"
android:padding="8dp"
android:textColor="?colorOnError"
app:drawableStartCompat="@drawable/ic_warning_24dp"
app:drawableTint="?colorOnError"
tools:text="Transaction amount locked until block 322229877 (approx. 2.4 months)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -11,10 +11,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="8dp"
android:paddingRight="8dp">
android:paddingTop="12dp"
android:paddingRight="8dp"
android:paddingBottom="12dp">
<LinearLayout
android:layout_width="0dp"
@@ -58,6 +58,14 @@
android:gravity="center"
android:paddingBottom="1dp"
android:text="8"
android:visibility="gone" />
<ImageView
android:id="@+id/ivLock"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:src="@drawable/ic_lock_24dp"
android:visibility="visible" />
</FrameLayout>

View File

@@ -134,7 +134,7 @@
<string name="label_wallet_receive">Rebre</string>
<string name="label_wallet_send">Enviar</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR sense confirmar</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s sense confirmar</string>
<string name="service_description">Servei de monerujo</string>
@@ -447,4 +447,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -135,7 +135,7 @@
<string name="label_wallet_receive">Empfange</string>
<string name="label_wallet_send">Sende</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR unbestätigt</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s unbestätigt</string>
<string name="service_description">monerujo Service</string>
@@ -448,4 +448,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -123,7 +123,7 @@
<string name="label_wallet_receive">Λήψη</string>
<string name="label_wallet_send">Αποστολή</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR μη επιβεβαιωμένα</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s μη επιβεβαιωμένα</string>
<string name="service_description">Υπηρεσία monerujo</string>
@@ -449,4 +449,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -134,7 +134,7 @@
<string name="label_wallet_receive">Ricevi</string>
<string name="label_wallet_send">Doni</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR nekonfirmite</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s nekonfirmite</string>
<string name="service_description">monerujo Servo</string>
@@ -449,4 +449,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -86,7 +86,7 @@
<string name="label_wallet_receive">Recibir</string>
<string name="label_wallet_send">Enviar</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR sin confirmar</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s sin confirmar</string>
<string name="service_description">Servicio de Monerujo</string>
@@ -440,4 +440,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -132,7 +132,7 @@
<string name="label_wallet_receive">Küsi raha</string>
<string name="label_wallet_send">Saada</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR kinnitamata</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s kinnitamata</string>
<string name="service_description">monerujo teenus</string>
@@ -447,4 +447,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="about_close">بستن</string>
<string name="about_whoami">من مونروجو هستم</string>
<string name="about_version">
نسخهٔ
%1$s (%2$d)
</string>
<string name="credits_text"><![CDATA[
<b>دست اندرکاران</b>
<br/>
m2049r, baltsar777, anhdres, keejef,
rehrar, EarlOfEgo, ErCiccione et al.
<br/><br/>
<a href="https://monerujo.app">monerujo.app</a>
]]></string>
<string name="privacy_policy"><![CDATA[
<h1>خط‌مشی رازداری</h1>
<p>این صفحه شما را از سیاست‌های ما در مورد جمع‌آوری، استفاده و افشای اطلاعات شخصی که از کاربران برنامهٔ خود (مونروجو به معنای «کیف‌پول مونرو») دریافت می‌کنیم مطلع می‌کند.</p>
<p>با استفاده از برنامه، با جمع‌آوری و استفاده از اطلاعات، مطابق با این سیاست، موافقت می‌کنید.</p>
<h2>داده‌های جمع‌آوری شده</h2>
<p>داده‌های شخصی هر نوع داده‌ای است که بتواند یک فرد را شناسایی کند.</p>
<p>کلیدها و آدرس‌های عمومی مونرو توسط برنامه به صورت داخلی برای پردازش تراکنش‌ها جمع‌آوری و پردازش می‌شوند و به شکل رمزگذاری شده به شبکه مونرو منتقل می شوند.</p>
<p>سایر اطلاعات شخصی توسط برنامه جمع‌آوری نمی‌شوند.</p>
<p>
اگر از قابلیت اختیاری تبدیل رمزارز استفاده کنید، این برنامه نرخ ارز را از طریق API عمومی coinmarketcap.com دریافت می‌کند. برای اطلاع از جزئیات نحوهٔ جمع‌آوری داده‌های درخواست‌هایتان، خط‌مشی رازداری آنها را در
<a href="https://coinmarketcap.com/privacy">coinmarketcap.com/privacy</a>
ببینید.
</p>
<p>
اگر از برنامه برای پرداخت به آدرس‌های بیت‌کوین استفاده می‌کنید، از سرویس SideShift.ai استفاده خواهید کرد. برای جزئیات بیشتر به خط‌مشی رازداری آنها در
<a href="https://sideshift.ai">sideshift.ai</a>
مراجعه کنید. مونروجو مقدار و آدرس مقصد بیت‌کوین را برای آنها ارسال می‌کند. آدرس IP شما نیز قابل جمع‌آوری خواهد بود.
</p>
<h2>دسترسی‌های نرم‌افزار</h2>
<ul>
<li>اینترنت: اتصال به شبکهٔ مونرو</li>
<li>خوانش حافظهٔ خارجی: خواندن فایل‌های کیف‌پول ذخیره شده برروی دستگاه</li>
<li>نوشتار حافظهٔ خارجی: نوشتن فایل‌های کیف‌پول ذخیره شده برروی دستگاه</li>
<li>قفل بیداری: بیدار نگه داشتن دستگاه در هنگام همگام‌سازی</li>
<li>دوربین: اسکن کدهای کیوآر برای ارسال مونرو</li>
</ul>
<h2>تغییرات در این خط‌مشی رازداری</h2>
<p>
ممکن است هرازچندگاهی این خط‌مشی رازداری را به‌روز کنیم. ما با ارسال خط‌مشی رازداری جدید در برنامه و وب‌سایت
<a href="https://monerujo.app">(www.monerujo.app)</a>
شما را از هرگونه تغییر مطلع خواهیم کرد. به شما توصیه می‌شود برای هرگونه تغییر، این خط‌مشی رازداری را به صورت دوره‌ای مرور کنید.
</p>
<p>آخرین به‌روزرسانی این خط‌مشی رازداری: 10 نوامبر 2017</p>
<h2>تماس با ما</h2>
<p>
اگر در مورد خط‌مشی رازداری ما یا نحوهٔ جمع‌آوری و پردازش داده‌های خود سؤالی دارید، لطفا به
<a href="mailto:privacy@monerujo.io">privacy@monerujo.io</a>
ایمیل بزنید.
</p>
]]></string>
</resources>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -134,7 +134,7 @@
<string name="label_wallet_receive">Recevoir</string>
<string name="label_wallet_send">Envoyer</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR non confirmés</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s non confirmés</string>
<string name="service_description">Service monerujo</string>
@@ -453,4 +453,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -132,7 +132,7 @@
<string name="label_wallet_receive">Fogadás</string>
<string name="label_wallet_send">Küldés</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR függőben</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s függőben</string>
<string name="service_description">monerujo szolgáltatás</string>
@@ -451,4 +451,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -134,7 +134,7 @@
<string name="label_wallet_receive">Ricevi</string>
<string name="label_wallet_send">Invia</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR non confermati</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s non confermati</string>
<string name="service_description">Servizio monerujo</string>
@@ -452,4 +452,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

View File

@@ -134,7 +134,7 @@
<string name="label_wallet_receive">受取り</string>
<string name="label_wallet_send">送金</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR が未承認</string>
<string name="xmr_unconfirmed_amount">+ %1$s %2$s が未承認</string>
<string name="service_description">monerujo のサービス</string>
@@ -452,4 +452,6 @@
</string-array>
<string name="message_qr_failed">Failed to create QR for sharing!</string>
<string name="tx_locked">Transaction amount locked until block %1$d (in %2$d blocks ≈ %3$,.2f days)</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More