diff --git a/android/app/build.gradle b/android/app/build.gradle index 6cc7126..16b6b08 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -50,6 +50,7 @@ android { targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -62,16 +63,37 @@ android { } } buildTypes { +// all { +// buildConfigField ("String[]", "SUPPORTED_DEVICES", collectSupportedDevicesToArray()) +// } debug { shrinkResources false minifyEnabled false + useProguard false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + defaultConfig { + minSdkVersion 24 + } } release { - signingConfig signingConfigs.release shrinkResources false minifyEnabled false + useProguard false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release } } + + compileOptions { + //coreLibraryDesugaringEnabled true + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + } flutter { @@ -79,8 +101,28 @@ flutter { } dependencies { + //coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + + // https://mvnrepository.com/artifact/com.google.code.gson/gson + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' + + + implementation 'com.android.support:multidex:1.0.3' + //m4bank dependencies + } + +//def collectSupportedDevicesToArray() { +// return '{' + rootProject.ext."supportedDevices${getProject().name}".collect { +// "\"${it}\"" +// }.join(",") + '}' +//} + + diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..88e52af --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,26 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\android_sdk\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} +#Flutter Wrapper +-keep class io.flutter.app.** { *; } +-keep class io.flutter.plugin.** { *; } +-keep class io.flutter.util.** { *; } +-keep class io.flutter.view.** { *; } +-keep class io.flutter.** { *; } +-keep class io.flutter.plugins.** { *; } +#M4Bank Wrapper +-keep class java9.util.stream.** { *; } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6c9b830..e771add 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,51 +1,62 @@ + - + FlutterApplication and put your custom class here. + --> - - - - - + + /> + --> - - + + + - + - + + \ No newline at end of file diff --git a/android/app/src/main/assets/sounds/card_prompt.aac b/android/app/src/main/assets/sounds/card_prompt.aac new file mode 100644 index 0000000..c97b4f5 Binary files /dev/null and b/android/app/src/main/assets/sounds/card_prompt.aac differ diff --git a/android/app/src/main/assets/sounds/card_read.wav b/android/app/src/main/assets/sounds/card_read.wav new file mode 100644 index 0000000..ec84dea Binary files /dev/null and b/android/app/src/main/assets/sounds/card_read.wav differ diff --git a/android/app/src/main/assets/sounds/error.wav b/android/app/src/main/assets/sounds/error.wav new file mode 100644 index 0000000..f224049 Binary files /dev/null and b/android/app/src/main/assets/sounds/error.wav differ diff --git a/android/app/src/main/java/kz/com/aman/kassa/model/AmanDao.java b/android/app/src/main/java/kz/com/aman/kassa/model/AmanDao.java new file mode 100644 index 0000000..a72beb2 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/model/AmanDao.java @@ -0,0 +1,43 @@ +package kz.com.aman.kassa.model; + +import java.util.ArrayList; +import java.util.List; + +public class AmanDao { + private boolean success; + private String msg; + private E data; + private List rows = new ArrayList<>(); + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public E getData() { + return data; + } + + public void setData(E data) { + this.data = data; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/model/CardData.java b/android/app/src/main/java/kz/com/aman/kassa/model/CardData.java new file mode 100644 index 0000000..7961365 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/model/CardData.java @@ -0,0 +1,58 @@ +package kz.com.aman.kassa.model; + +public class CardData { + private Integer transactionNumber; + private String cardExpiryDate; + private String cardNumber; + private String transactionType; + private String cardPaymentSystemType; + private String authorizationCode; + + public String getAuthorizationCode() { + return authorizationCode; + } + + public void setAuthorizationCode(String authorizationCode) { + this.authorizationCode = authorizationCode; + } + + public String getCardExpiryDate() { + return cardExpiryDate; + } + + public void setCardExpiryDate(String cardExpiryDate) { + this.cardExpiryDate = cardExpiryDate; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } + + public String getCardPaymentSystemType() { + return cardPaymentSystemType; + } + + public void setCardPaymentSystemType(String cardPaymentSystemType) { + this.cardPaymentSystemType = cardPaymentSystemType; + } + + public Integer getTransactionNumber() { + return transactionNumber; + } + + public void setTransactionNumber(Integer transactionNumber) { + this.transactionNumber = transactionNumber; + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java b/android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java new file mode 100644 index 0000000..5ed9b3e --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java @@ -0,0 +1,60 @@ +package kz.com.aman.kassa.model; + +import java.sql.Timestamp; + +public class TransactionDao { + String cardType; + String cardExpireDate; + String cardNumber; + String transactionType; + Long amount; + String date; + + public void setDate(String date) { + this.date = date; + } + + public String getDate() { + return date; + } + + public String getCardType() { + return cardType; + } + + public void setCardType(String cardType) { + this.cardType = cardType; + } + + public String getCardExpireDate() { + return cardExpireDate; + } + + public void setCardExpireDate(String cardExpireDate) { + this.cardExpireDate = cardExpireDate; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java b/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java new file mode 100644 index 0000000..9697a81 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java @@ -0,0 +1,307 @@ +package kz.com.aman.kassa.plugins; + +import android.content.ComponentName; +import android.content.Intent; +import android.os.Build; + + +import com.google.gson.Gson; + +import java.util.List; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import kz.com.aman.kassa.MainActivity; + +import kz.com.aman.kassa.model.AmanDao; + +enum OperationType { + PAYMENT, // payment + REFUND, // return + REVERSAL, // cancel + CLOSE_DAY, // closing of the trading day + OPERATIONS_LIST // get the list of operations +} + +public class BankNfcPlugins implements MethodCallHandler { + + private final Gson gson = new Gson(); + + //main activity + private MainActivity activity; + + + public MainActivity getActivity() { + return this.activity; + } + + public BankNfcPlugins(MainActivity activity) { + this.activity = activity; + } + + + @Override + public void onMethodCall(MethodCall call, Result result) { + switch (call.method) { + case "init": + init(call, result); + break; + case "permissions": + permissions(result); + break; + case "connection": + connection(result); + break; + case "currency": + currency(result); + break; + case "auth": + authentication(call, result); + break; + case "pay": + pay(call, result); + break; + case "cancel": + cancel(call, result); + break; + case "shutdown": + shutdown(call, result); + break; + case "closeDay": + closeDay(call, result); + break; + case "transaction": + showTransaction(call, result); + break; + case "findTransaction": + findTransaction(call, result); + break; + case "refund": + refund(call, result); + break; + case "version": + result.success(String.valueOf(Build.VERSION.SDK_INT)); + break; + case "get": + AmanDao dao = new AmanDao<>(); + dao.setSuccess(true); + dao.setMsg("Hello World"); + result.success(gson.toJson(dao)); + break; + case "error": + result.error("0-code","0-message", "0-details"); + break; + default: + result.notImplemented(); + } + } + + + private static int getVersion() { + String version = System.getProperty("java.version"); + if(version.startsWith("1.")) { + version = version.substring(2, 3); + } else { + int dot = version.indexOf("."); + if(dot != -1) { version = version.substring(0, dot); } + } return Integer.parseInt(version); + } + + private void permissions(Result result) { +// try { +// PermissionsManager.PermissionsCheckResultHandler permissionsCheckResultHandler = +// new PermissionsManager.PermissionsCheckResultHandler() { +// @Override +// public void onPermissionsGranted() { +// activity.runOnUiThread(() -> { +// AmanDao dao = new AmanDao<>(); +// dao.setSuccess(true); +// dao.setMsg("OK"); +// result.success(gson.toJson(dao)); +// } +// ); +// +// } +// +// @Override +// public void onPermissionsDeclined() { +// AmanDao dao = new AmanDao<>(); +// dao.setSuccess(false); +// dao.setMsg("decline"); +// result.success(gson.toJson(dao)); +// } +// }; +// permissionsManager = new PermissionsManagerImpl(this.activity); +// permissionsManager.checkPermissions(permissionsCheckResultHandler); +// +// +// } catch (Exception e) { +// result.error("1", e.getMessage(), e.getLocalizedMessage()); +// } + } + + + private void init(MethodCall call, Result result) { + String serverUrl = call.argument("serverUrl"); + String token = call.argument("token"); + start(token); + AmanDao dao = new AmanDao<>(); + dao.setSuccess(true); + dao.setMsg("OK"); + result.success(gson.toJson(dao)); + + } + + //start after all permissions granted + private void start(String token) { +// clientInterface = M4BankMposClient.getInstance( +// new M4BankMposParameters( +// Format.JSON, +// "rus", +// null, +// this.activity, +// new SessionExpiringCallbackHandlerImpl(), +// "appName", +// ServerChoose.API_5_0, +// new ConfigurationSettings +// .Builder() +// .printerUsed(true) +// .umkaEnabled(true) +// .networkConfiguration(createNetworkConfiguration(serverUrl)) +// .terminalConfiguration(createTerminalConfiguration()) +// .build()) +// ); + } + + private void connection(Result result) { +// clientInterface.getConfigurationManager() +// .checkConnection( +// new ConnectionCheckHandlerImpl(this.activity, result)); + } + private void currency(Result result) { +// CurrencyDataHolder dataHolder = clientInterface.getConfigurationManager() +// .getCurrencyDataHolder(); +// Currency currentCurrency = dataHolder.getCurrency(); +// if(currentCurrency!=null){ +// System.out.println(currentCurrency.getName()); +// System.out.println(currentCurrency.getCurrency3DigitCode()); +// } else { +// System.out.println("currentCurrency is null"); +// } +// System.out.println("==========================="); +// if(currentCurrency == null || !"398".equalsIgnoreCase(currentCurrency.getCurrency3DigitCode()) ){ +// List currencies = dataHolder.getCurrencyList(); +// boolean changed = false; +// for(Currency currency : currencies ){ +// System.out.println(currency.getName()); +// System.out.println(currency.getLetterCode()); +// System.out.println(currency.getCurrency3DigitCode()); +// if("398".equalsIgnoreCase(currency.getCurrency3DigitCode())){ +// dataHolder.setCurrency(currency); +// changed = true; +// break; +// } +// } +// AmanDao dao = new AmanDao<>(); +// dao.setSuccess(changed); +// dao.setMsg("current currency " + (currentCurrency!=null ? currentCurrency.getLetterCode() : "NULL")); +// result.success(gson.toJson(dao)); +// } else { +// AmanDao dao = new AmanDao<>(); +// dao.setSuccess(true); +// dao.setMsg("exist"); +// result.success(gson.toJson(dao)); +// } + } + + + + private void authentication(MethodCall call, Result result) { +// String login = call.argument("login"); +// String password = call.argument("password"); +// clientInterface.getAuthorizationManager().authorize(new AuthorizationHandlerImpl(this, result, login, password) ); + } + + private void pay(MethodCall call, Result result) { +// try { +// Integer value = call.argument("amount"); +// long amount = value.longValue(); +// clientInterface.cancel(); +// clientInterface.getTransactionManager().makeCardPayment(new CardPaymentHandlerImpl(this, result, amount, TransactionTypeConv.PAYMENT)); +// } catch (Exception e) { +// System.out.println("=============>ERROR:"+e.getMessage()); +// result.error("2", e.getMessage(), e.getLocalizedMessage()); +// } + } + + private void findTransaction(MethodCall call, Result result) { +// try { +// Integer transactionNumber = call.argument("transactionNumber"); +// String authorizationCode = call.argument("authorizationCode"); +// clientInterface.getTransactionManager() +// .getTransactionsList(new CardRefundAmanHandlerImpl(this, result, transactionNumber, authorizationCode , transaction), 1000, +// 0, GetOperationType.SHOW, null); +// } catch (Exception e) { +// System.out.println("=============>ERROR:"+e.getMessage()); +// result.error("2", e.getMessage(), e.getLocalizedMessage()); +// } + } + + private void refund(MethodCall call, Result result) { +// try { +// clientInterface.getTransactionManager() +// .makeCardRefund(new CardRefundAmanHandlerImpl(this, result, null, null, transaction)); +// } catch (Exception e) { +// System.out.println("=============>ERROR:"+e.getMessage()); +// result.error("2", e.getMessage(), e.getLocalizedMessage()); +// } + } + + private void closeDay(MethodCall call, Result result) { +// try { +// clientInterface.cancel(); +// clientInterface.getTransactionManager().closeDay(new CloseDayHandlerImpl(this, result)); +// } catch (Exception e) { +// System.out.println("=============>ERROR:"+e.getMessage()); +// result.error("2", e.getMessage(), e.getLocalizedMessage()); +// } + } + + private void showTransaction(MethodCall call, Result result){ +// clientInterface.getTransactionManager() +// .getTransactionsList( +// new TransactionDetailsHandlerImpl(this), +// 20, 0, +// GetOperationType.SHOW, +// null); + } + + private void cancel(MethodCall call, Result result) { +// try { +// clientInterface.cancel(); +// AmanDao dao = new AmanDao<>(); +// dao.setSuccess(true); +// dao.setMsg("OK"); +// result.success(gson.toJson(dao)); +// } catch (Exception e) { +// System.out.println("=============>ERROR:"+e.getMessage()); +// result.error("2", e.getMessage(), e.getLocalizedMessage()); +// } + } + + private void shutdown(MethodCall call, Result result) { +// try { +// clientInterface.shutdown(); +// AmanDao dao = new AmanDao<>(); +// dao.setSuccess(true); +// dao.setMsg("OK"); +// result.success(gson.toJson(dao)); +// } catch (Exception e) { +// System.out.println("=============>ERROR:"+e.getMessage()); +// result.error("2", e.getMessage(), e.getLocalizedMessage()); +// } + } + + +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/kz/com/aman/kassa/MainActivity.kt b/android/app/src/main/kotlin/kz/com/aman/kassa/MainActivity.kt index 5676e2b..749f4e5 100644 --- a/android/app/src/main/kotlin/kz/com/aman/kassa/MainActivity.kt +++ b/android/app/src/main/kotlin/kz/com/aman/kassa/MainActivity.kt @@ -1,83 +1,149 @@ package kz.com.aman.kassa -import android.content.Context -import android.content.ContextWrapper +import android.app.Activity +import android.content.ComponentName import android.content.Intent -import android.content.IntentFilter -import android.content.pm.PackageManager -import android.net.Uri -import android.os.BatteryManager -import android.os.Build.VERSION -import android.os.Build.VERSION_CODES +import android.os.Build +import android.widget.Toast import androidx.annotation.NonNull import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.GeneratedPluginRegistrant +import kz.com.aman.kassa.bank.JsonForExternalCall +import kz.com.aman.kassa.bank.OperationType -class MainActivity: FlutterActivity() { - private val CHANNEL = "samples.flutter.dev/battery" +class MainActivity : FlutterActivity() { + private val externalApplicationRequestCode = 207 + private val externalOperationTypeKey = "ru.m4bank.ExternalApplication.OperationTypeKey" + private val externalInputDataKey = "ru.m4bank.ExternalApplication.InputDataKey" + private val externalResultDataKey = "ru.m4bank.ExternalApplication.ResultDataKey" + + private val bankChannel = "channel:com.amanKassa/bank" + + private lateinit var _result: MethodChannel.Result override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { - GeneratedPluginRegistrant.registerWith(flutterEngine); - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { - // Note: this method is invoked on the main thread. - call, result -> - if (call.method == "getBatteryLevel") { - val batteryLevel = getBatteryLevel() + GeneratedPluginRegistrant.registerWith(flutterEngine) + //MethodChannel(flutterEngine.dartExecutor.binaryMessenger, BANK_CHANNEL).setMethodCallHandler(BankNfcPlugins(this)) - if (batteryLevel != -1) { - result.success(batteryLevel) - } else { - result.error("UNAVAILABLE", "Battery level not available.", null) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, bankChannel).setMethodCallHandler { call, result -> + _result = result + when (call.method) { + "pay" -> { + operationPayment(call) } - } else if (call.method == "sendMessage") { - val batteryLevel = sendMessage() - - if (batteryLevel != -1) { - result.success(batteryLevel) - } else { - result.error("UNAVAILABLE", "Battery level not available.", null) + "refund" -> { + operationRefund(call) + } + "reversal" -> { + operationReversal(call) + } + "closeDay" -> { + operationCloseDay(call) + } + "version" -> { + result.success(Build.VERSION.SDK_INT.toString()) + } + else -> { + result.notImplemented() } - } else { - result.notImplemented() } } } - private fun getBatteryLevel(): Int { - val batteryLevel: Int - if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) { - val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager - batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) - } else { - val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) - batteryLevel = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) +// private fun getOperationList(call: MethodCall) { +// val token: String = call.argument("token").toString() +// val operationParameters = createOperationParameters(token) +// startOperation(OperationType.OPERATIONS_LIST, +// JsonForExternalCall.getOperationsListJson(operationParameters.authToken)) +// +// } + + private fun operationPayment(call: MethodCall) { + val token = call.argument("token").toString() + var amount: Long = 0 + if (call.argument("amount") != null) { + amount = call.argument("amount")!!.toLong() } - println("batteryLevel"); - println(batteryLevel); - return batteryLevel + val operationParameters = createOperationParameters(token) + startOperation(OperationType.PAYMENT, JsonForExternalCall.getPaymentCardJson(operationParameters.authToken, amount.toString())) } - private fun sendMessage(): Int { - val packageManager: PackageManager = context.packageManager - val i = Intent(Intent.ACTION_VIEW) - try { - val mobileNo: String = "77774904900" //call.argument("mobileNo") - val message: String = "Hello world" //call.argument("message") - //https://wa.me/919167370647?text=Yes%20We'll%20do%20this%20in%20frag4%20inOCW - println("mobileNo: $mobileNo message: $message") - val url = "https://wa.me/" + mobileNo.trim { it <= ' ' } + "?text=" + message.trim { it <= ' ' } - i.setPackage("com.whatsapp") - i.data = Uri.parse(url) - if (i.resolveActivity(packageManager) != null) { - context.startActivity(i) - } - println("finish method - 2") - } catch (e: Exception) { - e.printStackTrace() - } - return 25 + private fun operationRefund(call: MethodCall) { + val token = call.argument("token").toString() + val terminalId = call.argument("terminalId").toString() + val operDay = call.argument("operDay").toString() + val transNum = call.argument("transNum").toString() + val amount = call.argument("amount").toString() + val operationParameters = createOperationParameters(token) + startOperation(OperationType.REFUND, JsonForExternalCall.getRefundCardJson(operationParameters.authToken, terminalId, operDay, transNum, amount)) } + + private fun operationReversal(call: MethodCall) { + val token = call.argument("token").toString() + val terminalId = call.argument("terminalId").toString() + val operDay = call.argument("operDay").toString() + val transNum = call.argument("transNum").toString() + val operationParameters = createOperationParameters(token) + val body = JsonForExternalCall.getReversalJson(operationParameters.authToken, terminalId, operDay, transNum); + println(body) + startOperation(OperationType.REVERSAL, body) + } + + private fun operationCloseDay(call: MethodCall) { + val token = call.argument("token").toString() + val operationParameters = createOperationParameters(token) + startOperation(OperationType.CLOSE_DAY, JsonForExternalCall.getCloseDayJson(operationParameters.authToken)) + } + + + private fun createOperationParameters(token: String, operDay: String = "", terminalId: String = "", transNum: String = ""): OperationParameters { + return OperationParameters(authToken = token, operDay = operDay, terminalId = terminalId, transNum = transNum) + } + + private fun startOperation(operationType: OperationType, inputJsonData: String?) { + val intent = Intent() + intent.component = ComponentName("ru.m4bank.softpos.halyk", "ru.m4bank.feature.externalapplication.ExternalApplicationActivity") + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + // intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP + intent.putExtra(externalOperationTypeKey, operationType.code) + intent.putExtra(externalInputDataKey, inputJsonData) + startActivityForResult(intent, externalApplicationRequestCode) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == externalApplicationRequestCode) { + println("---------------") + println(requestCode) + println(resultCode) + println(data) + if (data != null) { + println(data.getStringExtra(externalResultDataKey)) + } + println("---------------") + if (requestCode == externalApplicationRequestCode && resultCode == Activity.RESULT_OK && data != null) { + println(data.getStringExtra(externalResultDataKey)) + //Toast.makeText(this, data.getStringExtra(externalResultDataKey), Toast.LENGTH_LONG).show() + _result.success(data.getStringExtra(externalResultDataKey)) + } else { + _result.error("008", "Error while apps connecting", "aaa") + //Toast.makeText(this, "Error while apps connecting", Toast.LENGTH_SHORT).show() + } +// if (resultCode == Activity.RESULT_OK) { +// _result.success(data?.getStringExtra("result")) +// } else if (resultCode == Activity.RESULT_CANCELED) { +// _result.error("008", "123","aaa") +// } else +// _result.success(null) + } + + } + + } + +data class OperationParameters(val authToken: String, val terminalId: String, val operDay: String, val transNum: String) \ No newline at end of file diff --git a/android/app/src/main/kotlin/kz/com/aman/kassa/bank/ExternalPackage.kt b/android/app/src/main/kotlin/kz/com/aman/kassa/bank/ExternalPackage.kt new file mode 100644 index 0000000..50acba2 --- /dev/null +++ b/android/app/src/main/kotlin/kz/com/aman/kassa/bank/ExternalPackage.kt @@ -0,0 +1,3 @@ +package kz.com.aman.kassa.bank; + +data class ExternalPackage(val packageName: String, val activityName: String) \ No newline at end of file diff --git a/android/app/src/main/kotlin/kz/com/aman/kassa/bank/JsonForExternalCall.kt b/android/app/src/main/kotlin/kz/com/aman/kassa/bank/JsonForExternalCall.kt new file mode 100644 index 0000000..6360943 --- /dev/null +++ b/android/app/src/main/kotlin/kz/com/aman/kassa/bank/JsonForExternalCall.kt @@ -0,0 +1,142 @@ +package kz.com.aman.kassa.bank; + +object JsonForExternalCall { + + fun getPaymentCardJson(authToken: String, amount: String): String { + return """{ + "credentials" : { + "authorizationToken": "$authToken" + }, + "operationData" : { + "instrument": "CARD", + "amountData" : { + "currencyCode": "398", + "amount": "$amount", + "amountExponent": "2" + }, + "goods" : { + "product": [{ + "name": "Товар", + "price": "$amount", + "quantity": "1", + "quantityExponent": "0", + "taxRate": "TAX_20", + "accountingSubject": "PRODUCT" + }] + } + } + }""" + } + + fun getRefundCardJson(authToken: String, terminalId: String, operDay: String, transNum: String, amount: String): String { + return """{ + "credentials" :{ + "authorizationToken": "$authToken" + }, + "operationData" :{ + "instrument": "CARD", + "amountData" : { + "currencyCode": "348", + "amount": "6000", + "amountExponent": "2" + }, + "parentTransaction" : { + "terminalId": "$terminalId", + "operationDay": "$operDay", + "transactionNumber": "$transNum" + } + } + }""" + } + + fun getCloseDayJson(authToken: String): String { + return """{ + "credentials" : { + "authorizationToken": "$authToken" + } + }""" + } + + fun getOperationsListJson(authToken: String): String { + return """{ + "credentials" : { + "authorizationToken": "$authToken" + }, + "operationData": { + "params": { + "offset": "0", + "limit": "20" + }, + "filter": { + "transactionTypes": [PAYMENT, REFUND] + } + } + }""" + } + + fun getReversalJson(authToken: String, terminalId: String, operDay: String, transNum: String): String { + return """{ + "credentials" : { + "authorizationToken": "$authToken" + }, + "operationData" : { + "parentTransaction" : { + "terminalId": "$terminalId", + "operationDay": "$operDay", + "transactionNumber": "$transNum" + } + } + }""" + } + +// fun getPaymentCashJson(authToken: String): String { +// return """{ +// "credentials" : { +// "authorizationToken": "$authToken" +// }, +// "operationData" : { +// "instrument": "CASH", +// "amountData" : { +// "currencyCode": "643", +// "amount": "6000", +// "amountExponent": "2" +// }, +// "goods" : { +// "product": [{ +// "name": "Печеньки", +// "price": "3000", +// "quantity": "2", +// "quantityExponent": "0", +// "taxRate": "TAX_20", +// "accountingSubject": "PRODUCT" +// }] +// } +// } +// }""" +// } + +// +// fun getRefundCashJson(authToken: String, terminalId: String, operDay: String, transNum: String): String { +// return """{ +// "credentials" :{ +// "authorizationToken": "$authToken" +// }, +// "operationData" :{ +// "instrument": "CASH", +// "amountData" : { +// "currencyCode": "643", +// "amount": "6000", +// "amountExponent": "2" +// }, +// "parentTransaction" : { +// "terminalId": "$terminalId", +// "operationDay": "$operDay", +// "transactionNumber": "$transNum" +// } +// } +// }""" +// } + + + +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/kz/com/aman/kassa/bank/OperationType.kt b/android/app/src/main/kotlin/kz/com/aman/kassa/bank/OperationType.kt new file mode 100644 index 0000000..ce7b101 --- /dev/null +++ b/android/app/src/main/kotlin/kz/com/aman/kassa/bank/OperationType.kt @@ -0,0 +1,9 @@ +package kz.com.aman.kassa.bank; + +enum class OperationType(val code: String) { + PAYMENT("PAYMENT"), + REFUND("REFUND"), + REVERSAL("REVERSAL"), + CLOSE_DAY("CLOSE_DAY"), + OPERATIONS_LIST("OPERATIONS_LIST") +} \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_bank.xml b/android/app/src/main/res/layout/activity_bank.xml new file mode 100644 index 0000000..f554aee --- /dev/null +++ b/android/app/src/main/res/layout/activity_bank.xml @@ -0,0 +1,36 @@ + + + + + + + +