Skip to content

Commit

Permalink
[SMARTI-1585] Integration new functionality v2.9.0 of sdk (#49)
Browse files Browse the repository at this point in the history
* implementation of new strategy to launch the scanner camera (#46)

* implementation of new strategy to launch the scanner camera

* solvent comment

* solvent comment

* order the button

* Add Functionality to Print Payment Data on Terminal

* Add Functionality version 2.9.0 of SDK

* feat implementation version 2.9.0 mainapp and miniapp

* feat implementation remove success and error paymentFlowRequest Data

---------

Co-authored-by: ymrMeli <[email protected]>
Co-authored-by: dalvaradorus <[email protected]>
  • Loading branch information
3 people authored Sep 5, 2024
1 parent c2f1cbe commit 1072ea7
Show file tree
Hide file tree
Showing 13 changed files with 376 additions and 172 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# v2.9.0
## Added
- send through messenger custom tag to custom print 2.0
- change string to serializable voucher in payment method model
- Migrate the UserValidation class to an Interface.
- change of strategy in the launch of the deeplink for the camera scanner in reading QR and barcode codes.
- Adjust CameraScannerStatus enumerator class to avoid breaking changes
- implement payment flow with messenger and monitoring of event

# v2.8.2
## Fixed
- Implement sending payment flow response data to PTM
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ android {

dependencies {

mainappImplementation files("libs/nativesdk-mainapp-2.8.2.aar")
miniappImplementation files("libs/nativesdk-miniapp-2.8.2.aar")
mainappImplementation files("libs/nativesdk-mainapp-2.9.0.aar")
miniappImplementation files("libs/nativesdk-miniapp-2.9.0.aar")
// AndroidX
implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation "androidx.appcompat:appcompat:$appcompatVersion"
Expand Down
Binary file removed app/libs/nativesdk-mainapp-2.8.2.aar
Binary file not shown.
Binary file added app/libs/nativesdk-mainapp-2.9.0.aar
Binary file not shown.
Binary file removed app/libs/nativesdk-miniapp-2.8.2.aar
Binary file not shown.
Binary file added app/libs/nativesdk-miniapp-2.9.0.aar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,55 @@ import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.mercadolibre.android.point_integration_sdk.nativesdk.MPManager
import com.mercadolibre.android.point_integration_sdk.nativesdk.camera.domain.ScanType
import com.mercadolibre.android.point_integration_sdk.nativesdk.camera.provider.entities.CameraScannerStatus
import com.mercadolibre.android.point_integration_sdk.nativesdk.message.utils.doIfError
import com.mercadolibre.android.point_integration_sdk.nativesdk.message.utils.doIfSuccess
import com.mercadolibre.android.point_mainapp_demo.app.R
import com.mercadolibre.android.point_mainapp_demo.app.databinding.PointMainappDemoAppActivityCameraScannerBinding
import com.mercadolibre.android.point_mainapp_demo.app.util.toast
import com.mercadolibre.android.point_mainapp_demo.app.util.gone
import com.mercadolibre.android.point_mainapp_demo.app.util.visible

class CameraScannerActivity : AppCompatActivity() {

private val binding: PointMainappDemoAppActivityCameraScannerBinding by lazy {
PointMainappDemoAppActivityCameraScannerBinding.inflate(layoutInflater)
}

private val cameraScanner = MPManager.cameraScanner

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.pointMainappDemoAppCameraQrScannerInitBtn.setOnClickListener {
MPManager.cameraScanner.initQRCodeScanner(this)
cameraScanner.initQRCodeScanner(this)
}

binding.pointMainappDemoAppCameraBarcodeScannerInitBtn.setOnClickListener {
MPManager.cameraScanner.initBarcodeScanner(this)
cameraScanner.initBarcodeScanner(this)
}

binding.pointMainappDemoAppCameraQrScannerNewInitBtn.setOnClickListener {
launchScanner(ScanType.CAMERA_SCANNER_QR)
}

binding.pointMainappDemoAppNewCameraBarcodeScannerInitBtn.setOnClickListener {
launchScanner(ScanType.CAMERA_SCANNER_BARCODE)
}
binding.pointMainappDemoAppCameraScannerBackBtn.setOnClickListener {
showButton()
binding.pointMainappDemoAppCameraScannerResult.gone()
binding.pointMainappDemoAppStateImg.gone()
}
}

private fun launchScanner(scanType: ScanType) {
cameraScanner.launchScanner(scanType) { response ->
response.doIfSuccess {
cameraResultSuccess(it.message.orEmpty())
}.doIfError {
cameraResultError(it.message.orEmpty())
}
}
}

Expand All @@ -39,31 +66,67 @@ class CameraScannerActivity : AppCompatActivity() {
pointMainappDemoAppStateImg.visibility = View.VISIBLE
when (qrResult.status) {
CameraScannerStatus.Ok -> {
val result = getString(R.string.point_mainapp_demo_app_cammera_scanner_start_scan_success)
.format(qrResult.message)
pointMainappDemoAppCameraScannerResult.text = result
pointMainappDemoAppStateImg.setImageResource(R.drawable.point_mainapp_demo_app_ic_check_white)
cameraResultSuccess(qrResult.message.orEmpty())
}

CameraScannerStatus.Error -> {
val error = getString(R.string.point_mainapp_demo_app_cammera_scanner_start_scan_error)
.format(qrResult.message)
pointMainappDemoAppCameraScannerResult.text = error
pointMainappDemoAppStateImg.setImageResource(R.drawable.point_mainapp_demo_app_ic_error)
cameraResultError(qrResult.message.orEmpty())
}

CameraScannerStatus.Unknown -> {
val message = getString(R.string.point_mainapp_demo_app_cammera_scanner_start_scan_undefined)
.format(qrResult.message)
pointMainappDemoAppCameraScannerResult.text = message
pointMainappDemoAppStateImg.visibility = View.GONE
cameraResultSuccess(qrResult.message.orEmpty())
}
}
}
}
.doIfError { error ->
toast(error.message.orEmpty())
cameraResultError(error.message.orEmpty())
}
}
}

private fun cameraResultSuccess(result: String) {
binding.run {
pointMainappDemoAppStateImg.visible()
pointMainappDemoAppCameraScannerBackBtn.visible()
pointMainappDemoAppCameraScannerResult.visible()
goneButton()
val resultCamera = getString(R.string.point_mainapp_demo_app_cammera_scanner_start_scan_success).format(result)
pointMainappDemoAppCameraScannerResult.text = resultCamera
pointMainappDemoAppStateImg.setImageResource(R.drawable.point_mainapp_demo_app_ic_check_white)
}
}

private fun cameraResultError(error: String) {
binding.run {
pointMainappDemoAppStateImg.visible()
pointMainappDemoAppCameraScannerBackBtn.visible()
pointMainappDemoAppCameraScannerResult.visible()
goneButton()
val errorCamera = getString(R.string.point_mainapp_demo_app_cammera_scanner_start_scan_error).format(error)
pointMainappDemoAppCameraScannerResult.text = errorCamera
pointMainappDemoAppStateImg.setImageResource(R.drawable.point_mainapp_demo_app_ic_error)
}
}

private fun goneButton() {
binding.run {
pointMainappDemoAppCameraQrScannerInitBtn.gone()
pointMainappDemoAppCameraBarcodeScannerInitBtn.gone()
pointMainappDemoAppNewCameraBarcodeScannerInitBtn.gone()
pointMainappDemoAppCameraQrScannerNewInitBtn.gone()
}
}

private fun showButton() {
binding.run {
pointMainappDemoAppCameraQrScannerInitBtn.visible()
pointMainappDemoAppCameraBarcodeScannerInitBtn.visible()
pointMainappDemoAppNewCameraBarcodeScannerInitBtn.visible()
pointMainappDemoAppCameraQrScannerNewInitBtn.visible()
pointMainappDemoAppCameraScannerBackBtn.gone()
pointMainappDemoAppCameraScannerResult.gone()
pointMainappDemoAppStateImg.gone()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class PaymentFlowInstallmentsActivity : AppCompatActivity() {
private val amount by lazy { intent.getStringExtra(AMOUNT) }
private val paymentMethod by lazy { intent.getStringExtra(PAYMENT_METHOD) }
private val description by lazy { intent.getStringExtra(DESCRIPTION) }
private val printOnTerminal by lazy { intent.getBooleanExtra(PRINT_ON_TERMINAL, false) }

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -93,22 +94,11 @@ class PaymentFlowInstallmentsActivity : AppCompatActivity() {
amount = amount.toDouble(),
description = description,
paymentMethod = paymentMethodValue?.run { PaymentMethod.valueOf(this) },
intentSuccess = paymentFlow.buildCallbackUri(
callback = "mercadopago://launcher_native_app",
methodCallback = "success",
metadata = hashMapOf("message" to "testSuccess"),
appID = "demo.app"
),
intentError = paymentFlow.buildCallbackUri(
callback = "mercadopago://launcher_native_app",
methodCallback = "error",
metadata = hashMapOf("message" to "testError"),
appID = "demo.app"
)
printOnTerminal = printOnTerminal
)

private fun launchPaymentInstallment(paymentFlowRequestData: PaymentFlowRequestData) {
paymentFlow.launchPaymentFlowActivity(paymentFlowRequestData, this) { response ->
paymentFlow.launchPaymentFlow(paymentFlowRequestData) { response ->
response.doIfError {
setOnError(it.message)
}
Expand All @@ -133,5 +123,6 @@ class PaymentFlowInstallmentsActivity : AppCompatActivity() {
internal const val DESCRIPTION = "description"
internal const val PAYMENT_METHOD = "payment_method"
internal const val TOTAL_AMOUNT = "Total Amount"
internal const val PRINT_ON_TERMINAL = "print_on_terminal"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.mercadolibre.android.point_integration_sdk.nativesdk.MPManager
import com.mercadolibre.android.point_integration_sdk.nativesdk.message.utils.doIfError
import com.mercadolibre.android.point_integration_sdk.nativesdk.message.utils.doIfSuccess
Expand All @@ -18,6 +19,7 @@ import com.mercadolibre.android.point_mainapp_demo.app.view.payment.adapter.Paym
import com.mercadolibre.android.point_mainapp_demo.app.view.payment.launcher.PaymentFlowInstallmentsActivity.Companion.AMOUNT
import com.mercadolibre.android.point_mainapp_demo.app.view.payment.launcher.PaymentFlowInstallmentsActivity.Companion.DESCRIPTION
import com.mercadolibre.android.point_mainapp_demo.app.view.payment.launcher.PaymentFlowInstallmentsActivity.Companion.PAYMENT_METHOD
import com.mercadolibre.android.point_mainapp_demo.app.view.payment.launcher.PaymentFlowInstallmentsActivity.Companion.PRINT_ON_TERMINAL
import com.mercadolibre.android.point_mainapp_demo.app.view.payment.models.PaymentMethodModel

/** Main activity class */
Expand All @@ -28,6 +30,7 @@ class PaymentLauncherActivity : AppCompatActivity() {
private val paymentTool = MPManager.paymentMethodsTools
private var lastPaymentMethodSelected: PaymentMethod? = null
private var clearPaymentMethodList: Boolean = true
private var isPrintOnTerminal: Boolean = true
private val paymentMethodAdapter by lazy {
PaymentMethodAdapter {
lastPaymentMethodSelected = PaymentMethod.valueOf(it)
Expand All @@ -41,16 +44,20 @@ class PaymentLauncherActivity : AppCompatActivity() {

binding.recyclerviewPaymentMethod.apply {
layoutManager = LinearLayoutManager(
this@PaymentLauncherActivity,
LinearLayoutManager.VERTICAL,
false
this@PaymentLauncherActivity, LinearLayoutManager.VERTICAL, false
)
adapter = paymentMethodAdapter
}

configPaymentButton()
isAutomaticPrintOnTerminal()
}

private fun isAutomaticPrintOnTerminal() =
binding.checkboxIsAutomaticPrinting.setOnCheckedChangeListener { _, isChecked ->
isPrintOnTerminal = isChecked
}

private fun configPaymentButton() {

binding.apply {
Expand Down Expand Up @@ -79,24 +86,23 @@ class PaymentLauncherActivity : AppCompatActivity() {
private fun launchPaymentFlow(amount: String?, description: String?) {
when {
amount.isNullOrEmpty() -> {
setLayoutError(ERROR_INVALID_AMOUNT)
ERROR_INVALID_AMOUNT.setLayoutError()
}

isCreditCard() -> {
launchActivity(
PaymentFlowInstallmentsActivity::class.java,
bundleOf(
PaymentFlowInstallmentsActivity::class.java, bundleOf(
PAYMENT_METHOD to lastPaymentMethodSelected?.name,
AMOUNT to amount,
DESCRIPTION to description
DESCRIPTION to description,
PRINT_ON_TERMINAL to isPrintOnTerminal
)
)
}

else -> {
launchPaymentFlowIntent(
amount = amount,
description = description
amount = amount, description = description
)
}
}
Expand All @@ -106,55 +112,42 @@ class PaymentLauncherActivity : AppCompatActivity() {

private fun configPaymentMethodList() {
paymentTool.getPaymentMethods { response ->
response
.doIfSuccess { result ->
response.doIfSuccess { result ->
val paymentMethodList = result.map { PaymentMethodModel(name = it.name) }
paymentMethodAdapter.submitList(paymentMethodList)
}
.doIfError { error ->
}.doIfError { error ->
toast(error.message.orEmpty())
}
}
}

private fun launchPaymentFlowIntent(
amount: String,
description: String?
amount: String, description: String?
) {
val uriSuccess = paymentFlow.buildCallbackUri(
"mercadopago://launcher_native_app",
"success",
hashMapOf("attr" to "123"),
"demo_app"
)
val uriError = paymentFlow.buildCallbackUri(
"mercadopago://launcher_native_app",
"error",
hashMapOf("attr" to "456"),
"demo_app"
)

paymentFlow.launchPaymentFlowActivity(

paymentFlow.launchPaymentFlow(
PaymentFlowRequestData(
amount.toDouble(),
description,
uriSuccess,
uriError,
lastPaymentMethodSelected
),
this
paymentMethod = lastPaymentMethodSelected,
printOnTerminal = isPrintOnTerminal
)
) { response ->
response.doIfError { error ->
error.message?.let { errorMessage -> setLayoutError(errorMessage) }
response.doIfSuccess {
showSnackBar(MESSAGE_PAYMENT_SUCCESS.format(it.paymentReference))
}.doIfError {
it.message?.let { message ->
showSnackBar(MESSAGE_PAYMENT_CANCELED.format(message), true)
}
}
}
}

private fun setLayoutError(message: String?) {
private fun String?.setLayoutError() {

binding.amountInputLayout.apply {
isCounterEnabled = true
error = message
error = this@setLayoutError
}

listenerIconError()
Expand All @@ -169,7 +162,21 @@ class PaymentLauncherActivity : AppCompatActivity() {
}
}

private fun showSnackBar(message: String, isCanceled: Boolean = false) {
Snackbar.make(
binding.root, message, Snackbar.ANIMATION_MODE_SLIDE
).setBackgroundTint(getBackgroundColorSnackBar(isCanceled)).show()
}

private fun getBackgroundColorSnackBar(canceled: Boolean): Int = if (canceled) {
getColor(R.color.design_default_color_error)
} else {
getColor(R.color.doneColor)
}

companion object {
private const val ERROR_INVALID_AMOUNT = "Amount is null or empty"
private const val MESSAGE_PAYMENT_CANCELED = "Your payment was %s"
private const val MESSAGE_PAYMENT_SUCCESS = "Your payment reference is: %s"
}
}
Loading

0 comments on commit 1072ea7

Please sign in to comment.