diff --git a/BazaarPay/build.gradle b/BazaarPay/build.gradle index 4bf7a952..e75edc51 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' } @@ -43,6 +43,7 @@ android { buildFeatures { viewBinding true dataBinding true + buildConfig true } } @@ -69,7 +70,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/BazaarPay/consumer-rules.pro b/BazaarPay/consumer-rules.pro index e69de29b..15d8a02e 100644 --- a/BazaarPay/consumer-rules.pro +++ b/BazaarPay/consumer-rules.pro @@ -0,0 +1 @@ +-keep class ir.cafebazaar.bazaarpay.** { *; } \ No newline at end of file diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayActivity.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayActivity.kt index 412bdbad..60b8e610 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayActivity.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayActivity.kt @@ -6,7 +6,6 @@ import android.content.res.Configuration import android.os.Build import android.os.Bundle import android.os.LocaleList -import android.os.PersistableBundle import android.view.animation.AnimationUtils import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate @@ -14,6 +13,7 @@ import androidx.navigation.findNavController import androidx.navigation.navOptions import ir.cafebazaar.bazaarpay.arg.BazaarPayActivityArgs import ir.cafebazaar.bazaarpay.databinding.ActivityBazaarPayBinding +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport import java.util.Locale class BazaarPayActivity : AppCompatActivity(), FinishCallbacks { @@ -25,7 +25,7 @@ class BazaarPayActivity : AppCompatActivity(), FinishCallbacks { override fun onCreate(savedInstanceState: Bundle?) { initNightMode() super.onCreate(savedInstanceState) - binding = ActivityBazaarPayBinding.inflate(layoutInflater) + binding = layoutInflater.bindWithRTLSupport(ActivityBazaarPayBinding::inflate) setContentView(binding.root) args = intent.getParcelableExtra(BAZAARPAY_ACTIVITY_ARGS) @@ -99,6 +99,7 @@ class BazaarPayActivity : AppCompatActivity(), FinishCallbacks { R.id.open_paymentThankYouPageFragment ) } + isDirectDebitActivationIntent(intent) -> { findNavController(R.id.nav_host_fragment_bazaar_pay).navigate( resId = R.id.open_payment_methods, @@ -143,6 +144,7 @@ class BazaarPayActivity : AppCompatActivity(), FinishCallbacks { contextWithCorrectTheme.createConfigurationContext(config) } + else -> { config.setLocale(newLocale) contextWithCorrectTheme.createConfigurationContext(config) @@ -158,9 +160,11 @@ class BazaarPayActivity : AppCompatActivity(), FinishCallbacks { uiMode == Configuration.UI_MODE_NIGHT_UNDEFINED -> { contextResource.configuration.uiMode } + isDarkMode() -> { Configuration.UI_MODE_NIGHT_YES } + else -> { Configuration.UI_MODE_NIGHT_NO } @@ -224,6 +228,7 @@ class BazaarPayActivity : AppCompatActivity(), FinishCallbacks { } companion object { + const val BAZAARPAY_ACTIVITY_ARGS = "bazaarpayActivityArgs" } } \ No newline at end of file diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayApiWrappers.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/BazaarPayApiWrappers.kt index b02ff772..0e8c6459 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,34 @@ suspend fun trace( ifFailure = onFailure ) } + +/** + * Init the [checkoutToken] in order to initiate a purchase flow. + * + * @param context the context in which tracing happens. + * @param amount the amount of the purchase in Rials. Notice that this has some limitations which you should consider based on BazaarPay documentation. + * @param destination the destination of the purchase which you should get it from the BazaarPay team. + * @param serviceName the serviceName of the purchase which you should get it from the BazaarPay team. + * @param onSuccess the callback when init checkout payment successfully offering its [InitCheckoutResult]. + * @param onFailure the callback for an unsuccessful initiating of checkout with [ErrorModel] to reason about the cause. + */ +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/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 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 diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/register/RegisterFragment.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/register/RegisterFragment.kt index 68846705..6a363ede 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/register/RegisterFragment.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/register/RegisterFragment.kt @@ -18,11 +18,9 @@ import ir.cafebazaar.bazaarpay.FinishCallbacks import ir.cafebazaar.bazaarpay.R import ir.cafebazaar.bazaarpay.ServiceLocator import ir.cafebazaar.bazaarpay.ServiceLocator.PHONE_NUMBER -import ir.cafebazaar.bazaarpay.models.Resource -import ir.cafebazaar.bazaarpay.models.ResourceState -import ir.cafebazaar.bazaarpay.databinding.FragmentRegisterBinding import ir.cafebazaar.bazaarpay.data.bazaar.account.models.getotptoken.WaitingTimeWithEnableCall import ir.cafebazaar.bazaarpay.data.bazaar.models.InvalidPhoneNumberException +import ir.cafebazaar.bazaarpay.databinding.FragmentRegisterBinding import ir.cafebazaar.bazaarpay.extensions.fromHtml import ir.cafebazaar.bazaarpay.extensions.getReadableErrorMessage import ir.cafebazaar.bazaarpay.extensions.gone @@ -31,6 +29,9 @@ import ir.cafebazaar.bazaarpay.extensions.isLandscape import ir.cafebazaar.bazaarpay.extensions.isValidPhoneNumber import ir.cafebazaar.bazaarpay.extensions.navigateSafe import ir.cafebazaar.bazaarpay.extensions.setSafeOnClickListener +import ir.cafebazaar.bazaarpay.models.Resource +import ir.cafebazaar.bazaarpay.models.ResourceState +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport internal class RegisterFragment : Fragment() { @@ -50,11 +51,7 @@ internal class RegisterFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentRegisterBinding.inflate( - inflater, - container, - false - ) + _binding = inflater.bindWithRTLSupport(FragmentRegisterBinding::inflate, container) return binding.root } @@ -178,6 +175,7 @@ internal class RegisterFragment : Fragment() { handleSuccess(resource.data) } } + ResourceState.Error -> { val message = if (resource.failure is InvalidPhoneNumberException) { getString(R.string.bazaarpay_wrong_phone_number) @@ -186,6 +184,7 @@ internal class RegisterFragment : Fragment() { } showError(message) } + ResourceState.Loading -> handleLoading() else -> Throwable("Illegal State in handleResourceState") } diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/verify/VerifyOtpFragment.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/verify/VerifyOtpFragment.kt index 2c7704a0..cb8e74f0 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/verify/VerifyOtpFragment.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/login/verify/VerifyOtpFragment.kt @@ -5,13 +5,11 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Bundle -import android.text.InputType import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo -import android.view.inputmethod.InputMethodManager import androidx.activity.addCallback import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.Fragment @@ -38,6 +36,7 @@ import ir.cafebazaar.bazaarpay.receiver.SmsPermissionReceiver import ir.cafebazaar.bazaarpay.screens.login.LoginConstants.ACTION_BROADCAST_LOGIN import ir.cafebazaar.bazaarpay.screens.login.LoginConstants.SMS_NUMBER import ir.cafebazaar.bazaarpay.utils.Second +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport import ir.cafebazaar.bazaarpay.utils.secondsToStringTime internal class VerifyOtpFragment : Fragment() { @@ -52,7 +51,7 @@ internal class VerifyOtpFragment : Fragment() { private var _binding: FragmentVerifyOtpBinding? = null private val binding: FragmentVerifyOtpBinding get() = requireNotNull(_binding) - + private val phoneNumber: String get() = fragmentArgs.phoneNumber @@ -74,11 +73,7 @@ internal class VerifyOtpFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentVerifyOtpBinding.inflate( - inflater, - container, - false - ) + _binding = inflater.bindWithRTLSupport(FragmentVerifyOtpBinding::inflate, container) return binding.root } @@ -117,6 +112,7 @@ internal class VerifyOtpFragment : Fragment() { false } } + else -> false } } @@ -128,7 +124,6 @@ internal class VerifyOtpFragment : Fragment() { } binding.verificationCodeEditText.requestFocus() - } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -181,6 +176,7 @@ internal class VerifyOtpFragment : Fragment() { resource.failure ) ) + ResourceState.Loading -> handleVerifyCodeLoading() else -> Throwable("illegal state in handleVerifyCodeState") } @@ -243,22 +239,27 @@ internal class VerifyOtpFragment : Fragment() { ResourceState.Success -> { resource.data?.let(::onCountDownStarted) } + ResourceState.Error -> { resource.data?.let(::onCountDownStarted) showError(requireContext().getReadableErrorMessage(resource.failure)) } + ResourceState.Loading -> { binding.resendCodeButton.invisible() binding.callButton.invisible() binding.resendText.invisible() hideKeyboardInLandscape() } + VerificationState.Tick -> { resource.data?.let(::onTick) } + VerificationState.FinishCountDown -> { onCountDownFinished() } + else -> Throwable("illegal state in handleResendSmsAndCallState") } } diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/logout/LogoutFragment.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/logout/LogoutFragment.kt index e27d7d5a..c67ea646 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/logout/LogoutFragment.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/logout/LogoutFragment.kt @@ -10,6 +10,7 @@ import androidx.navigation.NavDirections import androidx.navigation.fragment.findNavController import ir.cafebazaar.bazaarpay.databinding.FragmentLogoutBinding import ir.cafebazaar.bazaarpay.extensions.setSafeOnClickListener +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport internal class LogoutFragment : Fragment() { @@ -24,11 +25,7 @@ internal class LogoutFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentLogoutBinding.inflate( - inflater, - container, - false - ) + _binding = inflater.bindWithRTLSupport(FragmentLogoutBinding::inflate, container) return binding.root } diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/BankListRowItem.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/BankListRowItem.kt index 386dc467..d2e01bcc 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/BankListRowItem.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/BankListRowItem.kt @@ -2,14 +2,14 @@ package ir.cafebazaar.bazaarpay.screens.payment.directdebitactivating.banklist import android.content.Context import android.graphics.drawable.Drawable -import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import ir.cafebazaar.bazaarpay.R +import ir.cafebazaar.bazaarpay.data.bazaar.payment.models.directdebit.banklist.Bank import ir.cafebazaar.bazaarpay.databinding.ItemBankListBinding import ir.cafebazaar.bazaarpay.databinding.ItemBankListHeaderBinding -import ir.cafebazaar.bazaarpay.data.bazaar.payment.models.directdebit.banklist.Bank +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport internal abstract sealed class BankList { @@ -37,11 +37,7 @@ internal abstract sealed class BankList { override fun createViewHolder(parent: ViewGroup): RecyclerView.ViewHolder { return DirectDebitBanksListItemViewHolder( - ItemBankListBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ), + parent.bindWithRTLSupport(ItemBankListBinding::inflate), onItemSelected ) } @@ -57,11 +53,7 @@ internal abstract sealed class BankList { override fun createViewHolder(parent: ViewGroup): RecyclerView.ViewHolder { return DirectDebitBanksListHeaderViewHolder( - ItemBankListHeaderBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) + parent.bindWithRTLSupport(ItemBankListHeaderBinding::inflate) ) } } diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/DirectDebitBankListFragment.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/DirectDebitBankListFragment.kt index 83958552..93baca93 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/DirectDebitBankListFragment.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/banklist/DirectDebitBankListFragment.kt @@ -23,6 +23,7 @@ import ir.cafebazaar.bazaarpay.extensions.setSafeOnClickListener import ir.cafebazaar.bazaarpay.extensions.visible import ir.cafebazaar.bazaarpay.models.Resource import ir.cafebazaar.bazaarpay.models.ResourceState +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport import ir.cafebazaar.bazaarpay.utils.getErrorViewBasedOnErrorModel internal class DirectDebitBankListFragment : Fragment() { @@ -40,7 +41,10 @@ internal class DirectDebitBankListFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentDirectDebitBankListBinding.inflate(inflater) + _binding = inflater.bindWithRTLSupport( + FragmentDirectDebitBankListBinding::inflate, + container + ) return binding.root } @@ -94,6 +98,7 @@ internal class DirectDebitBankListFragment : Fragment() { ResourceState.Error -> { showReadableErrorMessage(resource.failure) } + ResourceState.Success -> { openUrlWithResourceData(resource.data) } diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/nationalid/DirectDebitNationalIdFragment.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/nationalid/DirectDebitNationalIdFragment.kt index 3d1499c9..a8d2d427 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/nationalid/DirectDebitNationalIdFragment.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitactivating/nationalid/DirectDebitNationalIdFragment.kt @@ -16,6 +16,7 @@ import ir.cafebazaar.bazaarpay.databinding.FragmentNationalIdBinding import ir.cafebazaar.bazaarpay.extensions.NATIONAL_ID_LENGTH import ir.cafebazaar.bazaarpay.extensions.hideKeyboard import ir.cafebazaar.bazaarpay.extensions.setSafeOnClickListener +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport internal class DirectDebitNationalIdFragment : Fragment() { @@ -33,7 +34,7 @@ internal class DirectDebitNationalIdFragment : Fragment() { savedInstanceState: Bundle? ): View { requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - _binding = FragmentNationalIdBinding.inflate(inflater, container, false) + _binding = inflater.bindWithRTLSupport(FragmentNationalIdBinding::inflate, container) return binding.root } diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitonboarding/DirectDebitOnBoardingFragment.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitonboarding/DirectDebitOnBoardingFragment.kt index 22d09279..7c912661 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitonboarding/DirectDebitOnBoardingFragment.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/directdebitonboarding/DirectDebitOnBoardingFragment.kt @@ -19,6 +19,7 @@ import ir.cafebazaar.bazaarpay.extensions.visible import ir.cafebazaar.bazaarpay.models.PaymentFlowState import ir.cafebazaar.bazaarpay.models.Resource import ir.cafebazaar.bazaarpay.models.ResourceState +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport import ir.cafebazaar.bazaarpay.utils.getErrorViewBasedOnErrorModel internal class DirectDebitOnBoardingFragment : Fragment() { @@ -34,7 +35,10 @@ internal class DirectDebitOnBoardingFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentDirectDebitOnBoardingBinding.inflate(inflater, container, false) + _binding = inflater.bindWithRTLSupport( + FragmentDirectDebitOnBoardingBinding::inflate, + container + ) return binding.root } @@ -77,6 +81,7 @@ internal class DirectDebitOnBoardingFragment : Fragment() { loading.visible() } } + PaymentFlowState.DirectDebitObBoardingDetails -> { hideErrorView() with(binding) { @@ -84,6 +89,7 @@ internal class DirectDebitOnBoardingFragment : Fragment() { loading.gone() } } + ResourceState.Error -> { if (it.failure is ErrorModel.NetworkConnection) { showErrorView(it.failure) diff --git a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/increasecredit/DynamicCreditOptionAdapter.kt b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/increasecredit/DynamicCreditOptionAdapter.kt index 996e2c58..4bd878ea 100644 --- a/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/increasecredit/DynamicCreditOptionAdapter.kt +++ b/BazaarPay/src/main/java/ir/cafebazaar/bazaarpay/screens/payment/increasecredit/DynamicCreditOptionAdapter.kt @@ -1,10 +1,10 @@ package ir.cafebazaar.bazaarpay.screens.payment.increasecredit -import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import ir.cafebazaar.bazaarpay.databinding.ItemPaymentDynamicCreditBinding import ir.cafebazaar.bazaarpay.data.payment.models.getpaymentmethods.Option +import ir.cafebazaar.bazaarpay.databinding.ItemPaymentDynamicCreditBinding +import ir.cafebazaar.bazaarpay.utils.bindWithRTLSupport internal class DynamicCreditOptionAdapter( private val items: List