mirror of
https://codeberg.org/r4v3r23/mysu.git
synced 2024-11-10 05:03:44 +01:00
Almost done with new send screen
This commit is contained in:
parent
062d9dabe3
commit
fa4b0fd67e
@ -1,6 +1,8 @@
|
|||||||
package net.mynero.wallet.fragment.send;
|
package net.mynero.wallet.fragment.send;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -13,6 +15,8 @@ import android.widget.RadioGroup;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||||
@ -22,6 +26,10 @@ import androidx.lifecycle.ViewModelProvider;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.zxing.client.android.Intents;
|
||||||
|
import com.journeyapps.barcodescanner.ScanContract;
|
||||||
|
import com.journeyapps.barcodescanner.ScanOptions;
|
||||||
|
|
||||||
import net.mynero.wallet.MoneroApplication;
|
import net.mynero.wallet.MoneroApplication;
|
||||||
import net.mynero.wallet.R;
|
import net.mynero.wallet.R;
|
||||||
import net.mynero.wallet.model.PendingTransaction;
|
import net.mynero.wallet.model.PendingTransaction;
|
||||||
@ -29,6 +37,7 @@ import net.mynero.wallet.model.Wallet;
|
|||||||
import net.mynero.wallet.service.BalanceService;
|
import net.mynero.wallet.service.BalanceService;
|
||||||
import net.mynero.wallet.service.TxService;
|
import net.mynero.wallet.service.TxService;
|
||||||
import net.mynero.wallet.util.Helper;
|
import net.mynero.wallet.util.Helper;
|
||||||
|
import net.mynero.wallet.util.UriData;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -42,6 +51,7 @@ public class SendFragment extends Fragment {
|
|||||||
private LinearLayout destList;
|
private LinearLayout destList;
|
||||||
private LayoutInflater inflater;
|
private LayoutInflater inflater;
|
||||||
private Button createButton;
|
private Button createButton;
|
||||||
|
private Button sendButton;
|
||||||
private RadioGroup feeRadioGroup;
|
private RadioGroup feeRadioGroup;
|
||||||
private TextView feeRadioGroupLabelTextView;
|
private TextView feeRadioGroupLabelTextView;
|
||||||
|
|
||||||
@ -50,7 +60,24 @@ public class SendFragment extends Fragment {
|
|||||||
private TextView amountTextView;
|
private TextView amountTextView;
|
||||||
|
|
||||||
public PendingTransaction.Priority priority;
|
public PendingTransaction.Priority priority;
|
||||||
|
private int currentEntryIndex = -1;
|
||||||
|
private final ActivityResultLauncher<ScanOptions> qrCodeLauncher = registerForActivityResult(new ScanContract(), result -> {
|
||||||
|
if (result.getContents() != null) {
|
||||||
|
if(currentEntryIndex != -1) {
|
||||||
|
pasteAddress(getDestView(currentEntryIndex), result.getContents());
|
||||||
|
currentEntryIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
private final ActivityResultLauncher<String> cameraPermissionsLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
|
||||||
|
granted -> {
|
||||||
|
if (granted) {
|
||||||
|
onScan(currentEntryIndex);
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getActivity(), getString(R.string.no_camera_permission), Toast.LENGTH_SHORT).show();
|
||||||
|
currentEntryIndex = -1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||||
@ -68,6 +95,7 @@ public class SendFragment extends Fragment {
|
|||||||
createButton = view.findViewById(R.id.create_tx_button);
|
createButton = view.findViewById(R.id.create_tx_button);
|
||||||
feeRadioGroup = view.findViewById(R.id.tx_fee_radiogroup);
|
feeRadioGroup = view.findViewById(R.id.tx_fee_radiogroup);
|
||||||
feeTextView = view.findViewById(R.id.fee_textview);
|
feeTextView = view.findViewById(R.id.fee_textview);
|
||||||
|
sendButton = view.findViewById(R.id.send_tx_button);
|
||||||
addressTextView = view.findViewById(R.id.address_pending_textview);
|
addressTextView = view.findViewById(R.id.address_pending_textview);
|
||||||
amountTextView = view.findViewById(R.id.amount_pending_textview);
|
amountTextView = view.findViewById(R.id.amount_pending_textview);
|
||||||
feeRadioGroup = view.findViewById(R.id.tx_fee_radiogroup);
|
feeRadioGroup = view.findViewById(R.id.tx_fee_radiogroup);
|
||||||
@ -101,7 +129,12 @@ public class SendFragment extends Fragment {
|
|||||||
|
|
||||||
addOutputImageView.setOnClickListener(view1 -> {
|
addOutputImageView.setOnClickListener(view1 -> {
|
||||||
sendMaxButton.setVisibility(View.GONE);
|
sendMaxButton.setVisibility(View.GONE);
|
||||||
addOutput();
|
int outputCount = getDestCount();
|
||||||
|
if(outputCount < 8) {
|
||||||
|
addOutput();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getActivity(), getString(R.string.max_outputs_allowed), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
sendMaxButton.setOnClickListener(view1 -> {
|
sendMaxButton.setOnClickListener(view1 -> {
|
||||||
addOutputImageView.setVisibility(View.INVISIBLE);
|
addOutputImageView.setVisibility(View.INVISIBLE);
|
||||||
@ -143,6 +176,15 @@ public class SendFragment extends Fragment {
|
|||||||
createButton.setEnabled(false);
|
createButton.setEnabled(false);
|
||||||
createTx(dests, sendAll, priority);
|
createTx(dests, sendAll, priority);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
sendButton.setOnClickListener(view1 -> {
|
||||||
|
PendingTransaction pendingTx = mViewModel.pendingTransaction.getValue();
|
||||||
|
if (pendingTx != null) {
|
||||||
|
Toast.makeText(getActivity(), getString(R.string.sending_tx), Toast.LENGTH_SHORT).show();
|
||||||
|
sendButton.setEnabled(false);
|
||||||
|
sendTx(pendingTx);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindObservers() {
|
private void bindObservers() {
|
||||||
@ -174,7 +216,20 @@ public class SendFragment extends Fragment {
|
|||||||
|
|
||||||
private void addOutput() {
|
private void addOutput() {
|
||||||
if (inflater != null) {
|
if (inflater != null) {
|
||||||
|
int index = getDestCount();
|
||||||
ConstraintLayout entryView = (ConstraintLayout)inflater.inflate(R.layout.transaction_output_item, null);
|
ConstraintLayout entryView = (ConstraintLayout)inflater.inflate(R.layout.transaction_output_item, null);
|
||||||
|
|
||||||
|
|
||||||
|
entryView.findViewById(R.id.paste_address_imagebutton).setOnClickListener(view1 -> {
|
||||||
|
Context ctx = getContext();
|
||||||
|
if (ctx != null) {
|
||||||
|
String clipboard = Helper.getClipBoardText(ctx);
|
||||||
|
if (clipboard != null) {
|
||||||
|
pasteAddress(entryView, clipboard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
entryView.findViewById(R.id.scan_address_imagebutton).setOnClickListener(view -> onScan(index));
|
||||||
entryView.findViewById(R.id.remove_output_imagebutton).setOnClickListener(view -> {
|
entryView.findViewById(R.id.remove_output_imagebutton).setOnClickListener(view -> {
|
||||||
int currentCount = getDestCount();
|
int currentCount = getDestCount();
|
||||||
if(currentCount > 1) {
|
if(currentCount > 1) {
|
||||||
@ -218,6 +273,7 @@ public class SendFragment extends Fragment {
|
|||||||
feeRadioGroup.setVisibility(View.GONE);
|
feeRadioGroup.setVisibility(View.GONE);
|
||||||
feeRadioGroupLabelTextView.setVisibility(View.GONE);
|
feeRadioGroupLabelTextView.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
sendButton.setVisibility(View.VISIBLE);
|
||||||
feeTextView.setVisibility(View.VISIBLE);
|
feeTextView.setVisibility(View.VISIBLE);
|
||||||
addressTextView.setVisibility(View.VISIBLE);
|
addressTextView.setVisibility(View.VISIBLE);
|
||||||
amountTextView.setVisibility(View.VISIBLE);
|
amountTextView.setVisibility(View.VISIBLE);
|
||||||
@ -229,12 +285,39 @@ public class SendFragment extends Fragment {
|
|||||||
feeRadioGroup.setVisibility(View.VISIBLE);
|
feeRadioGroup.setVisibility(View.VISIBLE);
|
||||||
feeRadioGroupLabelTextView.setVisibility(View.VISIBLE);
|
feeRadioGroupLabelTextView.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
sendButton.setVisibility(View.GONE);
|
||||||
feeTextView.setVisibility(View.GONE);
|
feeTextView.setVisibility(View.GONE);
|
||||||
addressTextView.setVisibility(View.GONE);
|
addressTextView.setVisibility(View.GONE);
|
||||||
amountTextView.setVisibility(View.GONE);
|
amountTextView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onScan(int index) {
|
||||||
|
currentEntryIndex = index;
|
||||||
|
if (Helper.getCameraPermission(getActivity(), cameraPermissionsLauncher)) {
|
||||||
|
ScanOptions options = new ScanOptions();
|
||||||
|
options.setBeepEnabled(false);
|
||||||
|
options.setOrientationLocked(true);
|
||||||
|
options.setDesiredBarcodeFormats(List.of(Intents.Scan.QR_CODE_MODE));
|
||||||
|
options.addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN);
|
||||||
|
qrCodeLauncher.launch(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pasteAddress(ConstraintLayout entryView, String address) {
|
||||||
|
UriData uriData = UriData.parse(address);
|
||||||
|
if (uriData != null) {
|
||||||
|
EditText addressField = entryView.findViewById(R.id.address_edittext);
|
||||||
|
addressField.setText(uriData.getAddress());
|
||||||
|
if (uriData.hasAmount()) {
|
||||||
|
EditText amountField = entryView.findViewById(R.id.amount_edittext);
|
||||||
|
amountField.setText(uriData.getAmount());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void createTx(List<Pair<String, String>> dests, boolean sendAll, PendingTransaction.Priority feePriority) {
|
private void createTx(List<Pair<String, String>> dests, boolean sendAll, PendingTransaction.Priority feePriority) {
|
||||||
((MoneroApplication)getActivity().getApplication()).getExecutor().execute(() -> {
|
((MoneroApplication)getActivity().getApplication()).getExecutor().execute(() -> {
|
||||||
try {
|
try {
|
||||||
@ -261,4 +344,22 @@ public class SendFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendTx(PendingTransaction pendingTx) {
|
||||||
|
((MoneroApplication)getActivity().getApplication()).getExecutor().execute(() -> {
|
||||||
|
boolean success = TxService.getInstance().sendTx(pendingTx);
|
||||||
|
Activity activity = getActivity();
|
||||||
|
if (activity != null) {
|
||||||
|
activity.runOnUiThread(() -> {
|
||||||
|
if (success) {
|
||||||
|
Toast.makeText(getActivity(), getString(R.string.sent_tx), Toast.LENGTH_SHORT).show();
|
||||||
|
getActivity().onBackPressed();
|
||||||
|
} else {
|
||||||
|
sendButton.setEnabled(true);
|
||||||
|
Toast.makeText(getActivity(), getString(R.string.error_sending_tx), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
@ -92,9 +92,9 @@ public class MoneroHandlerThread extends Thread implements WalletListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void newBlock(long height) {
|
public void newBlock(long height) {
|
||||||
if(isEveryNthBlock(height, 5)) { // refresh services every 5 blocks downloaded
|
if(isEveryNthBlock(height, 1)) { // refresh services every 5 blocks downloaded
|
||||||
refresh(height);
|
refresh(height);
|
||||||
} else if(isEveryNthBlock(height, 720)) { // save wallet every 720 blocks (~1 day), we also save upon finishing sync (in refreshed())
|
} else if(isEveryNthBlock(height, 5)) { // save wallet every 5 blocks (~10 minutes), we also save upon finishing sync (in refreshed())
|
||||||
wallet.store();
|
wallet.store();
|
||||||
}
|
}
|
||||||
BlockchainService.getInstance().setDaemonHeight(wallet.isSynchronized() ? height : 0);
|
BlockchainService.getInstance().setDaemonHeight(wallet.isSynchronized() ? height : 0);
|
||||||
|
@ -1,14 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:fillViewport="true"
|
|
||||||
android:fitsSystemWindows="true">
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp">
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/send_monero_textview"
|
android:id="@+id/send_monero_textview"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
@ -61,7 +56,7 @@
|
|||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:text="@string/selected_utxos_value"
|
android:text="@string/selected_utxos_value"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
android:visibility="visible"
|
android:visibility="invisible"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/send_monero_textview" />
|
app:layout_constraintTop_toBottomOf="@id/send_monero_textview" />
|
||||||
@ -126,20 +121,27 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<LinearLayout
|
<ScrollView
|
||||||
android:id="@+id/transaction_destination_list"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_marginTop="8dp"
|
android:fillViewport="true"
|
||||||
android:clickable="false"
|
android:fitsSystemWindows="true"
|
||||||
android:clipToPadding="false"
|
|
||||||
android:orientation="vertical"
|
|
||||||
app:layout_constraintBottom_toTopOf="@id/tx_fee_radiogroup"
|
app:layout_constraintBottom_toTopOf="@id/tx_fee_radiogroup"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/selected_utxos_value_textview">
|
app:layout_constraintTop_toBottomOf="@id/selected_utxos_value_textview">
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/transaction_destination_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:clickable="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:orientation="vertical"
|
||||||
|
>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
<!-- SEND LAYOUT -->
|
<!-- SEND LAYOUT -->
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/address_pending_textview"
|
android:id="@+id/address_pending_textview"
|
||||||
@ -195,17 +197,14 @@
|
|||||||
android:id="@+id/send_tx_button"
|
android:id="@+id/send_tx_button"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="24dp"
|
||||||
android:layout_marginStart="24dp"
|
|
||||||
android:layout_marginEnd="24dp"
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginStart="24dp"
|
||||||
|
android:layout_marginBottom="24dp"
|
||||||
android:background="@drawable/button_bg"
|
android:background="@drawable/button_bg"
|
||||||
android:text="@string/send"
|
android:text="@string/send"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:layout_marginBottom="16dp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/fee_textview"
|
tools:visibility="visible" />
|
||||||
tools:visibility="gone" />
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
|
|
||||||
</ScrollView>
|
|
@ -128,4 +128,5 @@
|
|||||||
<string name="transactions">Transactions</string>
|
<string name="transactions">Transactions</string>
|
||||||
<string name="auth">[ auth ]</string>
|
<string name="auth">[ auth ]</string>
|
||||||
<string name="to">To</string>
|
<string name="to">To</string>
|
||||||
|
<string name="max_outputs_allowed">Maximum allowed outputs</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user