Commit caf6065a authored by shohboz's avatar shohboz

[FIX] MUS-401, Feature, fixed bugs with sms and card

parent 7db31b15
...@@ -280,6 +280,8 @@ dependencies { ...@@ -280,6 +280,8 @@ dependencies {
implementation 'xyz.peridy.shimmer:shimmerlayout:1.1' implementation 'xyz.peridy.shimmer:shimmerlayout:1.1'
implementation 'com.facebook.shimmer:shimmer:0.5.0' implementation 'com.facebook.shimmer:shimmer:0.5.0'
implementation 'com.github.reinaldoarrosi:maskededittext:1.1.0'
} }
repositories { repositories {
maven { maven {
......
...@@ -47,7 +47,6 @@ class MainRepository @Inject constructor( ...@@ -47,7 +47,6 @@ class MainRepository @Inject constructor(
try { try {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
AGRBilling.deleteAllCards() AGRBilling.deleteAllCards()
// todo monitoring ni delete qilish kerak
apiService.logOut() apiService.logOut()
dao.deleteAllMonitoring() dao.deleteAllMonitoring()
} }
......
...@@ -44,6 +44,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -44,6 +44,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
setUpUI() setUpUI()
collects() collects()
} }
override fun setUpUI() { override fun setUpUI() {
...@@ -62,7 +63,6 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -62,7 +63,6 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
}) })
inputPhone.addTextChangedListener(object : TextWatcherWrapper() { inputPhone.addTextChangedListener(object : TextWatcherWrapper() {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
super.beforeTextChanged(s, start, count, after) super.beforeTextChanged(s, start, count, after)
oldText = s.toString() oldText = s.toString()
...@@ -72,13 +72,21 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -72,13 +72,21 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
super.onTextChanged(s, start, before, count) super.onTextChanged(s, start, before, count)
try { try {
inputPhone.removeTextChangedListener(this) inputPhone.removeTextChangedListener(this)
newText = s.toString().filter { it.isDigit() }.maskedTextMobi() val text = s.toString()
inputPhone.setText(newText) if(text.length < 5){
inputPhone.setSelection(oldText.checkChangedPosition(newText)) inputPhone.setText("+998 ")
inputPhone.setSelection(5)
}else{
newText = text.filter { it.isDigit() || it == '+'}.maskedTextMobi()
inputPhone.setText(newText)
inputPhone.setSelection(oldText.checkChangedPosition(newText))
}
inputPhone.addTextChangedListener(this) inputPhone.addTextChangedListener(this)
btnCheckPhone.isEnabled = inputPhone.text.toString().trim().length == 12 btnCheckPhone.isEnabled = inputPhone.text.toString().filter { it.isDigit() || it == '+' }.length == 13
}catch (e: Exception){ }catch (e: Exception){
inputPhone.text.clear() inputPhone.text.clear()
inputPhone.addTextChangedListener(this)
} }
} }
...@@ -86,8 +94,8 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -86,8 +94,8 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
btnCheckPhone.setOnClickListener(object : ButtonClick() { btnCheckPhone.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
phone = "+998" + inputPhone.text.toString().trim().replace(" ","") phone = inputPhone.text.toString().filter { it.isDigit() || it == '+' }
phoneRaw = "+998 " + inputPhone.text.toString().trim() phoneRaw = inputPhone.text.toString().trim()
when { when {
phone.length < 13 -> { phone.length < 13 -> {
inputPhone.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake)) inputPhone.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
......
...@@ -5,6 +5,7 @@ import android.os.Bundle ...@@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import android.widget.TextView import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG
import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_WEAK import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_WEAK
...@@ -65,19 +66,13 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -65,19 +66,13 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
bn.apply { bn.apply {
loadData() loadData()
toolbar.setNavigationOnClickListener { toolbar.setNavigationOnClickListener {
if (type == CONSTANTS.NEW_PIN){ handleBackStack()
when {
navController.popBackStack(R.id.registerFragment,false) -> {
}
navController.popBackStack(R.id.loginFragment,false) -> {
}
else -> navController.navigateUp()
}
}else navController.navigateUp()
} }
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
handleBackStack()
}
})
rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
rvPin.setHasFixedSize(true) rvPin.setHasFixedSize(true)
...@@ -174,6 +169,16 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -174,6 +169,16 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
} }
} }
private fun handleBackStack() {
if (type == CONSTANTS.NEW_PIN){
when {
navController.popBackStack(R.id.registerFragment,false) -> {}
navController.popBackStack(R.id.loginFragment,false) -> {}
else -> navController.navigateUp()
}
}else navController.navigateUp()
}
private fun checkBiometric() : Boolean { private fun checkBiometric() : Boolean {
return when (biometricManager.canAuthenticate(BIOMETRIC_STRONG or BIOMETRIC_WEAK)) { return when (biometricManager.canAuthenticate(BIOMETRIC_STRONG or BIOMETRIC_WEAK)) {
BiometricManager.BIOMETRIC_SUCCESS -> true BiometricManager.BIOMETRIC_SUCCESS -> true
......
...@@ -3,12 +3,9 @@ package uz.mobiuz.mobiservice.dev.ui.auth.verification ...@@ -3,12 +3,9 @@ package uz.mobiuz.mobiservice.dev.ui.auth.verification
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.view.KeyEvent import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.view.isVisible import androidx.core.view.isVisible
...@@ -36,7 +33,6 @@ import uz.mobiuz.mobiservice.dev.utils.Utils ...@@ -36,7 +33,6 @@ import uz.mobiuz.mobiservice.dev.utils.Utils
import uz.mobiuz.mobiservice.dev.utils.extensions.* import uz.mobiuz.mobiservice.dev.utils.extensions.*
import uz.mobiuz.mobiservice.dev.utils.hideKeyboard import uz.mobiuz.mobiservice.dev.utils.hideKeyboard
import uz.mobiuz.mobiservice.dev.utils.showKeyboard import uz.mobiuz.mobiservice.dev.utils.showKeyboard
import uz.mobiuz.mobiservice.dev.utils.sms.MessageDialog
import uz.mobiuz.mobiservice.dev.utils.sms.SmsBroadcastReceiver import uz.mobiuz.mobiservice.dev.utils.sms.SmsBroadcastReceiver
import java.util.regex.Pattern import java.util.regex.Pattern
import javax.inject.Inject import javax.inject.Inject
...@@ -62,7 +58,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -62,7 +58,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private var cardNumber = "" private var cardNumber = ""
private var cardId = "" private var cardId = ""
private var cardExpire = "" private var cardExpire = ""
private var payCardnumber = "" private var payCardNumber = ""
private var monitoring = "" private var monitoring = ""
var transactionId = 0L var transactionId = 0L
...@@ -80,7 +76,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -80,7 +76,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
cardId = it.getString(CONSTANTS.CARD_ID) ?: "" cardId = it.getString(CONSTANTS.CARD_ID) ?: ""
cardNumber = it.getString(CONSTANTS.CARD_NUMBER) ?: "" cardNumber = it.getString(CONSTANTS.CARD_NUMBER) ?: ""
cardExpire = it.getString(CONSTANTS.CARD_EXPIRE) ?: "" cardExpire = it.getString(CONSTANTS.CARD_EXPIRE) ?: ""
payCardnumber = it.getString(CONSTANTS.PAY_CARD_NUMBER) ?: "" payCardNumber = it.getString(CONSTANTS.PAY_CARD_NUMBER) ?: ""
transactionId = it.getLong(CONSTANTS.TRANSACTION_ID) transactionId = it.getLong(CONSTANTS.TRANSACTION_ID)
saveCard = it.getInt(CONSTANTS.SAVED_CARD, 0) saveCard = it.getInt(CONSTANTS.SAVED_CARD, 0)
...@@ -146,31 +142,31 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -146,31 +142,31 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
sentCodeAgain.setOnClickListener { sentCodeAgain.setOnClickListener {
when (type) { when (type) {
CONSTANTS.TYPE_ADD_CARD -> { CONSTANTS.TYPE_ADD_CARD -> {
viewModel.resendSms("998949125150", cardNumber, cardExpire) viewModel.resendSms(pref.userPhone.filter { it.isDigit() }, cardNumber, cardExpire)
} }
CONSTANTS.TYPE_ANOTHER_CARD -> { CONSTANTS.TYPE_ANOTHER_CARD -> {
viewModel.vendorResendSms(transactionId) viewModel.vendorResendSms(transactionId)
} }
else -> viewModel.resetSmsCode(UserAuth(phone.filter { it.isDigit() })) else -> viewModel.resetSmsCode(UserAuth(pref.userPhone.filter { it.isDigit() }))
} }
} }
coutdownView.setOnCountdownEndListener { coutdownView.setOnCountdownEndListener {
count(false) count(false)
} }
// setVerificationCode()
} }
} }
private fun setVerificationCode(code: String) { private fun setVerificationCode(code: String) {
if (code.length == 6) { if (code.length == 6) {
bn.apply { bn.apply {
pin1.setText(verificationCode[0].toString()) pin1.setText(code[0].toString())
pin2.setText(verificationCode[1].toString()) pin2.setText(code[1].toString())
pin3.setText(verificationCode[2].toString()) pin3.setText(code[2].toString())
pin4.setText(verificationCode[3].toString()) pin4.setText(code[3].toString())
pin5.setText(verificationCode[4].toString()) pin5.setText(code[4].toString())
pin6.setText(verificationCode[5].toString()) pin6.setText(code[5].toString())
pin6.requestFocus() pin6.requestFocus()
pin6.setSelection(1)
btnVerification.isEnabled = true btnVerification.isEnabled = true
} }
} }
...@@ -384,7 +380,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -384,7 +380,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
R.id.paymentSuccessfulFragment, R.id.paymentSuccessfulFragment,
bundleOf( bundleOf(
CONSTANTS.PAY_SAVE_CARD to saveCard, CONSTANTS.PAY_SAVE_CARD to saveCard,
CONSTANTS.PAY_CARD_NUMBER to payCardnumber, CONSTANTS.PAY_CARD_NUMBER to payCardNumber,
CONSTANTS.PAY_MONITORING to monitoring CONSTANTS.PAY_MONITORING to monitoring
) )
) )
...@@ -448,7 +444,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -448,7 +444,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private fun getOtpFromMessage(message: String) { // This will match any 6 digit number in the message private fun getOtpFromMessage(message: String) { // This will match any 6 digit number in the message
val matcher = Pattern.compile("(|^)\\d{6}").matcher(message) val matcher = Pattern.compile("(|^)\\d{6}").matcher(message)
if (matcher.find()) { if (matcher.find()) {
customLog("verification code:${matcher.group(0)} ") // customLog("verification code:${matcher.group(0)} ")
setVerificationCode(matcher.group(0)) setVerificationCode(matcher.group(0))
} }
} }
...@@ -479,17 +475,22 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -479,17 +475,22 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
smsBroadcastReceiver?.smsBroadcastReceiverListener = smsBroadcastReceiver?.smsBroadcastReceiverListener =
object : SmsBroadcastReceiver.SmsBroadcastReceiverListener { object : SmsBroadcastReceiver.SmsBroadcastReceiverListener {
override fun onSuccess(intent: Intent?) { override fun onSuccess(intent: Intent?) {
pref.isShowPin = false
startActivityForResult(intent, 200) startActivityForResult(intent, 200)
} }
override fun onFailure() {} override fun onFailure() {}
} }
val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION) val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
context?.registerReceiver(smsBroadcastReceiver, intentFilter) requireActivity().registerReceiver(smsBroadcastReceiver, intentFilter)
}
override fun onDestroyView() {
requireActivity().unregisterReceiver(smsBroadcastReceiver)
super.onDestroyView()
} }
override fun onDestroy() { override fun onDestroy() {
context?.unregisterReceiver(smsBroadcastReceiver)
_bn = null _bn = null
super.onDestroy() super.onDestroy()
} }
......
package uz.mobiuz.mobiservice.dev.ui.global package uz.mobiuz.mobiservice.dev.ui.global
import android.annotation.SuppressLint import android.annotation.SuppressLint
import uz.mobiuz.mobiservice.dev.BuildConfig
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
object CONSTANTS { object CONSTANTS {
...@@ -13,8 +14,9 @@ object CONSTANTS { ...@@ -13,8 +14,9 @@ object CONSTANTS {
const val CARD_NUMBER = "CARD_NUMBER" const val CARD_NUMBER = "CARD_NUMBER"
const val CARD_EXPIRE = "CARD_EXPIRE" const val CARD_EXPIRE = "CARD_EXPIRE"
const val UNAUTHORIZED = "UNAUTHORIZED" const val UNAUTHORIZED = "UNAUTHORIZED"
const val BASE_URL = "http://10.160.41.12:82/" val BASE_URL by lazy { if (BuildConfig.DEBUG) BASE_URL_PROD else BASE_URL_PROD }
// const val BASE_URL = "https://mobileapp.mobi.uz/" private const val BASE_URL_TEST = "https://testapp.mobi.uz:8443/"
private const val BASE_URL_PROD = "https://mobileapp.mobi.uz/"
//languages //languages
const val RU = "ru" const val RU = "ru"
...@@ -30,17 +32,17 @@ object CONSTANTS { ...@@ -30,17 +32,17 @@ object CONSTANTS {
const val TERMS_OF_USE = "Terms of Use" const val TERMS_OF_USE = "Terms of Use"
const val PRIVACY_POLICY = "Privacy Policy" const val PRIVACY_POLICY = "Privacy Policy"
const val LICENSE_UZ = "${BASE_URL}uploads/licenses/license_uz.html" val LICENSE_UZ = "${BASE_URL}uploads/licenses/license_uz.html"
const val LICENSE_RU = "${BASE_URL}uploads/licenses/license_ru.html" val LICENSE_RU = "${BASE_URL}uploads/licenses/license_ru.html"
const val LICENSE_EN = "${BASE_URL}uploads/licenses/license_en.html" val LICENSE_EN = "${BASE_URL}uploads/licenses/license_en.html"
const val PRIVACY_POLICY_UZ = "${BASE_URL}uploads/privacy/privacy_policy_uz.html" val PRIVACY_POLICY_UZ = "${BASE_URL}uploads/privacy/privacy_policy_uz.html"
const val PRIVACY_POLICY_RU = "${BASE_URL}uploads/privacy/privacy_policy_ru.html" val PRIVACY_POLICY_RU = "${BASE_URL}uploads/privacy/privacy_policy_ru.html"
const val PRIVACY_POLICY_EN = "${BASE_URL}uploads/privacy/privacy_policy_en.html" val PRIVACY_POLICY_EN = "${BASE_URL}uploads/privacy/privacy_policy_en.html"
const val PAYSYS_LICENSE_UZ = "${BASE_URL}uploads/paysys/license_uz.html" val PAYSYS_LICENSE_UZ = "${BASE_URL}uploads/paysys/license_uz.html"
const val PAYSYS_LICENSE_RU = "${BASE_URL}uploads/paysys/license_ru.html" val PAYSYS_LICENSE_RU = "${BASE_URL}uploads/paysys/license_ru.html"
const val PAYSYS_LICENSE_EN = "${BASE_URL}uploads/paysys/license_en.html" val PAYSYS_LICENSE_EN = "${BASE_URL}uploads/paysys/license_en.html"
const val PHONE1 = "0890" const val PHONE1 = "0890"
const val PHONE2 = "+998 97 130 09 09" const val PHONE2 = "+998 97 130 09 09"
......
...@@ -219,7 +219,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -219,7 +219,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
private fun loadData() { private fun loadData() {
try { try {
sliderAdapter.submitList(customer?.events ?: emptyList()) sliderAdapter.submitList(customer?.events ?: emptyList())
bn.imagePlaceHolder.isVisible = customer?.events?.isEmpty() ?: false
customer?.customer?.info?.let { customer?.customer?.info?.let {
bn.apply { bn.apply {
......
...@@ -4,7 +4,9 @@ import androidx.lifecycle.ViewModel ...@@ -4,7 +4,9 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import uz.agr.sdk.core.entity.card.CardInfo import uz.agr.sdk.core.entity.card.CardInfo
import uz.agr.sdk.core.entity.card.CardRegistration import uz.agr.sdk.core.entity.card.CardRegistration
...@@ -115,5 +117,12 @@ class CardViewModel @Inject constructor( ...@@ -115,5 +117,12 @@ class CardViewModel @Inject constructor(
}) })
} }
private val _onClickedCardUiState = MutableStateFlow<UiStateObject<Long>>(UiStateObject.EMPTY)
val onClickedCardUiState: StateFlow<UiStateObject<Long>> = _onClickedCardUiState
fun onCLickAddCard(time:Long){
_onClickedCardUiState.value = UiStateObject.SUCCESS(time)
}
} }
\ No newline at end of file
...@@ -96,27 +96,6 @@ class CardsListFragment : BaseFragment(R.layout.fragment_cards_list) { ...@@ -96,27 +96,6 @@ class CardsListFragment : BaseFragment(R.layout.fragment_cards_list) {
) )
) )
// swipeToRefresh.setColorSchemeResources(
// R.color.agr_black,
// R.color.primary100
// )
// swipeToRefresh.setOnRefreshListener {
// MobiUz.refreshCardsInfo(object : BaseListener<List<CardInfo>> {
// override fun error(message: String) {
// swipeToRefresh.isRefreshing = false
// showToastMessage(message)
// }
//
// override fun loading(boolean: Boolean) {
// swipeToRefresh.isRefreshing = boolean
// }
//
// override fun success(data: List<CardInfo>) {
// swipeToRefresh.isRefreshing = false
// setData(data)
// }
// })
// }
} }
......
...@@ -36,7 +36,7 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success ...@@ -36,7 +36,7 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private var saveCard: Int = 0 private var saveCard: Int = 0
private var cardNumber = "" private var cardNumber: String = ""
private lateinit var monitoring: Monitoring private lateinit var monitoring: Monitoring
private val viewModel: HistoryViewModel by viewModels() private val viewModel: HistoryViewModel by viewModels()
...@@ -47,7 +47,7 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success ...@@ -47,7 +47,7 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
arguments?.let { arguments?.let {
saveCard = it.getInt(CONSTANTS.PAY_SAVE_CARD, 0) saveCard = it.getInt(CONSTANTS.PAY_SAVE_CARD, 0) ?: 0
cardNumber = it.getString(CONSTANTS.PAY_CARD_NUMBER, "") ?: "" cardNumber = it.getString(CONSTANTS.PAY_CARD_NUMBER, "") ?: ""
val arg = it.getString(CONSTANTS.PAY_MONITORING, "") ?: "" val arg = it.getString(CONSTANTS.PAY_MONITORING, "") ?: ""
if (arg.isNotEmpty()) if (arg.isNotEmpty())
...@@ -119,14 +119,9 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success ...@@ -119,14 +119,9 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success
} }
if (card != null) { if (card != null) {
AGRBilling.deleteCard(card, object : BaseListener<Boolean> { AGRBilling.deleteCard(card, object : BaseListener<Boolean> {
override fun error(message: String) { override fun error(message: String) {}
message
}
override fun loading(boolean: Boolean) {} override fun loading(boolean: Boolean) {}
override fun success(data: Boolean) { override fun success(data: Boolean) {}
data
}
}) })
} }
} }
......
...@@ -9,34 +9,37 @@ import android.view.View ...@@ -9,34 +9,37 @@ import android.view.View
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import com.google.gson.Gson import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.android.synthetic.main.fragment_replenish_balance.* import kotlinx.android.synthetic.main.fragment_replenish_balance.*
import timber.log.Timber import kotlinx.coroutines.flow.collect
import uz.agr.sdk.core.entity.card.CardInfo import uz.agr.sdk.core.entity.card.CardInfo
import uz.agr.sdk.core.entity.tuple.Tuple3 import uz.agr.sdk.core.entity.tuple.Tuple3
import uz.agr.sdk.coreui.extension.hideSoftInput import uz.agr.sdk.coreui.extension.hideSoftInput
import uz.agr.sdk.coreui.extension.showSnackMessage import uz.agr.sdk.coreui.extension.showSnackMessage
import uz.agr.sdk.coreui.ui.TextWatcherWrapper
import uz.agr.sdk.coreui.ui.form.AmountFormat import uz.agr.sdk.coreui.ui.form.AmountFormat
import uz.agr.sdk.coreui.ui.form.CardDateExpireFormat import uz.agr.sdk.coreui.ui.form.CardDateExpireFormat
import uz.agr.sdk.coreui.ui.form.CardNumberFormat import uz.agr.sdk.coreui.ui.form.CardNumberFormat
import uz.agr.sdk.mobi_uz.AGRBilling
import uz.agr.sdk.mobi_uz.BaseListener import uz.agr.sdk.mobi_uz.BaseListener
import uz.agr.sdk.mobi_uz.CardListener import uz.agr.sdk.mobi_uz.CardListener
import uz.agr.sdk.mobi_uz.AGRBilling
import uz.agr.sdk.mobi_uz.VendorPayConfirm import uz.agr.sdk.mobi_uz.VendorPayConfirm
import uz.mobiuz.mobiservice.dev.R import uz.mobiuz.mobiservice.dev.R
import uz.mobiuz.mobiservice.dev.databinding.FragmentReplenishBalanceBinding import uz.mobiuz.mobiservice.dev.databinding.FragmentReplenishBalanceBinding
import uz.mobiuz.mobiservice.dev.model.Monitoring import uz.mobiuz.mobiservice.dev.model.Monitoring
import uz.mobiuz.mobiservice.dev.model.SharedPref import uz.mobiuz.mobiservice.dev.model.SharedPref
import uz.mobiuz.mobiservice.dev.network.model.UiStateObject
import uz.mobiuz.mobiservice.dev.ui.base.BaseFragment import uz.mobiuz.mobiservice.dev.ui.base.BaseFragment
import uz.mobiuz.mobiservice.dev.ui.global.ButtonClick import uz.mobiuz.mobiservice.dev.ui.global.ButtonClick
import uz.mobiuz.mobiservice.dev.ui.global.CONSTANTS import uz.mobiuz.mobiservice.dev.ui.global.CONSTANTS
import uz.mobiuz.mobiservice.dev.ui.sdk.card.CardViewModel import uz.mobiuz.mobiservice.dev.ui.sdk.card.CardViewModel
import uz.mobiuz.mobiservice.dev.ui.sdk.pay.SelectAnotherCard import uz.mobiuz.mobiservice.dev.ui.sdk.pay.SelectAnotherCard
import uz.mobiuz.mobiservice.dev.utils.extensions.getColorCompat import uz.mobiuz.mobiservice.dev.utils.extensions.checkChangedPosition
import uz.mobiuz.mobiservice.dev.utils.extensions.customLog
import uz.mobiuz.mobiservice.dev.utils.extensions.maskedTextMobi
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
import kotlin.collections.HashMap import kotlin.collections.HashMap
...@@ -63,6 +66,9 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -63,6 +66,9 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
private var cardNumberValid: String = "" private var cardNumberValid: String = ""
private var cardExpiryValid: String = "" private var cardExpiryValid: String = ""
private var phoneNumber = ""
var oldText = ""
var newText = ""
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentReplenishBalanceBinding.bind(view) _bn = FragmentReplenishBalanceBinding.bind(view)
...@@ -118,14 +124,36 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -118,14 +124,36 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
override fun collects() { override fun collects() {
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
viewModel.onClickedCardUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
bn.apply {
selectedCard = null
payWithAnotherCard = true
selectCardView.showNewCard()
selectCardView.isVisible = payWithAnotherCard
addCardForm.isVisible = payWithAnotherCard
customLog("addCard.isVisible = !payWithAnotherCard ${!payWithAnotherCard}")
addCard.isVisible = !payWithAnotherCard
checkValidForm()
customLog("onClickedCardUiState")
}
}
else -> Unit
}
}
}
} }
private fun setCardListAdapter(list: List<CardInfo>) { private fun setCardListAdapter(list: List<CardInfo>) {
bn.apply { bn.apply {
initSelectCardView(list) initSelectCardView(list)
addCard.isVisible = list.isEmpty() customLog("addCard.isVisible = list.isEmpty() ${list.isEmpty()}")
selectCardView.isVisible = list.isNotEmpty() if (!payWithAnotherCard) {
addCard.isVisible = list.isEmpty()
selectCardView.isVisible = list.isNotEmpty()
}
if (list.isNotEmpty()) { if (list.isNotEmpty()) {
selectCardView.showCard(list[0], 0) selectCardView.showCard(list[0], 0)
} }
...@@ -171,15 +199,9 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -171,15 +199,9 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
} }
private fun getAllCards() { private fun getAllCards() {
Timber.d("getAllCards")
AGRBilling.getAllCards(object : CardListener<CardInfo> { AGRBilling.getAllCards(object : CardListener<CardInfo> {
override fun error(message: String) { override fun error(message: String) {}
} override fun loading(boolean: Boolean) {}
override fun loading(boolean: Boolean) {
// showProgressDialog(boolean)
}
override fun local(localData: List<CardInfo>) { override fun local(localData: List<CardInfo>) {
setCardListAdapter(localData) setCardListAdapter(localData)
if (localData.isNotEmpty()) { if (localData.isNotEmpty()) {
...@@ -225,7 +247,6 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -225,7 +247,6 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
private fun pay() { private fun pay() {
bn.apply { bn.apply {
val phoneNumber = "998${etPhone.unmaskedText}"
val amount = amountValid ?: 0 val amount = amountValid ?: 0
if (!isMobiUz(phoneNumber.substring(3, 5))) { if (!isMobiUz(phoneNumber.substring(3, 5))) {
showSnackMessage(getString(R.string.agr_mobi_uz_payment_phone_error)) showSnackMessage(getString(R.string.agr_mobi_uz_payment_phone_error))
...@@ -263,9 +284,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -263,9 +284,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
override fun success(data: Boolean) { override fun success(data: Boolean) {
if (payWithAnotherCard) payWithAnotherCard( if (payWithAnotherCard) payWithAnotherCard(
cardNumberValid, cardExpiryValid, btnSwitch.isChecked, pref.userPhone.filter { it.isDigit() }, cardNumberValid, cardExpiryValid, btnSwitch.isChecked, phoneNumber, vendorFormParams)
vendorFormParams
)
else vendorPay(selectedCard, pref.userPhone.filter { it.isDigit() }, vendorFormParams) else vendorPay(selectedCard, pref.userPhone.filter { it.isDigit() }, vendorFormParams)
} }
}) })
...@@ -280,7 +299,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -280,7 +299,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
val monitoring = Monitoring( val monitoring = Monitoring(
date = System.currentTimeMillis(), date = System.currentTimeMillis(),
phone = "998${bn.etPhone.unmaskedText}", phone = this@ReplenishBalanceFragment.phoneNumber,
amount = bn.etAmount.text.toString().filter { it.isDigit() }.toLong(), amount = bn.etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = selectedCard.pan pan = selectedCard.pan
) )
...@@ -307,7 +326,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -307,7 +326,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
override fun showSuccessfulPayment(transactionId: Long) { override fun showSuccessfulPayment(transactionId: Long) {
val monitoring = Monitoring( val monitoring = Monitoring(
date = System.currentTimeMillis(), date = System.currentTimeMillis(),
phone = "998${etPhone.unmaskedText}", phone = this@ReplenishBalanceFragment.phoneNumber,
amount = etAmount.text.toString().filter { it.isDigit() }.toLong(), amount = etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = selectedCard.pan pan = selectedCard.pan
) )
...@@ -329,28 +348,30 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -329,28 +348,30 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
var isSave = false var isSave = false
val responsePhone = phoneNumber.replace("+", "") val responsePhone = phoneNumber.replace("+", "")
val inputPhone = phone.replace("+", "") val inputPhone = phone.replace("+", "")
if (responsePhone.substring(0, 5) == inputPhone.substring(0, 5) && isSave = responsePhone.substring(0, 5) == inputPhone.substring(0, 5) &&
responsePhone.substring(responsePhone.length - 2, responsePhone.length) == inputPhone.substring(inputPhone.length - 2, inputPhone.length) responsePhone.substring(responsePhone.length - 2, responsePhone.length) == inputPhone.substring(inputPhone.length - 2, inputPhone.length)
) isSave = true else {
// deleteCard(cardNumber, cardExpiry)
}
val monitoring = Monitoring( val monitoring = Monitoring(
date = System.currentTimeMillis(), date = System.currentTimeMillis(),
phone = "998${bn.etPhone.unmaskedText}", phone = this@ReplenishBalanceFragment.phoneNumber,
amount = etAmount.text.toString().filter { it.isDigit() }.toLong(), amount = etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = cardNumber pan = cardNumber
) )
val isSaveCard = 0
if (saveCard){
if (isSave) CONSTANTS.IS_SAVED_CARD else CONSTANTS.IS_NOT_SAVED_CARD
}
navController.navigate( navController.navigate(
R.id.verificationFragment, R.id.verificationFragment,
bundleOf( bundleOf(
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_ANOTHER_CARD, CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_ANOTHER_CARD,
CONSTANTS.TRANSACTION_ID to transactionId, CONSTANTS.TRANSACTION_ID to transactionId,
CONSTANTS.PHONE to monitoring.phone, CONSTANTS.PHONE to phoneNumber,
CONSTANTS.PAY_AMOUNT to monitoring.amount, CONSTANTS.PAY_AMOUNT to monitoring.amount,
CONSTANTS.SAVED_CARD to if (isSave) CONSTANTS.IS_SAVED_CARD else CONSTANTS.IS_NOT_SAVED_CARD, CONSTANTS.SAVED_CARD to isSaveCard,
CONSTANTS.PAY_CARD_NUMBER to if (isSave) cardNumber else cardNumber + cardExpiry, CONSTANTS.PAY_CARD_NUMBER to if (isSave) cardNumber else cardNumber + cardExpiry,
CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring) CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring)
) )
...@@ -368,7 +389,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -368,7 +389,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
override fun showSuccessfulPayment(transactionId: Long) { override fun showSuccessfulPayment(transactionId: Long) {
val monitoring = Monitoring( val monitoring = Monitoring(
date = System.currentTimeMillis(), date = System.currentTimeMillis(),
phone = "998${etPhone.unmaskedText}", phone = this@ReplenishBalanceFragment.phoneNumber,
amount = etAmount.text.toString().filter { it.isDigit() }.toLong(), amount = etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = cardNumber pan = cardNumber
) )
...@@ -377,7 +398,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -377,7 +398,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
R.id.paymentSuccessfulFragment, R.id.paymentSuccessfulFragment,
bundleOf( bundleOf(
CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring), CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring),
CONSTANTS.PAY_SAVE_CARD to saveCard, CONSTANTS.PAY_SAVE_CARD to if (saveCard) CONSTANTS.IS_SAVED_CARD else CONSTANTS.IS_NOT_SAVED_CARD,
CONSTANTS.PAY_CARD_NUMBER to cardNumber CONSTANTS.PAY_CARD_NUMBER to cardNumber
) )
) )
...@@ -390,16 +411,8 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -390,16 +411,8 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
val dialog = SelectAnotherCard() val dialog = SelectAnotherCard()
dialog.setListener(object : SelectAnotherCard.Listener { dialog.setListener(object : SelectAnotherCard.Listener {
override fun onClickAnotherCard() { override fun onClickAnotherCard() {
bn.apply {
selectedCard = null
payWithAnotherCard = true
selectCardView.showNewCard()
selectCardView.isVisible = true
addCardForm.isVisible = payWithAnotherCard
addCard.isVisible = false
checkValidForm()
}
dialog.dismiss() dialog.dismiss()
viewModel.onCLickAddCard(System.currentTimeMillis())
} }
override fun onClickAddCard() { override fun onClickAddCard() {
...@@ -411,10 +424,39 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -411,10 +424,39 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
private fun initPhone() { private fun initPhone() {
bn.apply { bn.apply {
etPhone.addTextChangedListener(object : TextWatcherWrapper() {
inputPhone.addTextChangedListener(object : uz.mobiuz.mobiservice.dev.ui.global.TextWatcherWrapper() {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
super.beforeTextChanged(s, start, count, after)
oldText = s.toString()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
try {
inputPhone.removeTextChangedListener(this)
val text = s.toString()
if (text.length < 5) {
inputPhone.setText("+998 ")
inputPhone.setSelection(5)
} else {
newText = text.filter { it.isDigit() || it == '+' }.maskedTextMobi()
inputPhone.setText(newText)
inputPhone.setSelection(oldText.checkChangedPosition(newText))
}
inputPhone.addTextChangedListener(this)
phoneNumber = inputPhone.text.toString().filter { it.isDigit() }
} catch (e: Exception) {
inputPhone.text.clear()
inputPhone.addTextChangedListener(this)
}
}
override fun afterTextChanged(s: Editable) { override fun afterTextChanged(s: Editable) {
val isAllFormsValid = if (amountValid != null && amountValid!! >= CONSTANTS.PAY_MIN_AMOUNT && amountValid!! <= CONSTANTS.PAY_MAX_AMOUNT) val isAllFormsValid = if (amountValid != null && amountValid!! >= CONSTANTS.PAY_MIN_AMOUNT && amountValid!! <= CONSTANTS.PAY_MAX_AMOUNT)
amountIsValid && s.toString().filter { it.isDigit() }.length == 12 amountIsValid && phoneNumber.length == 12
else false else false
val cardValid = if (payWithAnotherCard) cardNumberIsValid && cardExpiryIsValid else selectedCard != null val cardValid = if (payWithAnotherCard) cardNumberIsValid && cardExpiryIsValid else selectedCard != null
...@@ -444,16 +486,13 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -444,16 +486,13 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
if (valid) { if (valid) {
etCardExpiry.requestFocus() etCardExpiry.requestFocus()
cardNumberValid = number cardNumberValid = number
// etCardNumber.setBackgroundResource(R.drawable.edit_text_unchecked)
// etCardNumber.setTextColor(getColorCompat(R.color.black100))
} else {
// etCardNumber.setBackgroundResource(R.drawable.edit_text_error)
// etCardNumber.setTextColor(getColorCompat(R.color.primary100))
} }
tvErrorMsg.isVisible = !valid tvErrorMsg.isVisible = !valid
checkValidForm() checkValidForm()
if (etCardNumber.text.toString().isEmpty()) {
tvErrorMsg.isVisible = false
}
}) })
} }
} }
...@@ -480,18 +519,15 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -480,18 +519,15 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
if (!cardNumberIsValid) { if (!cardNumberIsValid) {
etCardNumber.requestFocus() etCardNumber.requestFocus()
} else activity?.hideSoftInput() } else activity?.hideSoftInput()
// etCardExpiry.setBackgroundResource(R.drawable.edit_text_unchecked)
// etCardExpiry.setTextColor(getColorCompat(R.color.black100))
} else {
// etCardExpiry.setBackgroundResource(R.drawable.edit_text_error)
// etCardExpiry.setTextColor(getColorCompat(R.color.primary100))
} }
cardExpiryIsValid = checkValid cardExpiryIsValid = checkValid
tvErrorMsgExpiry.isVisible = !checkValid tvErrorMsgExpiry.isVisible = !checkValid
checkValidForm() checkValidForm()
if (etCardExpiry.text.toString().isEmpty()) {
tvErrorMsgExpiry.isVisible = false
}
}) })
} }
} }
...@@ -499,7 +535,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc ...@@ -499,7 +535,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
private fun checkValidForm() { private fun checkValidForm() {
bn.apply { bn.apply {
val isAllFormsValid = if (amountValid != null && amountValid!! >= CONSTANTS.PAY_MIN_AMOUNT && amountValid!! <= CONSTANTS.PAY_MAX_AMOUNT) val isAllFormsValid = if (amountValid != null && amountValid!! >= CONSTANTS.PAY_MIN_AMOUNT && amountValid!! <= CONSTANTS.PAY_MAX_AMOUNT)
amountIsValid && etPhone.unmaskedText.toString().length == 9 amountIsValid && this@ReplenishBalanceFragment.phoneNumber.length == 12
else false else false
val cardValid = if (payWithAnotherCard) cardNumberIsValid && cardExpiryIsValid else selectedCard != null val cardValid = if (payWithAnotherCard) cardNumberIsValid && cardExpiryIsValid else selectedCard != null
......
...@@ -146,7 +146,7 @@ fun View.getStatusBarHeight(): Int { ...@@ -146,7 +146,7 @@ fun View.getStatusBarHeight(): Int {
fun String.maskedTextMobi(): String { fun String.maskedTextMobi(): String {
var newText = "" var newText = ""
for (i in this.indices) { for (i in this.indices) {
if (i == 2 || i == 5 || i == 7) { if (i == 4 || i == 6 || i == 9 || i == 11) {
newText += " " newText += " "
} }
newText += this[i] newText += this[i]
......
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/primary100"
android:state_checked="true" />
<item android:color="@color/grey70"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/primary70"
android:state_checked="true" />
<item android:color="@color/grey30"/>
</selector>
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/gradient" android:background="@drawable/gradient"
android:orientation="vertical" android:orientation="vertical"
tools:context=".dev.ui.auth.biometric.BiometricFragment"> tools:context=".dev.ui.auth.biometric.BiometricFragment">
...@@ -78,11 +79,13 @@ ...@@ -78,11 +79,13 @@
android:textColor="@color/black100" android:textColor="@color/black100"
android:textSize="17sp" /> android:textSize="17sp" />
<Switch <androidx.appcompat.widget.SwitchCompat
android:id="@+id/btn_switch" android:id="@+id/btn_switch"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:checked="true" android:checked="true"
app:trackTint="@color/switch_track_selector"
app:thumbTint="@color/switch_thumb_selector"
tools:ignore="UseSwitchCompatOrMaterialXml" /> tools:ignore="UseSwitchCompatOrMaterialXml" />
</LinearLayout> </LinearLayout>
......
...@@ -38,43 +38,23 @@ ...@@ -38,43 +38,23 @@
android:textColor="@color/black75" android:textColor="@color/black75"
/> />
<EditText
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:background="@drawable/edit_text_unchecked" android:id="@+id/input_phone"
android:inputType="phone"
android:longClickable="false"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="6dp" android:layout_marginTop="6dp"
android:layout_height="wrap_content"> android:paddingHorizontal="@dimen/_16sdp"
android:text="+998 "
<TextView android:maxLength="17"
android:layout_width="wrap_content" android:paddingVertical="@dimen/_14sdp"
android:text="+998 " android:textStyle="bold"
android:visibility="visible" android:layout_gravity="center"
android:layout_marginStart="@dimen/_16sdp" android:imeOptions="actionDone"
android:paddingVertical="@dimen/_14sdp" android:textSize="17sp"
android:textStyle="bold" android:background="@drawable/edit_text_unchecked"
android:layout_gravity="center" android:layout_height="wrap_content"/>
android:textColor="@color/black80"
android:textSize="17sp"
android:layout_height="wrap_content"/>
<EditText
android:layout_width="match_parent"
android:id="@+id/input_phone"
android:inputType="phone"
app:allowed_chars="1234567890"
android:longClickable="false"
app:mask="+998 ## ### ## ##"
android:maxLength="12"
android:paddingVertical="@dimen/_14sdp"
android:textStyle="bold"
android:layout_gravity="center"
android:imeOptions="actionDone"
android:textSize="17sp"
android:background="@drawable/edit_text_unchecked"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout> </LinearLayout>
......
...@@ -426,16 +426,6 @@ ...@@ -426,16 +426,6 @@
app:riv_corner_radius="6dp" /> app:riv_corner_radius="6dp" />
</com.facebook.shimmer.ShimmerFrameLayout> </com.facebook.shimmer.ShimmerFrameLayout>
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/image_place_holder"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="@dimen/_16sdp"
android:src="@drawable/image_slider2"
android:visibility="gone" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
......
...@@ -40,22 +40,24 @@ ...@@ -40,22 +40,24 @@
android:textColor="@color/black75" android:textColor="@color/black75"
android:textSize="15sp" /> android:textSize="15sp" />
<com.github.pinball83.maskededittext.MaskedEditText
android:id="@+id/etPhone" <EditText
android:id="@+id/input_phone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="56dp" android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="4dp" android:layout_marginTop="6dp"
android:background="@drawable/edit_text_unchecked" android:background="@drawable/edit_text_unchecked"
android:gravity="center|start" android:imeOptions="actionDone"
android:imeOptions="actionNext" android:inputType="phone"
android:inputType="number|textNoSuggestions" android:longClickable="false"
android:paddingHorizontal="12dp" android:maxLength="17"
android:paddingVertical="12dp" android:paddingHorizontal="@dimen/_16sdp"
android:textColor="@color/black100" android:paddingVertical="@dimen/_14sdp"
android:textSize="15sp" android:text="+998 "
app:mask="+998 ** *** ** **" android:textSize="17sp"
app:notMaskedSymbol="*" /> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/txt_hint_amount" android:id="@+id/txt_hint_amount"
...@@ -159,128 +161,139 @@ ...@@ -159,128 +161,139 @@
tools:visibility="visible" /> tools:visibility="visible" />
<LinearLayout <LinearLayout
android:id="@+id/addCardForm"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="16dp"
android:background="@drawable/card_background"
android:layout_marginBottom="16dp"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp" android:id="@+id/addCardForm"
android:visibility="gone" tools:visibility="visible"
tools:visibility="visible"> android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/agr_mobi_uz_card_number"
android:textColor="@color/white100"
android:textSize="15sp" />
<EditText <LinearLayout
android:id="@+id/etCardNumber"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginStart="16dp"
android:background="@android:color/transparent" android:layout_marginTop="10dp"
android:textColorHint="@color/grey100" android:layout_marginEnd="16dp"
android:hint="0000 0000 0000 0000" android:background="@drawable/card_background"
android:imeOptions="actionNext" android:orientation="vertical"
android:inputType="number|textNoSuggestions" android:padding="16dp">
android:longClickable="false"
android:maxLength="19"
android:paddingVertical="12dp"
android:textColor="@color/white100"
android:textSize="15sp"
tools:ignore="Autofill,HardcodedText" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/white100"/>
<TextView <TextView
android:id="@+id/tvErrorMsg" android:layout_width="wrap_content"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:text="@string/agr_mobi_uz_card_number"
android:layout_marginTop="6dp" android:textColor="@color/white100"
android:drawablePadding="8dp" android:textSize="15sp" />
android:text="@string/agr_mobi_uz_card_format_error"
android:textColor="@color/grey100"
android:textSize="13sp"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible" />
<TextView <EditText
android:layout_width="match_parent" android:id="@+id/etCardNumber"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:layout_marginTop="16dp" android:layout_height="wrap_content"
android:text="@string/agr_mobi_uz_card_expiry" android:layout_marginTop="4dp"
android:textColor="@color/white100" android:background="@android:color/transparent"
android:textSize="15sp" /> android:hint="0000 0000 0000 0000"
android:imeOptions="actionNext"
android:inputType="number|textNoSuggestions"
android:longClickable="false"
android:maxLength="19"
android:paddingVertical="12dp"
android:textColor="@color/white100"
android:textColorHint="@color/grey100"
android:textSize="15sp"
tools:ignore="Autofill,HardcodedText" />
<EditText <View
android:id="@+id/etCardExpiry" android:layout_width="match_parent"
android:layout_width="wrap_content" android:layout_height="1dp"
android:layout_height="wrap_content" android:background="@color/white100" />
android:layout_marginTop="4dp"
android:hint="ММ / ГГ"
android:background="@android:color/transparent"
android:textColorHint="@color/grey100"
android:imeOptions="actionDone"
android:textColor="@color/white100"
android:importantForAutofill="no"
android:inputType="number|textNoSuggestions"
android:longClickable="false"
android:maxLength="5"
android:paddingVertical="12dp"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<View
android:layout_width="60dp"
android:layout_height="1dp"
android:background="@color/white100"/>
<TextView <TextView
android:id="@+id/tvErrorMsgExpiry" android:id="@+id/tvErrorMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:drawablePadding="8dp"
android:text="@string/agr_mobi_uz_card_format_error"
android:textColor="@color/grey100"
android:textSize="13sp"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/agr_mobi_uz_card_expiry"
android:textColor="@color/white100"
android:textSize="15sp" />
<EditText
android:id="@+id/etCardExpiry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:background="@android:color/transparent"
android:hint="ММ / ГГ"
android:imeOptions="actionDone"
android:importantForAutofill="no"
android:inputType="number|textNoSuggestions"
android:longClickable="false"
android:maxLength="5"
android:paddingVertical="12dp"
android:textColor="@color/white100"
android:textColorHint="@color/grey100"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<View
android:layout_width="60dp"
android:layout_height="1dp"
android:background="@color/white100" />
<TextView
android:id="@+id/tvErrorMsgExpiry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:drawablePadding="8dp"
android:text="@string/agr_mobi_uz_card_expire_error"
android:textColor="@color/grey100"
android:textSize="13sp"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
<LinearLayout
android:id="@+id/checkboxSaveCard"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="6dp" android:layout_marginHorizontal="16dp"
android:drawablePadding="8dp" android:layout_marginTop="16dp"
android:text="@string/agr_mobi_uz_card_expire_error" android:gravity="center">
android:textColor="@color/grey100"
android:textSize="13sp"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/agr_mobi_uz_save_card"
android:textColor="@color/black100"
android:textSize="16sp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/btnSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
app:thumbTint="@color/switch_thumb_selector"
app:trackTint="@color/switch_track_selector"
tools:ignore="UseSwitchCompatOrMaterialXml" />
</LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/checkboxSaveCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="15dp"
android:gravity="center">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/agr_mobi_uz_save_card"
android:textColor="@color/black100"
android:textSize="16sp" />
<Switch
android:id="@+id/btnSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
tools:ignore="UseSwitchCompatOrMaterialXml" />
</LinearLayout>
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
<item name="android:textColor">@color/black</item> <item name="android:textColor">@color/black</item>
<item name="buttonStyle">@style/ButtonPrimary</item> <item name="buttonStyle">@style/ButtonPrimary</item>
<item name="bottomSheetDialogTheme">@style/AppModalBottomSheetStyle</item> <item name="bottomSheetDialogTheme">@style/AppModalBottomSheetStyle</item>
<item name="colorSwitchThumbNormal">@color/primary100</item>
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment