backend_nfc
Serik.Uvaissov 2020-07-17 21:06:48 +06:00
parent 49c3cc5b8d
commit ef10080cd2
45 changed files with 4851 additions and 0 deletions

View File

@ -0,0 +1,65 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.EditText;
import android.widget.Toast;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.library.external.authorization.ActivationCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.ActivationType;
import timber.log.Timber;
public class ActivationCallbackHandlerImpl implements ActivationCallbackHandler {
private final M4BankActivity activity;
public ActivationCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onActivationTypeAndInfoRequested() {
Timber.i("FIRST STEP STARTED");
activity.getClientInterface().getAuthorizationManager().sendActivationFirstStepData(ActivationType.EMAIL, "dm@centercorptech.net");
}
@Override
public void onActivationCodeRequested(Integer codeLifetime) {
Timber.i("FIRST STEP COMPLETED");
Timber.i("SECOND STEP STARTED");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("ADD activation code:");
EditText editext = new EditText(activity);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface().getAuthorizationManager().sendActivationCode(editext.getText().toString());
dialog.dismiss();
});
builder.setView(editext);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onActivationConfirmRequested() {
Timber.i("SECOND STEP COMPLETED");
Timber.i("LAST STEP STARTED");
activity.getClientInterface().getAuthorizationManager().confirmActivation("1234", null);
}
@Override
public void onCompleted(Result result) {
Timber.i("COMPLETED WITH RESULT - " + result.getResultType());
}
@Override
public void onWrongApiCalled() {
Timber.i("WRONG API CALLED");
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,174 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.AlipayPaymentCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData;
import ru.m4bank.mpos.service.data.dynamic.objects.AlipayCodeType;
import ru.m4bank.mpos.service.data.dynamic.objects.IdentityCodeType;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import timber.log.Timber;
public class AlipayPaymentCallbackHandlerImpl implements AlipayPaymentCallbackHandler<Result> {
private final M4BankActivity activity;
public AlipayPaymentCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onWorkFlowDataRequested() {
Timber.d("WorkFlow requested");
}
@Override
public void onTransactionAmountRequested() {
activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount());
}
@Override
public void onTransactionDataRequested() {
activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(new AdditionalTransactionData.Builder(null).build());
}
@Override
public void onTransactionBarCodeRequested() {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("ADD QRCODE:");
EditText editext = new EditText(activity);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface().getTransactionManager().setTransactionBarCode(new IdentityCodeType(AlipayCodeType.QRCODE, editext.getText().toString()));
dialog.dismiss();
});
builder.setView(editext);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()),
Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription() == null ? "" : errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface()
.getTransactionManager()
.sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void notAuthorized() {
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult printerResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
}
}

View File

@ -0,0 +1,42 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import ru.m4bank.mpos.library.external.authorization.AuthorizationCallbackHandler;
import ru.m4bank.mpos.service.authorization.network.AuthorizationResponse;
public class AuthorizationCallbackHandlerImpl implements AuthorizationCallbackHandler {
private final M4BankActivity activity;
public AuthorizationCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onLoginAndPasswordRequested() {
activity.getClientInterface().getAuthorizationManager().sendLoginAndPassword(activity.getLogin(), activity.getPassword());
}
@Override
public void onCompleted(ru.m4bank.mpos.service.result.Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()),
Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(ru.m4bank.mpos.service.result.Result result, AuthorizationResponse authorizationResponse) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()),
Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,463 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog;
import ru.m4bank.mpos.library.external.transactions.CardPaymentCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ResultType;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData;
import ru.m4bank.mpos.service.data.dynamic.objects.GoodsData;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.VendorData;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.AccountingSubject;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxRate;
import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode;
import ru.m4bank.mpos.service.hardware.error.AllError;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.ButtonKeyboardDto;
import ru.m4bank.mpos.service.transactions.data.MessageButtonData;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.VirtualPinKeyboardData;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto;
import timber.log.Timber;
public class CardPaymentCallbackHandlerImpl implements CardPaymentCallbackHandler<Result> {
private final M4BankActivity activity;
private CustomKeyBoardDilalog customKeyBoardDilalog;
private TransactionTypeConv transactionTypeConv;
public CardPaymentCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
customKeyBoardDilalog = new CustomKeyBoardDilalog();
transactionTypeConv = TransactionTypeConv.UNKNOWN;
}
public CardPaymentCallbackHandlerImpl setTransactionTypeConv(TransactionTypeConv transactionTypeConv) {
this.transactionTypeConv = transactionTypeConv;
return this;
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
Timber.d("onDeviceToConnectSelectionRequested");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.selectCardReader(deviceListSpinner.getSelectedItem().toString());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
Timber.d("Reader has been received");
}
@Override
public void onNoBoundedDevicesFound() {
Timber.d("No bounded readers");
}
@Override
public void onDeviceToUseSelectionRequested(List<Reader> deviceList) {
Timber.d("onDeviceToUseSelectionRequested");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onTransactionAmountRequested() {
Timber.d("onTransactionAmountRequested");
activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount());
}
@Override
public void onTransactionDataRequested() {
Timber.d("onTransactionDataRequested");
List<GoodsData> goodsDataList = new ArrayList<>();
goodsDataList.add(new GoodsData.Builder()
.setOriginalPrice(100000L)
.setRealPrice(100000L)
.setName("Принтер")
.setQuantity(1)
.setCode("000001")
.setUnits("00")
.setDiscount(0L)
.setTaxRate(TaxRate.Tax_18)
.setExponent(2)
.setAccountingSubject(AccountingSubject.PRODUCT)
.build());
goodsDataList.add(new GoodsData.Builder()
.setOriginalPrice(30065L)
.setRealPrice(30065L)
.setName("Услуга")
.setQuantity(3)
.setCode("000002")
.setUnits("00")
.setDiscount(0L)
.setTaxRate(TaxRate.Tax_18)
.setExponent(2)
.setAccountingSubject(AccountingSubject.PRODUCT)
.build());
HashMap<String, String> vendorDescription = new HashMap<>();
vendorDescription.put("vendor", "description");
vendorDescription.put("vendor1", "description1");
vendorDescription.put("vendor2", "description2");
vendorDescription.put("vendor3", "description3");
VendorData vendorData = new VendorData(vendorDescription);
AdditionalTransactionData additionalTransactionData = new AdditionalTransactionData.Builder(goodsDataList).vendorData(vendorData).build();
activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(additionalTransactionData);
}
@Override
public void onWorkFlowDataRequested() {
Timber.d("WorkFlow requested");
}
@Override
public void onCompleted(Result result) {
Timber.d("onCompleted");
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
Timber.d("onWrongApiCalled");
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) {
Timber.d("onReceiveCardData");
if (shouldConfirmBeManuallyCalled) {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
}
@Override
public void onTransactionInit() {
//Impossible
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
Timber.d("onTransactionExecutionStatusChanged: " + newStatus.name());
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
if (transactionErrorData.getError() != null) {
activity.runOnUiThread(() -> Toast.makeText(activity, transactionErrorData.getError().getDescription(), Toast.LENGTH_LONG).show());
} else {
Timber.d("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription());
activity.runOnUiThread(() -> Toast.makeText(activity, String.format("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getFinalDescription()), Toast.LENGTH_LONG).show());
}
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
Timber.d("onErrorWithPossibilityToRetry: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription());
activity.runOnUiThread(() -> Toast.makeText(activity, String.format("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getFinalDescription()), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
Timber.d("onTransactionDataReceivedError");
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
Timber.d("onUserInformationRequested");
if (transactionTypeConv != TransactionTypeConv.CANCEL) {
activity.getClientInterface()
.getTransactionManager()
.sendTransactionUserData("signature", "phone", "vsa@centercorptech.net");
} else {
onTransactionCompleted();
}
}
@Override
public void onTransactionDataReceived(TransactionData data) {
Timber.d("onTransactionDataReceived");
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
Timber.d("onTransactionCompleted");
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRequiredHostAddress() {
Timber.d("onRequiredHostAddress");
activity.runOnUiThread(() -> Toast.makeText(activity, "Set Host Address", Toast.LENGTH_LONG)
.show());
activity.getClientInterface().getTransactionManager().setHostAddress("213.79.122.128", "8011");
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
Timber.d("onDisconnectedEventReceivedOrCanNotEstablishConnection");
if (reconnectAvailable) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
}
@Override
public void onConnectingProcessStarted(String deviceName) {
Timber.d("Connecting process started: %s", deviceName);
}
@Override
public void onReconnectNeededToProcess() {
Timber.d("onReconnectNeededToProcess");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
@Override
public void onReconciliationRequiredToProcess() {
Timber.d("onReconciliationRequiredToProcess");
Timber.d("Reconciliation required!!!");
activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction();
}
@Override
public void onReconciliationCompleted(Result result) {
Timber.d("onReconciliationCompleted");
Timber.d("Reconciliation completed!!!");
if (result.getResultType() == ResultType.SUCCESSFUL) {
activity.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation();
} else {
activity.runOnUiThread(() -> Toast.makeText(activity, "Reconciliation failed " + result.getDescription(), Toast.LENGTH_LONG)
.show());
}
}
@Override
public void notAuthorized() {
Timber.d("notAuthorized");
activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
Timber.d("onTransactionDetailsReceived");
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
Timber.d("onSuccessStatusTransaction");
}
@Override
public void onErrorStatusTransaction() {
Timber.d("onErrorStatusTransaction");
}
@Override
public void onRepeat(int attemptNumber) {
Timber.d("onRepeat");
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
Timber.d("onRequestedReportZ");
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
Timber.d("onCompletedPrinting");
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
Timber.d("onStatusFiscalModule");
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
Timber.d("onPrinterForRegistrationGettingCompleted");
}
@Override
public void onNoBoundedPrinterFound() {
Timber.d("onNoBoundedPrinterFound");
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
Timber.d("onPrinterToUseSelectionRequested");
}
@Override
public void onRequiredReversal(String description, ResultCode resultCode) {
Timber.d("onRequiredReversal: %s, resultCode: %s", description, resultCode.name());
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Revert last of operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().revertCurrentOperation(new RevertCurrentOperationCallbackHandlerImpl(activity)));
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().getTransactionManager().clearLastTransactionInformation());
builder.create().show();
});
}
@Override
public void onRequiredApplicationSelection(List<ApplicationIdConv> list) {
Timber.d("onRequiredApplicationSelection");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose application identifier");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<ApplicationIdConv> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.setTransactionApplicationIdentifier((ApplicationIdConv) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onActivityUpdateUiThread() {
Timber.d("onActivityUpdateUiThread");
activity.getClientInterface().getTransactionManager().addPinpadClickListener(activity);
}
@Override
public void onCreatePinPadButtons() {
Timber.d("onCreatePinPadButtons");
customKeyBoardDilalog.createDialog(activity);
customKeyBoardDilalog.show(activity);
ButtonKeyboardDto buttonKeyboardDto = new ButtonKeyboardDto.Build(
customKeyBoardDilalog.getBtnb1(),
customKeyBoardDilalog.getBtnb2(),
customKeyBoardDilalog.getBtnb3(),
customKeyBoardDilalog.getBtnb4(),
customKeyBoardDilalog.getBtnb5(),
customKeyBoardDilalog.getBtnb6(),
customKeyBoardDilalog.getBtnb7(),
customKeyBoardDilalog.getBtnb8(),
customKeyBoardDilalog.getBtnb9(),
customKeyBoardDilalog.getBtnb0(),
customKeyBoardDilalog.getBtncancel(),
customKeyBoardDilalog.getBtnconfirm(),
customKeyBoardDilalog.getBtnclean(),
activity.getWindowManager().getDefaultDisplay().getRotation()
).build();
activity.getClientInterface().getTransactionManager().addPinPadButtons(buttonKeyboardDto);
}
@Override
public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) {
Timber.d("onShowPinPadKeyBoard");
customKeyBoardDilalog.setText(messageButtonData);
}
@Override
public void onUpdateElementPin(int count) {
Timber.d("onUpdateElementPin");
activity.runOnUiThread(() -> Toast.makeText(activity, "count = " + count, Toast.LENGTH_SHORT).show());
}
@Override
public void onCloseKeyboard() {
Timber.d("onCloseKeyboard");
customKeyBoardDilalog.close(activity);
}
@Override
public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) {
activity.showSelectStyleDialog(additionalData ->
activity.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData));
}
public interface SelectStyleListener {
void onSelectStyle(VirtualPinKeyboardData virtualPinKeyboardData);
}
}

View File

@ -0,0 +1,215 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.List;
import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog;
import ru.m4bank.mpos.library.external.transactions.CardReadingCallbackHandler;
import ru.m4bank.mpos.service.commons.utils.ArrayUtils;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.SimpleCardTransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import timber.log.Timber;
public class CardReadingCallbackHandlerImpl implements CardReadingCallbackHandler<Result> {
private final M4BankActivity activity;
private CustomKeyBoardDilalog customKeyBoardDilalog;
public CardReadingCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
customKeyBoardDilalog = new CustomKeyBoardDilalog();
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.selectCardReader(deviceListSpinner.getSelectedItem().toString());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
Timber.d("Reader has been received");
}
@Override
public void onNoBoundedDevicesFound() {
Timber.d("No bounded readers");
}
@Override
public void onDeviceToUseSelectionRequested(List<Reader> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, ArrayUtils.newArrayList(deviceList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + result.getDescription(), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData errorData) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface()
.getTransactionManager()
.sendTransactionUserData("signature", "phone", "vsa@centercorptech.net");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
if (reconnectAvailable) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
}
@Override
public void onConnectingProcessStarted(String deviceName) {
Timber.d("Connecting process started");
}
@Override
public void onReconnectNeededToProcess() {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
@Override
public void notAuthorized() {
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onReceiveCommonCardData(SimpleCardTransactionData simpleCardTransactionData) {
String pan = simpleCardTransactionData.getCardNumber();
String expDate = simpleCardTransactionData.getCardExpiryDate();
String cardHolderName = simpleCardTransactionData.getCardHolderName();
activity.runOnUiThread(() -> Toast.makeText(activity, "card data: " + pan + " - " + expDate + " - " + cardHolderName, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequiredApplicationSelection(List<ApplicationIdConv> applicationOfList) {
// activity.runOnUiThread(() -> {
// AlertDialog.Builder builder = new AlertDialog.Builder(activity);
// builder.setTitle("Choose application identifier");
//
// Spinner deviceListSpinner = new Spinner(activity);
// ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, applicationOfList);
// adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// deviceListSpinner.setAdapter(adapter);
//
// builder.setPositiveButton("OK", (dialog, which) -> {
// activity.getClientInterface()
// .getTransactionManager()
// .setTransactionApplicationIdentifier(deviceListSpinner.getSelectedItem().toString());
// dialog.dismiss();
// });
//
// builder.setView(deviceListSpinner);
// builder.create().show();
// });
}
}

View File

@ -0,0 +1,334 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog;
import ru.m4bank.mpos.library.external.transactions.EasyCardRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode;
import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType;
import ru.m4bank.mpos.service.hardware.error.AllError;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.ButtonKeyboardDto;
import ru.m4bank.mpos.service.transactions.data.MessageButtonData;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto;
import timber.log.Timber;
public class CardRefundCallbackHandlerImpl implements EasyCardRefundCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
private CustomKeyBoardDilalog customKeyBoardDilalog;
public CardRefundCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
customKeyBoardDilalog = new CustomKeyBoardDilalog();
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
Timber.d("Reader has been received");
}
@Override
public void onNoBoundedDevicesFound() {
Timber.d("No bounded readers");
}
@Override
public void onDeviceToUseSelectionRequested(List<Reader> deviceList) {
Timber.d("onDeviceToUseSelectionRequested");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface().getTransactionManager().setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
Timber.d("onDeviceToConnectSelectionRequested");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface().getTransactionManager().selectCardReader(deviceListSpinner.getSelectedItem().toString());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onCompleted(Result result) {
Timber.d("onCompleted");
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()),
Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
Timber.d("onWrongApiCalled");
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) {
Timber.d("onReceiveCardData");
if (shouldConfirmBeManuallyCalled) {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
}
@Override
public void onRequiredReversal(String description, ResultCode resultCode) {
Timber.d("onRequiredReversal: %s, resultCode: %s", description, resultCode.name());
}
@Override
public void onRequiredApplicationSelection(List<ApplicationIdConv> list) {
Timber.d("onRequiredApplicationSelection");
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
Timber.d("onTransactionExecutionStatusChanged: %s", newStatus.name());
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
Timber.d("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription());
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
Timber.d("onErrorWithPossibilityToRetry: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription());
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
Timber.d("onTransactionDataReceivedError");
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
Timber.d("onUserInformationRequested");
activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
Timber.d("onTransactionDataReceived");
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
Timber.d("onTransactionCompleted");
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
Timber.d("onDisconnectedEventReceivedOrCanNotEstablishConnection");
}
@Override
public void onConnectingProcessStarted(String name) {
Timber.d("onConnectingProcessStarted: %s", name);
}
@Override
public void onReconnectNeededToProcess() {
Timber.d("onReconnectNeededToProcess");
}
@Override
public void onReconciliationRequiredToProcess() {
Timber.d("onReconciliationRequiredToProcess");
Timber.d("Reconciliation required!!!");
activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction();
}
@Override
public void onReconciliationCompleted(Result result) {
Timber.d("onReconciliationCompleted");
Timber.d("Reconciliation completed!!!");
}
@Override
public void notAuthorized() {
Timber.d("notAuthorized");
activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
Timber.d("onRepeat");
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
Timber.d("onRequestedReportZ");
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
Timber.d("onCompletedPrinting");
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
Timber.d("onStatusFiscalModule");
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
Timber.d("onPrinterForRegistrationGettingCompleted");
}
@Override
public void onNoBoundedPrinterFound() {
Timber.d("onNoBoundedPrinterFound");
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
Timber.d("onPrinterToUseSelectionRequested");
}
@Override
public void onRefundDataRequested() {
Timber.d("onRefundDataRequested");
activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General);
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
Timber.d("onTransactionsListReceived");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().makeCardRefund(this);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onActivityUpdateUiThread() {
Timber.d("onActivityUpdateUiThread");
activity.getClientInterface().getTransactionManager().addPinpadClickListener(activity);
}
@Override
public void onCreatePinPadButtons() {
Timber.d("onCreatePinPadButtons");
customKeyBoardDilalog.createDialog(activity);
customKeyBoardDilalog.show(activity);
ButtonKeyboardDto buttonKeyboardDto = new ButtonKeyboardDto.Build(
customKeyBoardDilalog.getBtnb1(),
customKeyBoardDilalog.getBtnb2(),
customKeyBoardDilalog.getBtnb3(),
customKeyBoardDilalog.getBtnb4(),
customKeyBoardDilalog.getBtnb5(),
customKeyBoardDilalog.getBtnb6(),
customKeyBoardDilalog.getBtnb7(),
customKeyBoardDilalog.getBtnb8(),
customKeyBoardDilalog.getBtnb9(),
customKeyBoardDilalog.getBtnb0(),
customKeyBoardDilalog.getBtncancel(),
customKeyBoardDilalog.getBtnconfirm(),
customKeyBoardDilalog.getBtnclean(),
activity.getWindowManager().getDefaultDisplay().getRotation()
).build();
activity.getClientInterface().getTransactionManager().addPinPadButtons(buttonKeyboardDto);
}
@Override
public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) {
Timber.d("onShowPinPadKeyBoard");
customKeyBoardDilalog.setText(messageButtonData);
}
@Override
public void onUpdateElementPin(int count) {
Timber.d("onUpdateElementPin");
activity.runOnUiThread(() -> Toast.makeText(activity, "count = " + count, Toast.LENGTH_SHORT).show());
}
@Override
public void onCloseKeyboard() {
Timber.d("onCloseKeyboard");
customKeyBoardDilalog.close(activity);
}
@Override
public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) {
activity.showSelectStyleDialog(additionalData ->
activity.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData));
}
@Override
public void onRequiredHostAddress() {
Timber.d("onRequiredHostAddress");
activity.runOnUiThread(() -> Toast.makeText(activity, "Set Host Address", Toast.LENGTH_LONG)
.show());
activity.getClientInterface().getTransactionManager().setHostAddress("213.79.122.128", "8011");
}
}

View File

@ -0,0 +1,186 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.CashPaymentCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData;
import ru.m4bank.mpos.service.data.dynamic.objects.GoodsData;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.AccountingSubject;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxRate;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import timber.log.Timber;
public class CashPaymentCallbackHandlerImpl implements CashPaymentCallbackHandler<Result> {
private final M4BankActivity activity;
public CashPaymentCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onWorkFlowDataRequested() {
Timber.d("WorkFlow requested");
}
@Override
public void onTransactionAmountRequested() {
activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount());
}
@Override
public void onTransactionDataRequested() {
List<GoodsData> goodsDataList = new ArrayList<>();
goodsDataList.add(new GoodsData.Builder()
.setOriginalPrice(100000L)
.setRealPrice(100000L)
.setName("Принтер")
.setQuantity(1)
.setCode("000001")
.setUnits("00")
.setDiscount(0L)
.setTaxRate(TaxRate.Tax_18)
.setExponent(2)
.setAccountingSubject(AccountingSubject.PRODUCT)
.build());
goodsDataList.add(new GoodsData.Builder()
.setOriginalPrice(30065L)
.setRealPrice(30065L)
.setName("Услуга")
.setQuantity(3)
.setCode("000002")
.setUnits("00")
.setDiscount(0L)
.setTaxRate(TaxRate.Tax_18)
.setExponent(2)
.setAccountingSubject(AccountingSubject.PRODUCT)
.build());
AdditionalTransactionData additionalTransactionData = new AdditionalTransactionData.Builder(goodsDataList).build();
activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(additionalTransactionData);
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()),
Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
Timber.d("onTransactionInit");
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface()
.getTransactionManager()
.sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult printerResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
}
}

View File

@ -0,0 +1,24 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import ru.m4bank.mpos.library.external.configuration.CheckConnectionCallbackHandler;
import ru.m4bank.mpos.service.result.CheckConnectionExternalResult;
public class CheckConnectionCallbackHandlerImpl implements CheckConnectionCallbackHandler {
private final M4BankActivity activity;
public CheckConnectionCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(CheckConnectionExternalResult result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()) + " " + result.isOnlineRegistration(), Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,54 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import com.landicorp.uns.result;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.CloseDayCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.handling.result.CloseDayResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.network.closeday.CloseDayResponseInfo;
class CloseDayCallbackHandlerImpl implements CloseDayCallbackHandler<Result> {
private final M4BankActivity activity;
CloseDayCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList, List<CloseDayResponseInfo> list1) {
activity.runOnUiThread(() -> Toast.makeText(activity, "onTransactionsListReceived - " + transactionList, Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(CloseDayResult closeDayResult) {
activity.runOnUiThread(() -> Toast.makeText(activity, closeDayResult.getResultType() + " " + (closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription()), Toast.LENGTH_SHORT)
.show());
}
}

View File

@ -0,0 +1,21 @@
package kz.com.aman.kassa.bank;
import android.app.Application;
import timber.log.Timber;
public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> {
Timber.v(ex.getMessage());
for (StackTraceElement element : ex.getStackTrace()) {
Timber.v(element.toString());
}
ex.printStackTrace();
System.exit(0);
});
}
}

View File

@ -0,0 +1,81 @@
package kz.com.aman.kassa.bank;
import org.apache.http.conn.scheme.LayeredSocketFactory;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.security.KeyStore;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
public class CustomSSLSocketFactory implements LayeredSocketFactory {
private SSLContext sslcontext = null;
private KeyStore keyStore = null;
public CustomSSLSocketFactory() {
}
public CustomSSLSocketFactory(KeyStore keyStore) {
this.keyStore = keyStore;
}
private SSLContext createEasySSLContext() throws IOException {
try {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[] { new CustomTrustManager(keyStore) }, null);
return context;
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
private SSLContext getSSLContext() throws IOException {
if (this.sslcontext == null) {
this.sslcontext = createEasySSLContext();
}
return this.sslcontext;
}
public Socket connectSocket(Socket sock, String host, int port,
InetAddress localAddress, int localPort, HttpParams params)
throws IOException {
int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
int soTimeout = HttpConnectionParams.getSoTimeout(params);
InetSocketAddress remoteAddress = new InetSocketAddress(host, port);
SSLSocket sslSocket = (SSLSocket) ((sock != null) ? sock : createSocket());
if ((localAddress != null) || (localPort > 0)) {
// we need to bind explicitly
if (localPort < 0) {
localPort = 0; // indicates "any"
}
InetSocketAddress isa = new InetSocketAddress(localAddress,
localPort);
sslSocket.bind(isa);
}
sslSocket.connect(remoteAddress, connTimeout);
sslSocket.setSoTimeout(soTimeout);
return sslSocket;
}
public Socket createSocket() throws IOException {
return getSSLContext().getSocketFactory().createSocket();
}
public boolean isSecure(Socket socket) throws IllegalArgumentException {
return true;
}
public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException {
return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose);
}
}

View File

@ -0,0 +1,40 @@
package kz.com.aman.kassa.bank;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class CustomTrustManager implements X509TrustManager {
private X509TrustManager standardTrustManager;
public CustomTrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
super();
TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
factory.init(keystore);
TrustManager[] trustManagers = factory.getTrustManagers();
if (trustManagers.length == 0) {
throw new NoSuchAlgorithmException("no trust manager found");
}
standardTrustManager = (X509TrustManager)trustManagers[0];
}
public void checkClientTrusted(X509Certificate[] certificates, String authType) throws CertificateException {
standardTrustManager.checkClientTrusted(certificates, authType);
}
public void checkServerTrusted(X509Certificate[] certificates, String authType) throws CertificateException {
if ((certificates != null) && (certificates.length == 1)) {
certificates[0].checkValidity();
}
}
public X509Certificate[] getAcceptedIssuers() {
return this.standardTrustManager.getAcceptedIssuers();
}
}

View File

@ -0,0 +1,144 @@
package kz.com.aman.kassa.bank;
import java.util.Calendar;
import java.util.Date;
import ru.m4bank.mpos.service.commons.Lists;
import ru.m4bank.mpos.service.data.dynamic.objects.CurrencyEnum;
import ru.m4bank.mpos.service.data.dynamic.objects.ExternalVerificationType;
import ru.m4bank.mpos.service.data.dynamic.objects.GoodsData;
import ru.m4bank.mpos.service.data.dynamic.objects.ProductsAndTransactionData;
import ru.m4bank.mpos.service.data.dynamic.objects.TransactionStatus;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.AccountingSubject;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxRate;
import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxSystem;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.CardTransTypeConv;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv;
import ru.m4bank.mpos.service.hardware.printer.dto.data.FiscalPrinterMerchantData;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrinterInformationCheck;
import ru.m4bank.mpos.service.hardware.printer.dto.data.TransactionSlipData;
import ru.m4bank.mpos.service.transactions.data.AccountingSign;
import ru.m4bank.mpos.service.transactions.data.CorrectionType;
import ru.m4bank.mpos.service.transactions.data.external.CurrencyAmount;
import ru.m4bank.mpos.service.transactions.data.external.ExternalCorrectionData;
import ru.m4bank.mpos.service.transactions.data.external.ExternalFiscalData;
import ru.m4bank.mpos.service.transactions.data.external.ExternalSlipData;
import ru.m4bank.mpos.service.transactions.data.external.ExternalStubData;
public class DataCreatorUtils {
public static ExternalCorrectionData makeCorrectionData() {
Calendar date = Calendar.getInstance();
date.set(2019, 3, 1);
return new ExternalCorrectionData.Builder()
.currencyAmount(makeCurrencyAmount())
.calculationSign(AccountingSign.INCOMING)
.correctionType(CorrectionType.INDEPENDENTLY)
.taxRate(TaxRate.Tax_20)
.cash(true)
.docNumber(С345454")
.docDate(date)
.docDescription(" ")
.stubData(makeStubData())
.build();
}
public static ExternalFiscalData makeFiscalData() {
return new ExternalFiscalData.Builder()
.cash(false)
.currency("643")
.phone("12345678")
.informationCheckData(makeInformationCheckData())
.productsAndTransactionData(makeProductsAndTransactionData())
.externalStubData(makeStubData())
.transactionTypeConv(TransactionTypeConv.PAYMENT)
.build();
}
public static ExternalSlipData makeSlipData(boolean newCheck) {
return new ExternalSlipData.Builder()
.currencyAmount(makeCurrencyAmount())
.cash(false)
.merchantData(makeMerchantData())
.newCheck(newCheck)
.transactionData(makeTransactionData())
.transactionType(TransactionTypeConv.PAYMENT)
.cashierName("Петров В.В.")
.build();
}
public static CurrencyAmount makeCurrencyAmount() {
return new CurrencyAmount.Builder().amount(10000).currencyCode(CurrencyEnum.RUS.getStringCurrency()).build();
}
public static FiscalPrinterMerchantData makeMerchantData() {
return new FiscalPrinterMerchantData.Builder()
.merchantAddress("улица Твардовского, Москва Россия")
.merchantId("1732056")
.merchantInn("123456489123")
.merchantName("Center of corporate technologies")
.build();
}
public static TransactionSlipData makeTransactionData() {
return new TransactionSlipData.Builder()
.applicationId("A40000100023056")
.authCode("447041")
.cardHolderName("IVANOV/I")
.currencyCode("643")
.hostResultCode("00")
.interaction(CardTransTypeConv.MAGNETIC_STRIPE)
.originalPan("************8888")
.pan("************8176")
.rrn("123456789")
.terminalNumber("00687879")
.terminalVerificationResults("00000")
.transactionDate(new Date())
.transactionStatus(TransactionStatus.APPROVED)
.typeCard("Mastercard")
.typeVerification(ExternalVerificationType.PIN)
.phone("88008008008562")
.build();
}
public static ExternalStubData makeStubData() {
return new ExternalStubData.Builder()
.shiftNumber("0001")
.factoryNumberKKT("0000000000")
.registerNumberKKT("00000000000000000")
.fiscalDocNumber("2780")
.fiscalMemoryNumber("9999078900003063")
.fiscalSign("32323933373534383633")
.formOfTaxation("УСН")
.merchantData(makeMerchantData())
.phone("12-12-12")
.productsAndTransactionData(makeProductsAndTransactionData())
.build();
}
private static ProductsAndTransactionData makeProductsAndTransactionData() {
return new ProductsAndTransactionData(
Lists.newArrayList(new GoodsData.Builder()
.setOriginalPrice(1500L)
.setRealPrice(1400L)
.setName("Товар")
.setQuantity(1)
.setCode("1")
.setUnits("00")
.setExponent(2)
.setDiscount(100L)
.setTaxRate(TaxRate.Tax_10)
.setAccountingSubject(AccountingSubject.OTHER)
.build()),
1400L, 100L, 1, CurrencyEnum.RUS, TaxSystem.Common);
}
public static PrinterInformationCheck makeInformationCheckData() {
return new PrinterInformationCheck.Builder()
.setCheckNumber("00")
.setDocNumber("1")
.setPd("00")
.setDateAndTime(new Date())
.setInn("7777777777")
.build();
}
}

View File

@ -0,0 +1,29 @@
package kz.com.aman.kassa.bank;
import kz.com.aman.kassa.BuildConfig;
import ru.m4bank.mpos.service.commons.utils.VirtualDeviceUtils;
import ru.m4bank.mpos.service.data.dynamic.objects.DeviceType;
public class DeviceTypeDefiner {
public DeviceType define() {
if (VirtualDeviceUtils.isDevice()) {
return DeviceType.SMART_POS;
}
String[] supportedDevices = BuildConfig.SUPPORTED_DEVICES;
if (containsIgnoreCase(supportedDevices, "SoftPos")) {
return DeviceType.SOFT_POS;
}
return DeviceType.PHONE;
}
private boolean containsIgnoreCase(String[] array, String checkValue) {
for (String arrayValue : array) {
if (arrayValue.equalsIgnoreCase(checkValue)) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,152 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.EasyAlipayRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
public class EasyAlipayRefundCallbackHandlerImpl implements EasyAlipayRefundCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
public EasyAlipayRefundCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRefundDataRequested() {
activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General);
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().makeAlipayRefund(this);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
}
}

View File

@ -0,0 +1,363 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.EasyReversalCardCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ResultType;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.MessageButtonData;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto;
import timber.log.Timber;
public class EasyCardReversalCallbackHandlerImpl implements EasyReversalCardCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
public EasyCardReversalCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
Timber.d("Reader has been received");
}
@Override
public void onNoBoundedDevicesFound() {
Timber.d("No bounded readers");
}
@Override
public void onConnectingProcessStarted(String deviceName) {
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
if (reconnectAvailable) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
}
@Override
public void onDeviceToConnectSelectionRequested(List deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.selectCardReader(deviceListSpinner.getSelectedItem().toString());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onWorkFlowDataRequested() {
}
@Override
public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) {
if (shouldConfirmBeManuallyCalled) {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
}
@Override
public void onRequiredReversal(String description, ResultCode resultCode) {
activity.runOnUiThread(() -> Toast.makeText(activity, "onRequiredReversal", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRequiredApplicationSelection(List<ApplicationIdConv> list) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "onTransactionDetailsReceived", Toast.LENGTH_LONG)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "onSuccessStatusTransaction", Toast.LENGTH_LONG)
.show());
}
@Override
public void onErrorStatusTransaction() {
activity.runOnUiThread(() -> Toast.makeText(activity, "onErrorStatusTransaction", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onReconciliationRequiredToProcess() {
Timber.d("Reconciliation required!!!");
activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction();
}
@Override
public void onReconciliationCompleted(Result result) {
Timber.d("Reconciliation completed!!!");
if (result.getResultType() == ResultType.SUCCESSFUL) {
activity.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation();
} else {
activity.runOnUiThread(() -> Toast.makeText(activity, "Reconciliation failed " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_LONG)
.show());
}
}
@Override
public void onRepeat(int attemptNumber) {
}
@Override
public void onTransactionAmountRequested() {
}
@Override
public void onTransactionDataRequested() {
}
@Override
public void onDeviceToUseSelectionRequested(List deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
activity.runOnUiThread(() -> builder.create().show());
});
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
if (errorHandler.getCode() != null && errorHandler.getDescription() != null) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Error Code: " + errorHandler.getCode() + " error Description: "
+ errorHandler.getDescription(), Toast.LENGTH_LONG)
.show());
} else {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getServerCode() + " "
+ errorHandler.getServerDescription(), Toast.LENGTH_LONG)
.show());
}
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "onTransactionDataReceivedError", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onReconnectNeededToProcess() {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
@Override
public void onWrongTerminal() {
}
@Override
public void onSelectTransaction() {
activity.getClientInterface().getTransactionManager().selectTransaction(transaction);
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().makeCardReversal(this);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onTransactionSelectionRequested(List<Transaction> transactionList) {
}
@Override
public void onActivityUpdateUiThread() {
}
@Override
public void onCreatePinPadButtons() {
}
@Override
public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) {
}
@Override
public void onUpdateElementPin(int i) {
}
@Override
public void onCloseKeyboard() {
}
@Override
public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) {
activity.showSelectStyleDialog(additionalData ->
activity.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData));
}
}

View File

@ -0,0 +1,152 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.EasyCashRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
public class EasyCashRefundCallbackHandlerImpl implements EasyCashRefundCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
public EasyCashRefundCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRefundDataRequested() {
activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General);
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().makeCashRefund(this);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
}
}

View File

@ -0,0 +1,157 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.EasyEcomRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
public class EasyEcomRefundCallbackHandlerImpl implements EasyEcomRefundCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
public EasyEcomRefundCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRefundDataRequested() {
activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General);
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().makeEcomRefund(this);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
}
@Override
public void onPreviewTransactionDataReceived(TransactionData transactionData) {
}
}

View File

@ -0,0 +1,176 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ReversalCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
public class EasyReversalCallbackHandlerImpl implements ReversalCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
public EasyReversalCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onTransactionSelectionRequested(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface().getTransactionManager().selectTransaction((Transaction) transactionListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onCardShortPanRequested() {
activity.getClientInterface().getTransactionManager().setCardShortPan("0069", 20, 0);
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
//activity.getClientInterface().getTransactionManager().sendTransactionUserData(null, "phone", "email");
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction reversal complete", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onSelectTransaction() {
activity.getClientInterface().getTransactionManager().selectTransaction(transaction);
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().makeEasyReversal(this);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> list) {
}
}

View File

@ -0,0 +1,136 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.EasyReversalSavedOperationCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
public class EasyReversalSavedOperationCallbackHandlerImpl implements EasyReversalSavedOperationCallbackHandler {
private M4BankActivity activity;
public EasyReversalSavedOperationCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onTransactionIsNotReversible() {
showMessage("onTransactionIsNotReversible");
}
@Override
public void onSelectTransaction() {
showMessage("onSelectTransaction");
}
@Override
public void onCompletedPrinting(PrinterResult result) {
showMessage("onCompletedPrinting");
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusDatat) {
showMessage("onStatusFiscalModule");
}
@Override
public void onTransactionSelectionRequested(List list) {
showMessage("onTransactionSelectionRequested");
}
@Override
public void onCardShortPanRequested() {
showMessage("onCardShortPanRequested");
}
@Override
public void notAuthorized() {
showMessage("notAuthorized");
}
@Override
public void onCompleted(Result result) {
showMessage("onCompleted");
}
@Override
public void onWrongApiCalled() {
showMessage("onWrongApiCalled");
}
@Override
public void onRequestedReportZ() {
showMessage("onRequestedReportZ");
}
@Override
public void onTransactionInit() {
showMessage("onTransactionInit");
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
showMessage("onTransactionExecutionStatusChanged: ");
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
showMessage("onUserInformationRequested");
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData errorData) {
showMessage("onError");
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
showMessage("onErrorWithPossibilityToRetry");
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
showMessage("onTransactionDataReceivedError");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
showMessage("onTransactionDataReceived");
}
@Override
public void onTransactionCompleted() {
showMessage("onTransactionCompleted");
}
@Override
public void onRepeat(int attemptNumber) {
showMessage("onRepeat");
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
showMessage("onPrinterForRegistrationGettingCompleted");
}
@Override
public void onNoBoundedPrinterFound() {
showMessage("onNoBoundedPrinterFound");
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
showMessage("onPrinterToUseSelectionRequested");
}
private void showMessage(String message) {
activity.runOnUiThread(() -> Toast.makeText(activity, message, Toast.LENGTH_LONG).show());
}
}

View File

@ -0,0 +1,173 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.EcomPaymentCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData;
import ru.m4bank.mpos.service.data.dynamic.objects.EmailStatus;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import timber.log.Timber;
public class EcomPaymentCallbackHandlerImpl implements EcomPaymentCallbackHandler<Result> {
private final M4BankActivity activity;
public EcomPaymentCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onWorkFlowDataRequested() {
Timber.d("WorkFlow requested");
}
@Override
public void onTransactionAmountRequested() {
activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount());
}
@Override
public void onTransactionDataRequested() {
activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(new AdditionalTransactionData.Builder(null).build());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
activity.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface()
.getTransactionManager()
.sendTransactionUserData("signature", "phone", "email");
}
@Override
public void onFormUrlRequested(String formUrl) {
activity.getClientInterface()
.getTransactionManager()
.sendEcomEmail("qrCode", null, "ap@m4bank.com", EmailStatus.SEND);
activity.runOnUiThread(() -> Toast.makeText(activity, "onFormUrlRequested " + formUrl, Toast.LENGTH_LONG)
.show());
}
@Override
public void onPreviewTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Preview Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult printerResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
}
}

View File

@ -0,0 +1,64 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.GetCardReaderInformationCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.result.GetCardReaderInformationResult;
import timber.log.Timber;
public class GetCardReaderInformationCallbackHandlerImpl implements GetCardReaderInformationCallbackHandler {
private final M4BankActivity activity;
public GetCardReaderInformationCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
}
@Override
public void onNoBoundedDevicesFound() {
}
@Override
public void onConnectingProcessStarted(String deviceName) {
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
}
@Override
public void onDeviceToUseSelectionRequested(List<Reader> deviceList) {
}
@Override
public void notAuthorized() {
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
}
@Override
public void onCompleted(GetCardReaderInformationResult result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.toString(), Toast.LENGTH_LONG).show());
Timber.d("GetCardReaderInformationResult : " + result);
}
@Override
public void onWrongApiCalled() {
}
}

View File

@ -0,0 +1,34 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import ru.m4bank.mpos.library.external.configuration.GetLicenseCallbackHandler;
import ru.m4bank.mpos.service.result.Result;
public class GetLicenseCallbackHandlerImpl implements GetLicenseCallbackHandler<Result> {
private final M4BankActivity activity;
public GetLicenseCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onLicenseReceived(String license) {
activity.runOnUiThread(() -> Toast.makeText(activity, license, Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,38 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.authorization.GetMerchantUsersCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.MerchantUser;
import ru.m4bank.mpos.service.result.Result;
public class GetMerchantUsersCallbackHandlerImpl implements GetMerchantUsersCallbackHandler<Result> {
private final M4BankActivity activity;
public GetMerchantUsersCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onListOfUsersRequested(List<MerchantUser> userList) {
activity.runOnUiThread(() -> Toast.makeText(activity, "loaded list of merchant users", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,84 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.GetTransactionDetailsCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.result.Result;
class GetTransactionDetailsCallbackHandlerImpl implements GetTransactionDetailsCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
GetTransactionDetailsCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received: " + transaction, Toast.LENGTH_SHORT)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
Transaction transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface()
.getTransactionManager()
.getTransactionDetails(this, transaction.getOperationalDayNumber(), transaction
.getTransactionNumber(), transaction.getMobileTerminalId());
dialog.dismiss();
});
builder.setView(transactionListSpinner);
builder.create().show();
});
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,62 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.GetTransactionDetailsCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.result.Result;
class GetTransactionListForRefundCallbackHandlerImpl implements GetTransactionDetailsCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private final CardRefundCallbackHandlerImpl cardRefundCallbackHandler;
GetTransactionListForRefundCallbackHandlerImpl(M4BankActivity activity, CardRefundCallbackHandlerImpl cardRefundCallbackHandler) {
this.cardRefundCallbackHandler = cardRefundCallbackHandler;
this.activity = activity;
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received: " + transaction, Toast.LENGTH_SHORT)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
cardRefundCallbackHandler.onTransactionsListReceived(transactionList);
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,133 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.LoadTerminalKeysCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode;
import ru.m4bank.mpos.service.hardware.network.external.TerminalKeyType;
import ru.m4bank.mpos.service.result.Result;
import timber.log.Timber;
class LoadTerminalKeysCallbackHandlerImpl implements LoadTerminalKeysCallbackHandler<Result> {
private final M4BankActivity activity;
public LoadTerminalKeysCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void notAuthorized() {
Timber.d("Not authorized");
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onKeyLoad(TerminalKeyType terminalKeyType, String description, ResultCode resultCode) {
Timber.d("key loaded".concat(terminalKeyType.name()));
}
@Override
public void onKeyReceived(TerminalKeyType terminalKeyType, String description, ResultCode resultCode) {
Timber.d("key loaded".concat(terminalKeyType.name()));
}
@Override
public void onError(String description, ResultCode resultCode) {
Timber.d("key loaded" + " onError");
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
Timber.d("Reader has been received");
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getCardReaderManager()
.selectCardReader(deviceListSpinner.getSelectedItem().toString());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onDeviceToUseSelectionRequested(List<Reader> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getCardReaderManager()
.setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onNoBoundedDevicesFound() {
Timber.d("No bounded readers");
}
@Override
public void onConnectingProcessStarted(String deviceName) {
Timber.d("onConnectingProcessStarted");
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
if (reconnectAvailable) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
}
}

View File

@ -0,0 +1,29 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import ru.m4bank.mpos.library.external.authorization.LogOutCallbackHandler;
import ru.m4bank.mpos.service.result.Result;
public class LogOutCallbackHandlerImpl implements LogOutCallbackHandler {
private final M4BankActivity activity;
public LogOutCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,77 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.PrintingCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrintingType;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import timber.log.Timber;
public class PrintingCallbackHandlerImpl implements PrintingCallbackHandler<Result, PrinterResult<PrinterErrorData, PrinterBaseData>> {
private final M4BankActivity activity;
public PrintingCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onRequestedReportZ() {
Timber.i("onRequestedReportZ");
activity.getClientInterface().getPrinterManager().printReport(this, PrintingType.Z_REPORT);
}
@Override
public void onCompletedPrinting(PrinterResult printerResult) {
Timber.i("onCompletedPrinting = " + printerResult);
activity.runOnUiThread(() -> Toast.makeText(activity, "onCompletedPrinting = " + printerResult, Toast.LENGTH_SHORT).show());
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
Timber.i("onPrinterForRegistrationGettingCompleted");
activity.runOnUiThread(() -> Toast.makeText(activity, "Saved printer - " + activity.getClientInterface().getPrinterManager().isSavedPrinterName(), Toast.LENGTH_SHORT).show());
}
@Override
public void onNoBoundedPrinterFound() {
Timber.i("onNoBoundedPrinterFound");
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
Timber.i("printerList = " + printerList);
activity.getClientInterface().getPrinterManager().selectPrinter(printerList.get(0).toString());
}
@Override
public void onCompleted(Result result) {
Timber.i("onCompleted = " + result.getResultType().toString());
}
@Override
public void onWrongApiCalled() {
Timber.i("onWrongApiCalled");
}
@Override
public void onRepeat(int attemptNumber) {
Timber.i("onRepeat");
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,73 @@
package kz.com.aman.kassa.bank;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.service.data.dynamic.objects.CurrencyEnum;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.printer.dto.data.ReconciliationData;
import ru.m4bank.mpos.service.hardware.printer.dto.data.ReconciliationOperationData;
import ru.m4bank.mpos.service.hardware.printer.dto.data.TransactionType;
import ru.m4bank.mpos.service.transactions.data.TransactionMoneyInteractionType;
public class ReconciliationPrinterDataBuilder {
public ReconciliationData build(List<Transaction> transactionList, boolean closeDay) {
ArrayList<ReconciliationOperationData> reconciliationOperationDataList = new ArrayList<ReconciliationOperationData>();
if (transactionList == null) return null;
for (Transaction transaction : transactionList) {
if (!isErrorStatus(transaction)) {
reconciliationOperationDataList.add(buildOneElement(transaction));
}
}
return new ReconciliationData(reconciliationOperationDataList, closeDay);
}
private ReconciliationOperationData buildOneElement(Transaction transaction) {
return new ReconciliationOperationData.Builder(
transaction.getAmount(),
transaction.getMaskedPan(),
CurrencyEnum.getCurrencyEnum(Integer.parseInt(transaction.getCurrency3DigitCode())),
getPrinterOperationType(transaction.getTransactionType()),
transaction.getExternalTerminalId(), transaction.getPiDataType().getTypePIData().equals(TransactionMoneyInteractionType.CASH.toString()))
.cardType(transaction.getCardType())
.date(transaction.getTransactionDate())
.checkId(transaction.getCheck())
.externalMerchantId(transaction.getExternalMerchantId())
.externalMerchantName(transaction.getExternalMerchantName())
.externalMerchantAdress(transaction.getExternalMerchantAddress())
.authorizationCode(transaction.getAuthorizationCode())
.refNumber(transaction.getRrn())
.time(transaction.getTransactionTime())
.build();
}
private TransactionType getPrinterOperationType(String type) {
if (type == null) return null;
switch (type.toUpperCase()) {
case "PAYMENT":
return TransactionType.INCOMING;
case "REFUND":
return TransactionType.INCOMING_REFUND;
case "REVERSAL":
return TransactionType.REVERSAL;
}
return null;
}
public static boolean isErrorStatus(Transaction transaction) {
if (transaction == null || transaction.getOperationStatus() == null) {
return true;
}
switch (transaction.getOperationStatus()) {
case COMPLETED:
case REVERSED:
case READER_TIMEOUT:
return false;
default:
return true;
}
}
}

View File

@ -0,0 +1,64 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ResendReceiptCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.result.Result;
class ResendReceiptCallbackHandlerImpl implements ResendReceiptCallbackHandler<Result>,
GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
ResendReceiptCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
Transaction transaction = (Transaction) transactionListSpinner.getSelectedItem();
activity.getClientInterface().getTransactionManager().resendReceipt(this, transaction, "vsa@centercorptech.net", null);
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,153 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.ReversalCallbackHandler;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.PrinterBaseData;
import ru.m4bank.mpos.service.data.PrinterErrorData;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
public class ReversalCallbackHandlerImpl implements ReversalCallbackHandler<Result> {
private final M4BankActivity activity;
public ReversalCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onTransactionSelectionRequested(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
transactionListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface().getTransactionManager().selectTransaction((Transaction) transactionListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(transactionListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onCardShortPanRequested() {
activity.getClientInterface().getTransactionManager().setCardShortPan("0069", 20, 0);
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show());
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show());
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
activity.getClientInterface().getTransactionManager().sendTransactionUserData(null, "phone", "email");
}
@Override
public void onTransactionDataReceived(TransactionData data) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onTransactionCompleted() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onRepeat(int attemptNumber) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onSelectTransaction() {
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> list) {
}
}

View File

@ -0,0 +1,308 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.LastReversalCardPaymentCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ResultType;
import ru.m4bank.mpos.service.data.FiscalStatusData;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode;
import ru.m4bank.mpos.service.hardware.error.ErrorHandler;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv;
import ru.m4bank.mpos.service.result.PrinterResult;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.MessageButtonData;
import ru.m4bank.mpos.service.transactions.data.TransactionData;
import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus;
import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData;
import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto;
import timber.log.Timber;
public class RevertCurrentOperationCallbackHandlerImpl implements LastReversalCardPaymentCallbackHandler<Result> {
private final M4BankActivity activity;
public RevertCurrentOperationCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
}
@Override
public void onNoBoundedDevicesFound() {
}
@Override
public void onConnectingProcessStarted(String deviceName) {
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
if (reconnectAvailable) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
}
@Override
public void onDeviceToConnectSelectionRequested(List deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.selectCardReader(deviceListSpinner.getSelectedItem().toString());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onWorkFlowDataRequested() {
}
@Override
public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) {
}
@Override
public void onRequiredReversal(String description, ResultCode resultCode) {
}
@Override
public void onRequiredApplicationSelection(List applicationOfList) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onRequestedReportZ() {
}
@Override
public void onCompletedPrinting(PrinterResult printerResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onReconciliationRequiredToProcess() {
Timber.d("Reconciliation required!!!");
activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction();
}
@Override
public void onReconciliationCompleted(Result result) {
Timber.d("Reconciliation completed!!!");
if (result.getResultType() == ResultType.SUCCESSFUL) {
activity.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation();
} else {
activity.runOnUiThread(() -> Toast.makeText(activity, "Reconciliation failed " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_LONG)
.show());
}
}
@Override
public void onRepeat(int attemptNumber) {
}
@Override
public void onTransactionAmountRequested() {
}
@Override
public void onTransactionDataRequested() {
}
@Override
public void onDeviceToUseSelectionRequested(List deviceList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
activity.getClientInterface()
.getTransactionManager()
.setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
activity.runOnUiThread(() -> builder.create().show());
}
@Override
public void onPrinterToUseSelectionRequested(List printerList) {
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onTransactionDataReceived(TransactionData data) {
}
@Override
public void onTransactionCompleted() {
}
@Override
public void onReconnectNeededToProcess() {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader());
builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel());
builder.create().show();
});
}
@Override
public void onWrongTerminal() {
}
@Override
public void onActivityUpdateUiThread() {
}
@Override
public void onCreatePinPadButtons() {
}
@Override
public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) {
}
@Override
public void onUpdateElementPin(int i) {
}
@Override
public void onCloseKeyboard() {
}
@Override
public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) {
}
}

View File

@ -0,0 +1,72 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.external.transactions.ScanBarCodeCallbackHandler;
import ru.m4bank.mpos.service.result.Result;
public class ScanBarCodeCallbackHandlerImpl implements ScanBarCodeCallbackHandler {
private final M4BankActivity activity;
public ScanBarCodeCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleteBarCode(String result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result, Toast.LENGTH_SHORT).show());
}
@Override
public void onError(String result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result, Toast.LENGTH_SHORT).show());
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
}
@Override
public void onNoBoundedDevicesFound() {
}
@Override
public void onConnectingProcessStarted(String s) {
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean b, String s) {
}
@Override
public void onDeviceToUseSelectionRequested(List list) {
}
@Override
public void notAuthorized() {
}
@Override
public void onDeviceToConnectSelectionRequested(List list) {
}
@Override
public void onCompleted(Result result) {
activity.runOnUiThread(() -> Toast.makeText(activity, (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
}
}

View File

@ -0,0 +1,24 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import ru.m4bank.mpos.library.external.configuration.SendRegisterRequestCallbackHandler;
import ru.m4bank.mpos.service.result.SendRegisterRequestExternalResult;
public class SendRegisterRequestCallbackHandlerImpl implements SendRegisterRequestCallbackHandler {
private final M4BankActivity activity;
public SendRegisterRequestCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCompleted(SendRegisterRequestExternalResult result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + result.getRequestCode() + " " + result.getStatus(), Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,11 @@
package kz.com.aman.kassa.bank;
import ru.m4bank.mpos.library.external.SessionExpiringCallbackHandler;
import timber.log.Timber;
public class SessionExpiringCallbackHandlerImpl implements SessionExpiringCallbackHandler {
@Override
public void onSessionExpired() {
Timber.w("SESSION EXPIRED!");
}
}

View File

@ -0,0 +1,5 @@
package kz.com.aman.kassa.bank;
public enum TerminalKeyTypeMpos {
Tmp, Tpk, Tak
}

View File

@ -0,0 +1,72 @@
package kz.com.aman.kassa.bank;
import android.widget.Toast;
import java.util.List;
import ru.m4bank.mpos.library.M4BankMposClientInterfaceFacade;
import ru.m4bank.mpos.library.external.transactions.XReportCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ResultType;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrintingType;
import ru.m4bank.mpos.service.result.Result;
import ru.m4bank.mpos.service.transactions.data.external.ExternalReconciliationData;
public class XReportCallbackHandlerImpl implements XReportCallbackHandler<Result> {
private PrintingType reportType;
private M4BankActivity activity;
private M4BankMposClientInterfaceFacade clientInterface;
public XReportCallbackHandlerImpl(M4BankMposClientInterfaceFacade clientInterface, PrintingType reportType, M4BankActivity activity) {
this.reportType = reportType;
this.activity = activity;
this.clientInterface = clientInterface;
}
@Override
public void onTransactionsListReceived(List<Transaction> list) {
if(list == null || list.isEmpty()) {
activity.runOnUiThread(() -> Toast.makeText(activity, "list of transaction is empty", Toast.LENGTH_SHORT).show());
} else {
ExternalReconciliationData data = new ExternalReconciliationData.Builder()
.reconciliationData(new ReconciliationPrinterDataBuilder().build(list, false))
.build();
printReport(clientInterface, reportType, data);
}
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onCompleted(Result result) {
if(result == null || result.getResultType() != ResultType.SUCCESSFUL) {
activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show());
}else if(result.getResultType() == ResultType.SUCCESSFUL){
// if code is successful and list is empty -> reconciliation is already done
activity.runOnUiThread(() -> Toast.makeText(activity, "list of transaction is empty", Toast.LENGTH_SHORT).show());
}
}
@Override
public void onWrongApiCalled() {
}
@Override
public void onRepeat(int i) {
}
private void printReport(M4BankMposClientInterfaceFacade clientInterface, PrintingType reportType, ExternalReconciliationData data) {
clientInterface.cancel();
if(reportType == PrintingType.RECONCILIATION_FULL_REPORT) {
clientInterface.getPrinterManager().printReconciliationReportFull(new PrintingCallbackHandlerImpl(activity), data);
} else {
clientInterface.getPrinterManager().printReconciliationReportShort(new PrintingCallbackHandlerImpl(activity), data);
}
}
}

View File

@ -0,0 +1,50 @@
package kz.com.aman.kassa.bank.builders;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
import ru.m4bank.mpos.service.network.retrofit.SSLConfiguration;
public class SslConfigurationBuilder {
public static SSLConfiguration buildAllTrustConfiguration(String serverAddress) {
X509TrustManager[] trustManager = getTrustManagers();
return new SSLConfiguration.Builder()
.trustManager(trustManager[0])
.hostnameVerifier(getHostnameVerifier(serverAddress))
.socketFactory(getSSLSocketFactory(trustManager))
.build();
}
private static HostnameVerifier getHostnameVerifier(String serverUrl) {
return (hostname, session) -> true;
}
private static X509TrustManager[] getTrustManagers() {
return new X509TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}};
}
private static SSLSocketFactory getSSLSocketFactory(X509TrustManager[] trustManager) {
try {
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManager, new java.security.SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
return null;
}
}
}

View File

@ -0,0 +1,128 @@
package kz.com.aman.kassa.bank.gui;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import kz.com.aman.kassa.R;
import ru.m4bank.mpos.service.transactions.data.MessageButtonData;
public class CustomKeyBoardDilalog {
Button btnb1, btnb2, btnb3, btnb4, btnb5, btnb6, btnb7, btnb8, btnb9, btnb0,
btncancel, btnconfirm, btnclean;
View view;
Dialog dialog;
public void createDialog(Context context) {
dialog = new Dialog(context);
view = LayoutInflater.from(context).inflate(R.layout.layout_pin, null);
btnb1 = (Button) view.findViewById(R.id.button1);
btnb2 = (Button) view.findViewById(R.id.button2);
btnb3 = (Button) view.findViewById(R.id.button3);
btnb4 = (Button) view.findViewById(R.id.button4);
btnb5 = (Button) view.findViewById(R.id.button5);
btnb6 = (Button) view.findViewById(R.id.button6);
btnb7 = (Button) view.findViewById(R.id.button7);
btnb8 = (Button) view.findViewById(R.id.button8);
btnb9 = (Button) view.findViewById(R.id.button9);
btnb0 = (Button) view.findViewById(R.id.button0);
btncancel = (Button) view.findViewById(R.id.buttoncan);
btnconfirm = (Button) view.findViewById(R.id.buttonconfirm);
btnclean = (Button) view.findViewById(R.id.buttonclean);
Window dialogWindow = dialog.getWindow();
dialogWindow.setGravity( Gravity.BOTTOM);
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.x = 0;
lp.y = 0;
view.measure(0, 0);
lp.height = view.getMeasuredHeight();
lp.alpha = 9f;
dialogWindow.setAttributes(lp);
dialog.setContentView(view);
}
public void show(Activity activity) {
if (!activity.isFinishing())
dialog.show();
}
public void close(Activity activity) {
if (!activity.isFinishing() && dialog != null && dialog.isShowing())
dialog.dismiss();
}
public void setText(MessageButtonData messageButtonData) {
btnb1.setText("" + messageButtonData.getBtnb1());
btnb2.setText("" + messageButtonData.getBtnb2());
btnb3.setText("" + messageButtonData.getBtnb3());
btnb4.setText("" + messageButtonData.getBtnb4());
btnb5.setText("" + messageButtonData.getBtnb5());
btnb6.setText("" + messageButtonData.getBtnb6());
btnb7.setText("" + messageButtonData.getBtnb7());
btnb8.setText("" + messageButtonData.getBtnb8());
btnb9.setText("" + messageButtonData.getBtnb9());
btnb0.setText("" + messageButtonData.getBtnb0());
}
public Button getBtnb1() {
return btnb1;
}
public Button getBtnb2() {
return btnb2;
}
public Button getBtnb3() {
return btnb3;
}
public Button getBtnb4() {
return btnb4;
}
public Button getBtnb5() {
return btnb5;
}
public Button getBtnb6() {
return btnb6;
}
public Button getBtnb7() {
return btnb7;
}
public Button getBtnb8() {
return btnb8;
}
public Button getBtnb9() {
return btnb9;
}
public Button getBtnb0() {
return btnb0;
}
public Button getBtncancel() {
return btncancel;
}
public Button getBtnconfirm() {
return btnconfirm;
}
public Button getBtnclean() {
return btnclean;
}
}

View File

@ -0,0 +1,10 @@
package kz.com.aman.kassa.bank.gui;
/**
* Created by pppoo on 27.02.2018.
*/
public interface SelectDialogCallback<ElementType> {
void onElementSelected(ElementType element);
void onCancelSelection();
}

View File

@ -0,0 +1,66 @@
package kz.com.aman.kassa.bank.gui;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
import kz.com.aman.kassa.R;
public class SelectElementDialog<ElementType> extends Dialog {
private Context context;
ArrayAdapter<ElementType> listAdapter;
private TextView labelTitle;
private ListView list;
private SelectDialogCallback<ElementType> selectDialogCallback;
public SelectElementDialog(final Context context, List<ElementType> elements, SelectDialogCallback<ElementType> selectDialogCallback) {
super(context);
this.context = context;
this.selectDialogCallback = selectDialogCallback;
setCancelable(false);
setCanceledOnTouchOutside(false);
init(elements);
list.setAdapter(listAdapter);
getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
list.setOnItemClickListener((arg0, arg1, arg2, arg3) -> {
ElementType element = (ElementType) arg0.getItemAtPosition(arg2);
selectDialogCallback.onElementSelected(element);
((Activity) context).runOnUiThread(this::dismiss);
});
}
private void init(List<ElementType> elements) {
setContentView(R.layout.custom_dialog_list);
labelTitle = findViewById(R.id.labelMessage);
list = findViewById(R.id.list);
listAdapter = new ArrayAdapter<ElementType>(context, R.layout.list_item, R.id.itemView, elements);
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
public void setTitle(String text) {
if (null != labelTitle)
labelTitle.setText(text);
}
public static void showError(Context context, String message) {
try {
Dialog dialog = new Dialog(context);
dialog.setTitle(message);
dialog.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,37 @@
package kz.com.aman.kassa.bank.managing;
import android.content.Context;
import android.content.SharedPreferences;
import static android.content.Context.MODE_PRIVATE;
public class PreferencesManager {
public enum Field {
LOGIN("Login"), PASSWORD("Password"), SERVER_URL("ServerUrl");
private String code;
Field(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
public static void saveStringField(Context context, Field field, String value) {
SharedPreferences preferences = context.getSharedPreferences("preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(field.getCode(), value).apply();
}
public static String loadStringField(Context context, Field field) {
return loadStringField(context, field, null);
}
public static String loadStringField(Context context, Field field, String defaultValue) {
SharedPreferences preferences = context.getSharedPreferences("preferences", MODE_PRIVATE);
return preferences.getString(field.getCode(), defaultValue);
}
}

View File

@ -0,0 +1,11 @@
package kz.com.aman.kassa.bank.permissions;
public interface PermissionsManager {
void checkPermissions(PermissionsCheckResultHandler handler);
void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults);
interface PermissionsCheckResultHandler {
void onPermissionsGranted();
void onPermissionsDeclined();
}
}

View File

@ -0,0 +1,65 @@
package kz.com.aman.kassa.bank.permissions;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class PermissionsManagerImpl implements PermissionsManager {
private static final int MY_PERMISSIONS_REQUEST = 107;
private static final String[] PERMISSIONS_LIST = new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private final Activity activity;
private PermissionsCheckResultHandler permissionsCheckResultHandler;
public PermissionsManagerImpl(Activity activity) {
this.activity = activity;
}
@Override
public void checkPermissions(PermissionsCheckResultHandler permissionsCheckResultHandler) {
for (String permission : PERMISSIONS_LIST) {
if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
this.permissionsCheckResultHandler = permissionsCheckResultHandler;
ActivityCompat.requestPermissions(activity, PERMISSIONS_LIST, MY_PERMISSIONS_REQUEST);
return;
}
}
permissionsCheckResultHandler.onPermissionsGranted();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST: {
if (grantResults.length == PERMISSIONS_LIST.length) {
if (arePermissionsGranted(grantResults)) {
permissionsCheckResultHandler.onPermissionsGranted();
} else {
permissionsCheckResultHandler.onPermissionsDeclined();
}
}
}
}
}
private boolean arePermissionsGranted(int[] grantResults) {
boolean access = true;
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED)
access = false;
}
return access;
}
}