From 0f759fbb3db69a32cfe688a7005de0aa1b11afdb Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Wed, 29 Mar 2023 05:17:54 +0430 Subject: [PATCH 01/20] Add KSP plugin to the project --- build.gradle | 1 + gradle/libs.versions.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 8aa883e6..5525b55b 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.ksp) apply false alias(libs.plugins.navigation.safeargs) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e56c99c0..eb9eaa0e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -47,4 +47,5 @@ loggingInterceptor = { group = "com.github.ihsanbal", name = "LoggingInterceptor android-application = { id = "com.android.application", version.ref = "androidPlugin" } android-library = { id = "com.android.library", version.ref = "androidPlugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +ksp = { id = "com.google.devtools.ksp", version = "1.6.21-1.0.5" } navigation-safeargs = { id = "androidx.navigation.safeargs.kotlin", version.ref = "androidxNavigation" } From fa5f7309a6962c7b2ac0d2121ba58280aae021f3 Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Wed, 29 Mar 2023 05:19:21 +0430 Subject: [PATCH 02/20] Update Glide dependency version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eb9eaa0e..cabb98a0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ androidMinSdk = "17" androidPlugin = "7.1.3" androidxLifecycle = "2.5.0" androidxNavigation = "2.5.0" -glide = "4.13.1" +glide = "4.15.1" kotlin = "1.6.21" retrofit = "2.9.0" From 30e24a21cf8289b6d88f8059c13cd928e4e30542 Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Wed, 29 Mar 2023 05:22:00 +0430 Subject: [PATCH 03/20] Replace usage of KAPT with KSP --- BazaarPay/build.gradle | 4 ++-- gradle/libs.versions.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BazaarPay/build.gradle b/BazaarPay/build.gradle index 158112b0..08af6bac 100644 --- a/BazaarPay/build.gradle +++ b/BazaarPay/build.gradle @@ -3,7 +3,7 @@ plugins { id 'org.jetbrains.kotlin.android' id 'kotlin-parcelize' id 'androidx.navigation.safeargs.kotlin' - id 'kotlin-kapt' + id 'com.google.devtools.ksp' id 'maven-publish' } @@ -69,7 +69,7 @@ dependencies { implementation libs.squareup.retrofit.core implementation libs.squareup.retrofit.core implementation libs.glide.core - kapt libs.glide.compiler + ksp libs.glide.compiler implementation libs.dotsIndicator implementation(libs.loggingInterceptor) { exclude group: 'org.json', module: 'json' diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cabb98a0..53625336 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ squareup-retrofit-converter = { group = "com.squareup.retrofit2", name = "conver squareup-retrofit-core = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } # Other -glide-compiler = { group = "com.github.bumptech.glide", name = "compiler", version.ref = "glide" } +glide-compiler = { group = "com.github.bumptech.glide", name = "ksp", version.ref = "glide" } glide-core = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" } dotsIndicator = { group = "com.tbuonomo", name = "dotsindicator", version = "4.2" } loggingInterceptor = { group = "com.github.ihsanbal", name = "LoggingInterceptor", version = "3.1.0" } From 13984b618193b29ccf019e98ede04634b29a4652 Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Wed, 29 Mar 2023 07:04:19 +0430 Subject: [PATCH 04/20] Fix regression with updating KSP to the latest version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 53625336..1b10810e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -47,5 +47,5 @@ loggingInterceptor = { group = "com.github.ihsanbal", name = "LoggingInterceptor android-application = { id = "com.android.application", version.ref = "androidPlugin" } android-library = { id = "com.android.library", version.ref = "androidPlugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -ksp = { id = "com.google.devtools.ksp", version = "1.6.21-1.0.5" } +ksp = { id = "com.google.devtools.ksp", version = "1.6.21-1.0.6" } navigation-safeargs = { id = "androidx.navigation.safeargs.kotlin", version.ref = "androidxNavigation" } From 4931f19211d429f1d4a54ec02183c70a1eba44c2 Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Sun, 9 Apr 2023 02:54:00 +0430 Subject: [PATCH 05/20] Format gradle.properties --- gradle.properties | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/gradle.properties b/gradle.properties index cd0519bb..7e35dab3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,23 +1,10 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. +# Gradle org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app"s APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": + +# Kotlin kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file + +# Android +android.useAndroidX=true +# TODO: It is the default behavior in AGP 8.0 (Remove the flag after update). +android.nonTransitiveRClass=true From c7c2fec657760cfa0dda271ef8cb02c30491b3ec Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Sun, 9 Apr 2023 02:54:26 +0430 Subject: [PATCH 06/20] Enable Kotlin's new incremental compilation --- gradle.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gradle.properties b/gradle.properties index 7e35dab3..bb9a54eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,6 +3,8 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # Kotlin kotlin.code.style=official +# TODO: It is the default behavior in Koltin 1.8.20 (Remove the flag after update). +kotlin.incremental.useClasspathSnapshot=true # Android android.useAndroidX=true From fa9d2394960c2ad27c59232daeb8dd21b0b5f97d Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Sun, 9 Apr 2023 02:57:38 +0430 Subject: [PATCH 07/20] Use parallel GC (instead of G1) for faster builds --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index bb9a54eb..101b28d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Gradle -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -XX:+UseParallelGC # Kotlin kotlin.code.style=official From 6abe2d8d19cbaaef1019cb98c1b96f4d1dbcd20d Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Sun, 9 Apr 2023 02:58:35 +0430 Subject: [PATCH 08/20] Disable unused build features for faster builds --- gradle.properties | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 101b28d2..09b7b6a3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,5 +8,11 @@ kotlin.incremental.useClasspathSnapshot=true # Android android.useAndroidX=true -# TODO: It is the default behavior in AGP 8.0 (Remove the flag after update). +android.defaults.buildfeatures.resvalues=false +android.defaults.buildfeatures.shaders=false + +# TODO: These are the default behavior in AGP 8.0 (Remove the flags after update). android.nonTransitiveRClass=true +android.defaults.buildfeatures.aidl=false +android.defaults.buildfeatures.renderscript=false + From e0d5abb95cd49d789930c31c7a89f51ee30efc05 Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Sun, 9 Apr 2023 02:59:37 +0430 Subject: [PATCH 09/20] Enable BuildConfig only in modules needed for faster builds --- BazaarPay/build.gradle | 1 + gradle.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/BazaarPay/build.gradle b/BazaarPay/build.gradle index 4bf7a952..778b2a08 100644 --- a/BazaarPay/build.gradle +++ b/BazaarPay/build.gradle @@ -43,6 +43,7 @@ android { buildFeatures { viewBinding true dataBinding true + buildConfig true } } diff --git a/gradle.properties b/gradle.properties index 09b7b6a3..0ed71e15 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,6 @@ android.defaults.buildfeatures.shaders=false # TODO: These are the default behavior in AGP 8.0 (Remove the flags after update). android.nonTransitiveRClass=true android.defaults.buildfeatures.aidl=false +android.defaults.buildfeatures.buildconfig=false android.defaults.buildfeatures.renderscript=false From 1934db1f60de55390eb789189252af12fc9bcc72 Mon Sep 17 00:00:00 2001 From: Ali Bagherifam Date: Sun, 9 Apr 2023 16:36:49 +0430 Subject: [PATCH 10/20] Convert BazaarPayOptions from data class to normal one for future binary compatibility --- .../src/main/java/ir/cafebazaar/bazaarpay/BazaarPayOptions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayOptions.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayOptions.kt index dfcd470f..ea50979f 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayOptions.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayOptions.kt @@ -7,7 +7,7 @@ package ir.cafebazaar.bazaarpay * @property isInDarkMode enables *Dark Mode* for the UI elements of the payment flow, which are in *Light Mode* by default. * @property phoneNumber the default phone number to pre-fill the login screen's input field. It uses a `null` value by default, resulting in no pre-filled input. */ -data class BazaarPayOptions( +class BazaarPayOptions( val checkoutToken: String, val isInDarkMode: Boolean = false, val phoneNumber: String? = null From 49597632e782926473f6cee486ae8679414e70f0 Mon Sep 17 00:00:00 2001 From: Hamidreza Date: Sun, 9 Apr 2023 20:42:20 +0330 Subject: [PATCH 11/20] Add API for init checkout --- .../bazaarpay/BazaarPayApiWrappers.kt | 22 +++++++++++++++++++ .../data/payment/PaymentRemoteDataSource.kt | 15 +++++++++++++ .../data/payment/PaymentRepository.kt | 16 ++++++++++++++ .../data/payment/api/PaymentService.kt | 8 ++++++- .../payment/models/pay/InitCheckoutResult.kt | 6 +++++ .../models/pay/request/InitCheckoutRequest.kt | 9 ++++++++ .../pay/response/InitCheckoutResponse.kt | 16 ++++++++++++++ 7 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/InitCheckoutResult.kt create mode 100644 BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/request/InitCheckoutRequest.kt create mode 100644 BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/response/InitCheckoutResponse.kt diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayApiWrappers.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayApiWrappers.kt index b02ff772..67ff658a 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayApiWrappers.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayApiWrappers.kt @@ -3,6 +3,7 @@ package ir.cafebazaar.bazaarpay import android.content.Context import ir.cafebazaar.bazaarpay.data.bazaar.models.ErrorModel import ir.cafebazaar.bazaarpay.data.payment.PaymentRepository +import ir.cafebazaar.bazaarpay.data.payment.models.pay.InitCheckoutResult import ir.cafebazaar.bazaarpay.data.payment.models.pay.PurchaseStatus import ir.cafebazaar.bazaarpay.extensions.fold @@ -48,3 +49,24 @@ suspend fun trace( ifFailure = onFailure ) } + +suspend fun initCheckout( + context: Context, + amount: Long, + destination: String, + serviceName: String, + onSuccess: (InitCheckoutResult) -> Unit, + onFailure: (ErrorModel) -> Unit +) { + initSDKForAPICall( + context = context, + checkoutToken = "" + ) + val payRepository: PaymentRepository = ServiceLocator.get() + payRepository.initCheckout(amount, destination, serviceName).fold( + ifSuccess = { + onSuccess.invoke(it) + }, + ifFailure = onFailure + ) +} diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRemoteDataSource.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRemoteDataSource.kt index 7a9a67ec..c79c6773 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRemoteDataSource.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRemoteDataSource.kt @@ -6,9 +6,11 @@ import ir.cafebazaar.bazaarpay.data.payment.api.PaymentService import ir.cafebazaar.bazaarpay.data.payment.models.getpaymentmethods.PaymentMethodsInfo import ir.cafebazaar.bazaarpay.data.payment.models.getpaymentmethods.request.GetPaymentMethodsRequest import ir.cafebazaar.bazaarpay.data.payment.models.merchantinfo.MerchantInfo +import ir.cafebazaar.bazaarpay.data.payment.models.pay.InitCheckoutResult import ir.cafebazaar.bazaarpay.data.payment.models.pay.PayResult import ir.cafebazaar.bazaarpay.data.payment.models.pay.PurchaseStatus import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.CommitRequest +import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.InitCheckoutRequest import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.PayRequest import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.TraceRequest import ir.cafebazaar.bazaarpay.extensions.ServiceType @@ -97,6 +99,19 @@ internal class PaymentRemoteDataSource { } } } + suspend fun initCheckout( + amount: Long, + destination: String, + serviceName: String + ): Either { + return withContext(globalDispatchers.iO) { + return@withContext safeApiCall(ServiceType.BAZAARPAY) { + paymentService.initCheckout( + InitCheckoutRequest(amount, destination, serviceName) + ).toInitCheckoutResult() + } + } + } private companion object { private val increaseBalanceRedirectUrl = diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRepository.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRepository.kt index dfd4a82e..c8fda77f 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRepository.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/PaymentRepository.kt @@ -3,6 +3,7 @@ package ir.cafebazaar.bazaarpay.data.payment import ir.cafebazaar.bazaarpay.ServiceLocator import ir.cafebazaar.bazaarpay.data.payment.models.getpaymentmethods.PaymentMethodsInfo import ir.cafebazaar.bazaarpay.data.payment.models.merchantinfo.MerchantInfo +import ir.cafebazaar.bazaarpay.data.payment.models.pay.InitCheckoutResult import ir.cafebazaar.bazaarpay.data.payment.models.pay.PayResult import ir.cafebazaar.bazaarpay.data.payment.models.pay.PurchaseStatus import ir.cafebazaar.bazaarpay.extensions.fold @@ -49,4 +50,19 @@ internal class PaymentRepository { } ) } + + suspend fun initCheckout( + amount: Long, + destination: String, + serviceName: String + ): Either { + return paymentRemoteDataSource.initCheckout(amount, destination, serviceName).fold( + ifSuccess = { + Either.Success(it) + }, + ifFailure = { + Either.Failure(it) + } + ) + } } \ No newline at end of file diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/api/PaymentService.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/api/PaymentService.kt index d3c4f70d..1f307e38 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/api/PaymentService.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/api/PaymentService.kt @@ -3,10 +3,11 @@ package ir.cafebazaar.bazaarpay.data.payment.api import ir.cafebazaar.bazaarpay.data.payment.models.getpaymentmethods.request.GetPaymentMethodsRequest import ir.cafebazaar.bazaarpay.data.payment.models.getpaymentmethods.response.PaymentMethodsInfoDto import ir.cafebazaar.bazaarpay.data.payment.models.merchantinfo.response.MerchantInfoDto -import ir.cafebazaar.bazaarpay.data.payment.models.pay.PurchaseStatus import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.CommitRequest +import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.InitCheckoutRequest import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.PayRequest import ir.cafebazaar.bazaarpay.data.payment.models.pay.request.TraceRequest +import ir.cafebazaar.bazaarpay.data.payment.models.pay.response.InitCheckoutResponse import ir.cafebazaar.bazaarpay.data.payment.models.pay.response.PayResponse import ir.cafebazaar.bazaarpay.data.payment.models.pay.response.TraceResponse import okhttp3.ResponseBody @@ -45,6 +46,11 @@ internal interface PaymentService { @Body traceRequest: TraceRequest ): TraceResponse + @POST("checkout/init/") + suspend fun initCheckout( + @Body initCheckoutRequest: InitCheckoutRequest + ): InitCheckoutResponse + companion object { const val PAY_ENDPOINT_LANG = "lang" const val CHECKOUT_TOKEN_LABEL = "checkout_token" diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/InitCheckoutResult.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/InitCheckoutResult.kt new file mode 100644 index 00000000..4c909188 --- /dev/null +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/InitCheckoutResult.kt @@ -0,0 +1,6 @@ +package ir.cafebazaar.bazaarpay.data.payment.models.pay + +data class InitCheckoutResult( + val checkoutToken: String, + val paymentUrl: String +) \ No newline at end of file diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/request/InitCheckoutRequest.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/request/InitCheckoutRequest.kt new file mode 100644 index 00000000..f578d026 --- /dev/null +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/request/InitCheckoutRequest.kt @@ -0,0 +1,9 @@ +package ir.cafebazaar.bazaarpay.data.payment.models.pay.request + +import com.google.gson.annotations.SerializedName + +internal data class InitCheckoutRequest( + @SerializedName("amount") val amount: Long, + @SerializedName("destination") val destination: String, + @SerializedName("service_name") val serviceName: String, +) \ No newline at end of file diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/response/InitCheckoutResponse.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/response/InitCheckoutResponse.kt new file mode 100644 index 00000000..9e0259db --- /dev/null +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/data/payment/models/pay/response/InitCheckoutResponse.kt @@ -0,0 +1,16 @@ +package ir.cafebazaar.bazaarpay.data.payment.models.pay.response + +import com.google.gson.annotations.SerializedName +import ir.cafebazaar.bazaarpay.data.payment.models.PaymentBaseResponse +import ir.cafebazaar.bazaarpay.data.payment.models.pay.InitCheckoutResult +import ir.cafebazaar.bazaarpay.data.payment.models.pay.PayResult + +internal data class InitCheckoutResponse( + @SerializedName("checkout_token") val checkoutToken: String, + @SerializedName("payment_url") val paymentUrl: String +): PaymentBaseResponse() { + + fun toInitCheckoutResult(): InitCheckoutResult { + return InitCheckoutResult(checkoutToken, paymentUrl) + } +} \ No newline at end of file From d26dfd11aff33432299f2aa94598807582ea89a1 Mon Sep 17 00:00:00 2001 From: Hamidreza Date: Mon, 10 Apr 2023 16:11:22 +0330 Subject: [PATCH 12/20] Add sample for init checkout token in sample app --- app/src/main/AndroidManifest.xml | 4 + .../sample/SampleInitCheckoutActivity.kt | 47 +++++++ .../bazaarpay/sample/SamplePaymentActivity.kt | 4 + app/src/main/res/layout/activity_payment.xml | 11 ++ .../layout/activity_sample_init_checkout.xml | 129 ++++++++++++++++++ app/src/main/res/values-fa/strings.xml | 5 + app/src/main/res/values/strings.xml | 5 + 7 files changed, 205 insertions(+) create mode 100644 app/src/main/java/ir/cafebazaar/bazaarpay/sample/SampleInitCheckoutActivity.kt create mode 100644 app/src/main/res/layout/activity_sample_init_checkout.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c470761..1f579410 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,10 @@ + + diff --git a/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SampleInitCheckoutActivity.kt b/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SampleInitCheckoutActivity.kt new file mode 100644 index 00000000..e61f3c24 --- /dev/null +++ b/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SampleInitCheckoutActivity.kt @@ -0,0 +1,47 @@ +package ir.cafebazaar.bazaarpay.sample + +import android.graphics.Color +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import ir.cafebazaar.bazaarpay.extensions.setSafeOnClickListener +import ir.cafebazaar.bazaarpay.initCheckout +import ir.cafebazaar.bazaarpay.sample.databinding.ActivitySampleInitCheckoutBinding +import kotlinx.coroutines.launch + +class SampleInitCheckoutActivity : AppCompatActivity() { + + private lateinit var binding: ActivitySampleInitCheckoutBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySampleInitCheckoutBinding.inflate(layoutInflater) + setContentView(binding.root) + registerClickListeners(binding) + } + + private fun registerClickListeners(binding: ActivitySampleInitCheckoutBinding) { + binding.initCheckoutTokenButton.setSafeOnClickListener { + initCheckoutToken() + } + } + + private fun initCheckoutToken() { + lifecycleScope.launch { + initCheckout( + context = this@SampleInitCheckoutActivity, + amount = binding.amountEditText.text.toString().toLong(), + destination = binding.destinationEditText.text.toString(), + serviceName = binding.serviceNameEditText.text.toString(), + onSuccess = { + binding.checkoutTokenTextView.text = it.checkoutToken + binding.redirectUrlTextView.text = it.paymentUrl + }, + onFailure = { + binding.checkoutTokenTextView.text = it.message + binding.checkoutTokenTextView.setTextColor(Color.RED) + } + ) + } + } +} diff --git a/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SamplePaymentActivity.kt b/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SamplePaymentActivity.kt index cfecbdf0..f7788ead 100644 --- a/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SamplePaymentActivity.kt +++ b/app/src/main/java/ir/cafebazaar/bazaarpay/sample/SamplePaymentActivity.kt @@ -43,6 +43,10 @@ class SamplePaymentActivity : AppCompatActivity() { val intent = Intent(this, SampleFragmentContainer::class.java) startActivity(intent) } + binding.initCheckoutActivityButton.setSafeOnClickListener { + val intent = Intent(this, SampleInitCheckoutActivity::class.java) + startActivity(intent) + } } private fun startPayment() { diff --git a/app/src/main/res/layout/activity_payment.xml b/app/src/main/res/layout/activity_payment.xml index 8d1e4913..4c98a01e 100644 --- a/app/src/main/res/layout/activity_payment.xml +++ b/app/src/main/res/layout/activity_payment.xml @@ -139,6 +139,17 @@ app:layout_constraintTop_toBottomOf="@id/trace_button" tools:text="@string/message_trace_result" /> +