mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-03 08:23:04 +02:00
Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ffda0e965b | ||
![]() |
cc7cdb383c | ||
![]() |
ac1ea05ef6 | ||
![]() |
1ddd4f30b9 | ||
![]() |
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 3100
|
||||
versionName "3.1.0 '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() {
|
||||
@@ -252,4 +238,5 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte
|
||||
activityCallback.showSubaddress(view, subaddress.getAddressIndex());
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -147,6 +145,8 @@ public class SubaddressInfoFragment extends Fragment
|
||||
void setTitle(String title, String subtitle);
|
||||
|
||||
void setSubtitle(String subtitle);
|
||||
|
||||
long getDaemonHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -172,4 +172,9 @@ public class SubaddressInfoFragment extends Fragment
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDaemonHeight() {
|
||||
return activityCallback.getDaemonHeight();
|
||||
}
|
||||
}
|
||||
|
@@ -36,14 +36,16 @@ 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;
|
||||
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;
|
||||
@@ -96,13 +101,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);
|
||||
@@ -123,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();
|
||||
@@ -306,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")
|
||||
@@ -347,10 +361,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);
|
||||
}
|
||||
|
||||
@@ -379,6 +391,7 @@ public class TxFragment extends Fragment {
|
||||
|
||||
void showSubaddress(View view, final int subaddressIndex);
|
||||
|
||||
long getDaemonHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -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;
|
||||
@@ -63,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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -462,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;
|
||||
@@ -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);
|
||||
@@ -574,4 +560,9 @@ public class WalletFragment extends Fragment
|
||||
} else
|
||||
ivStreetGunther.setImageDrawable(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDaemonHeight() {
|
||||
return activityCallback.getDaemonHeight();
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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();
|
||||
|
@@ -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;
|
||||
|
@@ -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) {
|
||||
|
9
app/src/main/res/drawable/ic_lock_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_lock_24dp.xml
Normal 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>
|
9
app/src/main/res/drawable/ic_warning_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_warning_24dp.xml
Normal 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>
|
@@ -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,14 +4,37 @@
|
||||
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"
|
||||
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"
|
||||
@@ -33,6 +56,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>
|
||||
|
||||
|
@@ -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>
|
||||
|
||||
|
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>
|
||||
@@ -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>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user