m4bank test-app inited

backend_nfc
Serik.Uvaissov 2020-07-10 22:21:48 +06:00
parent f8f646279f
commit e5f6cad039
59 changed files with 6503 additions and 54 deletions

View File

@ -46,7 +46,7 @@ android {
defaultConfig {
applicationId "com.example.aman_kassa_flutter"
minSdkVersion 18
minSdkVersion 21
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
@ -80,38 +80,49 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
//m4bank dependencies
//implementation (group: 'm4bank', name: 'zlibrary', version: '2093', ext: 'aar')
implementation("m4bank:zlibrary:2093@aar")
implementation (group: 'm4bank', name: 'cardreaderlib', version: '725')
implementation (group: 'm4bank', name: 'connectionreaders', version: '725')
//implementation deps.okhttp.core
//implementation deps.okhttp.logger
implementation("com.squareup.okhttp3:okhttp:4.7.2")
implementation("com.squareup.okhttp3:logging-interceptor:4.7.2")
//implementation deps.retrofit.core
//implementation deps.retrofit.converterGson
//implementation deps.retrofit.rxjava2Adapter
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//implementation deps.rx.core
//implementation deps.rx.android
//implementation deps.logback.core
//implementation(deps.logback.classic) {
// exclude group: 'com.google.android', module: 'android'
//m4bank dependencies
implementation deps.zlibrary
implementation deps.hardware.terminalCommon.values()
implementation deps.hardware.aisino.aisino_common
implementation deps.hardware.aisino.vm20.values()
implementation deps.hardware.wangpos.values()
implementation deps.hardware.roam.values()
implementation deps.hardware.spirelib
implementation deps.hardware.icmp.values()
implementation deps.hardware.atol.values()
// if (buildType.buildType == 'NFC') {
// implementation deps.hardware.softpos.softpaylibrary
// implementation deps.hardware.softpos.softpay_dependencies
// } else {
// implementation deps.hardware.aisino.a90.values()
// }
implementation 'ch.qos.logback:logback-core:1.2.3'
implementation ('ch.qos.logback:logback-classic:1.2.3') {
//implementation deps.hardware.softpos.softpaylibrary
//implementation deps.hardware.softpos.softpay_dependencies
implementation deps.hardware.aisino.a90.values()
implementation deps.hardware.shtrih.values()
implementation deps.hardware.redlib
implementation deps.hardware.sunmi
implementation deps.hardware.d200lib
//Implementation okhhtp library
implementation deps.okhttp.values()
//Implementation retrofit library
implementation deps.retrofit.values()
//Implementation rxJava library
implementation deps.rx.values()
//Implementation logback
implementation deps.logback.core
implementation(deps.logback.classic) {
exclude group: 'com.google.android', module: 'android'
}
//implementation deps.greendao
implementation 'org.greenrobot:greendao:3.3.0'
//implementation deps.timber
implementation 'com.jakewharton.timber:timber:4.7.1'
//implementation deps.paperdb
implementation 'io.paperdb:paperdb:2.6'
//implementation deps.retro_stream
implementation 'net.sourceforge.streamsupport:android-retrostreams:1.7.2'
//useWebsockets = true
//implementation deps.websockets
//Implementation other libraries
implementation deps.timber
implementation deps.paperdb
implementation deps.greendao
implementation deps.retro_stream
implementation deps.websockets // Only for useWebsockets parameter
}

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.aman_kassa_flutter">
<!--
io.flutter.app.FlutterApplication is an android.app.Application that
@ -14,12 +15,14 @@
<uses-permission android:name="android.permission.CAMERA" />
<application
tools:replace="android:label"
android:name="io.flutter.app.FlutterApplication"
android:icon="@mipmap/ic_launcher"
android:label="Аман Касса"
android:roundIcon="@mipmap/ic_launcher_rounded"
android:usesCleartextTraffic="true">
<activity android:name=".bank.BankActivity" android:theme="@android:style/Theme.Black.NoTitleBar"></activity>
<activity android:name=".bank.M4BankActivity" android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar"></activity>
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,65 @@
package com.example.aman_kassa_flutter.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,175 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,465 @@
package com.example.aman_kassa_flutter.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import com.example.aman_kassa_flutter.bank.gui.CustomKeyBoardDilalog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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,217 @@
package com.example.aman_kassa_flutter.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import com.example.aman_kassa_flutter.bank.gui.CustomKeyBoardDilalog;
import java.util.List;
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,336 @@
package com.example.aman_kassa_flutter.bank;
import android.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import com.example.aman_kassa_flutter.bank.gui.CustomKeyBoardDilalog;
import java.util.ArrayList;
import java.util.List;
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,187 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,52 @@
package com.example.aman_kassa_flutter.bank;
import android.widget.Toast;
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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,152 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,153 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,177 @@
package com.example.aman_kassa_flutter.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,174 @@
package com.example.aman_kassa_flutter.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,34 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,103 @@
package com.example.aman_kassa_flutter.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.GetSerialNumberCallbackHandler;
import ru.m4bank.mpos.service.data.dynamic.objects.Reader;
import ru.m4bank.mpos.service.result.GetSNResult;
import timber.log.Timber;
public class GetSerialNumberCallbackHandlerImpl implements GetSerialNumberCallbackHandler {
private final M4BankActivity activity;
public GetSerialNumberCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
}
@Override
public void onNoBoundedDevicesFound() {
activity.runOnUiThread(() -> Toast.makeText(activity, "onNoBoundedDevicesFound", Toast.LENGTH_SHORT).show());
}
@Override
public void onConnectingProcessStarted(String s) {
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean b, String s) {
}
@Override
public void notAuthorized() {
activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show());
}
@Override
public void onDeviceToConnectSelectionRequested(List list) {
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, list);
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 onDeviceToUseSelectionRequested(List list) {
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<>(list));
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 onCompleted(GetSNResult result) {
activity.runOnUiThread(() -> Toast.makeText(activity, result.getSerialNumber(), Toast.LENGTH_SHORT).show());
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> Toast.makeText(activity, "onWrongApiCalled", Toast.LENGTH_SHORT).show());
}
}

View File

@ -0,0 +1,84 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,814 @@
package com.example.aman_kassa_flutter.bank;
import android.app.AlertDialog;
import android.graphics.BitmapFactory;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.Formatter;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.example.aman_kassa_flutter.R;
import com.example.aman_kassa_flutter.bank.builders.SslConfigurationBuilder;
import com.example.aman_kassa_flutter.bank.gui.SelectDialogCallback;
import com.example.aman_kassa_flutter.bank.gui.SelectElementDialog;
import com.example.aman_kassa_flutter.bank.managing.PreferencesManager;
import com.example.aman_kassa_flutter.bank.permissions.PermissionsManager;
import com.example.aman_kassa_flutter.bank.permissions.PermissionsManagerImpl;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.android.LogcatAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import io.flutter.app.FlutterActivity;
import ru.m4bank.mpos.library.M4BankMposClient;
import ru.m4bank.mpos.library.M4BankMposClientInterfaceFacade;
import ru.m4bank.mpos.library.M4BankMposParameters;
import ru.m4bank.mpos.library.external.authorization.ActivationCallbackHandler;
import ru.m4bank.mpos.library.external.authorization.AuthorizationCallbackHandler;
import ru.m4bank.mpos.library.external.authorization.GetMerchantUsersCallbackHandler;
import ru.m4bank.mpos.library.external.authorization.LogOutCallbackHandler;
import ru.m4bank.mpos.library.external.configuration.CheckConnectionCallbackHandler;
import ru.m4bank.mpos.library.external.configuration.GetLicenseCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.CardReadingCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.CashPaymentCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.EasyCardRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.EasyCashRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetSerialNumberCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionDetailsCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.LastReversalCardPaymentCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ResendReceiptCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ReversalCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ScanBarCodeCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.XReportCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ConfigurationSettings;
import ru.m4bank.mpos.service.commons.data.NetworkConfiguration;
import ru.m4bank.mpos.service.commons.data.TerminalConfiguration;
import ru.m4bank.mpos.service.configuration.data.RegisterRequestData;
import ru.m4bank.mpos.service.data.dictionary.DictionaryCore;
import ru.m4bank.mpos.service.data.dictionary.LanguageCore;
import ru.m4bank.mpos.service.data.dictionary.MessageCore;
import ru.m4bank.mpos.service.data.dynamic.objects.GetOperationType;
import ru.m4bank.mpos.service.data.dynamic.objects.OperationType;
import ru.m4bank.mpos.service.data.dynamic.objects.PIDataType;
import ru.m4bank.mpos.service.data.dynamic.objects.ScanBarCodeScreenDataInput;
import ru.m4bank.mpos.service.data.dynamic.objects.TransactionFilterData;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv;
import ru.m4bank.mpos.service.hardware.network.external.TerminalKeyType;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrinterSeries;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrintingType;
import ru.m4bank.mpos.service.hardware.printer.dto.data.enums.SlipType;
import ru.m4bank.mpos.service.hardware.printer.dto.template.Align;
import ru.m4bank.mpos.service.hardware.printer.dto.template.BarcodeCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.ImageCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.PrintingTemplate;
import ru.m4bank.mpos.service.hardware.printer.dto.template.QRCodeCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.StringCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.StringSpan;
import ru.m4bank.mpos.service.hardware.printer.dto.template.TextStyle;
import ru.m4bank.mpos.service.network.Format;
import ru.m4bank.mpos.service.network.ServerChoose;
import ru.m4bank.mpos.service.transactions.data.VirtualPinKeyboardData;
import ru.m4bank.mpos.service.transactions.data.external.ExternalTemplateData;
import timber.log.Timber;
public class M4BankActivity extends FlutterActivity {
private M4BankMposClientInterfaceFacade clientInterface;
private AuthorizationCallbackHandler authorizationCallbackHandler;
private LogOutCallbackHandler logOutCallbackHandler;
private CheckConnectionCallbackHandler checkConnectionCallbackHandler;
private CardPaymentCallbackHandlerImpl cardPaymentCallbackHandler;
private CardReadingCallbackHandler cardReadingCallbackHandler;
private CashPaymentCallbackHandler cashPaymentCallbackHandler;
private AlipayPaymentCallbackHandlerImpl alipayPaymentCallbackHandler;
private EcomPaymentCallbackHandlerImpl ecomPaymentCallbackHandler;
private EasyCardRefundCallbackHandler cardRefundCallbackHandler;
private EasyCashRefundCallbackHandler easyCashRefundCallbackHandler;
private EasyAlipayRefundCallbackHandlerImpl easyAlipayRefundCallbackHandler;
private EasyEcomRefundCallbackHandlerImpl easyEcomRefundCallbackHandler;
private ReversalCallbackHandler easyReversalCallbackHandler;
private GetMerchantUsersCallbackHandler getMerchantUsersCallbackHandler;
private ActivationCallbackHandler activationCallbackHandler;
private GetLicenseCallbackHandler getLicenseCallbackHandler;
private ResendReceiptCallbackHandler resendReceiptCallbackHandler;
private GetTransactionDetailsCallbackHandler getTransactionDetailsCallbackHandler;
private PrintingCallbackHandlerImpl printingCallbackHandler;
private XReportCallbackHandler xReportCallbackHandler;
private LastReversalCardPaymentCallbackHandler revertCurrentOperationCallbackHandler;
private GetSerialNumberCallbackHandler getSerialNumberCallbackHandler;
private GetTransactionListForRefundCallbackHandlerImpl getTransactionListForRefundCallbackHandler;
private SendRegisterRequestCallbackHandlerImpl sendRegisterRequestCallbackHandler;
private EasyCardReversalCallbackHandlerImpl easyCardReversalCallbackHandler;
private CloseDayCallbackHandlerImpl closeDayCallbackHandler;
private LoadTerminalKeysCallbackHandlerImpl loadTerminalKeysCallbackHandler;
private ScanBarCodeCallbackHandler scanBarCodeCallbackHandler;
public M4BankMposClientInterfaceFacade getClientInterface() {
return clientInterface;
}
private LogcatAppender appender;
private String login;
private String password;
private PermissionsManager permissionsManager;
public String getLogin() {
return login;
}
public String getPassword() {
return password;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Timber.plant(new Timber.DebugTree());
setContentView(R.layout.activity_main);
new Handler();
PermissionsManager.PermissionsCheckResultHandler permissionsCheckResultHandler =
new PermissionsManager.PermissionsCheckResultHandler() {
@Override
public void onPermissionsGranted() {
init();
}
@Override
public void onPermissionsDeclined() {
Toast.makeText(M4BankActivity.this,
"Application can work incorrectly caused by missing permissions", Toast.LENGTH_SHORT)
.show();
init();
}
};
permissionsManager = new PermissionsManagerImpl(this);
permissionsManager.checkPermissions(permissionsCheckResultHandler);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
@NonNull int[] grantResults) {
permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void init() {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(lc);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
appender = new LogcatAppender();
appender.setContext(lc);
appender.setEncoder(encoder);
appender.start();
//слушатель активации
activationCallbackHandler = new ActivationCallbackHandlerImpl(this);
//слушатель авторизации
authorizationCallbackHandler = new AuthorizationCallbackHandlerImpl(this);
//слушатель завершения сессии
logOutCallbackHandler = new LogOutCallbackHandlerImpl(this);
//слушатель проверки коннекта с сервером и получения конфигурационных данных
checkConnectionCallbackHandler = new CheckConnectionCallbackHandlerImpl(this);
//слушатель получения данных карты
cardReadingCallbackHandler = new CardReadingCallbackHandlerImpl(this);
//слушатели для оплат
cardPaymentCallbackHandler = new CardPaymentCallbackHandlerImpl(this);
cashPaymentCallbackHandler = new CashPaymentCallbackHandlerImpl(this);
alipayPaymentCallbackHandler = new AlipayPaymentCallbackHandlerImpl(this);
ecomPaymentCallbackHandler = new EcomPaymentCallbackHandlerImpl(this);
//слушатели для возвратов
cardRefundCallbackHandler = new CardRefundCallbackHandlerImpl(this);
getTransactionListForRefundCallbackHandler = new GetTransactionListForRefundCallbackHandlerImpl(this,
(CardRefundCallbackHandlerImpl) cardRefundCallbackHandler);
easyCashRefundCallbackHandler = new EasyCashRefundCallbackHandlerImpl(this);
easyAlipayRefundCallbackHandler = new EasyAlipayRefundCallbackHandlerImpl(this);
//слушатели для отмен
//слушатель для отмены карточной операции без участия ридера
easyReversalCallbackHandler = new EasyReversalCallbackHandlerImpl(this);
//слушатель для отмены карточной операции с участием ридера
easyCardReversalCallbackHandler = new EasyCardReversalCallbackHandlerImpl(this);
//слушатель для отмены текущей операции, когда данные по транзакции сохранены в кеше и не производилась очистка или новая операция
revertCurrentOperationCallbackHandler = new RevertCurrentOperationCallbackHandlerImpl(this);
//слушатель для записи на терминал ключей
loadTerminalKeysCallbackHandler = new LoadTerminalKeysCallbackHandlerImpl(this);
//слушатель для получения списка мерчантов
getMerchantUsersCallbackHandler = new GetMerchantUsersCallbackHandlerImpl(this);
//слушатель поулчения лицензии
getLicenseCallbackHandler = new GetLicenseCallbackHandlerImpl(this);
//слушатель повторной отправки чека
resendReceiptCallbackHandler = new ResendReceiptCallbackHandlerImpl(this);
//слушатель получения информации о транзакциях и детальной информации по конкретной операции
getTransactionDetailsCallbackHandler = new GetTransactionDetailsCallbackHandlerImpl(this);
//заявка на mpos
sendRegisterRequestCallbackHandler = new SendRegisterRequestCallbackHandlerImpl(this);
//слушатель закрытия опер дня и сверки с сервером
closeDayCallbackHandler = new CloseDayCallbackHandlerImpl(this);
//слушатели печати
printingCallbackHandler = new PrintingCallbackHandlerImpl(this);
//слушатель для получения серийного номера
getSerialNumberCallbackHandler = new GetSerialNumberCallbackHandlerImpl(this);
//слушатель для считывания barcode
scanBarCodeCallbackHandler = new ScanBarCodeCallbackHandlerImpl(this);
initLoginForm();
initButton(R.id.getSerialNumber, v -> getSerialNumber());
initButton(R.id.activate, v -> clientInterface.getAuthorizationManager().activate(activationCallbackHandler));
initButton(R.id.logout,
v -> clientInterface.getAuthorizationManager().logOut(logOutCallbackHandler));
initButton(R.id.checkConnection, v -> clientInterface.getConfigurationManager()
.checkConnection(
checkConnectionCallbackHandler));
initButton(R.id.checkAccess, v -> {
String result;
if (clientInterface.getConfigurationManager()
.isOperationAllowed(
OperationType.getByCode(((Spinner) findViewById(R.id.checkAccessSpinner))
.getSelectedItem()
.toString()))) {
result = "YES";
} else {
result = "NO";
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
});
initButton(R.id.getAccesses, v -> {
StringBuilder result = new StringBuilder();
List<OperationType> availableOperations = clientInterface.getConfigurationManager()
.getAllowedOperationsList();
if (!availableOperations.isEmpty()) {
for (OperationType o : availableOperations) {
result.append(o.getCode()).append("\n");
}
} else {
result.append("No available operations");
}
Toast.makeText(this, result.toString(), Toast.LENGTH_SHORT).show();
});
initButton(R.id.getAccessPaymentInstruments, v -> {
boolean ecom = clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.ECOM);
boolean alipay =
clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.ALIPAY_STANDARD);
boolean card =
clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.CARD_STANDART);
boolean cash = clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.CASH);
});
initButton(R.id.cancel, v -> clientInterface.cancel());
initButton(R.id.getLicense, v -> {
clientInterface.cancel();
clientInterface.getConfigurationManager().getLicense(getLicenseCallbackHandler);
});
findViewById(R.id.getCommonCardData).setOnClickListener(v -> {
clientInterface.cancel();
clientInterface.getTransactionManager().getCommonCardData(cardReadingCallbackHandler);
});
//////////// вызовы оплат //////////////
initButton(R.id.makeCardPayment, v -> {
clientInterface.cancel();
cardPaymentCallbackHandler.setTransactionTypeConv(TransactionTypeConv.PAYMENT);
clientInterface.getTransactionManager().makeCardPayment(cardPaymentCallbackHandler);
});
initButton(R.id.makeCashPayment, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager().makeCashPayment(cashPaymentCallbackHandler);
});
initButton(R.id.ecomPayment, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager().makeEcomPayment(ecomPaymentCallbackHandler);
});
initButton(R.id.makeAlipayPayment,
v -> clientInterface.getTransactionManager().makeAlipayPayment(alipayPaymentCallbackHandler));
//////////// вызов подтверждения платежа и дисконнекта устройств//////////////
initButton(R.id.completePayment,
v -> clientInterface.getTransactionManager().completeTransaction());
//////////// вызовы отмен - хостовые терминалы//////////////
//////////// вызов отмены текущей транзакции с использованием слушателя оплаты (только во время транзакции)//////////////
initButton(R.id.makeReversalLast, v -> {
cardPaymentCallbackHandler.setTransactionTypeConv(TransactionTypeConv.CANCEL);
clientInterface.getTransactionManager().revertCurrentOperation(revertCurrentOperationCallbackHandler);
});
//////////// вызов отмены текущей транзакции с использованием нового слушателя (только во время транзакции) - хостовые терминалы//////////////
initButton(R.id.makeReversalLastWithCallback, v -> clientInterface.getTransactionManager()
.revertCurrentOperation(
revertCurrentOperationCallbackHandler));
/////////// вызовы отмены по карте//////////////
initButton(R.id.makeEasyCardReversal, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager()
.getTransactionsList(easyCardReversalCallbackHandler, 20, 0, GetOperationType.SHOW, null);
});
/////////// вызовы отмены на сервере//////////////
initButton(R.id.makeEasyReversal, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) easyReversalCallbackHandler,
20, 0, GetOperationType.SHOW,
null));
//////////// вызовы возвратов //////////////
initButton(R.id.makeCardRefund, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager()
.getTransactionsList(getTransactionListForRefundCallbackHandler, 20, 0,
GetOperationType.SHOW, null);
});
initButton(R.id.makeCashRefund, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager()
.getTransactionsList((GetTransactionsListCallbackHandler) easyCashRefundCallbackHandler, 20,
0, GetOperationType.SHOW, null);
});
initButton(R.id.makeAlipayRefund, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) easyAlipayRefundCallbackHandler,
20, 0, GetOperationType.SHOW,
null));
//////////// получение списка мерчантов //////////////
initButton(R.id.getMerchantUsers, v -> clientInterface.getAuthorizationManager()
.getMerchantUsers(getMerchantUsersCallbackHandler, 1000,
0));
//////////// повторная отправка чека на почту //////////////
initButton(R.id.resendReceipt, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) resendReceiptCallbackHandler,
20, 0, GetOperationType.SHOW,
null));
//////////// получение детальной информации о транзакции //////////////
initButton(R.id.getTransactionDetails, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) getTransactionDetailsCallbackHandler,
20, 0,
GetOperationType.SHOW,
null));
//////////// получение детальной информации о текущей транзакции//////////////
initButton(R.id.getCurrentTransactionDetails,
v -> clientInterface.getTransactionManager().getTransactionDetails(false));
//////////// получение спика транзакций с использованием фильтра //////////////
initButton(R.id.getTransactionListFilter, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) getTransactionDetailsCallbackHandler,
20, 0, GetOperationType.SEARCH,
new TransactionFilterData.Builder().setScanerCode(
"6354635635736647656").build()));
//////////// отправка данных для регистрации mpos - дополнительный функционал при активации//////////////
findViewById(R.id.sendRegisterRequest).setOnClickListener(v -> {
String url = "https://test.ponkratenko.ru";
clientInterface.getConfigurationManager()
.sendRegisterRequest(sendRegisterRequestCallbackHandler, getRegisterRequestData(), url);
});
//запись на терминал ключей tmk, tpk
findViewById(R.id.writeTerminalKeys).setOnClickListener(v -> {
String url = "https://test.ponkratenko.ru";
Set keysForDynamicUpdate = new HashSet<TerminalKeyType>() {{
add(TerminalKeyType.Tak);
add(TerminalKeyType.Tpk);
}};
clientInterface.getCardReaderManager()
.loadTerminalKeys(new LoadTerminalKeysCallbackHandlerImpl(this), keysForDynamicUpdate);
});
//////////// закрытие смены и сверка с сервером //////////////
initButton(R.id.closeDay,
v -> clientInterface.getTransactionManager().closeDay(closeDayCallbackHandler));
//////////// добавление принтера в систему с возможностью печати во время транзакций //////////////
initButton(R.id.addPrinter, v -> clientInterface.getPrinterManager()
.addNewPrinter(printingCallbackHandler,
PrinterSeries.NEW_PRINTER));
//////////// удаление принтера из системы //////////////
initButton(R.id.deletePrinter,
v -> clientInterface.getPrinterManager().clearSavedPrinterName());
initButton(R.id.printFiscal, v -> {
clientInterface.cancel();
clientInterface.getPrinterManager()
.printFiscalTransactionCheck(printingCallbackHandler, DataCreatorUtils.makeFiscalData());
});
initButton(R.id.printSlipCheck, v -> {
clientInterface.cancel();
clientInterface.getPrinterManager()
.printFirstSlipTransactionCheck(printingCallbackHandler, DataCreatorUtils.makeSlipData(true),
SlipType.ERROR);
});
initButton(R.id.printReportX, v1 -> {
clientInterface.cancel();
clientInterface.getPrinterManager().printReport(printingCallbackHandler, PrintingType.X_REPORT);
});
initButton(R.id.printReportZ, v2 -> {
clientInterface.cancel();
clientInterface.getPrinterManager().printReport(printingCallbackHandler, PrintingType.Z_REPORT);
});
initButton(R.id.printFullReport, v1 -> {
clientInterface.cancel();
xReportCallbackHandler =
new XReportCallbackHandlerImpl(clientInterface, PrintingType.RECONCILIATION_FULL_REPORT, this);
clientInterface.getPrinterManager().xReport(xReportCallbackHandler);
});
initButton(R.id.printShortReport, v2 -> {
clientInterface.cancel();
xReportCallbackHandler =
new XReportCallbackHandlerImpl(clientInterface, PrintingType.RECONCILIATION_SHORT_REPORT, this);
clientInterface.getPrinterManager().xReport(xReportCallbackHandler);
});
initButton(R.id.printTemplate, v -> {
clientInterface.cancel();
clientInterface.getPrinterManager().printTemplate(printingCallbackHandler,
new ExternalTemplateData.Builder().printingTemplate(buildPrintingTemplate()).build());
});
initButton(R.id.readBarCode, v2 -> showDialogScanner());
String savedServerUrl = PreferencesManager.loadStringField(this, PreferencesManager.Field.SERVER_URL,
getString(R.string.default_server_address_mpos_5_0_test));
String serverUrl;
if (savedServerUrl != null) {
serverUrl = savedServerUrl;
} else {
serverUrl = getString(R.string.default_server_address_mpos_5_0_test);
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose server");
EditText serverAddressForm = new EditText(this);
serverAddressForm.setText(serverUrl);
builder.setView(serverAddressForm);
builder.setPositiveButton("OK", (dialog, which) -> {
String model1 = Build.MODEL;
String brand2 = Build.BRAND;
String serverAddress = serverAddressForm.getText().toString();
PreferencesManager.saveStringField(M4BankActivity.this, PreferencesManager.Field.SERVER_URL, serverAddress);
clientInterface = M4BankMposClient.getInstance(
new M4BankMposParameters(
Format.JSON,
"rus",
null,
this,
new SessionExpiringCallbackHandlerImpl(),
"appName",
ServerChoose.API_5_0,
new ConfigurationSettings
.Builder()
.printerUsed(true)
.umkaEnabled(true)
.networkConfiguration(createNetworkConfiguration(serverAddress))
.terminalConfiguration(createTerminalConfiguration())
.build())
);
dialog.dismiss();
});
builder.create().show();
//Создание словаря
DictionaryCore aisinoDictionary =
new DictionaryCore(new HashMap<LanguageCore, HashMap<MessageCore, String>>() {{
put(LanguageCore.English, new HashMap<MessageCore, String>() {{
put(MessageCore.AisinoA90OfflinePin, "Please enter offline PIN");
put(MessageCore.AisinoA90OfflinePinRemain1, "Please enter offline PIN (Last try)");
put(MessageCore.AisinoA90OfflinePinRemain2, "Please enter offline PIN (Remain: 2)");
put(MessageCore.AisinoA90OfflinePinRemain3, "Please enter offline PIN (Remain: 3)");
put(MessageCore.AisinoA90OfflinePinRemain4, "Please enter offline PIN (Remain: 4)");
put(MessageCore.AisinoA90OnlinePin, "Please enter online PIN");
put(MessageCore.AisinoA90CompletingTransaction, "");
put(MessageCore.AisinoA90ContactlessMessage, "Please tap card");
put(MessageCore.AisinoA90ContactMessage, "Please insert card");
put(MessageCore.AisinoA90ReadSuccess, "PROCESSING");
put(MessageCore.AisinoA90InputPWD, "enter pin");
put(MessageCore.AisinoA90DefaultBottomButtonsText, "Cancel Clear Done");
put(MessageCore.AisinoPinpadCompleted, "COMPLETED");
put(MessageCore.AisinoPinpadDeclined, "DECLINED");
put(MessageCore.AisinoPinpadAmountHint, "");
put(MessageCore.KztCurrency, "KZT");
put(MessageCore.BynCurrency, "BYN");
put(MessageCore.EurCurrency, "EUR");
put(MessageCore.GelCurrency, "GEL");
put(MessageCore.JpyCurrency, "JPY");
put(MessageCore.KwdCurrency, "KWD");
put(MessageCore.RubCurrency, "RUB");
put(MessageCore.UsdCurrency, "USD");
put(MessageCore.AisinoPinpadScanning, "Text for test");
put(MessageCore.AisinoPinpadScanningCompleted, "Success for test");
}});
put(LanguageCore.Russian, new HashMap<MessageCore, String>() {{
put(MessageCore.AisinoA90OfflinePin, "Введите ПИН");
put(MessageCore.AisinoA90OfflinePinRemain1, "ПИН (Последняя попытка)");
put(MessageCore.AisinoA90OfflinePinRemain2, "ПИН (Осталось попыток: 2)");
put(MessageCore.AisinoA90OfflinePinRemain3, "ПИН (Осталось попыток: 3)");
put(MessageCore.AisinoA90OfflinePinRemain4, "ПИН (Осталось попыток: 4)");
put(MessageCore.AisinoA90OnlinePin, "Введите ПИН");
put(MessageCore.AisinoA90CompletingTransaction, "");
put(MessageCore.AisinoA90ContactlessMessage, "Предъявите карту");
put(MessageCore.AisinoA90ContactMessage, "Предъявите карту");
put(MessageCore.AisinoA90ReadSuccess, "ОБРАБОТКА");
put(MessageCore.AisinoA90InputPWD, "введите пин");
put(MessageCore.AisinoA90DefaultBottomButtonsText, "Отмена Очистить Готово");
put(MessageCore.AisinoPinpadCompleted, "ОДОБРЕНО");
put(MessageCore.AisinoPinpadDeclined, "ОТКЛОНЕНО");
put(MessageCore.AisinoPinpadAmountHint, "");
put(MessageCore.KztCurrency, "KZT");
put(MessageCore.BynCurrency, "BYN");
put(MessageCore.EurCurrency, "EUR");
put(MessageCore.GelCurrency, "GEL");
put(MessageCore.JpyCurrency, "JPY");
put(MessageCore.KwdCurrency, "KWD");
put(MessageCore.RubCurrency, "RUB");
put(MessageCore.UsdCurrency, "USD");
put(MessageCore.AisinoPinpadScanning, "Скан...");
put(MessageCore.AisinoPinpadScanningCompleted, "Успешно");
}});
}});
//обновление словаря в библиотеке ридера
initButton(R.id.updateDictionary, v -> updateDictionary(aisinoDictionary));
}
private void initButton(int id, View.OnClickListener onClickListener) {
findViewById(id).setOnClickListener(onClickListener);
}
private void initLoginForm() {
EditText loginField = findViewById(R.id.login);
EditText passwordField = findViewById(R.id.password);
loginField.setText(
PreferencesManager.loadStringField(M4BankActivity.this, PreferencesManager.Field.LOGIN, login));
passwordField.setText(
PreferencesManager.loadStringField(M4BankActivity.this, PreferencesManager.Field.PASSWORD, password));
initButton(R.id.authorize, v -> {
login = loginField.getText().toString();
password = passwordField.getText().toString();
PreferencesManager.saveStringField(M4BankActivity.this, PreferencesManager.Field.LOGIN, login);
PreferencesManager.saveStringField(M4BankActivity.this, PreferencesManager.Field.PASSWORD, password);
clientInterface.getAuthorizationManager().authorize(authorizationCallbackHandler);
});
}
private TerminalConfiguration createTerminalConfiguration() {
return new TerminalConfiguration.Builder()
.energySaverModeTime(150)
.pinLengthsArray(new byte[]{4, 6})
.shutDownModeTime(300)
.build();
}
private NetworkConfiguration createNetworkConfiguration(String serverUrl) {
return new NetworkConfiguration.Builder()
.sslConfiguration(SslConfigurationBuilder.buildAllTrustConfiguration(serverUrl))
.serverUrl(serverUrl)
.build();
}
private void showDialogScanner() {
String[] listItems = {"custom", "default"};
AlertDialog.Builder builder = new AlertDialog.Builder(M4BankActivity.this);
builder.setTitle("Choose scanner:");
builder.setItems(listItems, (dialog, which) -> showScanner(which));
AlertDialog dialog = builder.create();
dialog.show();
}
private void showScanner(int which) {
boolean isCustom;
if (which == 0) {
isCustom = true;
} else {
isCustom = false;
}
clientInterface.getCardReaderManager().scanBarCode(scanBarCodeCallbackHandler,
new ScanBarCodeScreenDataInput.Builder()
.setShowCustom(isCustom)
.setShowNextButton("true")
.setNextButtonText("Next button")
.setNextButtonTextColor("#999888")
.setNextButtonTextSize("20")
.setTitleBarText("Qr Scanner")
.setTitleTextSize("20")
.setTitleTextColor("#123456")
.setTitleColor("#987123")
.setDescriptionText("Описание")
.setDescriptionTextColor("#564637")
.setDescriptionTextSize("20")
.setScanHeight("200")
.setScanWidth("600")
.setSummText("2000")
.setSummColor("#666777")
.setSummSize("20")
.build());
}
private void updateDictionary(DictionaryCore dictionaryCore) {
clientInterface.getConfigurationManager().updateDictionary(dictionaryCore);
}
private void getSerialNumber() {
clientInterface.getCardReaderManager().getCardReaderSerialNumber(getSerialNumberCallbackHandler);
}
@Override
protected void onStart() {
super.onStart();
//
// ((EditText) findViewById(R.id.code)).setText("roam");
//// ((EditText) findViewById(R.id.code)).setText("201");
// ((EditText) findViewById(R.id.pin)).setText("1111");
//// ((EditText) findViewById(R.id.login)).setText("61");
//// ((EditText) findViewById(R.id.login)).setText("test2");
//// ((EditText) findViewById(R.id.login)).setText("dm@centercorptech.net");
// ((EditText) findViewById(R.id.login)).setText("ap@m4bank.com");
//// ((EditText) findViewById(R.id.password)).setText("qwer");
// ((EditText) findViewById(R.id.password)).setText("1111");
//// ((EditText) findViewById(R.id.password)).setText("1111");
}
@Override
protected void onDestroy() {
Timber.d("Shutdown");
if (clientInterface != null) {
clientInterface.shutdown();
}
super.onDestroy();
}
private RegisterRequestData getRegisterRequestData() {
String code = "1" + (int) (Math.random() * 1000) + "" + (int) (Math.random() * 1000) + "" +
(int) (Math.random() * 1000);
String date = new SimpleDateFormat("yyyy-MM-dd H:m:s").format(new Date());
String acquiringType = "mPOS";
String ip = "169.254.10.10";
try {
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
} catch (Exception e) {
e.printStackTrace();
}
RegisterRequestData result = new RegisterRequestData(code, date, acquiringType, ip);
result.setWebSite("http://fgfdgsfgsd.ru");
result.setRegion("г. Москва");
result.setCity("Moscow");
result.setOrganizationName("AlexCorp");
result.setInn("5785678");
result.setIndustry("dghdfgh");
result.setCellPointsCount("44");
result.setContactName("Alex");
result.setEmail("Alex@alex.com");
result.setPhone("+79859999999");
result.setUsingCard(true);
result.setAgreement(true);
return result;
}
public long getAmount() {
long amount;
try {
amount = Long.parseLong(((EditText) findViewById(R.id.amountField)).getText().toString());
} catch (Exception any) {
amount = 1;
}
return amount;
}
public HashMap<String, Object> getStyle(String style) {
HashMap<String, Object> style1 = new HashMap<>();
style1.put("TitleBackGroundColor", "#DB3F34");
style1.put("VirtualPinPadStyle", 6);
style1.put("PatternForAmountAndCurrency", "%s $");
style1.put("setBottomBtnText", new String[]{"Cancel", "Clear", "Done"});
HashMap<String, Object> style2 = new HashMap<>();
style2.put("TitleBackGroundColor", "#909090");
style2.put("VirtualPinPadStyle", 7);
style2.put("PatternForAmountAndCurrency", "$ %s");
style2.put("setBottomBtnText", new String[]{"Отмена", "Очистить", "Готово"});
style2.put("amountTextSize", 32);
style2.put("amountTextColor", "#333111");
style2.put("amountTextFont", "sans_serif_bold_italic");
style2.put("messageTextSize", 18);
style2.put("messageTextColor", "#333aaa");
style2.put("messageTextFont", "sans_serif_bold_italic");
style2.put("keyboardNumbersTextColor", "#111ccc");
style2.put("keyboardNumbersTextSize", 24);
style2.put("keyboardNumbersTextFont", "sans_serif_bold_italic");
style2.put("bottomButtonsTextSize", 14);
style2.put("bottomButtonsTextColor", "#ccc666");
style2.put("bottomButtonsTextFont", "sans_serif_bold_italic");
switch (style) {
case "Style 1":
return style1;
case "Style 2":
return style2;
default:
return style1;
}
}
public void showSelectStyleDialog(CardPaymentCallbackHandlerImpl.SelectStyleListener selectStyleListener) {
ArrayList<String> styles = new ArrayList<>();
styles.add("Style 1");
styles.add("Style 2");
runOnUiThread(() ->
new SelectElementDialog<>(M4BankActivity.this, styles, new SelectDialogCallback<String>() {
@Override
public void onElementSelected(String element) {
VirtualPinKeyboardData virtualPinKeyboardData =
new VirtualPinKeyboardData.Builder(getStyle(element)).build();
selectStyleListener.onSelectStyle(virtualPinKeyboardData);
}
@Override
public void onCancelSelection() {
}
}).show()
);
}
private PrintingTemplate buildPrintingTemplate() {
return new PrintingTemplate.Builder()
.append(new BarcodeCheckObject(Align.Center, 100, 300, true, "Hello kitty"))
.append(new StringCheckObject(new StringSpan.Builder("Test short simple string").build()))
.append(new StringCheckObject(new StringSpan.Builder(
"Test long simple string. It's a pretty long string for being more that check with.").build()))
.append(new StringCheckObject(new StringSpan.Builder("Test short italic center string.")
.alignment(Align.Center)
.textStyle(TextStyle.Italic)
.build()))
.append(new StringCheckObject(new StringSpan.Builder("Test bold italic right large font string.")
.alignment(Align.Right)
.fontSize(30)
.textStyle(TextStyle.ItalicBold)
.build()))
.append(new StringCheckObject(new StringSpan.Builder("Test gray left small string.")
.graylevel(5)
.fontSize(15)
.build()))
.append(new QRCodeCheckObject(Align.Center, 100, "Hello kitty"))
.append(new ImageCheckObject(
BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_call)))
.build();
}
}

View File

@ -0,0 +1,77 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,154 @@
package com.example.aman_kassa_flutter.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,309 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.bank;
public enum TerminalKeyTypeMpos {
Tmp, Tpk, Tak
}

View File

@ -0,0 +1,72 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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,129 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.bank.gui;
/**
* Created by pppoo on 27.02.2018.
*/
public interface SelectDialogCallback<ElementType> {
void onElementSelected(ElementType element);
void onCancelSelection();
}

View File

@ -0,0 +1,65 @@
package com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.R;
import java.util.List;
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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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 com.example.aman_kassa_flutter.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;
}
}

View File

@ -3,7 +3,7 @@ package com.example.aman_kassa_flutter
import android.app.Activity
import android.content.Intent
import androidx.annotation.NonNull
import com.example.aman_kassa_flutter.bank.BankActivity
import com.example.aman_kassa_flutter.bank.M4BankActivity
import com.example.aman_kassa_flutter.bank.MusicPlugin
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
@ -25,8 +25,9 @@ class MainActivity: FlutterActivity() {
call, result ->
if (call.method == "start") {
_result = result
val intent= Intent(this, BankActivity::class.java)
val intent= Intent(this, M4BankActivity::class.java)
startActivityForResult(intent, 8989)
//result.success("ActivityStarted")
} else {
result.notImplemented()

View File

@ -0,0 +1,476 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.example.aman_kassa_flutter.bank.M4BankActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/authorize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/authorize_button" />
<EditText
android:id="@+id/amountField"
android:layout_weight="1"
android:inputType="numberDecimal"
android:hint="@string/amount_hint"
android:layout_width="0dp"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/login"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/login_hint"
android:inputType="text" />
<EditText
android:id="@+id/password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/password_hint"
android:inputType="textPassword" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/logout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/logout_button" />
<!--<Button-->
<!--android:id="@+id/changePassword"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_gravity="center_horizontal"-->
<!--android:text="@string/change_password_button" />-->
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--<EditText-->
<!--android:id="@+id/oldPassword"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_weight="1"-->
<!--android:hint="@string/old_password_hint"-->
<!--android:inputType="textPassword" />-->
<!--<EditText-->
<!--android:id="@+id/newPassword"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_weight="1"-->
<!--android:hint="@string/new_password_hint"-->
<!--android:inputType="textPassword" />-->
</LinearLayout>
<!--<Button-->
<!--android:id="@+id/register"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:text="@string/register_button" />-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--<EditText-->
<!--android:id="@+id/code"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_weight="1"-->
<!--android:hint="@string/code_hint"-->
<!--android:inputType="number" />-->
<!--<EditText-->
<!--android:id="@+id/pin"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_weight="1"-->
<!--android:hint="@string/pin_hint"-->
<!--android:inputType="number" />-->
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<Button
android:id="@+id/checkAccess"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/check_access" />
<Spinner
android:id="@+id/checkAccessSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/accessTypes" />
</LinearLayout>
<Button
android:id="@+id/getAccesses"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/get_available_operations" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<!--<Button-->
<!--android:id="@+id/setLanguage"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/set_language" />-->
<!--<Spinner-->
<!--android:id="@+id/setLanguageSpinner"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:entries="@array/languages" />-->
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/checkConnection"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/check_connection" />
<Button
android:id="@+id/getLicense"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/get_license" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/makeCardPayment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/make_card_payment" />
<Button
android:id="@+id/getCommonCardData"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/get_common_card_data" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/makeReversalLast"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/make_reversal_last" />
<Button
android:id="@+id/getCurrentTransactionDetails"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/get_current_transaction_details" />
<Button
android:id="@+id/completePayment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/complete_payment" />
</LinearLayout>
<Button
android:id="@+id/getSerialNumber"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/getSerialNumber" />
<Button
android:id="@+id/makeReversalLastWithCallback"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_reversal_last_saved_operation" />
<Button
android:id="@+id/makeCashPayment"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_cash_payment" />
<Button
android:id="@+id/makeAlipayPayment"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_alipay_payment" />
<Button
android:id="@+id/makeCardRefund"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_card_refund" />
<!--<Button-->
<!--android:id="@+id/makeCardRefundWithD200"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/make_card_refund_with_d200" />-->
<Button
android:id="@+id/makeCashRefund"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_cash_refund" />
<!--<Button-->
<!--android:id="@+id/makeCashRefundWithD200"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/make_cash_refund_with_d200" />-->
<Button
android:id="@+id/makeAlipayRefund"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_alipay_refund" />
<!--<Button-->
<!--android:id="@+id/makeReversal"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/make_reversal" />-->
<Button
android:id="@+id/makeEasyReversal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_easy_reversal" />
<Button
android:id="@+id/makeEasyCardReversal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_easy_card_reversal" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--<Button-->
<!--android:id="@+id/makeReconciliation"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/make_reconciliation" />-->
<!--<Button-->
<!--android:id="@+id/enterServiceMenu"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/enter_service_menu" />-->
</LinearLayout>
<!--<Button-->
<!--android:id="@+id/addAdditionalCardReader"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/add_additional_card_reader" />-->
<!--<Button-->
<!--android:id="@+id/getReadersInfo"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/get_readers_info" />-->
<Button
android:id="@+id/getMerchantUsers"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/get_merchant_users" />
<Button
android:id="@+id/resendReceipt"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/resend_receipt" />
<Button
android:id="@+id/getTransactionDetails"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/get_transaction_details" />
<Button
android:id="@+id/getTransactionListFilter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/get_filter_list" />
<Button
android:id="@+id/activate"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/activate" />
<Button
android:id="@+id/addPrinter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/add_new_printer" />
<Button
android:id="@+id/deletePrinter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/delete_printer" />
<Button
android:id="@+id/printFiscal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/printing_fiscal_check" />
<Button
android:id="@+id/printSlipCheck"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/printing_slip_check" />
<Button
android:id="@+id/printTemplate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/print_template" />
<Button
android:id="@+id/printReportX"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/printing_x_report" />
<Button
android:id="@+id/printReportZ"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/printing_z_report" />
<Button
android:id="@+id/printFullReport"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/printing_full_report" />
<Button
android:id="@+id/printShortReport"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/printing_short_report" />
<!--<Button-->
<!--android:id="@+id/executeExternalApplication"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:text="@string/call_external_application" />-->
<Button
android:id="@+id/sendRegisterRequest"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/send_register_request" />
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/cancel_interface" />
<Button
android:id="@+id/ecomPayment"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/make_ecom_payment" />
<Button
android:id="@+id/getAccessPaymentInstruments"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/get_access_payment_instruments" />
<Button
android:id="@+id/closeDay"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/close_day" />
<Button
android:id="@+id/writeTerminalKeys"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/write_terminal_keys" />
<Button
android:id="@+id/readBarCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/read_barcode" />
<Button
android:id="@+id/updateDictionary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/update_dictionary" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<TextView
android:id="@+id/labelMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:text="Choose element" />
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/labelMessage"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:cacheColorHint="#00000000"
android:divider="@android:color/transparent"
android:dividerHeight="1dp"
android:listSelector="@android:color/transparent" />
</RelativeLayout>

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="New Text"
android:textSize="30sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_3" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_4" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_5" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_6" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_7" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_8" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_9" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.36"
android:orientation="horizontal">
<Button
android:id="@+id/button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_0" />
<Button
android:id="@+id/buttoncan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cancel" />
<Button
android:id="@+id/buttonconfirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/confirm" />
<Button
android:id="@+id/buttonclean"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clear" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/buttonstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_start" />
<Button
android:id="@+id/buttonexit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pin_text_btn_exit" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/itemView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:padding="20dp"
android:textColor="@android:color/black" />
</RelativeLayout>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>

View File

@ -0,0 +1,5 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>

View File

@ -1 +1,104 @@
<resources></resources>
<resources>
<string name="app_name">TestAppM4bank</string>
<string name="authorize_button">Authorize</string>
<string name="logout_button">Log Out</string>
<string name="change_password_button">Change Password</string>
<string name="login_hint">Enter Your Login</string>
<string name="password_hint">Enter Your Password</string>
<string name="old_password_hint">Enter Old Password</string>
<string name="new_password_hint">Enter New Password</string>
<string name="register_button">Register</string>
<string name="code_hint">Enter Reader Code</string>
<string name="pin_hint">Enter Reader Pin</string>
<string name="serial_hint">Enter Reader Serial Number</string>
<string name="default_server_address1">http://10.10.0.245:29978</string>
<string name="default_server_address2">http://10.45.49.31:29978</string>
<string name="default_server_address_sber_test">http://sbertest.m4bank.ru:21017</string>
<!--<string name="default_server_address_mpos_5_0_test">http://217.174.185.218:35997</string>-->
<string name="default_server_address_mpos_5_0_test">http://10.31.0.40:5000</string>
<string name="check_access">Check access</string>
<string name="get_available_operations">Get available operations</string>
<string name="set_language">Set language</string>
<string name="check_connection">Check connection</string>
<string name="make_card_payment">Make card payment</string>
<string name="get_common_card_data">Get common card data</string>
<string name="add_additional_card_reader">Add additional card reader</string>
<string name="get_readers_info">Get readers info</string>
<string name="make_cash_payment">Make cash payment</string>
<string name="make_alipay_payment">Make alipay payment</string>
<string name="make_card_refund">Make card refund</string>
<string name="make_card_refund_with_d200">Make card refund with D200</string>
<string name="make_cash_refund_with_d200">Make easy cash refund</string>
<string name="make_alipay_refund">Make alipay refund</string>
<string name="make_cash_refund">Make cash refund</string>
<string name="make_reversal">Make reversal</string>
<string name="make_easy_reversal">Make easy reversal</string>
<string name="make_easy_card_reversal">Make easy card reversal</string>
<string name="make_reconciliation">Make reconciliation</string>
<string name="get_merchant_users">Get merchant users</string>
<string name="get_access_payment_instruments">Get access PI</string>
<string name="close_day">Close day</string>
<string name="write_terminal_keys">Write terminal keys</string>
<string name="read_barcode">Read BarCode</string>
<string name="update_dictionary">Update Dictionary</string>
<string-array name="accessTypes">
<item>Payment</item>
<item>Reversal</item>
<item>Refund</item>
<item>Cash</item>
<item>PartRefund</item>
<item>AddReader</item>
<item>CloseDay</item>
<item>AddPrinter</item>
<item>FuncPrinter</item>
</string-array>
<string-array name="languages">
<item>rus</item>
<item>eng</item>
</string-array>
<string name="confirm">confirm</string>
<string name="clear">clear</string>
<string name="cancel">cancel</string>
<string name="resend_receipt">Resend receipt</string>
<string name="get_transaction_details">Get transaction details</string>
<string name="get_filter_list">Get filter list</string>
<string name="activate">Activate</string>
<string name="add_new_printer">Add new printer</string>
<string name="delete_printer">Delete printer</string>
<string name="printing_fiscal_check">Printing fiscal check</string>
<string name="printing_slip_check">Printing slip check</string>
<string name="print_template">print template</string>
<string name="printing_x_report">Printing X report</string>
<string name="printing_z_report">Printing Z report</string>
<string name="printing_full_report">Printing full report</string>
<string name="printing_short_report">Printing short report</string>
<string name="call_external_application">Call external application</string>
<string name="send_register_request">Send register request</string>
<string name="cancel_interface">Cancel interface</string>
<string name="make_ecom_payment">Make ecom payment</string>
<string name="enter_service_menu">Enter service menu</string>
<string name="make_reversal_last_saved_operation">Make reversal last saved operation</string>
<string name="getSerialNumber">Get Serial Number</string>
<string name="pin_text_btn_1">1</string>
<string name="pin_text_btn_2">2</string>
<string name="pin_text_btn_3">3</string>
<string name="pin_text_btn_4">4</string>
<string name="pin_text_btn_5">5</string>
<string name="pin_text_btn_6">6</string>
<string name="pin_text_btn_7">7</string>
<string name="pin_text_btn_8">8</string>
<string name="pin_text_btn_9">9</string>
<string name="pin_text_btn_0">0</string>
<string name="pin_text_btn_start">start</string>
<string name="pin_text_btn_exit">exit</string>
<string name="get_license">Get license</string>
<string name="make_reversal_last">Make reversal last</string>
<string name="get_current_transaction_details">Get current transaction details</string>
<string name="complete_payment">Complete payment</string>
<string name="amount_hint">Amount</string>
</resources>

View File

@ -9,10 +9,110 @@ buildscript {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
ext.buildType = [
'buildType': ''
]
ext.versions = [
'supportLibrary': '28.0.0',
'okhttp' : '3.8.1',
'retrofit' : '2.3.0',
'multidex' : '1.0.2',
'logback' : '1.1.1-6'
]
ext.deps = [
'okhttp' : [
'core' : "com.squareup.okhttp3:okhttp:${versions.okhttp}",
'logger': "com.squareup.okhttp3:logging-interceptor:${versions.okhttp}",
],
'retrofit' : [
'core' : "com.squareup.retrofit2:retrofit:${versions.retrofit}",
'converterGson' : "com.squareup.retrofit2:converter-gson:${versions.retrofit}",
'rxjava2Adapter': 'com.squareup.retrofit2:adapter-rxjava2:2.3.0',
],
'rx' : [
'core' : 'io.reactivex.rxjava2:rxjava:2.1.7',
'android': 'io.reactivex.rxjava2:rxandroid:2.0.1',
],
'logback' : [
'core' : "com.github.tony19:logback-android-core:${versions.logback}",
'classic': "com.github.tony19:logback-android-classic:${versions.logback}",
],
'timber' : 'com.jakewharton.timber:timber:4.5.1',
'paperdb' : 'io.paperdb:paperdb:2.1',
'sdpAndroid' : 'com.intuit.sdp:sdp-android:1.0.4',
'slf4jApi' : 'org.slf4j:slf4j-api:1.7.21',
'greendao' : 'org.greenrobot:greendao:3.2.2',
'websockets' : 'org.java-websocket:Java-WebSocket:1.4.0',
'retro_stream': 'net.sourceforge.streamsupport:android-retrostreams:1.6.3',
'hardware' : [
"terminalCommon": [
"cardreaderlib" : "m4bank:cardreaderlib:750",
"connectionreaders": "m4bank:connectionreaders:750",
"emv-taglib" : "external:emv-taglib:2.4",
],
'aisino' : [
"aisino_common": "m4bank:aisino_common:138",
"vm20" : [
"vm20" : "external:vm20sdk:9",
"asinalib": "m4bank:asinalib:99"
],
"a90" : [
"aisinoprinterlib": "m4bank:aisinoprinterlib:152",
"aisino_a90lib" : "m4bank:aisino_a90lib:422",
"aisino_a90deps" : "m4bank:aisino_a90deps:master-1.1.42@aar",
],
],
'wangpos' : [
"wangposlib" : "m4bank:wangposlib:53",
"wangposprinterlibrary": "m4bank:wangposprinterlibrary:35",
"SDK4BaseBinder" : "external:SDK4BaseBinder:2.1.5",
"SDK4EmvBinder" : "external:SDK4EmvBinder:2.1.5",
"SDK4KeyManagerBinder" : "external:SDK4KeyManagerBinder:2.1.5"
],
'atol' : [
"fiscalprinterlibrary": "m4bank:fiscalprinterlibrary:93",
"atol_core" : "external:atol_core:1@aar"
],
'shtrih' : [
"FptrServiceAndroid": "m4bank:FptrServiceAndroid:3",
"shtrih_core" : "external:shtrihjpos:1"
],
"icmp" : [
"icmplibrary" : "m4bank:icmplibrary:16",
"icmp_dependencies": "m4bank:icmp_dependencies:1.1.1.2@aar"
],
"roam" : [
"roamlib" : "roamlib:roamlib2:207",
"roamreaderAAR": "external:roamreaderunifiedapiAAR:1@aar"
],
"spirelib" : "m4bank:spirelib:138",
"softpos" : [
"softpaylibrary" : "m4bank:softpaylibrary:41@aar",
"softpay_dependencies": "m4bank:softpay_dependencies:1.1.1.53@aar",
],
"sunmi" : "m4bank:sunmiv1printerlibrary:5",
"redlib" : "m4bank:redlib:1",
"d200lib" : "m4bank:d200lib:9",
],
"zlibrary" : "m4bank:zlibrary:2134@aar"
]
ext.currentRepository = "http://217.174.185.218:55555/artifactory/gradle-dev"
}
allprojects {
repositories {
maven {
url currentRepository
content {
includeGroupByRegex "external.*"
includeGroupByRegex "m4bank.*"
includeGroupByRegex "roamlib.*"
}
}
google()
jcenter()
}

View File

@ -29,7 +29,6 @@ class LoginView extends StatefulWidget {
}
class _LoginViewState extends State<LoginView> {
TextEditingController emailController;
TextEditingController passwordController;
@ -45,9 +44,11 @@ class _LoginViewState extends State<LoginView> {
@override
void initState() {
super.initState();
if(widget.loginModel!=null && widget.loginModel.authType == AuthenticateTypeLogin) {
if (widget.loginModel != null &&
widget.loginModel.authType == AuthenticateTypeLogin) {
emailController = TextEditingController(text: widget.loginModel.login);
passwordController = TextEditingController(text: widget.loginModel.password);
passwordController =
TextEditingController(text: widget.loginModel.password);
} else {
emailController = TextEditingController();
passwordController = TextEditingController();
@ -83,7 +84,14 @@ class _LoginViewState extends State<LoginView> {
height: 150,
child: Image.asset('assets/images/logo.png'),
),
Positioned(child: Text('онлайн касса', style: TextStyle(fontWeight: FontWeight.bold),), bottom: 23.0,left: 25.0,),
Positioned(
child: Text(
'онлайн касса',
style: TextStyle(fontWeight: FontWeight.bold),
),
bottom: 23.0,
left: 25.0,
),
],
),
@ -107,10 +115,13 @@ class _LoginViewState extends State<LoginView> {
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
BusyButton(
SizedBox(
width: 100,
child: BusyButton(
title: 'Войти',
busy: vm.isLoading,
onPressed: _pressBtnEnter,
),
)
],
),
@ -132,7 +143,8 @@ class _LoginViewState extends State<LoginView> {
}
_pressBtnEnter() async {
if(emailController.text!=null && emailController.text.toLowerCase().trim().startsWith('test')){
if (emailController.text != null &&
emailController.text.toLowerCase().trim().startsWith('test')) {
_apiService.test = true;
} else {
_apiService.test = false;