Commit 5f3765fd authored by shohboz's avatar shohboz

[UPD] MUS-318 Feature, updated payment

parent d5ffe68f
......@@ -5,6 +5,7 @@
<map>
<entry key="../../../../layout/custom_preview.xml" value="0.3527777777777778" />
<entry key="../../.gradle/caches/transforms-3/272c6ad3bc9f3b40802fd3a427796f36/transformed/jetified-agr-sdk-mobi-uz-release-1.0.0/res/layout/agr_layout_empty.xml" value="0.25625" />
<entry key="../../.gradle/caches/transforms-3/272c6ad3bc9f3b40802fd3a427796f36/transformed/jetified-agr-sdk-mobi-uz-release-1.0.0/res/layout/agr_mobi_uz_monitoring_item.xml" value="0.25625" />
<entry key="../../.gradle/caches/transforms-3/eea77424a90e1e1097be3e7a9314e37d/transformed/jetified-mobi_uz/res/layout/agr_fragment_fast_pay.xml" value="0.25" />
<entry key="../../.gradle/caches/transforms-3/fd180e2afb980e83e4951f5e21e58af5/transformed/jetified-agr-sdk-coreui-release-1.7.0/res/layout/agr_core_ui_layout_zero.xml" value="0.25625" />
<entry key="../../.gradle/caches/transforms-3/fd180e2afb980e83e4951f5e21e58af5/transformed/jetified-agr-sdk-coreui-release-1.7.0/res/layout/agr_item_card.xml" value="0.25625" />
......@@ -113,6 +114,7 @@
<entry key="app/src/main/res/layout/home_motion.xml" value="0.10951008645533142" />
<entry key="app/src/main/res/layout/item_action.xml" value="0.25625" />
<entry key="app/src/main/res/layout/item_confirm.xml" value="0.23497267759562843" />
<entry key="app/src/main/res/layout/item_history_header.xml" value="0.25625" />
<entry key="app/src/main/res/layout/item_home.xml" value="0.22" />
<entry key="app/src/main/res/layout/item_pin.xml" value="0.23497267759562843" />
<entry key="app/src/main/res/layout/item_service.xml" value="0.25625" />
......@@ -125,6 +127,7 @@
<entry key="app/src/main/res/layout/layout_offline_bottom_sheet.xml" value="0.266051912568306" />
<entry key="app/src/main/res/layout/layout_sender.xml" value="0.25625" />
<entry key="app/src/main/res/layout/mobi_uz_item_card.xml" value="0.25625" />
<entry key="app/src/main/res/layout/monitoring_item.xml" value="0.25625" />
<entry key="app/src/main/res/layout/motion_layout.xml" value="0.266796875" />
<entry key="app/src/main/res/menu/bottom_nav_menu.xml" value="0.3416666666666667" />
<entry key="app/src/main/res/xml/layout_description.xml" value="0.25625" />
......
package uz.mobiuz.mobiservice.dev.model.database
import androidx.room.*
import io.reactivex.Single
import kotlinx.coroutines.flow.Flow
import uz.mobiuz.mobiservice.dev.model.Monitoring
/**
......@@ -11,7 +11,7 @@ import uz.mobiuz.mobiservice.dev.model.Monitoring
interface MonitoringDao {
@Query("SELECT * FROM monitoring")
fun getAllMonitoring(): Single<List<Monitoring>>
fun getAllMonitoring(): Flow<List<Monitoring>>
@Query("DELETE FROM monitoring")
fun deleteAllMonitoring()
......
......@@ -3,18 +3,12 @@ package uz.mobiuz.mobiservice.dev.network.repository
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import uz.agr.sdk.core.entity.card.CardRegistration
import uz.agr.sdk.pgw_core.mobi.BaseListener
import uz.agr.sdk.pgw_core.mobi.MobiUz
import uz.mobiuz.mobiservice.dev.model.Monitoring
import uz.mobiuz.mobiservice.dev.model.SharedPref
import uz.mobiuz.mobiservice.dev.model.database.MonitoringDao
import uz.mobiuz.mobiservice.dev.network.api.ApiService
import uz.mobiuz.mobiservice.dev.network.model.Customer
import uz.mobiuz.mobiservice.dev.network.model.UiStateObject
import uz.mobiuz.mobiservice.dev.utils.extensions.getMessage
import uz.mobiuz.mobiservice.dev.utils.extensions.userMessage
import javax.inject.Inject
import javax.inject.Singleton
......@@ -26,11 +20,16 @@ class CardRepository @Inject constructor(
@ApplicationContext val context: Context
) {
suspend fun addMonitoring(data:Monitoring){
withContext(Dispatchers.IO){
suspend fun addMonitoring(data: Monitoring) {
withContext(Dispatchers.IO) {
dao.addMonitoring(data)
}
}
fun getAllMonitoring(): Flow<List<Monitoring>> {
return dao.getAllMonitoring()
}
}
......@@ -181,7 +181,10 @@ class AuthViewModel @Inject constructor(
_vendorUiState.emit(UiStateObject.LOADING)
MobiUz.vendorPay(code, transactionId, object : VendorPaySuccessListener {
override fun exit() {
viewModelScope.launch {
_vendorUiState.emit(UiStateObject.ERROR("exit"))
}
// exit
}
override fun showError(message: String) {
......@@ -191,10 +194,11 @@ class AuthViewModel @Inject constructor(
}
override fun showProgress(show: Boolean) {
show
}
override fun showSuccess(transactionId: String) {
transactionId
viewModelScope.launch {
_vendorUiState.emit(UiStateObject.SUCCESS(transactionId))
}
......
......@@ -62,10 +62,11 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private var cardId = ""
private var cardExpire = ""
private var payCardnumber = ""
private var monitoring = ""
var transactionId = 0L
var payAmount = 0L
var saveCard: Boolean? = null
var saveCard: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
......@@ -81,8 +82,9 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
payCardnumber = it.getString(CONSTANTS.PAY_CARD_NUMBER) ?: ""
transactionId = it.getLong(CONSTANTS.TRANSACTION_ID)
saveCard = it.getBoolean(CONSTANTS.SAVED_CARD)
saveCard = it.getInt(CONSTANTS.SAVED_CARD, 0)
payAmount = it.getLong(CONSTANTS.PAY_AMOUNT)
monitoring = it.getString(CONSTANTS.PAY_MONITORING) ?: ""
}
}
......@@ -130,7 +132,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
viewModel.cardConfirm(cardId, getLinePinCodes())
}
CONSTANTS.TYPE_ANOTHER_CARD -> {
viewModel.vendor(getLinePinCodes(),transactionId)
viewModel.vendor(getLinePinCodes(), transactionId)
}
else -> {
viewModel.verification(auth)
......@@ -143,7 +145,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
sentCodeAgain.setOnClickListener {
when (type) {
CONSTANTS.TYPE_ADD_CARD -> {
viewModel.resendSms("998949125150", cardNumber, cardExpire)
viewModel.resendSms("998917797278", cardNumber, cardExpire)
}
CONSTANTS.TYPE_ANOTHER_CARD -> {
viewModel.vendorResendSms(transactionId)
......@@ -379,10 +381,9 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
navController.navigate(
R.id.paymentSuccessfulFragment,
bundleOf(
CONSTANTS.PHONE to phone,
CONSTANTS.PAY_AMOUNT to payAmount,
CONSTANTS.PAY_SAVE_CARD to saveCard,
CONSTANTS.PAY_CARD_NUMBER to cardNumber
CONSTANTS.PAY_CARD_NUMBER to payCardnumber,
CONSTANTS.PAY_MONITORING to monitoring
)
)
showProgressDialog(false)
......
......@@ -2,6 +2,8 @@ package uz.mobiuz.mobiservice.dev.ui.global
object CONSTANTS {
const val IS_SAVED_CARD = 1
const val IS_NOT_SAVED_CARD = 2
const val CARD_ID = "CARD_ID"
const val TRANSACTION_ID = "TRANSACTION_ID"
const val SAVED_CARD = "SAVED_CARD"
......@@ -108,4 +110,5 @@ object CONSTANTS {
const val PAY_AMOUNT = "PAYMENT_SUCCESS_PAYMENT"
const val PAY_SAVE_CARD = "PAYMENT_SAVE_CARD"
const val PAY_CARD_NUMBER = "PAYMENT_CARD_NUMBER"
const val PAY_MONITORING = "PAY_MONITORING"
}
package uz.mobiuz.mobiservice.dev.ui.home
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.core.os.bundleOf
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import uz.agr.sdk.core.entity.card.CardRegistration
import uz.agr.sdk.pgw_core.mobi.BaseListener
import uz.agr.sdk.pgw_core.mobi.MobiUz
import uz.mobiuz.mobiservice.dev.R
import uz.mobiuz.mobiservice.dev.databinding.FragmentBillingBinding
import uz.mobiuz.mobiservice.dev.model.SharedPref
import uz.mobiuz.mobiservice.dev.ui.base.BaseFragment
import uz.mobiuz.mobiservice.dev.ui.global.CONSTANTS
import uz.mobiuz.mobiservice.dev.utils.extensions.showMessage
import javax.inject.Inject
......@@ -43,21 +37,21 @@ class BillingFragment : BaseFragment(R.layout.fragment_billing) {
savedCards.setOnClickListener {
getPhoneNumber(object : LoadPhoneNumber {
override fun invoke(phoneNumber: String) {
navController.navigate(R.id.cardsListFragment, bundleOf(CONSTANTS.PHONE to pref.userPhone.filter { it.isDigit() }))
navController.navigate(R.id.cardsListFragment)
}
})
}
payments.setOnClickListener {
getPhoneNumber(object : LoadPhoneNumber {
override fun invoke(phoneNumber: String) {
navController.navigate(R.id.replenishBalanceFragment, bundleOf(CONSTANTS.PHONE to pref.userPhone.filter { it.isDigit() }))
navController.navigate(R.id.replenishBalanceFragment)
}
})
}
monitoring.setOnClickListener {
getPhoneNumber(object : LoadPhoneNumber {
override fun invoke(phoneNumber: String) {
// navController.navigate(R.id.replenishBalanceFragment, bundleOf(CONSTANTS.PHONE to pref.userPhone.filter { it.isDigit() }))
navController.navigate(R.id.monitoringLocalFragment)
}
})
}
......
......@@ -81,7 +81,7 @@ class AddCardFragment : BaseFragment(R.layout.fragment_add_card) {
val filteredCards = serverData.filter { it.cardHash == hash }
if (filteredCards.isEmpty()) {
viewModel.cardRegistration("998990552109", cardNumberValid!!, cardExpiryValid!!)
viewModel.cardRegistration("998917797278", cardNumberValid!!, cardExpiryValid!!)
} else {
showToastMessage(getString(uz.agr.mobiuz.R.string.agr_mobi_uz_card_exist))
}
......
......@@ -85,7 +85,7 @@ class CardConfirmFragment : BaseFragment(R.layout.fragment_card_confirm) {
btnResend.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
// viewModel.resendSms(pref.userPhone.filter { it.isDigit() },cardNumber,cardExpire)
viewModel.resendSms("998949125150", cardNumber, cardExpire)
viewModel.resendSms("998917797278", cardNumber, cardExpire)
}
})
......
......@@ -202,7 +202,7 @@ class CardsListFragment : BaseFragment(R.layout.fragment_cards_list) {
}
// private fun addCard() {
// MobiUz.registerCard("998990552109", "8600312917291250", "0325", object : BaseListener<CardRegistration> {
// MobiUz.registerCard("998917797278", "8600312917291250", "0325", object : BaseListener<CardRegistration> {
// override fun error(message: String) {
// Log.e("TTT", "error:$message")
// }
......
package uz.mobiuz.mobiservice.dev.ui.sdk.history
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.hannesdorfmann.adapterdelegates4.AdapterDelegate
import kotlinx.android.synthetic.main.item_history_header.view.*
import uz.agr.mobiuz.model.Tuple2
import uz.agr.sdk.coreui.extension.inflate
import uz.mobiuz.mobiservice.dev.R
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
class HistoryHeaderDelegate : AdapterDelegate<MutableList<Any>>() {
private val dateParseFormat = SimpleDateFormat("yyyyMMdd", Locale.getDefault())
private val dateFormat = SimpleDateFormat("dd MMMM", Locale.getDefault())
override fun isForViewType(items: MutableList<Any>, position: Int) =
items[position] is Tuple2
override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder =
ViewHolder(parent.inflate(R.layout.item_history_header))
override fun onBindViewHolder(items: MutableList<Any>, position: Int, viewHolder: RecyclerView.ViewHolder, payloads: MutableList<Any>) =
(viewHolder as ViewHolder).bind(items[position] as Tuple2)
private inner class ViewHolder(val containerView: View) : RecyclerView.ViewHolder(containerView) {
@SuppressLint("SetTextI18n")
fun bind(header: Tuple2) {
try {
containerView.tvTitle.text = header.first
if (header.second.isNotEmpty() && header.second.length > 4) {
if (header.second != "0") {
if (header.second[0] == '-') {
containerView.tvTotalSum.text = "${header.second[0]} ${header.second.substring(1, header.second.length)}"
} else containerView.tvTotalSum.text = header.second
}
}
} catch (e: ParseException) {
containerView.tvTitle.text = null
containerView.tvTotalSum.text = null
}
}
}
}
\ No newline at end of file
......@@ -3,16 +3,9 @@ package uz.mobiuz.mobiservice.dev.ui.sdk.history
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch
import uz.agr.sdk.core.entity.card.CardInfo
import uz.agr.sdk.pgw_core.mobi.CardListenerMobi
import uz.agr.sdk.pgw_core.mobi.MobiUz
import uz.mobiuz.mobiservice.dev.model.Monitoring
import uz.mobiuz.mobiservice.dev.network.model.UiStateList
import uz.mobiuz.mobiservice.dev.network.repository.CardRepository
import uz.mobiuz.mobiservice.dev.network.repository.MainRepository
import javax.inject.Inject
@HiltViewModel
......@@ -24,31 +17,7 @@ class HistoryViewModel @Inject constructor(
repository.addMonitoring(data)
}
private val _cardListUiState = MutableSharedFlow<UiStateList<CardInfo>>()
val cardListUiState: SharedFlow<UiStateList<CardInfo>> = _cardListUiState
fun getAllCards() = viewModelScope.launch {
_cardListUiState.emit(UiStateList.LOADING)
MobiUz.getAllCards(object : CardListenerMobi<CardInfo> {
override fun error(message: String) {
viewModelScope.launch {
_cardListUiState.emit(UiStateList.ERROR(message))
}
}
fun getAllMonitoring() = repository.getAllMonitoring()
override fun loading(boolean: Boolean) {}
override fun local(localData: List<CardInfo>) {
viewModelScope.launch {
_cardListUiState.emit(UiStateList.SUCCESS(localData))
}
}
override fun server(serverData: List<CardInfo>) {
viewModelScope.launch {
_cardListUiState.emit(UiStateList.SUCCESS(serverData))
}
}
})
}
}
\ No newline at end of file
}
\ No newline at end of file
package uz.mobiuz.mobiservice.dev.ui.sdk.history
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.hannesdorfmann.adapterdelegates4.ListDelegationAdapter
import uz.agr.mobiuz.model.Tuple2
import uz.agr.mobiuz.ui.global.list.DividerAdapterDelegate
import uz.agr.sdk.coreui.extension.formattedMoney
import uz.agr.sdk.coreui.ui.history.DividerItem
import uz.agr.sdk.coreui.ui.list.ProgressAdapterDelegate
import uz.agr.sdk.coreui.ui.list.ProgressItem
import uz.mobiuz.mobiservice.dev.model.Monitoring
class MonitoringAdapter : ListDelegationAdapter<MutableList<Any>>() {
init {
items = mutableListOf()
delegatesManager.addDelegate(HistoryHeaderDelegate())
delegatesManager.addDelegate(MonitoringDelegate())
delegatesManager.addDelegate(DividerAdapterDelegate())
delegatesManager.addDelegate(ProgressAdapterDelegate())
}
fun isHeaderItem(position: Int): Boolean = items[position] is Tuple2
fun setData(historyList: List<Monitoring>) {
val oldData = items.toList()
val progress = isProgress()
items.clear()
var summa: Long = 0
val hashMap = HashMap<String, String>()
for (item in historyList) {
val it = hashMap[item.date.toString()]
summa -= item.amount
if (it != null) {
val i = (it.toLong() + summa).toString()
hashMap[item.date.toString()] = i
} else {
hashMap[item.date.toString()] = "$summa"
}
summa = 0
}
var tempDate = ""
for (item in historyList) {
if (tempDate != item.date.toString()) {
items.add(DividerItem())
val value = hashMap[item.date.toString()]
items.add(
Tuple2(
item.date.toString(),
((value?.replaceRange(value.length - 2, value.length, "") ?: "0").toInt() * 100).formattedMoney(false) + " UZS"
)
)
tempDate = item.date.toString()
}
items.add(item)
}
if (items.isNotEmpty()) {
items.add(DividerItem())
}
if (progress) items.add(ProgressItem())
//yes, on main thread...
DiffUtil
.calculateDiff(DiffCallback(items, oldData), false)
.dispatchUpdatesTo(this)
}
fun showProgress(isVisible: Boolean) {
val oldData = items.toList()
val currentProgress = isProgress()
if (isVisible && !currentProgress) {
items.add(ProgressItem())
notifyItemInserted(items.lastIndex)
} else if (!isVisible && currentProgress) {
items.remove(items.last())
notifyItemRemoved(oldData.lastIndex)
}
}
private fun isProgress() = items.isNotEmpty() && items.last() is ProgressItem
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any?>) {
super.onBindViewHolder(holder, position, payloads)
}
private inner class DiffCallback(
private val newItems: List<Any>,
private val oldItems: List<Any>
) : DiffUtil.Callback() {
override fun getOldListSize() = oldItems.size
override fun getNewListSize() = newItems.size
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldItems[oldItemPosition]
val newItem = newItems[newItemPosition]
return if (newItem is Monitoring && oldItem is Monitoring) {
newItem.id == oldItem.id
} else if (newItem is Tuple2 && oldItem is Tuple2) {
newItem.first == oldItem.first
} else {
(newItem is ProgressItem && oldItem is ProgressItem)
|| (newItem is DividerItem && oldItem is DividerItem)
}
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldItems[oldItemPosition]
val newItem = newItems[newItemPosition]
return if (newItem is Monitoring && oldItem is Monitoring) {
newItem.id == oldItem.id
&& newItem.date == oldItem.date
&& newItem.amount == oldItem.amount
&& newItem.phone == oldItem.phone
&& newItem.pan == oldItem.pan
} else if (newItem is Tuple2 && oldItem is Tuple2) {
newItem.first == oldItem.first
} else {
true
}
}
}
}
\ No newline at end of file
package uz.mobiuz.mobiservice.dev.ui.sdk.history
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.hannesdorfmann.adapterdelegates4.AdapterDelegate
import kotlinx.android.synthetic.main.monitoring_item.view.*
import uz.agr.mobiuz.ui.fast_action.animation.formatCard1
import uz.agr.sdk.coreui.extension.formattedMoney
import uz.agr.sdk.coreui.extension.inflate
import uz.mobiuz.mobiservice.dev.R
import uz.mobiuz.mobiservice.dev.model.Monitoring
import uz.mobiuz.mobiservice.dev.utils.extensions.formatPhone
import java.text.SimpleDateFormat
import java.util.*
class MonitoringDelegate : AdapterDelegate<MutableList<Any>>() {
private val timeParseFormat = SimpleDateFormat("HHmmss", Locale.getDefault())
private val timeFormat = SimpleDateFormat("HH:mm", Locale.getDefault())
override fun isForViewType(items: MutableList<Any>, position: Int) = items[position] is Monitoring
override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder =
ViewHolder(parent.inflate(R.layout.monitoring_item))
override fun onBindViewHolder(items: MutableList<Any>, position: Int, viewHolder: RecyclerView.ViewHolder, payloads: MutableList<Any>) =
(viewHolder as ViewHolder).bind(items[position] as Monitoring)
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
super.onViewRecycled(holder)
}
private inner class ViewHolder(val containerView: View) : RecyclerView.ViewHolder(containerView) {
private lateinit var history: Monitoring
@SuppressLint("SetTextI18n", "ResourceAsColor")
fun bind(history: Monitoring) {
this.history = history
containerView.cardPan.text = history.pan.formatCard1()
containerView.tvAmount.text = "- " + (history.amount * 100).formattedMoney(false) + " " + itemView.context.getString(R.string.agr_mobi_uz_curr)
// val date = timeFormat.format(history.date)
val date = history.date.toString()
containerView.tvTime.text = date
containerView.tvTransType.text = history.phone.formatPhone()
}
}
}
\ No newline at end of file
package uz.mobiuz.mobiservice.dev.ui.sdk.history
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
......@@ -13,15 +10,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import uz.agr.mobiuz.ui.history.header.HeaderItemDecoration
import uz.agr.mobiuz.ui.history.local.MonitoringAdapter
import uz.agr.sdk.pgw_core.mobi.MobiUz
import uz.mobiuz.mobiservice.dev.R
import uz.mobiuz.mobiservice.dev.databinding.FragmentCardsListBinding
import uz.mobiuz.mobiservice.dev.databinding.FragmentMonitoringLocalBinding
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.home.HomeViewModel
import javax.inject.Inject
......@@ -33,7 +25,7 @@ class MonitoringLocalFragment : BaseFragment(R.layout.fragment_monitoring_local)
private var _bn: FragmentMonitoringLocalBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: HomeViewModel by viewModels()
private val viewModel: HistoryViewModel by viewModels()
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val adapter: MonitoringAdapter by lazy { MonitoringAdapter() }
......@@ -42,7 +34,6 @@ class MonitoringLocalFragment : BaseFragment(R.layout.fragment_monitoring_local)
_bn = FragmentMonitoringLocalBinding.bind(view)
setUpUI()
collects()
}
......@@ -55,7 +46,7 @@ class MonitoringLocalFragment : BaseFragment(R.layout.fragment_monitoring_local)
recyclerView.apply {
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
adapter = adapter
adapter = this@MonitoringLocalFragment.adapter
addItemDecoration(HeaderItemDecoration(this) { itemPosition ->
if (itemPosition >= 0 && itemPosition < adapter!!.itemCount) {
(adapter as MonitoringAdapter).isHeaderItem(itemPosition)
......@@ -68,27 +59,11 @@ class MonitoringLocalFragment : BaseFragment(R.layout.fragment_monitoring_local)
override fun collects() {
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.mainIndexUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
}
is UiStateObject.ERROR -> {
}
is UiStateObject.LOADING -> {
}
else -> Unit
}
lifecycleScope.launchWhenStarted {
viewModel.getAllMonitoring().collect {
adapter.setData(it)
}
}
}
override fun onDestroy() {
......
......@@ -5,18 +5,25 @@ import android.os.Bundle
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint
import uz.agr.mobiuz.ui.fast_action.animation.formatPhone
import uz.agr.sdk.core.entity.card.CardInfo
import uz.agr.sdk.coreui.extension.formattedMoney
import uz.agr.sdk.coreui.extension.showSnackMessage
import uz.agr.sdk.pgw_core.mobi.BaseListener
import uz.agr.sdk.pgw_core.mobi.MobiUz
import uz.mobiuz.mobiservice.dev.R
import uz.mobiuz.mobiservice.dev.databinding.FragmentPaymentSuccessfulBinding
import uz.mobiuz.mobiservice.dev.model.Monitoring
import uz.mobiuz.mobiservice.dev.ui.base.BaseFragment
import uz.mobiuz.mobiservice.dev.ui.global.ButtonClick
import uz.mobiuz.mobiservice.dev.ui.global.CONSTANTS
import uz.mobiuz.mobiservice.dev.ui.sdk.history.HistoryViewModel
import uz.mobiuz.mobiservice.dev.utils.extensions.formatCard
import uz.mobiuz.mobiservice.dev.utils.extensions.formatPhone
/**
* Created by DostonbekIbragimov on 06/01/2022.
......@@ -28,20 +35,26 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success
private var _bn: FragmentPaymentSuccessfulBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private var phone = ""
private var amount = ""
private var saveCard: Boolean? = null
private var saveCard: Int = 0
private var cardNumber = ""
private lateinit var monitoring: Monitoring
private val viewModel: HistoryViewModel by viewModels()
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
phone = arguments?.getString(CONSTANTS.PHONE, "") ?: ""
amount = arguments?.getString(CONSTANTS.PAY_AMOUNT, "0") ?: "0"
saveCard = arguments?.getBoolean(CONSTANTS.PAY_SAVE_CARD)
cardNumber = arguments?.getString(CONSTANTS.PAY_CARD_NUMBER, "") ?: ""
arguments?.let {
saveCard = it.getInt(CONSTANTS.PAY_SAVE_CARD, 0)
cardNumber = it.getString(CONSTANTS.PAY_CARD_NUMBER, "") ?: ""
val arg = it.getString(CONSTANTS.PAY_MONITORING, "") ?: ""
if (arg.isNotEmpty())
monitoring = Gson().fromJson(arg, Monitoring::class.java)
}
if (::monitoring.isInitialized)
viewModel.addMonitoring(monitoring)
}
......@@ -57,32 +70,69 @@ class PaymentSuccessfulFragment : BaseFragment(R.layout.fragment_payment_success
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
navController.popBackStack(R.id.replenishBalanceFragment,false)
navController.popBackStack(R.id.billingFragment, false)
}
})
doneButton.setOnClickListener(object : ButtonClick(){
doneButton.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navController.popBackStack(R.id.replenishBalanceFragment,false)
navController.popBackStack(R.id.billingFragment, false)
}
})
etAmount.text = "${amount.toLong().formattedMoney(showDecimal = false, tiyinToSum = false)} ${getString(uz.agr.mobiuz.R.string.agr_mobi_uz_curr)}"
etPhone.text = phone.formatPhone(minus = false)
if (saveCard == true) {
if (::monitoring.isInitialized) {
etAmount.text = "${monitoring.amount.formattedMoney(showDecimal = false, tiyinToSum = false)} ${
getString(
uz.agr.mobiuz.R.string
.agr_mobi_uz_curr
)
}"
etPhone.text = monitoring.phone.formatPhone(minus = false)
}
if (saveCard == CONSTANTS.IS_SAVED_CARD) {
showSnackMessage(getString(uz.agr.mobiuz.R.string.agr_mobi_uz_card_added))
if (cardNumber.isNotEmpty()) {
tvPanTitle.isVisible = true
etCardPan.isVisible = true
etCardPan.text = cardNumber.formatCard()
}
}
if (saveCard == false) {
if (saveCard == CONSTANTS.IS_NOT_SAVED_CARD) {
if (cardNumber.length == 20)
deleteCard(cardNumber.substring(0, 16), cardNumber.substring(16, 20))
showSnackMessage(getString(uz.agr.mobiuz.R.string.agr_mobi_uz_card_not_save))
}
}
}
private fun deleteCard(cardNumber: String, cardExpiry: String) {
MobiUz.getLocalCards(object : BaseListener<List<CardInfo>> {
override fun error(message: String) {}
override fun loading(boolean: Boolean) {}
override fun success(data: List<CardInfo>) {
val card: CardInfo? = data.find {
it.expiry.substring(0, 2) == cardExpiry.substring(2, 4) &&
it.expiry.substring(2, 4) == cardExpiry.substring(0, 2)
&& it.pan.replace(" ", "").substring(0, 6) == cardNumber.replace(" ", "").substring(0, 6)
&& it.pan.replace(" ", "").substring(it.pan.length - 4, it.pan.length) ==
cardNumber.replace(" ", "").substring(cardNumber.length - 4, cardNumber.length)
}
if (card != null) {
MobiUz.deleteCard(card, object : BaseListener<Boolean> {
override fun error(message: String) {
message
}
override fun loading(boolean: Boolean) {}
override fun success(data: Boolean) {
data
}
})
}
}
})
}
override fun collects() {
......
......@@ -5,16 +5,15 @@ import android.net.Uri
import android.os.Bundle
import android.text.Editable
import android.text.method.DigitsKeyListener
import android.util.Log
import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import kotlinx.android.synthetic.main.fragment_replenish_balance.*
import timber.log.Timber
import uz.agr.mobiuz.ui.fast_action.animation.getColorCompat
import uz.agr.mobiuz.ui.replenish.dialog.SelectCardBottomDialogFragment
......@@ -32,12 +31,11 @@ import uz.agr.sdk.pgw_core.mobi.CardListenerMobi
import uz.agr.sdk.pgw_core.mobi.MobiUz
import uz.mobiuz.mobiservice.dev.R
import uz.mobiuz.mobiservice.dev.databinding.FragmentReplenishBalanceBinding
import uz.mobiuz.mobiservice.dev.model.Monitoring
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.global.ButtonClick
import uz.mobiuz.mobiservice.dev.ui.global.CONSTANTS
import uz.mobiuz.mobiservice.dev.ui.home.HomeViewModel
import uz.mobiuz.mobiservice.dev.ui.sdk.card.CardViewModel
import uz.mobiuz.mobiservice.dev.ui.sdk.pay.SelectAnotherCard
import java.util.*
......@@ -52,7 +50,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
private var _bn: FragmentReplenishBalanceBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: HomeViewModel by viewModels()
private val viewModel: CardViewModel by viewModels()
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private var payWithAnotherCard = false
......@@ -227,7 +225,9 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
}
private fun isMobiUz(code: String): Boolean {
return code == "97" || code == "88"
return true
// return code == "97" || code == "88"
// return code == "99"
}
private fun pay() {
......@@ -264,14 +264,16 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
showSnackMessage(message)
}
override fun loading(boolean: Boolean) {}
override fun loading(boolean: Boolean) {
showProgressDialog(boolean)
}
override fun success(data: Boolean) {
if (payWithAnotherCard) payWithAnotherCard(
cardNumberValid, cardExpiryValid, btnSwitch.isChecked, /*pref.userPhone.filter { it.isDigit() }*/"998990552109",
cardNumberValid, cardExpiryValid, btnSwitch.isChecked, /*pref.userPhone.filter { it.isDigit() }*/"998917797278",
vendorFormParams
)
else vendorPay(selectedCard, /*pref.userPhone.filter { it.isDigit() }*/"998990552109", vendorFormParams)
else vendorPay(selectedCard, /*pref.userPhone.filter { it.isDigit() }*/"998917797278", vendorFormParams)
}
})
}
......@@ -282,18 +284,23 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
MobiUz.onClickPay(phoneNumber, selectedCard, vendorFormParams, requireContext(), object : VendorPayConfirm {
override fun showConfirmPage(transactionId: Long, phoneNumber: String, timeOut: Int) {
// todo Shohboz aka uchun
val monitoring = Monitoring(
date = System.currentTimeMillis(),
phone = "998${bn.etPhone.unmaskedText}",
amount = bn.etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = selectedCard.pan
)
navController.navigate(
R.id.verificationFragment,
bundleOf(
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_ANOTHER_CARD,
CONSTANTS.PHONE to "998" + bn.etPhone.unmaskedText,
CONSTANTS.PAY_AMOUNT to amountValid,
CONSTANTS.TRANSACTION_ID to transactionId
CONSTANTS.PHONE to monitoring.phone,
CONSTANTS.PAY_AMOUNT to monitoring.amount,
CONSTANTS.TRANSACTION_ID to transactionId,
CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring)
)
)
Log.e("TTT", "confirm")
}
override fun showError(message: String) {
......@@ -305,13 +312,16 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
}
override fun showSuccessfulPayment(transactionId: Long) {
// todo must add to local database
viewModel
val monitoring = Monitoring(
date = System.currentTimeMillis(),
phone = "998${etPhone.unmaskedText}",
amount = etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = selectedCard.pan
)
navController.navigate(
R.id.paymentSuccessfulFragment,
bundleOf(
CONSTANTS.PHONE to phoneNumber,
CONSTANTS.PAY_AMOUNT to bn.etAmount.text.toString().filter { it.isDigit() },
CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring)
)
)
}
......@@ -319,28 +329,6 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
}
}
private fun deleteCard(cardNumber: String, cardExpiry: String) {
MobiUz.getLocalCards(object : BaseListener<List<CardInfo>> {
override fun error(message: String) {}
override fun loading(boolean: Boolean) {}
override fun success(data: List<CardInfo>) {
val card: CardInfo? = data.find {
it.expiry.filter { it.isDigit() } == cardExpiry.filter { it.isDigit() }
&& it.pan.replace(" ", "").substring(0, 6) == cardNumber.replace(" ", "").substring(0, 6)
&& it.pan.replace(" ", "").substring(it.pan.length - 4, it.pan.length) ==
cardNumber.replace(" ", "").substring(cardNumber.length - 4, cardNumber.length)
}
if (card != null) {
MobiUz.deleteCard(card, object : BaseListener<Boolean> {
override fun error(message: String) {}
override fun loading(boolean: Boolean) {}
override fun success(data: Boolean) {}
})
}
}
})
}
private fun payWithAnotherCard(cardNumber: String, cardExpiry: String, saveCard: Boolean, phone: String, vendorFormParams: HashMap<String, String>) {
MobiUz.vendorPayWithAnotherCard(cardNumber, cardExpiry, saveCard, phone, vendorFormParams, object : VendorPayConfirm {
......@@ -351,18 +339,27 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
if (responsePhone.substring(0, 5) == inputPhone.substring(0, 5) &&
responsePhone.substring(responsePhone.length - 2, responsePhone.length) == inputPhone.substring(inputPhone.length - 2, inputPhone.length)
) isSave = true else {
deleteCard(cardNumber, cardExpiry)
// deleteCard(cardNumber, cardExpiry)
}
val monitoring = Monitoring(
date = System.currentTimeMillis(),
phone = "998${bn.etPhone.unmaskedText}",
amount = etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = cardNumber
)
navController.navigate(
R.id.verificationFragment,
bundleOf(
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_ANOTHER_CARD,
CONSTANTS.TRANSACTION_ID to transactionId,
CONSTANTS.PHONE to "998" + bn.etPhone.unmaskedText,
CONSTANTS.SAVED_CARD to isSave,
CONSTANTS.PAY_AMOUNT to amountValid,
CONSTANTS.PAY_CARD_NUMBER to cardNumber
CONSTANTS.PHONE to monitoring.phone,
CONSTANTS.PAY_AMOUNT to monitoring.amount,
CONSTANTS.SAVED_CARD to if (isSave) CONSTANTS.IS_SAVED_CARD else CONSTANTS.IS_NOT_SAVED_CARD,
CONSTANTS.PAY_CARD_NUMBER to if (isSave) cardNumber else cardNumber + cardExpiry,
CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring)
)
)
}
......@@ -376,11 +373,17 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
}
override fun showSuccessfulPayment(transactionId: Long) {
val monitoring = Monitoring(
date = System.currentTimeMillis(),
phone = "998${etPhone.unmaskedText}",
amount = etAmount.text.toString().filter { it.isDigit() }.toLong(),
pan = cardNumber
)
navController.navigate(
R.id.paymentSuccessfulFragment,
bundleOf(
CONSTANTS.PHONE to "998" + bn.etPhone.unmaskedText,
CONSTANTS.PAY_AMOUNT to bn.etAmount.text.toString().filter { it.isDigit() },
CONSTANTS.PAY_MONITORING to Gson().toJson(monitoring),
CONSTANTS.PAY_SAVE_CARD to saveCard,
CONSTANTS.PAY_CARD_NUMBER to cardNumber
)
......@@ -398,7 +401,7 @@ class ReplenishBalanceFragment : BaseFragment(R.layout.fragment_replenish_balanc
selectedCard = null
payWithAnotherCard = true
selectCardView.showNewCard()
selectCardView.isVisible = false
selectCardView.isVisible = true
addCardForm.isVisible = payWithAnotherCard
addCard.isVisible = false
checkValidForm()
......
......@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/agr_grey10"
android:orientation="vertical">
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/_32sdp"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="@dimen/_4sdp"
android:background="@drawable/agr_round_white"
android:elevation="@dimen/_5sdp"
app:cardCornerRadius="@dimen/_6sdp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:textColor="@color/agr_grey110"
android:textSize="13sp"
tools:text="03 марта 2022" />
<TextView
android:id="@+id/tvTotalSum"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight="1"
android:gravity="end"
android:textColor="@color/agr_text_color"
android:textSize="14sp"
android:textStyle="bold"
tools:text="03 марта" />
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginVertical="@dimen/_3sdp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:elevation="@dimen/_5sdp"
app:cardCornerRadius="@dimen/_6sdp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginBottom="16dp"
android:drawableStart="@drawable/ic_agr_hour_icon"
android:drawablePadding="4dp"
android:textColor="@color/agr_grey70"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="12:45" />
<TextView
android:id="@+id/tvAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:maxLines="1"
android:textColor="@color/primary100"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tvTransType"
tools:text="-37 000 сум" />
<FrameLayout
android:id="@+id/logoContent"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/agr_bg_oval_while"
android:elevation="2dp"
android:padding="5dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tvTime"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/tvTime"
tools:ignore="UnusedAttribute">
<ImageView
android:id="@+id/ivMerchantLogo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
tools:src="@drawable/agr_ic_prev_uztelecom" />
</FrameLayout>
<TextView
android:id="@+id/tvTransType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:gravity="center"
android:maxLength="26"
android:maxLines="1"
android:textColor="@color/agr_text_color"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Перевод" />
<Button
android:id="@+id/btMore"
android:layout_width="72dp"
android:layout_height="32dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:textAllCaps="false"
android:textColor="#1054A5"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/cardPan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/agr_grey100"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@id/tvTime"
app:layout_constraintEnd_toEndOf="@id/tvAmount"
tools:text="8600 31** **** 8899" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/agr_mobi_uz_with_card"
android:textColor="@color/agr_grey100"
android:textSize="12sp"
app:layout_constraintBottom_toTopOf="@id/cardPan"
app:layout_constraintEnd_toEndOf="@id/cardPan" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
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