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() {
......
......@@ -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