mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-07 11:35:59 +02:00
Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1dc081834f | ||
![]() |
ce084927e1 | ||
![]() |
3610781f43 | ||
![]() |
ef3ddbac71 | ||
![]() |
0512af1496 | ||
![]() |
bd2c49669a | ||
![]() |
ac7831d0f9 | ||
![]() |
0f0b9a38c7 | ||
![]() |
807db19603 | ||
![]() |
c956f38899 | ||
![]() |
db68f517d3 | ||
![]() |
d4b293af80 | ||
![]() |
f7bbfc2fac | ||
![]() |
e08964749e | ||
![]() |
a05fa9d177 | ||
![]() |
7fe2fbe37d | ||
![]() |
40e30fed08 | ||
![]() |
320c7865ff | ||
![]() |
5e8cf8010e | ||
![]() |
e671fa19e0 | ||
![]() |
20d5b9a100 | ||
![]() |
5d489a634b | ||
![]() |
59b6f484fd | ||
![]() |
ecaa49d67d | ||
![]() |
d2dc53599e | ||
![]() |
4d8b26f97f | ||
![]() |
581c76e7be | ||
![]() |
6f66862870 | ||
![]() |
dd92f7bb36 | ||
![]() |
46808d306b | ||
![]() |
20503d2cbd | ||
![]() |
604691ca7e | ||
![]() |
1b626ba2b0 | ||
![]() |
0ed7bdfcee | ||
![]() |
524c3dd79f | ||
![]() |
197dffeae1 |
@@ -3,13 +3,11 @@ jobs:
|
||||
build:
|
||||
working_directory: ~/code
|
||||
docker:
|
||||
- image: circleci/android:api-28-ndk
|
||||
- image: cimg/android:2022.03-ndk
|
||||
environment:
|
||||
JVM_OPTS: -Xmx3200m
|
||||
steps:
|
||||
- checkout
|
||||
- run: yes | sdkmanager --licenses || exit 0
|
||||
- run: yes | sdkmanager --update || exit 0
|
||||
- restore_cache:
|
||||
key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}
|
||||
- run:
|
||||
|
@@ -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
|
||||
|
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "com.m2049r.xmrwallet"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 31
|
||||
versionCode 1303
|
||||
versionName "2.3.3 'Baldaŭ'"
|
||||
versionCode 3003
|
||||
versionName "3.0.3 '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
|
||||
}
|
||||
}
|
||||
@@ -111,6 +111,7 @@ android {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
namespace 'com.m2049r.xmrwallet'
|
||||
}
|
||||
|
||||
static def getId(name) {
|
||||
@@ -129,7 +130,7 @@ dependencies {
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
|
||||
implementation 'androidx.preference:preference:1.2.0'
|
||||
|
||||
implementation 'com.google.android.material:material:1.5.0'
|
||||
implementation 'com.google.android.material:material:1.6.0'
|
||||
|
||||
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
||||
implementation "com.squareup.okhttp3:okhttp:4.9.3"
|
||||
|
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.m2049r.xmrwallet">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -78,7 +78,7 @@ public class BTChipTransportAndroidHID implements BTChipTransport {
|
||||
}
|
||||
|
||||
private static final int VID = 0x2C97;
|
||||
private static final int[] PID_HIDS = {0x0001, 0x0004};
|
||||
private static final int[] PID_HIDS = {0x0001, 0x0004, 0x0005};
|
||||
|
||||
private UsbDeviceConnection connection;
|
||||
private UsbInterface dongleInterface;
|
||||
|
@@ -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);
|
||||
|
@@ -415,7 +415,14 @@ public class NodeFragment extends Fragment
|
||||
}
|
||||
etNodeHost.setError(null);
|
||||
nodeInfo.setRpcPort(port);
|
||||
nodeInfo.setName(etNodeName.getEditText().getText().toString().trim());
|
||||
// setName() may trigger reverse DNS
|
||||
Helper.runWithNetwork(new Helper.Action() {
|
||||
@Override
|
||||
public boolean run() {
|
||||
nodeInfo.setName(etNodeName.getEditText().getText().toString().trim());
|
||||
return true;
|
||||
}
|
||||
});
|
||||
nodeInfo.setUsername(etNodeUser.getEditText().getText().toString().trim());
|
||||
nodeInfo.setPassword(etNodePass.getEditText().getText().toString()); // no trim for pw
|
||||
return true;
|
||||
|
@@ -30,7 +30,6 @@ import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.transition.MaterialElevationScale;
|
||||
import com.m2049r.xmrwallet.data.Subaddress;
|
||||
import com.m2049r.xmrwallet.layout.SubaddressInfoAdapter;
|
||||
import com.m2049r.xmrwallet.ledger.LedgerProgressDialog;
|
||||
@@ -117,14 +116,6 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
|
||||
managerMode = ((b != null) && (MODE_MANAGER.equals(b.getString(KEY_MODE))));
|
||||
|
||||
View view = inflater.inflate(R.layout.fragment_subaddress, container, false);
|
||||
|
||||
final MaterialElevationScale exitTransition = new MaterialElevationScale(false);
|
||||
exitTransition.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
setExitTransition(exitTransition);
|
||||
final MaterialElevationScale reenterTransition = new MaterialElevationScale(true);
|
||||
reenterTransition.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
setReenterTransition(reenterTransition);
|
||||
|
||||
view.findViewById(R.id.fab).setOnClickListener(this);
|
||||
|
||||
if (managerMode) {
|
||||
@@ -154,11 +145,6 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
postponeEnterTransition();
|
||||
view.getViewTreeObserver().addOnPreDrawListener(() -> {
|
||||
startPostponedEnterTransition();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
public void loadList() {
|
||||
|
@@ -29,15 +29,15 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.transition.Transition;
|
||||
import androidx.transition.TransitionInflater;
|
||||
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.google.android.material.transition.MaterialContainerTransform;
|
||||
import com.m2049r.xmrwallet.data.Subaddress;
|
||||
import com.m2049r.xmrwallet.layout.TransactionInfoAdapter;
|
||||
import com.m2049r.xmrwallet.model.TransactionInfo;
|
||||
import com.m2049r.xmrwallet.model.Wallet;
|
||||
import com.m2049r.xmrwallet.util.Helper;
|
||||
import com.m2049r.xmrwallet.util.ThemeHelper;
|
||||
import com.m2049r.xmrwallet.widget.Toolbar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -102,10 +102,8 @@ public class SubaddressInfoFragment extends Fragment
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
final MaterialContainerTransform transform = new MaterialContainerTransform();
|
||||
transform.setDrawingViewId(R.id.fragment_container);
|
||||
transform.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
transform.setAllContainerColors(ThemeHelper.getThemedColor(getContext(), android.R.attr.colorBackground));
|
||||
Transition transform = TransitionInflater.from(requireContext())
|
||||
.inflateTransition(R.transition.details);
|
||||
setSharedElementEnterTransition(transform);
|
||||
}
|
||||
|
||||
|
@@ -36,9 +36,9 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.transition.Transition;
|
||||
import androidx.transition.TransitionInflater;
|
||||
|
||||
import com.google.android.material.transition.MaterialContainerTransform;
|
||||
import com.google.android.material.transition.MaterialElevationScale;
|
||||
import com.m2049r.xmrwallet.data.Subaddress;
|
||||
import com.m2049r.xmrwallet.data.UserNotes;
|
||||
import com.m2049r.xmrwallet.model.TransactionInfo;
|
||||
@@ -96,13 +96,6 @@ public class TxFragment extends Fragment {
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.fragment_tx_info, container, false);
|
||||
|
||||
final MaterialElevationScale exitTransition = new MaterialElevationScale(false);
|
||||
exitTransition.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
setExitTransition(exitTransition);
|
||||
final MaterialElevationScale reenterTransition = new MaterialElevationScale(true);
|
||||
reenterTransition.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
setReenterTransition(reenterTransition);
|
||||
|
||||
cvXmrTo = view.findViewById(R.id.cvXmrTo);
|
||||
tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey);
|
||||
tvDestinationBtc = view.findViewById(R.id.tvDestinationBtc);
|
||||
@@ -347,10 +340,8 @@ public class TxFragment extends Fragment {
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
final MaterialContainerTransform transform = new MaterialContainerTransform();
|
||||
transform.setDrawingViewId(R.id.fragment_container);
|
||||
transform.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
transform.setAllContainerColors(ThemeHelper.getThemedColor(getContext(), android.R.attr.colorBackground));
|
||||
Transition transform = TransitionInflater.from(requireContext())
|
||||
.inflateTransition(R.transition.details);
|
||||
setSharedElementEnterTransition(transform);
|
||||
}
|
||||
|
||||
|
@@ -539,7 +539,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||
|
||||
@Override
|
||||
public void onSendRequest(View view) {
|
||||
replaceFragmentWithTransition(view, SendFragment.newInstance(uri), null, null);
|
||||
replaceFragment(SendFragment.newInstance(uri), null, null);
|
||||
uri = null; // only use uri once
|
||||
}
|
||||
|
||||
@@ -800,10 +800,6 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||
int transition;
|
||||
if (newFragment instanceof TxFragment)
|
||||
transition = R.string.tx_details_transition_name;
|
||||
else if (newFragment instanceof ReceiveFragment)
|
||||
transition = R.string.receive_transition_name;
|
||||
else if (newFragment instanceof SendFragment)
|
||||
transition = R.string.send_transition_name;
|
||||
else if (newFragment instanceof SubaddressInfoFragment)
|
||||
transition = R.string.subaddress_info_transition_name;
|
||||
else
|
||||
@@ -960,7 +956,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||
Bundle b = new Bundle();
|
||||
b.putString("address", address);
|
||||
b.putString("name", getWalletName());
|
||||
replaceFragmentWithTransition(view, new ReceiveFragment(), null, b);
|
||||
replaceFragment(new ReceiveFragment(), null, b);
|
||||
Timber.d("ReceiveFragment placed");
|
||||
}
|
||||
|
||||
|
@@ -43,7 +43,6 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.github.brnunes.swipeablerecyclerview.SwipeableRecyclerViewTouchListener;
|
||||
import com.google.android.material.transition.MaterialElevationScale;
|
||||
import com.m2049r.xmrwallet.layout.TransactionInfoAdapter;
|
||||
import com.m2049r.xmrwallet.model.TransactionInfo;
|
||||
import com.m2049r.xmrwallet.model.Wallet;
|
||||
@@ -119,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);
|
||||
@@ -204,14 +203,20 @@ public class WalletFragment extends Fragment
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
postponeEnterTransition();
|
||||
view.getViewTreeObserver().addOnPreDrawListener(() -> {
|
||||
startPostponedEnterTransition();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
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) {
|
||||
@@ -224,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);
|
||||
}
|
||||
}
|
||||
@@ -238,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;
|
||||
@@ -255,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);
|
||||
@@ -304,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();
|
||||
}
|
||||
|
||||
@@ -333,19 +331,9 @@ public class WalletFragment extends Fragment
|
||||
// Callbacks from TransactionInfoAdapter
|
||||
@Override
|
||||
public void onInteraction(final View view, final TransactionInfo infoItem) {
|
||||
final MaterialElevationScale exitTransition = new MaterialElevationScale(false);
|
||||
exitTransition.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
setExitTransition(exitTransition);
|
||||
final MaterialElevationScale reenterTransition = new MaterialElevationScale(true);
|
||||
reenterTransition.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
setReenterTransition(reenterTransition);
|
||||
|
||||
activityCallback.onTxDetailsRequest(view, infoItem);
|
||||
}
|
||||
|
||||
// called from activity
|
||||
|
||||
|
||||
// if account index has changed scroll to top?
|
||||
private int accountIndex = 0;
|
||||
|
||||
@@ -538,8 +526,6 @@ public class WalletFragment extends Fragment
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
setExitTransition(null);
|
||||
setReenterTransition(null);
|
||||
Timber.d("onResume()");
|
||||
activityCallback.setTitle(walletTitle, walletSubtitle);
|
||||
activityCallback.setToolbarButton(Toolbar.BUTTON_NONE);
|
||||
|
@@ -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;
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -8,17 +8,17 @@
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llNotice"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:orientation="vertical" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvPull"
|
||||
android:layout_below="@+id/llNotice"
|
||||
style="@style/MoneroLabel.Heading"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/llNotice"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:gravity="center"
|
||||
@@ -52,7 +52,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_margin="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:background="@drawable/gradient_oval"
|
||||
android:elevation="6dp">
|
||||
|
||||
@@ -67,7 +68,7 @@
|
||||
app:borderWidth="0dp"
|
||||
app:elevation="0dp"
|
||||
app:fabSize="normal"
|
||||
app:pressedTranslationZ="0dp" />
|
||||
|
||||
app:pressedTranslationZ="0dp"
|
||||
app:tint="?attr/toolbarTextColor" />
|
||||
</FrameLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
||||
|
@@ -3,8 +3,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:transitionName="@string/receive_transition_name">
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etDummy"
|
||||
@@ -98,7 +97,6 @@
|
||||
android:backgroundTint="#ffffffff"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:foreground="?android:attr/selectableItemBackground"
|
||||
card_view:contentPadding="4dp">
|
||||
|
||||
<TextView
|
||||
@@ -110,8 +108,8 @@
|
||||
android:drawablePadding="4dp"
|
||||
android:text="@string/label_receive_info_gen_qr_code"
|
||||
android:textAlignment="center"
|
||||
android:textSize="16sp"
|
||||
android:textColor="#2D1A2E"
|
||||
android:textSize="16sp"
|
||||
android:visibility="visible"
|
||||
card_view:drawableStartCompat="@drawable/ic_info_outline_black_24dp" />
|
||||
|
||||
@@ -119,7 +117,8 @@
|
||||
android:id="@+id/qrCode"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:adjustViewBounds="true" />
|
||||
android:adjustViewBounds="true"
|
||||
android:src="#fff" />
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<TextView
|
||||
|
@@ -4,8 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:transitionName="@string/send_transition_name">
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llNotice"
|
||||
|
@@ -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"
|
||||
|
@@ -69,6 +69,7 @@
|
||||
app:borderWidth="0dp"
|
||||
app:elevation="0dp"
|
||||
app:fabSize="normal"
|
||||
app:pressedTranslationZ="0dp" />
|
||||
app:pressedTranslationZ="0dp"
|
||||
app:tint="?attr/toolbarTextColor" />
|
||||
</FrameLayout>
|
||||
</FrameLayout>
|
||||
</FrameLayout>
|
||||
|
@@ -5,8 +5,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp"
|
||||
android:transitionName="@string/subaddress_info_transition_name">
|
||||
android:padding="8dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvAddress"
|
||||
@@ -14,6 +13,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/header_top_first"
|
||||
android:transitionName="@string/subaddress_info_transition_name"
|
||||
tools:text="#1: 8AioXCmK...aGivEa7C" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
|
@@ -4,8 +4,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:fillViewport="true"
|
||||
android:transitionName="@string/tx_details_transition_name">
|
||||
android:fillViewport="true">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
@@ -33,6 +32,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:selectAllOnFocus="true"
|
||||
android:textIsSelectable="true"
|
||||
android:transitionName="@string/tx_details_transition_name"
|
||||
tools:text="+ 1,092.00229" />
|
||||
|
||||
<TextView
|
||||
|
@@ -177,7 +177,6 @@
|
||||
android:layout_weight="1"
|
||||
android:enabled="false"
|
||||
android:text="@string/label_wallet_receive"
|
||||
android:transitionName="@string/receive_btn_transition_name"
|
||||
app:icon="@drawable/ic_hand" />
|
||||
|
||||
<Button
|
||||
@@ -190,7 +189,6 @@
|
||||
android:layout_weight="1"
|
||||
android:enabled="false"
|
||||
android:text="@string/label_wallet_send"
|
||||
android:transitionName="@string/send_btn_transition_name"
|
||||
app:icon="@drawable/ic_send" />
|
||||
</LinearLayout>
|
||||
|
||||
|
3
app/src/main/res/transition/details.xml
Normal file
3
app/src/main/res/transition/details.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<changeTransform android:duration="@integer/tx_item_transition_duration" />
|
||||
</transitionSet>
|
@@ -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>
|
||||
|
||||
@@ -290,7 +290,7 @@
|
||||
<string name="menu_language">Idioma</string>
|
||||
<string name="language_system_default">Utilitzar Idioma del Sistema</string>
|
||||
|
||||
<string name="fab_restore_ledger">Restablir desde Ledger Nano S</string>
|
||||
<string name="fab_restore_ledger">Restablir desde Ledger Nano</string>
|
||||
|
||||
<string name="progress_ledger_progress">Comunicant amb Ledger</string>
|
||||
<string name="progress_ledger_confirm">Es requereix confirmació en Ledger!</string>
|
||||
|
@@ -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>
|
||||
|
||||
@@ -286,7 +286,7 @@
|
||||
<string name="menu_language">Sprache</string>
|
||||
<string name="language_system_default">Benutze Systemsprache</string>
|
||||
|
||||
<string name="fab_restore_ledger">Wallet mit Ledger Nano S wiederherstellen</string>
|
||||
<string name="fab_restore_ledger">Wallet mit Ledger Nano wiederherstellen</string>
|
||||
|
||||
<string name="progress_ledger_progress">Kommunikation mit Ledger</string>
|
||||
<string name="progress_ledger_confirm">Bestätigung auf Ledger benötigt!</string>
|
||||
|
@@ -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>
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
<string name="menu_language">Language</string>
|
||||
<string name="language_system_default">Use System Language</string>
|
||||
|
||||
<string name="fab_restore_ledger">Restore from Ledger Nano S</string>
|
||||
<string name="fab_restore_ledger">Restore from Ledger Nano</string>
|
||||
|
||||
<string name="progress_ledger_progress">Communicating with Ledger</string>
|
||||
<string name="progress_ledger_confirm">Confirmation on Ledger required!</string>
|
||||
|
@@ -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>
|
||||
|
||||
@@ -290,7 +290,7 @@
|
||||
<string name="menu_language">Lingvo</string>
|
||||
<string name="language_system_default">Uzi la sistemlingvon</string>
|
||||
|
||||
<string name="fab_restore_ledger">Restaŭri de Ledger Nano S</string>
|
||||
<string name="fab_restore_ledger">Restaŭri de Ledger Nano</string>
|
||||
|
||||
<string name="progress_ledger_progress">Komunikante kun Ledger</string>
|
||||
<string name="progress_ledger_confirm">Konfirmo je la Ledger estas postulita!</string>
|
||||
|
@@ -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>
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
<string name="menu_language">Lenguaje</string>
|
||||
<string name="language_system_default">Usar Idioma del Sistema</string>
|
||||
|
||||
<string name="fab_restore_ledger">Restaurar desde Ledger Nano S</string>
|
||||
<string name="fab_restore_ledger">Restaurar desde Ledger Nano</string>
|
||||
|
||||
<string name="progress_ledger_progress">Comunicándose con Ledger</string>
|
||||
<string name="progress_ledger_confirm">¡Confirmación en Ledger requerida!</string>
|
||||
|
@@ -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>
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
<string name="menu_language">Keel</string>
|
||||
<string name="language_system_default">Kasuta süsteemi keelt</string>
|
||||
|
||||
<string name="fab_restore_ledger">Taasta seadmelt Ledger Nano S</string>
|
||||
<string name="fab_restore_ledger">Taasta seadmelt Ledger Nano</string>
|
||||
|
||||
<string name="progress_ledger_progress">Suhtlen seadmega Ledger</string>
|
||||
<string name="progress_ledger_confirm">Seadmelt Ledger on vajalik kinnitus!</string>
|
||||
|
59
app/src/main/res/values-fa/about.xml
Normal file
59
app/src/main/res/values-fa/about.xml
Normal 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>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user