cahier fixed, now it send redirect-signal with amout to pinpad and recieve redirect-success

This commit is contained in:
Ahmed Al-Omairi 2025-08-29 10:23:20 +03:00
parent 30055a1a14
commit 491fcb8d94
3 changed files with 157 additions and 16 deletions

View File

@ -3,31 +3,39 @@ package com.dspread.pos.ui.cashier;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.viewmodel.CreationExtras;
import com.dspread.pos.common.base.BaseFragment;
import com.dspread.pos.TitleProviderListener;
import com.dspread.pos.ui.main.MainActivity;
import com.dspread.pos.ui.main.MainViewModel;
import com.dspread.pos.ui.mulberry.MulberryViewModel;
import com.dspread.pos_android_app.R;
import com.dspread.pos_android_app.databinding.FragmentCashierBinding;
import com.dspread.pos_android_app.BR;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import org.json.JSONObject;
public class CashierFragment extends BaseFragment<FragmentCashierBinding, CashierViewModel >
implements TitleProviderListener{
private EditText etAmountInput;
@Override
public void initViewObservable() {
// Observe item click events
// Handle fragment navigation
// Observe payment info LiveData
viewModel.getPaymentInfo().observe(getViewLifecycleOwner(), paymentInfo -> {
@ -58,6 +66,109 @@ public class CashierFragment extends BaseFragment<FragmentCashierBinding, Cashie
return BR.viewModel;
}
@Override
public void initData() {
super.initData();
// Setup amount input field
setupAmountInput();
}
private void setupAmountInput() {
// Find the EditText in layout
etAmountInput = binding.getRoot().findViewById(R.id.etAmountInput);
if (etAmountInput != null) {
// Request focus
etAmountInput.requestFocus();
// Add text watcher to update amount in real-time
etAmountInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
String input = s.toString().trim();
if (!input.isEmpty()) {
try {
// Convert cents to dollars and update ViewModel
double dollars = Double.parseDouble(input) / 100.0;
viewModel.amount.set(String.format("%.2f", dollars));
} catch (NumberFormatException e) {
// Handle invalid input
viewModel.amount.set("0.00");
}
} else {
viewModel.amount.set("0.00");
}
}
});
// Set up Enter key listener
etAmountInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
handleEnterPressed();
return true;
}
return false;
}
});
// Handle physical keyboard Enter key
etAmountInput.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
handleEnterPressed();
return true;
}
return false;
}
});
}
}
private void handleEnterPressed() {
if (etAmountInput != null) {
String amount = etAmountInput.getText().toString().trim();
if (!amount.isEmpty()) {
try {
// Create JSON signal
JSONObject paymentData = new JSONObject();
paymentData.put("type", "redirect");
paymentData.put("amount", amount);
paymentData.put("currencySymbol", "$");
paymentData.put("id", "01534090202502210065");
paymentData.put("status", "signal");
// Send via WebSocket
viewModel.sendMessage(paymentData.toString());
// Reset input field
etAmountInput.setText("");
} catch (Exception e) {
Log.e("CashierFragment", "Error creating JSON", e);
}
}
}
}
@Override
public void onResume() {
super.onResume();
// Request focus when fragment resumes
if (etAmountInput != null) {
etAmountInput.requestFocus();
}
}
@NonNull
@Override
public CreationExtras getDefaultViewModelCreationExtras() {

View File

@ -165,7 +165,6 @@ public class CashierViewModel extends BaseAppViewModel {
}
@Override
protected void onPaymentRedirected(String jsonString) {
Log.d(TAG, "onPaymentRedirected - processing redirect payment");
@ -202,4 +201,15 @@ public class CashierViewModel extends BaseAppViewModel {
}
// Add this method to your existing CashierViewModel class:
public void sendMessage(String message) {
try {
sendWebSocketMessage(message);
} catch (Exception e) {
Log.e(TAG, "Error sending WebSocket message", e);
}
}
}

View File

@ -18,6 +18,26 @@
android:gravity="center"
android:padding="16dp">
<!-- Real-time amount display -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.amount + ` ` + viewModel.currencyCode}"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@color/black"
android:layout_marginTop="16dp"
android:gravity="center"/>
<EditText
android:id="@+id/etAmountInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:hint="Enter amount"
android:imeOptions="actionDone"
android:maxLines="1"/>
<!-- Waiting State -->
<LinearLayout
android:id="@+id/waitingLayout"
@ -30,7 +50,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Please tap or scan QR code on M50 pinpad"
android:text="Enter amount for pinpad M50 to pay"
android:textSize="18sp"
android:textStyle="bold"
android:gravity="center" />
@ -45,13 +65,13 @@
android:gravity="center"
android:visibility="@{viewModel.paymentStatus == PaymentStatus.SUCCESS ? View.VISIBLE : View.GONE}">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.amount + ` ` + viewModel.currencyCode}"
android:textSize="24sp"
android:textStyle="bold"
android:gravity="center" />
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="@{viewModel.amount + ` ` + viewModel.currencyCode}"-->
<!-- android:textSize="24sp"-->
<!-- android:textStyle="bold"-->
<!-- android:gravity="center" />-->
<Button
android:layout_width="wrap_content"