From b890504d6141293000db84bc6fa0669da8bcf3d1 Mon Sep 17 00:00:00 2001 From: Mohan Shiwakoti Date: Sat, 1 Apr 2023 22:10:41 +0545 Subject: [PATCH] home flow changes banner added --- .idea/assetWizardSettings.xml | 5 +- app/build.gradle | 1 + .../BeneficiaryDetailActivity.kt | 19 +- .../homeV3/adpaters/BannerViewAdapter.kt | 65 ++ .../homeV3/adpaters/SendTypeAdapter.kt | 19 +- .../features/homeV3/models/BannerModel.kt | 3 + .../features/homeV3/view/HomeActivityV3.kt | 19 +- .../features/homeV3/view/HomeFragmentV3.kt | 598 +++++++---------- .../adapters/MyBeneficiariesAdapter.kt | 11 +- .../myTransfers/view/MyTransfersFragment.kt | 40 +- .../userprofile/view/ProfileFragment.kt | 110 +++ app/src/main/res/drawable/banner_round_bg.xml | 13 + app/src/main/res/drawable/blue_dot.xml | 12 + app/src/main/res/drawable/circle_bullet.xml | 8 + .../main/res/drawable/fingerprint_24px.xml | 40 ++ .../drawable/grey_border_dark_indicator.xml | 10 + app/src/main/res/drawable/ic_language.xml | 24 + app/src/main/res/drawable/ico_profile.png | Bin 0 -> 20368 bytes .../main/res/drawable/phonelink_lock_24px.xml | 17 + app/src/main/res/drawable/round_help_24px.xml | 25 + .../drawable/round_perm_phone_msg_24px.xml | 23 + .../main/res/drawable/round_person_24px.xml | 14 + app/src/main/res/layout/banner_item.xml | 27 + .../main/res/layout/banner_view_layout.xml | 35 + app/src/main/res/layout/fragment_home_new.xml | 36 +- app/src/main/res/layout/fragment_profile.xml | 632 ++++++++++++++++++ .../res/layout/row_fragment_beneficiaries.xml | 1 + app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 10 + 30 files changed, 1407 insertions(+), 414 deletions(-) create mode 100644 app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/BannerViewAdapter.kt create mode 100644 app/src/main/java/com/remit/jmecustomer/features/homeV3/models/BannerModel.kt create mode 100644 app/src/main/java/com/remit/jmecustomer/features/userprofile/view/ProfileFragment.kt create mode 100644 app/src/main/res/drawable/banner_round_bg.xml create mode 100644 app/src/main/res/drawable/blue_dot.xml create mode 100644 app/src/main/res/drawable/circle_bullet.xml create mode 100644 app/src/main/res/drawable/fingerprint_24px.xml create mode 100644 app/src/main/res/drawable/grey_border_dark_indicator.xml create mode 100644 app/src/main/res/drawable/ic_language.xml create mode 100755 app/src/main/res/drawable/ico_profile.png create mode 100644 app/src/main/res/drawable/phonelink_lock_24px.xml create mode 100644 app/src/main/res/drawable/round_help_24px.xml create mode 100644 app/src/main/res/drawable/round_perm_phone_msg_24px.xml create mode 100644 app/src/main/res/drawable/round_person_24px.xml create mode 100644 app/src/main/res/layout/banner_item.xml create mode 100644 app/src/main/res/layout/banner_view_layout.xml create mode 100644 app/src/main/res/layout/fragment_profile.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 84f7c458..00f8438c 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -317,8 +317,9 @@ diff --git a/app/build.gradle b/app/build.gradle index e0539678..d2a5752b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -233,6 +233,7 @@ dependencies { implementation 'io.trustdock.sdk:verification-sandbox-full:2.7.2' implementation 'com.google.android.flexbox:flexbox:3.0.0' + implementation 'me.relex:circleindicator:2.1.4' diff --git a/app/src/main/java/com/remit/jmecustomer/features/beneficiaryDetail/BeneficiaryDetailActivity.kt b/app/src/main/java/com/remit/jmecustomer/features/beneficiaryDetail/BeneficiaryDetailActivity.kt index ef28a675..0c6fef1c 100644 --- a/app/src/main/java/com/remit/jmecustomer/features/beneficiaryDetail/BeneficiaryDetailActivity.kt +++ b/app/src/main/java/com/remit/jmecustomer/features/beneficiaryDetail/BeneficiaryDetailActivity.kt @@ -8,6 +8,9 @@ import com.remit.jmecustomer.databinding.ActivityBeneficiaryDetailBinding import com.remit.jmecustomer.features.beneficiaryDetail.adapters.SendMethodAdapter import com.remit.jmecustomer.features.recipientlisting.view.recipientaddedit.RecipientAddEditActivity import com.remit.jmecustomer.features.recipientmanagement.model.recipientlistingV3.ReceiverInfoV3Model +import com.remit.jmecustomer.features.recipientmanagement.view.recipientaddeditV3.RecipientAddEditV3Activity +import com.remit.jmecustomer.features.sendmoney.model.SendMoneyRequiredDataV3 +import com.remit.jmecustomer.features.sendmoney.view.SendMoneyV2Activity class BeneficiaryDetailActivity : BaseActivity() { @@ -44,9 +47,19 @@ class BeneficiaryDetailActivity : BaseActivity() { } binding.agreeButton.setOnClickListener { - val intent = Intent() - setResult(RESULT_OK, intent) - finish() + val intent = Intent( + this@BeneficiaryDetailActivity, + SendMoneyV2Activity::class.java + ) + val sendMoneyRequiredDataV3 = SendMoneyRequiredDataV3(receiverInfoModel) + intent.putExtra( + RecipientAddEditV3Activity.RECIPIENT_INFO_BUNDLE_KEY_v3, + sendMoneyRequiredDataV3 + ) + startActivityForResult( + intent, + RecipientAddEditV3Activity.RECIPIENT_ACTION_EDIT_REQUEST_CODE_v3 + ) } } diff --git a/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/BannerViewAdapter.kt b/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/BannerViewAdapter.kt new file mode 100644 index 00000000..b7ac0745 --- /dev/null +++ b/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/BannerViewAdapter.kt @@ -0,0 +1,65 @@ +package com.remit.jmecustomer.features.homeV3.adpaters + +import android.content.Context +import android.util.DisplayMetrics +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.request.RequestOptions +import com.remit.jmecustomer.databinding.BannerItemBinding +import com.remit.jmecustomer.features.homeV3.models.BannerModel + +class BannerViewAdapter( + data: List, +) : + RecyclerView.Adapter() { + var data: List + var mContext: Context? = null + + init { + this.data = data + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BannerItemViewHolder { + val binding = BannerItemBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + mContext = parent.context + return BannerItemViewHolder(binding) + } + + override fun onBindViewHolder(holder: BannerItemViewHolder, position: Int) { + val imageURl: String = data[position].bannerIcon + Glide.with(mContext!!) + .load(imageURl).diskCacheStrategy(DiskCacheStrategy.ALL) + .transform(CenterCrop(), RoundedCorners(dpToPx(8, mContext!!))) + .into(holder.bindings.offerItemImgView) + } + + + override fun getItemCount(): Int { + return data.size + } + + private fun dpToPx(dp: Int, context: Context): Int { + val displayMetrics = context.resources.displayMetrics + return Math.round( + dp * (displayMetrics.xdpi / + DisplayMetrics.DENSITY_DEFAULT) + ) + } + + class BannerItemViewHolder(private val binding: BannerItemBinding) : + RecyclerView.ViewHolder(binding.root) { + val bindings: BannerItemBinding = binding + fun bind(item: String) { + + } + } +} diff --git a/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/SendTypeAdapter.kt b/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/SendTypeAdapter.kt index f3cf285e..c8fbe983 100644 --- a/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/SendTypeAdapter.kt +++ b/app/src/main/java/com/remit/jmecustomer/features/homeV3/adpaters/SendTypeAdapter.kt @@ -4,15 +4,22 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.remit.jmecustomer.databinding.RowSendTypeBinding +import com.remit.jmecustomer.features.exrate.model.PaymentModeMapper +import com.remit.jmecustomer.features.exrate.model.datav2.PaymentMode -class SendTypeAdapter(private val items: List) : +class SendTypeAdapter(private var items: MutableList) : RecyclerView.Adapter() { class ViewHolder(private val binding: RowSendTypeBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(item: String) { - binding.ivText.text = item + fun bind(item: PaymentMode) { + binding.ivIcon.setImageResource( + PaymentModeMapper.getPaymentModeImageFromId( + item.id + ) + ) + binding.ivText.text = item.description } } @@ -31,4 +38,10 @@ class SendTypeAdapter(private val items: List) : } override fun getItemCount(): Int = items.size + + fun setData(serviceAvailable: MutableList) { + if (serviceAvailable != null && serviceAvailable.size > 0) this.items = + serviceAvailable else this.items.clear() + notifyDataSetChanged() + } } \ No newline at end of file diff --git a/app/src/main/java/com/remit/jmecustomer/features/homeV3/models/BannerModel.kt b/app/src/main/java/com/remit/jmecustomer/features/homeV3/models/BannerModel.kt new file mode 100644 index 00000000..b75a7396 --- /dev/null +++ b/app/src/main/java/com/remit/jmecustomer/features/homeV3/models/BannerModel.kt @@ -0,0 +1,3 @@ +package com.remit.jmecustomer.features.homeV3.models + +class BannerModel(var bannerIcon : String) \ No newline at end of file diff --git a/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeActivityV3.kt b/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeActivityV3.kt index 2567bc5e..2edb7569 100644 --- a/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeActivityV3.kt +++ b/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeActivityV3.kt @@ -65,15 +65,16 @@ import com.remit.jmecustomer.features.transactionhistory.presenter.TransactionHi import com.remit.jmecustomer.features.transactionhistory.presenter.TransactionHistoryV2PresenterInterface import com.remit.jmecustomer.features.transactionhistory.view.RemitTransactionHistoryActivity import com.remit.jmecustomer.features.trustdock.view.TrustDockActivity +import com.remit.jmecustomer.features.userprofile.view.ProfileFragment import com.remit.jmecustomer.features.walletstatement.view.WalletStatementV2Activity import com.remit.jmecustomer.features.withdraw.view.WithdrawActivity class HomeActivityV3 : BaseActivity(), HomeParentViewContractV2, HomeV2PresenterInterface.HomeV2ContractInterface, SendMoneyActionListener, - SendMoneyV2ContractInterface , + SendMoneyV2ContractInterface, TransactionHistoryV2PresenterInterface.TransactionHistoryV2ContractInterface { - lateinit var binding: ActivityHomeV3Binding + lateinit var binding: ActivityHomeV3Binding private var pagerAdapter: HomePagerAdapter? = null private val currentFragment: Fragment? = null private val manager: FragmentManager? = null @@ -90,7 +91,7 @@ class HomeActivityV3 : BaseActivity(), HomeParentViewContractV2, private var presenter: SendMoneyV2PresenterInterface? = null private var sendMoneyRequiredData: SendMoneyRequiredDataV3? = null private var presenterTransaction: TransactionHistoryV2Presenter? = null - lateinit var homeFragmentV3 : HomeFragmentV3 + lateinit var homeFragmentV3: HomeFragmentV3 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityHomeV3Binding.inflate(layoutInflater) @@ -112,7 +113,7 @@ class HomeActivityV3 : BaseActivity(), HomeParentViewContractV2, SendMoneyV2ViewModel::class.java ) homeFragmentV3 = HomeFragmentV3() - val fragments = listOf(homeFragmentV3, MyTransfersFragment()) + val fragments = listOf(homeFragmentV3, MyTransfersFragment(), ProfileFragment()) pagerAdapter = HomePagerAdapter(supportFragmentManager, fragments) binding.vpDashboard.adapter = pagerAdapter @@ -146,6 +147,7 @@ class HomeActivityV3 : BaseActivity(), HomeParentViewContractV2, 2 -> { resetTabs() tab.setIcon(R.drawable.ic_transfers_selected) + binding.vpDashboard.currentItem = 2 } } } @@ -720,13 +722,4 @@ class HomeActivityV3 : BaseActivity(), HomeParentViewContractV2, true } else false } - - fun setSendData(sendMoneyRequiredDataV3: SendMoneyRequiredDataV3){ - val factory = SendMoneyViewModelFactory(this, sendMoneyRequiredDataV3) - presenter = ViewModelProviders.of(this, factory).get( - SendMoneyV2ViewModel::class.java - ) - homeFragmentV3.performDefaultAction(factory) - - } } \ No newline at end of file diff --git a/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeFragmentV3.kt b/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeFragmentV3.kt index c07651f2..fe396c86 100644 --- a/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeFragmentV3.kt +++ b/app/src/main/java/com/remit/jmecustomer/features/homeV3/view/HomeFragmentV3.kt @@ -1,56 +1,48 @@ package com.remit.jmecustomer.features.homeV3.view -import android.app.Activity -import android.content.Context +import android.graphics.Rect import android.os.Bundle -import android.os.Handler import android.text.Editable -import android.text.TextWatcher -import android.view.KeyEvent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* +import android.view.GestureDetector.SimpleOnGestureListener import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.Interpolator import android.view.inputmethod.EditorInfo -import android.widget.Button import android.widget.EditText import android.widget.ImageView import android.widget.RelativeLayout -import android.widget.Spinner import android.widget.TextView import android.widget.TextView.OnEditorActionListener -import androidx.cardview.widget.CardView -import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.GestureDetectorCompat import androidx.core.view.ViewCompat -import androidx.core.widget.NestedScrollView -import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import butterknife.BindView -import butterknife.ButterKnife +import androidx.recyclerview.widget.PagerSnapHelper import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.remit.jmecustomer.R import com.remit.jmecustomer.base.BaseFragment import com.remit.jmecustomer.common.customwidgets.CurrencyFormatterTextWatcher -import com.remit.jmecustomer.common.customwidgets.CustomAlertDialog -import com.remit.jmecustomer.common.customwidgets.JmeTextView import com.remit.jmecustomer.common.customwidgets.exchangecountrylistingdialog.CountryFlagMapper +import com.remit.jmecustomer.common.customwidgets.exchangecountrylistingdialog.ExchangeRateCurrencyListingDialog import com.remit.jmecustomer.databinding.FragmentHomeNewBinding -import com.remit.jmecustomer.features.exrate.model.datav2.ExchangeCalculationModel +import com.remit.jmecustomer.features.exrate.adapter.PaymentModeRvAdapter +import com.remit.jmecustomer.features.exrate.gateway.ExchangeRateGateway +import com.remit.jmecustomer.features.exrate.model.datav2.CountryPaymentService +import com.remit.jmecustomer.features.exrate.model.datav2.PaymentMode +import com.remit.jmecustomer.features.exrate.presenter.ExchangeRatePresenter +import com.remit.jmecustomer.features.exrate.presenter.ExchangeRatePresenterInterface +import com.remit.jmecustomer.features.exrate.presenter.ExchangeRatePresenterInterface.ExchangeRateContractInterfacee +import com.remit.jmecustomer.features.homeV3.adpaters.BannerViewAdapter import com.remit.jmecustomer.features.homeV3.adpaters.SendTypeAdapter -import com.remit.jmecustomer.features.sendmoney.SendMoneyViewModelFactory -import com.remit.jmecustomer.features.sendmoney.model.RewardsPointDTO +import com.remit.jmecustomer.features.homeV3.models.BannerModel import com.remit.jmecustomer.features.sendmoney.model.amountdetail.AmountDetailRelatedDataModel -import com.remit.jmecustomer.features.sendmoney.model.amountdetail.RecipientCurrencyModel -import com.remit.jmecustomer.features.sendmoney.presenter.SendMoneyV2ViewModel -import com.remit.jmecustomer.features.sendmoney.view.SendMoneyActionListener import com.remit.jmecustomer.features.sendmoney.view.amountdetail.AmountDetailExRateCountryListingDialog -import com.remit.jmecustomer.features.sendmoney.view.amountdetail.AmountDetailExRateCountryListingDialog.ExRateCurrencySelectionListener -import com.remit.jmecustomer.utils.Utils +import java.util.* class HomeFragmentV3 : BaseFragment(), View.OnClickListener, - ExRateCurrencySelectionListener, OnEditorActionListener { + OnEditorActionListener, ExchangeRateContractInterfacee, + PaymentModeRvAdapter.OnPaymentModeSelectionListener { + private var scrollPosition: Int = 0 private var _binding: FragmentHomeNewBinding? = null private val binding get() = _binding!! var iv_rewardsPoint: TextInputLayout? = null @@ -66,14 +58,11 @@ class HomeFragmentV3 : BaseFragment(), View.OnClickListener, private var selectedSendAmount: String? = null private var selectedsendingCurrency: String? = null private var sendAmountTextWatcher: SendAmountTextWatcher? = null - private var recepientAmountTextWatcher: RecipientAmountTextWatcher? = null private var sendCurrencyFormatterTextWatcher: CurrencyFormatterTextWatcher? = null private var recepientCurrencyFormatterTextWatcher: CurrencyFormatterTextWatcher? = null - private var rewardsPointTextWatcher: RewardsPointTextWatcher? = null private var selectedExRateId: String? = null private var selectedExRateWithoutTrunc: String? = null private var selectedTransferAmount: String? = null - private var viewmodel: SendMoneyV2ViewModel? = null private var sendMoneyEditText: TextInputEditText? = null private var recieveMoneyEditText: TextInputEditText? = null private var continueBtn: RelativeLayout? = null @@ -83,6 +72,16 @@ class HomeFragmentV3 : BaseFragment(), View.OnClickListener, private var recepientFlagImageView: ImageView? = null private var recepientCurrencyTextView: TextView? = null private var btnText: TextView? = null + lateinit var presenter: ExchangeRatePresenterInterface + private var countryListingDialog: ExchangeRateCurrencyListingDialog? = null + + private var sendMoneyTextWatcher: SendAmountTextWatcher? = null + private var receiveMoneyTextWatcher: ReceiveAmountTextWatcher? = null + private var gestureDetector: GestureDetectorCompat? = null + private var myViewGestureDetector: AmountChangeAndFocusOutDetector? = null + + private val paymentModeRvAdapter: PaymentModeRvAdapter? = null + private var sendTypeAdapter: SendTypeAdapter? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -91,7 +90,8 @@ class HomeFragmentV3 : BaseFragment(), View.OnClickListener, _binding = FragmentHomeNewBinding.inflate(inflater, container, false) setUpData() init() - performDefaultAction(null) + setBannerData() + performDefaultAction() return binding.root } @@ -99,15 +99,21 @@ class HomeFragmentV3 : BaseFragment(), View.OnClickListener, super.onViewCreated(view, savedInstanceState) } + private fun performDefaultAction() { + showProgressBar(true, getString(R.string.processing_request_text)) + presenter.getExrateRelatedData() + } + private fun setUpData() { - var list = listOf("Cash Pickup", "Bank Deposit", "Mobile Wallet") + val list: MutableList = ArrayList() val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) binding.rvSendType.layoutManager = layoutManager - var adapter = SendTypeAdapter(list) - binding.rvSendType.adapter = adapter + sendTypeAdapter = SendTypeAdapter(list) + binding.rvSendType.adapter = sendTypeAdapter } private fun init() { + presenter = ExchangeRatePresenter(this, ExchangeRateGateway()) sendMoneyEditText = binding.sendAmountEdTxt recieveMoneyEditText = binding.receiveAmountEdTxt transferFeeTxtView = binding.tvTransfer1 @@ -117,417 +123,273 @@ class HomeFragmentV3 : BaseFragment(), View.OnClickListener, recepientCurrencyTextView = binding.tvCurrency2 countrySelectionSpinner = binding.ivCurrency2; btnText = binding.btnText - viewmodel = ViewModelProvider(requireActivity())[SendMoneyV2ViewModel::class.java] - sendAmountTextWatcher = SendAmountTextWatcher() - recepientAmountTextWatcher = RecipientAmountTextWatcher() interpolator = AccelerateDecelerateInterpolator() - setupRecyclerView() - registerTextWatchers(true) - viewmodel!!.fetchRewardsLiveData() - viewmodel!!.subscribeToRewardsPoint().observe( - viewLifecycleOwner - ) { rewardsPointDTO: RewardsPointDTO -> - updateRewardDetails( - rewardsPointDTO - ) - } - } - - override fun onStart() { - super.onStart() - continueBtn!!.setOnClickListener(this) - recieveMoneyEditText!!.setOnEditorActionListener(this) - sendMoneyEditText!!.setOnEditorActionListener(this) - countrySelectionSpinner!!.setOnClickListener(this) -// recepientCurrencyTextView!!.setOnClickListener(this) -// countrySelectionSpinnerArrow!!.setOnClickListener(this) -// ed_rewardsPoint!!.setOnClickListener(this) -// ed_rewardsPoint!!.setOnEditorActionListener(this) - } - - override fun onStop() { - super.onStop() - continueBtn!!.setOnClickListener(null) - recieveMoneyEditText!!.setOnEditorActionListener(null) - sendMoneyEditText!!.setOnEditorActionListener(null) - countrySelectionSpinner!!.setOnClickListener(null) -// recepientCurrencyTextView!!.setOnClickListener(null) -// countrySelectionSpinnerArrow!!.setOnClickListener(null) -// ed_rewardsPoint!!.setOnClickListener(null) -// ed_rewardsPoint!!.setOnEditorActionListener(null) - } - - override fun onAttach(context: Context) { - super.onAttach(context) - (context as SendMoneyActionListener).updateCurrentIndexFrom(R.layout.fragment_amount_detail_send_money_v2) - } - - override fun onAttach(activity: Activity) { - super.onAttach(activity) - (activity as SendMoneyActionListener).updateCurrentIndexFrom(R.layout.fragment_amount_detail_send_money_v2) - } - - override fun onDetach() { - super.onDetach() - (activity as SendMoneyActionListener?)!!.updateCurrentScreenByLayoutId(R.layout.fragment_amount_detail_send_money_v2) + sendMoneyTextWatcher = SendAmountTextWatcher(sendMoneyEditText) + receiveMoneyTextWatcher = ReceiveAmountTextWatcher(recieveMoneyEditText) + myViewGestureDetector = AmountChangeAndFocusOutDetector() + gestureDetector = GestureDetectorCompat(requireContext(), myViewGestureDetector) } - override fun onDestroy() { - registerTextWatchers(false) - super.onDestroy() + override fun onClick(v: View) { + when (v.id) { + R.id.agreeButton -> { + (requireActivity() as HomeActivityV3).binding.vpDashboard.currentItem = 1 + } + R.id.countrySelectionSpinner, R.id.recepientCurrencyTextView, R.id.iv_currency_2 -> showCountryListinDialog() + R.id.exRateCalculateButton -> presenter.calcExrate() + } } - private fun setupRecyclerView() {} - - private fun showCurrencyListingDialog() { - hideKeyBoard() - if (amountDetailRelatedData!!.availableCurrencyData == null || amountDetailRelatedData!!.availableCurrencyData.isEmpty()) return - if (exRateCountryListingDialog == null) exRateCountryListingDialog = - AmountDetailExRateCountryListingDialog() - exRateCountryListingDialog!!.setListener(this) - exRateCountryListingDialog!!.setCountryPaymentData(amountDetailRelatedData!!.availableCurrencyData) - if (!exRateCountryListingDialog!!.isAdded) exRateCountryListingDialog!!.show( - activity!!.supportFragmentManager, + private fun showCountryListinDialog() { + if (countryListingDialog == null) countryListingDialog = ExchangeRateCurrencyListingDialog() + countryListingDialog?.setCountryPaymentData(presenter.getAvailableCountryRelatedCurrency()) + countryListingDialog?.setListener(ExchangeRateCurrencyListingDialog.CountrySelectionListener { countryPaymentService -> + presenter.setCountryRelatedCurrencyData(countryPaymentService) + countryListingDialog?.dismiss() + }) + if (!countryListingDialog!!.isAdded) countryListingDialog?.show( + requireActivity().supportFragmentManager, "GenericTextListingDialog" ) } - fun performDefaultAction(sendMoneyViewModelFactory: SendMoneyViewModelFactory?) { - - if(sendMoneyViewModelFactory != null) { - viewmodel = - ViewModelProvider(this, sendMoneyViewModelFactory)[SendMoneyV2ViewModel::class.java] - } - shouldCaulatedByRecipient = false - showFootNote(viewmodel!!.footNote) - viewmodel!!.subscribeToAmountRelatedData().observe( - viewLifecycleOwner - ) { data: AmountDetailRelatedDataModel? -> - amountDetailRelatedData = data - if (amountDetailRelatedData == null || amountDetailRelatedData!!.defaultSelectedCurrency == null) { - showSelectedCurrency("", getString(R.string.na_text)) - Handler().postDelayed({ - showPopUpMessage( - getString(R.string.no_payout_currency_defined_error), - CustomAlertDialog.AlertType.ALERT, - null - ) - }, 350) - continueBtn!!.setOnClickListener(null) - } else { - showSelectedCurrency( - amountDetailRelatedData!!.defaultSelectedCurrency.countryCode, - amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode - ) - updateButtonToCalculate(true) - } - } - viewmodel!!.subscribeToExRateData().observe( - viewLifecycleOwner - ) { data: ExchangeCalculationModel -> - selectedTransferFeeAmount = data.scCharge - selectedExRate = data.exRateDisplay - selectedExRateWithoutTrunc = data.exRate - selectedRecipientAmount = data.getpAmt() - selectedSendAmount = data.collAmt - selectedsendingCurrency = data.collCurr - selectedExRateId = data.exrateId - selectedTransferAmount = data.getsAmt() - val transferDisplay = - " -" + Utils.formatCurrency( - selectedTransferFeeAmount - ) + " " + selectedsendingCurrency + "\n (" + getString(R.string.transfer_fee_included_text) + ")" - val exRateDisplay = - """ $selectedExRate - (${getString(R.string.current_exchange_rate_text)})""" - showTransferfeeAndExRate(true, transferDisplay, exRateDisplay, "") - showSendAndRecieveAmount(selectedSendAmount, selectedRecipientAmount) - updateButtonToCalculate(false) - showFootNote(viewmodel!!.footNote) + private fun startSendAmountListener(action: Boolean) { + if (action) { + binding.sendAmountEdTxt.addTextChangedListener(sendMoneyTextWatcher) + } else { + binding.sendAmountEdTxt.removeTextChangedListener(sendMoneyTextWatcher) } } - override fun onClick(v: View) { - when (v.id) { - R.id.agreeButton -> if (shouldCalculateExRate) { - forex - } else { - if (validateAll()) { - hideKeyBoard() - sendMoneyEditText!!.clearFocus() - recieveMoneyEditText!!.clearFocus() - viewmodel!!.setSendingAmount( - sendMoneyEditText!!.text.toString(), - amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode, - selectedExRateWithoutTrunc, - selectedRecipientAmount, - selectedTransferFeeAmount, - shouldCaulatedByRecipient, - selectedExRateId, - selectedTransferAmount - ) - // ((SendMoneyActionListener) getActivity()).showTransactionReviewPage(); - (activity as SendMoneyActionListener?)!!.showCCDIPage() - } - } - R.id.countrySelectionSpinner, R.id.recepientCurrencyTextView, R.id.countrySelectionSpinnerArrow -> if (!amountDetailRelatedData!!.availableCurrencyData.isEmpty()) showCurrencyListingDialog() + private fun startReceiveAmountListener(action: Boolean) { + if (action) { + binding.receiveAmountEdTxt.addTextChangedListener(receiveMoneyTextWatcher) + } else { + binding.receiveAmountEdTxt.removeTextChangedListener(receiveMoneyTextWatcher) } } - private val forex: Unit - private get() { - if (shouldCaulatedByRecipient && !validateAmountIsNotEmpty(recieveMoneyEditText!!.text.toString())) { - showToastMessage(getString(R.string.sending_amount_error)) - return - } - if (!shouldCaulatedByRecipient && !validateAmountIsNotEmpty(sendMoneyEditText!!.text.toString())) { - showToastMessage(getString(R.string.receiving_amount_error)) - return - } - if (amountDetailRelatedData != null) { - viewmodel!!.getForex( - recieveMoneyEditText!!.text.toString(), - sendMoneyEditText!!.text.toString(), - shouldCaulatedByRecipient, - amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode, - binding.edRewardsPoint!!.text.toString() - ); - } else { - (requireActivity() as HomeActivityV3).binding.vpDashboard.currentItem = 2 - } - } + override fun showPayoutAmount(pAmount: String?) { + startReceiveAmountListener(false) + binding.receiveAmountEdTxt.setText(pAmount) + startReceiveAmountListener(true) + } - private fun showSelectedCurrency( - selectedCountryCode: String?, - selectedCountryCurrency: String? + override fun showCollectionAmount(pAmount: String?) { + startSendAmountListener(false) + binding.sendAmountEdTxt.setText(pAmount) + startSendAmountListener(true) + } + + override fun showSelectedPayoutMode( + serviceAvailable: MutableList, + selectedIndex: Int ) { - var flagResId = -1 - if (selectedCountryCode != null) flagResId = - CountryFlagMapper.getFlagFromCountryCode(selectedCountryCode) - if (flagResId != -1) recepientFlagImageView!!.setBackgroundResource(flagResId) else recepientFlagImageView!!.setBackgroundResource( - 0 + sendTypeAdapter?.setData(serviceAvailable) +// sendTypeAdapter.setSelectedItem(selectedIndex) + } + + override fun showSelectedPayoutCurrency(selectedPayoutCountryCurrency: CountryPaymentService) { + recepientCurrencyTextView!!.text = selectedPayoutCountryCurrency.currency + recepientFlagImageView!!.setImageResource( + CountryFlagMapper.getFlagFromCountryCode( + selectedPayoutCountryCurrency.countryCode + ) ) - if (selectedCountryCurrency != null) recepientCurrencyTextView!!.text = - selectedCountryCurrency } - private fun showTransferfeeAndExRate( - action: Boolean, - transferDisplay: String, - exRateDisplay: String, - discountValue: String + + override fun showTransferChargeAndExrate( + chargeAmount: String?, + exRate: String?, + formattedExRate: String?, + playAnimation: Boolean ) { - if (action) { - if (exchangeRateTxtView!!.visibility == View.VISIBLE) exchangeRateTxtView!!.visibility = - View.INVISIBLE - exchangeRateTxtView!!.text = exRateDisplay + if (playAnimation) { + exchangeRateTxtView!!.visibility = View.INVISIBLE + exchangeRateTxtView!!.text = exRate exchangeRateTxtView!!.translationY = exchangeRateTxtView!!.height.toFloat() exchangeRateTxtView!!.visibility = View.VISIBLE ViewCompat.animate(exchangeRateTxtView!!).translationY(0f).setDuration(550) .setInterpolator( interpolator ).start() - if (transferFeeTxtView!!.visibility == View.VISIBLE) transferFeeTxtView!!.visibility = - View.INVISIBLE - transferFeeTxtView!!.text = transferDisplay + transferFeeTxtView!!.visibility = View.INVISIBLE + transferFeeTxtView!!.text = chargeAmount transferFeeTxtView!!.translationY = transferFeeTxtView!!.height.toFloat() transferFeeTxtView!!.visibility = View.VISIBLE ViewCompat.animate(transferFeeTxtView!!).translationY(0f).setDuration(550) .setInterpolator( interpolator ).start() +// jmeExratePC.setVisibility(View.INVISIBLE) +// jmeExratePC.setAlpha(0f) +// jmeExratePC.setText(formattedExRate) +// jmeExratePC.setVisibility(View.INVISIBLE) +// jmeExratePC.animate().alpha(1f).setDuration(500).withLayer().start() } else { - if (exchangeRateTxtView!!.visibility == View.VISIBLE) exchangeRateTxtView!!.visibility = - View.INVISIBLE - if (transferFeeTxtView!!.visibility == View.VISIBLE) transferFeeTxtView!!.visibility = - View.INVISIBLE + transferFeeTxtView!!.text = chargeAmount + exchangeRateTxtView!!.text = exRate +// jmeExratePC.setText(formattedExRate) } } - private fun showSendAndRecieveAmount(sendAmount: String?, recieveAmount: String?) { - updateSendAmount(sendAmount) - updateRecievingAmount(recieveAmount) + override fun showExrateView(task: Runnable?) { + showProgressBar(false, getString(R.string.processing_request_text)) + presenter.onExRateViewLoadedSuccessfully() } - private fun validateAmountIsNotEmpty(amount: String?): Boolean { - return amount != null && amount.length > 0 + override fun showFootNote(footNote: String) { +// if (footNote.isEmpty()) { +// idExFootNoteContainer.setVisibility(View.INVISIBLE) +// } else { +// exRateFootNoteText.setText(footNote) +// idExFootNoteContainer.setVisibility(View.VISIBLE) +// } } - override fun onCurrencySelected(selectedCurrency: RecipientCurrencyModel) { - if (amountDetailRelatedData != null && amountDetailRelatedData!!.defaultSelectedCurrency != null && amountDetailRelatedData!!.defaultSelectedCurrency.countryName != null && amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode != null && amountDetailRelatedData!!.defaultSelectedCurrency.countryName.length > 0 && amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode.length > 0) { - if (!amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode.equals( - selectedCurrency.currencyCode, - ignoreCase = true - ) && !amountDetailRelatedData!!.defaultSelectedCurrency.countryName.equals( - selectedCurrency.countryCode, - ignoreCase = true - ) - ) { - updateRecievingAmount("") - updateButtonToCalculate(true) - shouldCaulatedByRecipient = false - } else forex - } - amountDetailRelatedData!!.defaultSelectedCurrency = selectedCurrency - if (exRateCountryListingDialog != null) exRateCountryListingDialog!!.dismiss() - exRateCountryListingDialog = null - showSelectedCurrency( - amountDetailRelatedData!!.defaultSelectedCurrency.countryCode, - amountDetailRelatedData!!.defaultSelectedCurrency.currencyCode - ) + override fun onPaymentModeSelected(selectedData: PaymentMode?) { + presenter.setPaymentMode(selectedData) + } + + override fun onStart() { + super.onStart() +// exRateCalculateButton.setOnClickListener(this) +// iv_back.setOnClickListener(this) + binding.receiveAmountEdTxt.setOnEditorActionListener(this) + binding.sendAmountEdTxt.setOnEditorActionListener(this) + countrySelectionSpinner!!.setOnClickListener(this) + recepientCurrencyTextView!!.setOnClickListener(this) + recepientFlagImageView?.setOnClickListener(this) + binding.agreeButton.setOnClickListener(this) } override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?): Boolean { when (v.id) { - R.id.sendAmountEdTxt, R.id.receiveAmountEdTxt -> { + R.id.sendAmountEdTxt -> { if (actionId == EditorInfo.IME_ACTION_DONE) { - hideKeyBoard() - forex + presenter.setCalcByPayoutAmount(false) + presenter.calcExrate() + return true } - return true - } - R.id.ed_rewardsPoint -> { if (actionId == EditorInfo.IME_ACTION_DONE) { - hideKeyBoard() - forex + presenter.setCalcByPayoutAmount(true) + presenter.calcExrate() + return true } + } + R.id.receiveAmountEdTxt -> if (actionId == EditorInfo.IME_ACTION_DONE) { + presenter.setCalcByPayoutAmount(true) + presenter.calcExrate() return true } } return false } - private fun validateAll(): Boolean { - return validateAmountIsNotEmpty(sendMoneyEditText!!.text.toString()) && validateAmountIsNotEmpty( - recieveMoneyEditText!!.text.toString() - ) - } - - private fun updateButtonToCalculate(action: Boolean) { - shouldCalculateExRate = action - if (action) btnText?.text = - getString(R.string.calculate_text) else btnText?.text = - getString(R.string.continue_text) - } - - private fun updateSendAmount(amount: String?) { - registerAvailableTextWatchersForEditText(sendMoneyEditText, false) - sendMoneyEditText!!.setText(Utils.formatCurrency(amount)) - registerAvailableTextWatchersForEditText(sendMoneyEditText, true) - } - - private fun updateRecievingAmount(amount: String?) { - registerAvailableTextWatchersForEditText(recieveMoneyEditText, false) - recieveMoneyEditText!!.setText(Utils.formatCurrency(amount)) - registerAvailableTextWatchersForEditText(recieveMoneyEditText, true) - } - - private fun registerTextWatchers(action: Boolean) { - if (action) { - if (sendAmountTextWatcher == null) sendAmountTextWatcher = SendAmountTextWatcher() - if (recepientAmountTextWatcher == null) recepientAmountTextWatcher = - RecipientAmountTextWatcher() - if (recepientCurrencyFormatterTextWatcher == null) recepientCurrencyFormatterTextWatcher = - CurrencyFormatterTextWatcher(recieveMoneyEditText) - if (sendCurrencyFormatterTextWatcher == null) sendCurrencyFormatterTextWatcher = - CurrencyFormatterTextWatcher(sendMoneyEditText) - if (rewardsPointTextWatcher == null) rewardsPointTextWatcher = RewardsPointTextWatcher() - sendMoneyEditText!!.addTextChangedListener(sendAmountTextWatcher) - recieveMoneyEditText!!.addTextChangedListener(recepientAmountTextWatcher) - sendMoneyEditText!!.addTextChangedListener(sendCurrencyFormatterTextWatcher) - recieveMoneyEditText!!.addTextChangedListener(recepientCurrencyFormatterTextWatcher) - binding.edRewardsPoint!!.addTextChangedListener(rewardsPointTextWatcher) - } else { - sendMoneyEditText!!.removeTextChangedListener(sendAmountTextWatcher) - recieveMoneyEditText!!.removeTextChangedListener(recepientAmountTextWatcher) - sendMoneyEditText!!.removeTextChangedListener(sendCurrencyFormatterTextWatcher) - recieveMoneyEditText!!.removeTextChangedListener(recepientCurrencyFormatterTextWatcher) - binding.edRewardsPoint!!.removeTextChangedListener(rewardsPointTextWatcher) + inner class AmountChangeAndFocusOutDetector : SimpleOnGestureListener() { + override fun onSingleTapUp(e: MotionEvent): Boolean { + if (e.action == MotionEvent.ACTION_UP) { + if (hasValidOutsideAmountWidgetTouch(e.x, e.y)) { + presenter.calcExrate() + return true + } + } + return super.onSingleTapUp(e) } - } - private fun registerAvailableTextWatchersForEditText(editText: EditText?, action: Boolean) { - when (editText!!.id) { - R.id.sendAmountEdTxt -> if (action) sendMoneyEditText!!.addTextChangedListener( - sendAmountTextWatcher - ) else sendMoneyEditText!!.removeTextChangedListener(sendAmountTextWatcher) - R.id.receiveAmountEdTxt -> if (action) recieveMoneyEditText!!.addTextChangedListener( - recepientAmountTextWatcher - ) else recieveMoneyEditText!!.removeTextChangedListener(recepientAmountTextWatcher) + private fun hasValidOutsideAmountWidgetTouch(x: Float, y: Float): Boolean { + val posX = x.toInt() + val posY = y.toInt() + val sendMoneyLeftAndTopCoordinates = IntArray(2) + val receiveMoneyLeftAndTopCoordinates = IntArray(2) + +// sendMoneyViewContainer.getLocationOnScreen(sendMoneyLeftAndTopCoordinates); + val sendMoneyBoundRect = Rect( + sendMoneyLeftAndTopCoordinates[0], sendMoneyLeftAndTopCoordinates[1], + sendMoneyLeftAndTopCoordinates[0] + binding.sendAmountEdTxt.getMeasuredWidth(), + sendMoneyLeftAndTopCoordinates[1] + binding.sendAmountEdTxt.getMeasuredHeight() + ) + val receiveMoneyBoundRect = Rect( + receiveMoneyLeftAndTopCoordinates[0], receiveMoneyLeftAndTopCoordinates[1], + receiveMoneyLeftAndTopCoordinates[0] + binding.receiveAmountEdTxt.getMeasuredWidth(), + receiveMoneyLeftAndTopCoordinates[1] + binding.receiveAmountEdTxt.getMeasuredHeight() + ) + return ((binding.receiveAmountEdTxt.hasFocus() || binding.sendAmountEdTxt.hasFocus()) + && !sendMoneyBoundRect.contains(posX, posY) + && !receiveMoneyBoundRect.contains(posX, posY) + ) } } - private inner class SendAmountTextWatcher : TextWatcher { + + inner class SendAmountTextWatcher(editText: EditText?) : + CurrencyFormatterTextWatcher(editText) { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable) { - shouldCaulatedByRecipient = false - updateRecievingAmount("") - updateButtonToCalculate(true) - showTransferfeeAndExRate(false, "", "", "") + super.afterTextChanged(s) + presenter.setCalcByPayoutAmount(false) + presenter.setCAmount(s.toString()) } } - private inner class RecipientAmountTextWatcher : TextWatcher { + inner class ReceiveAmountTextWatcher(editText: EditText?) : + CurrencyFormatterTextWatcher(editText) { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable) { - shouldCaulatedByRecipient = true - updateSendAmount("") - updateButtonToCalculate(true) - showTransferfeeAndExRate(false, "", "", "") + super.afterTextChanged(s) + presenter.setCalcByPayoutAmount(true) + presenter.setPAmount(s.toString()) } } - private inner class RewardsPointTextWatcher : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - val strEnteredVal = binding.edRewardsPoint!!.text.toString() - if (!strEnteredVal.isEmpty()) { - val num = strEnteredVal.toInt() - if (num > rewardPoint!!.toInt()) { - iv_rewardsPoint!!.error = "You cannot use more than $rewardPoint" - continueBtn!!.isEnabled = false - } else { - iv_rewardsPoint!!.error = null - continueBtn!!.isEnabled = true - } - } - } + fun setBannerData() { + val data: MutableList = ArrayList() + var url = arrayOf( + "https://cdn.imepay.com.np:9001/Handler/AdminImageHandler.ashx?img=GF84cX%2fW3XJc0WxXb93%2fjgTfdYUWuYswsB5R6endZc84sA%2bJ9cUB06Km7M9P1ULW," + + "https://cdn.imepay.com.np:9001/Handler/AdminImageHandler.ashx?img=GF84cX%2fW3XJc0WxXb93%2fjgTfdYUWuYswsB5R6endZc84sA%2bJ9cUB06Km7M9P1ULW," + + "https://cdn.imepay.com.np:9001/Handler/AdminImageHandler.ashx?img=GF84cX%2fW3XJc0WxXb93%2fjgTfdYUWuYswsB5R6endZc84sA%2bJ9cUB06Km7M9P1ULW" + ) - override fun afterTextChanged(s: Editable) { - shouldCaulatedByRecipient = false - updateRecievingAmount("") - updateButtonToCalculate(true) - showTransferfeeAndExRate(false, "", "", "") + for (i in url) { + val bannerModel = BannerModel(i) + data.add(bannerModel) } - } + val bannerViewAdapter = BannerViewAdapter(data) - class CouponDetailViewDTO(var couponName: String, var appliedAmount: String) { - override fun toString(): String { - return "CouponDetailViewDTO{" + - "couponName='" + couponName + '\'' + - ", appliedAmount='" + appliedAmount + '\'' + - '}' + val lm = LinearLayoutManager( + binding.bannerView.getContext(), + LinearLayoutManager.HORIZONTAL, + false + ) + binding.bannerView.layoutManager = lm + binding.bannerView.adapter = bannerViewAdapter + binding.bannerView.setOnFlingListener(null) + val snapHelper = PagerSnapHelper() + snapHelper.attachToRecyclerView(binding.bannerView) + + if (data.size > 1) { +// bannerView.addItemDecoration(new LinePagerIndicatorDecoration()); + binding.indicator.attachToRecyclerView(binding.bannerView, snapHelper) } - } - fun showFootNote(footNote: String?) { -// if (footNote == null || footNote.isEmpty()) { -// idSendMoneyFootNoteContainer!!.visibility = View.INVISIBLE -// } else { -// sendMoneyNoteText!!.text = footNote -// idSendMoneyFootNoteContainer!!.visibility = View.VISIBLE -// } - } - - fun updateRewardDetails(rewardsPointDTO: RewardsPointDTO) { - if (rewardsPointDTO.showRewardPoint.equals("y", ignoreCase = true)) { - binding.rewardsPointsContainer!!.visibility = View.VISIBLE - //pointsAvailableText.setText("You have " + rewardsPointDTO.getPoint() + " reward points available"); - binding.pointsAvailableText!!.text = rewardsPointDTO.rewardMessage - rewardPoint = rewardsPointDTO.point - } + val timer = Timer() + timer.scheduleAtFixedRate(object : TimerTask() { + override fun run() { + if (scrollPosition >= data.size) scrollPosition = 0 + binding.bannerView.post(Runnable { // scrollPosition = lm.findFirstVisibleItemPosition(); + ++scrollPosition + if (scrollPosition > data.size - 1) { + scrollPosition = 0 + binding.bannerView.scrollToPosition(scrollPosition) + } else { + binding.bannerView.smoothScrollToPosition(scrollPosition) + } + }) + } + }, 500, 3500) } } \ No newline at end of file diff --git a/app/src/main/java/com/remit/jmecustomer/features/myTransfers/adapters/MyBeneficiariesAdapter.kt b/app/src/main/java/com/remit/jmecustomer/features/myTransfers/adapters/MyBeneficiariesAdapter.kt index d5ec0ca0..7c58201f 100644 --- a/app/src/main/java/com/remit/jmecustomer/features/myTransfers/adapters/MyBeneficiariesAdapter.kt +++ b/app/src/main/java/com/remit/jmecustomer/features/myTransfers/adapters/MyBeneficiariesAdapter.kt @@ -40,13 +40,12 @@ class MyBeneficiariesAdapter(private var data: MutableList override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = data[position] holder.bindings.rvInitials.setOnClickListener { - val activity : HomeActivityV3 = mContext as HomeActivityV3 - var intent = Intent(mContext, BeneficiaryDetailActivity::class.java) - intent.putExtra("receiverInfoModel", item) - activity.startActivityForResult(intent , 101) - activity.setSendData(SendMoneyRequiredDataV3(item)) + + } + holder.bindings.constMain.setOnClickListener{ + listener?.onRecipientSelected(item) } - holder.itemView.setOnClickListener{ + holder.bindings.rvInitials.setOnClickListener{ listener?.onRecipientSelected(item) } holder.bindings.tvName.text = item.fullName diff --git a/app/src/main/java/com/remit/jmecustomer/features/myTransfers/view/MyTransfersFragment.kt b/app/src/main/java/com/remit/jmecustomer/features/myTransfers/view/MyTransfersFragment.kt index 16e556d8..ffda855e 100644 --- a/app/src/main/java/com/remit/jmecustomer/features/myTransfers/view/MyTransfersFragment.kt +++ b/app/src/main/java/com/remit/jmecustomer/features/myTransfers/view/MyTransfersFragment.kt @@ -19,6 +19,7 @@ import com.remit.jmecustomer.common.customwidgets.common.GenericEditTextPromptDi import com.remit.jmecustomer.common.customwidgets.common.GenericPromptDialog import com.remit.jmecustomer.common.customwidgets.common.GenericPromptDialog.GenericDialogPromptListener import com.remit.jmecustomer.databinding.FragmentMyTransfersBinding +import com.remit.jmecustomer.features.beneficiaryDetail.BeneficiaryDetailActivity import com.remit.jmecustomer.features.homeV3.view.HomeActivityV3 import com.remit.jmecustomer.features.inboundreceipt.view.InboundRemitReceiptActivity import com.remit.jmecustomer.features.myTransfers.adapters.RecentTransactionsAdapter @@ -47,7 +48,7 @@ class MyTransfersFragment : BaseFragment(), private var adapter: MyBeneficiariesAdapter? = null private var recentAdapter: RecentTransactionsAdapter? = null - var presenter: RecipientListingV3PresenterInterface? = null + var presenter: RecipientListingV3PresenterInterface? = null private var searchEditTextTextWatcher: SearchEditTextTextWatcher? = null private var _binding: FragmentMyTransfersBinding? = null @@ -80,7 +81,7 @@ class MyTransfersFragment : BaseFragment(), val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) binding.recipientListRv.layoutManager = layoutManager var data: ArrayList = ArrayList() - adapter = MyBeneficiariesAdapter(data , this) + adapter = MyBeneficiariesAdapter(data, this) binding.recipientListRv.adapter = adapter val layoutManagerVertical = LinearLayoutManager(activity) @@ -95,8 +96,6 @@ class MyTransfersFragment : BaseFragment(), override fun onStart() { super.onStart() - binding.edtSearchTransfers!!.addTextChangedListener(searchEditTextTextWatcher) - binding.addRecipientView.setOnClickListener(this) } override fun onStop() { @@ -113,6 +112,9 @@ class MyTransfersFragment : BaseFragment(), presenterTransaction = ViewModelProvider(requireActivity()).get( TransactionHistoryV2Presenter::class.java ) + + binding.edtSearchTransfers!!.addTextChangedListener(searchEditTextTextWatcher) + binding.addRecipientView.setOnClickListener(this) } private fun performDefaultAction(savedInstance: Bundle?) { @@ -128,7 +130,7 @@ class MyTransfersFragment : BaseFragment(), } - override fun showAllRecipientToUser( + override fun showAllRecipientToUser( recipientInfoModelList: MutableList, changeLayoutBehavior: Boolean ) { @@ -151,7 +153,7 @@ class MyTransfersFragment : BaseFragment(), override fun onEmailCodeNegativeButtonPressed() {} - override fun onEmailCodePositiveBtnPressed(emailCode: String?) { + override fun onEmailCodePositiveBtnPressed(emailCode: String?) { presenter?.verifyEmailCode(emailCode) } @@ -179,7 +181,7 @@ class MyTransfersFragment : BaseFragment(), ) } - override fun redirectToSendMoney(sendMoneyRequiredDataV3: SendMoneyRequiredDataV3?) { + override fun redirectToSendMoney(sendMoneyRequiredDataV3: SendMoneyRequiredDataV3?) { // val intent = Intent(requireContext(), SendMoneyV2Activity::class.java) // intent.putExtra( // RecipientAddEditV3Activity.RECIPIENT_INFO_BUNDLE_KEY_v3, @@ -189,10 +191,9 @@ class MyTransfersFragment : BaseFragment(), // intent, // RecipientAddEditV3Activity.RECIPIENT_ACTION_EDIT_REQUEST_CODE_v3 // ) - (requireActivity() as HomeActivityV3).binding.vpDashboard.currentItem = 0 } - override fun proceedToEditRecipient(recipientInfoModel: ReceiverInfoV3Model) { + override fun proceedToEditRecipient(recipientInfoModel: ReceiverInfoV3Model) { val intent = Intent(requireContext(), RecipientAddEditV3Activity::class.java) intent.putExtra(RecipientAddEditV3Activity.RECIPIENT_INFO_BUNDLE_KEY_v3, recipientInfoModel) startActivityForResult( @@ -230,15 +231,18 @@ class MyTransfersFragment : BaseFragment(), ) } - override fun onRecipientSelected(recipientInfoModel: ReceiverInfoV3Model) { - if (recipientInfoModel.hasVerifiedOTP) { - presenter!!.saveSelectedRecipientInfomation(recipientInfoModel) - } else { - proceedToShowTermsConditions(recipientInfoModel) - } + override fun onRecipientSelected(recipientInfoModel: ReceiverInfoV3Model) { +// if (recipientInfoModel.hasVerifiedOTP) { +// presenter!!.saveSelectedRecipientInfomation(recipientInfoModel) +// } else { +// proceedToShowTermsConditions(recipientInfoModel) +// } + val intent = Intent(requireActivity(), BeneficiaryDetailActivity::class.java) + intent.putExtra("receiverInfoModel", recipientInfoModel) + startActivity(intent) } - override fun proceedToDeleteRecipient(receiverInfoV3Model: ReceiverInfoV3Model) { + override fun proceedToDeleteRecipient(receiverInfoV3Model: ReceiverInfoV3Model) { showBeneficiaryDeleteConfirmDialog(receiverInfoV3Model) } @@ -262,9 +266,9 @@ class MyTransfersFragment : BaseFragment(), } - internal class SearchEditTextTextWatcher : TextWatcherAdapter() { + inner class SearchEditTextTextWatcher : TextWatcherAdapter() { override fun onTextUpdated(text: String) { -// this.presenter.searchForReciever(text) + presenter?.searchForReciever(text) } } diff --git a/app/src/main/java/com/remit/jmecustomer/features/userprofile/view/ProfileFragment.kt b/app/src/main/java/com/remit/jmecustomer/features/userprofile/view/ProfileFragment.kt new file mode 100644 index 00000000..f3ba5974 --- /dev/null +++ b/app/src/main/java/com/remit/jmecustomer/features/userprofile/view/ProfileFragment.kt @@ -0,0 +1,110 @@ +package com.remit.jmecustomer.features.userprofile.view + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.remit.jmecustomer.R +import com.remit.jmecustomer.base.BaseFragment +import com.remit.jmecustomer.common.customwidgets.common.GenericPromptDialog +import com.remit.jmecustomer.common.customwidgets.common.GenericPromptDialog.GenericDialogPromptListener +import com.remit.jmecustomer.databinding.FragmentProfileBinding +import com.remit.jmecustomer.features.aboutscreen.view.AboutJMERemit +import com.remit.jmecustomer.features.customersupport.view.CustomerSupportFragment +import com.remit.jmecustomer.features.depositinfo.view.DepositInfo +import com.remit.jmecustomer.features.homeV3.view.HomeActivityV3 +import com.remit.jmecustomer.features.homeV3.view.HomeFragmentV3 +import com.remit.jmecustomer.features.loyaltypoints.view.LoyaltyPointsActivity +import com.remit.jmecustomer.features.mynotifications.view.MyNotificationActivity +import com.remit.jmecustomer.features.settings.view.SettingsView +import com.remit.jmecustomer.features.walletstatement.view.WalletStatementV2Activity + +class ProfileFragment : BaseFragment(), View.OnClickListener { + private var _binding: FragmentProfileBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentProfileBinding.inflate(inflater, container, false) + init() + return binding.root + } + + fun init() { + binding.llPaymentLayout.setOnClickListener(this) + binding.llAboutUsLayout.setOnClickListener(this) + binding.llFaqLayout.setOnClickListener(this) + binding.rlLogout.setOnClickListener(this) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onClick(view: View) { + when (view.id) { + R.id.ll_faq_layout -> { + val newFragment = CustomerSupportFragment.newInstance() + newFragment.show(requireActivity().supportFragmentManager, "dialog") + } + R.id.ll_about_us_layout -> startActivity( + Intent( + requireActivity(), + AboutJMERemit::class.java + ) + ) + R.id.view_setting -> startActivity(Intent(requireActivity(), SettingsView::class.java)) + R.id.rl_logout -> { + showLogoutConfirmationDialog() + } + R.id.view_account_statement -> startActivity( + Intent( + requireActivity(), + WalletStatementV2Activity::class.java + ) + ) + R.id.iv_notification -> startActivity( + Intent( + requireActivity(), + MyNotificationActivity::class.java + ) + ) + R.id.ll_payment_layout -> startActivity( + Intent( + requireActivity(), + DepositInfo::class.java + ) + ) + R.id.view_loyalty_points -> startActivity( + Intent( + requireActivity(), + LoyaltyPointsActivity::class.java + ) + ) + } + } + + private fun showLogoutConfirmationDialog() { + val genericPromptDialog = GenericPromptDialog() + genericPromptDialog.setTitleMessage(getString(R.string.logout_text)) + genericPromptDialog.setBodyMessage(getString(R.string.logout_confirmation_text)) + genericPromptDialog.setIconsRes(-1) + genericPromptDialog.setCancellable(true) + genericPromptDialog.setPositiveBtnString(getString(R.string.yes_text)) + genericPromptDialog.setNegativeBtnString(getString(R.string.no_text)) + genericPromptDialog.setListener(object : GenericDialogPromptListener { + override fun onNegativeBtnPressed() {} + override fun onPositiveBtnPressed() { + (requireActivity() as HomeActivityV3).performLogout() + } + }) + if (!genericPromptDialog.isAdded) genericPromptDialog.show( + requireActivity().supportFragmentManager, + "PROMPTSENDMONEY" + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/banner_round_bg.xml b/app/src/main/res/drawable/banner_round_bg.xml new file mode 100644 index 00000000..31855583 --- /dev/null +++ b/app/src/main/res/drawable/banner_round_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/blue_dot.xml b/app/src/main/res/drawable/blue_dot.xml new file mode 100644 index 00000000..883d7b71 --- /dev/null +++ b/app/src/main/res/drawable/blue_dot.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circle_bullet.xml b/app/src/main/res/drawable/circle_bullet.xml new file mode 100644 index 00000000..1fc0b5ec --- /dev/null +++ b/app/src/main/res/drawable/circle_bullet.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fingerprint_24px.xml b/app/src/main/res/drawable/fingerprint_24px.xml new file mode 100644 index 00000000..316c63d9 --- /dev/null +++ b/app/src/main/res/drawable/fingerprint_24px.xml @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/grey_border_dark_indicator.xml b/app/src/main/res/drawable/grey_border_dark_indicator.xml new file mode 100644 index 00000000..4bb5877d --- /dev/null +++ b/app/src/main/res/drawable/grey_border_dark_indicator.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_language.xml b/app/src/main/res/drawable/ic_language.xml new file mode 100644 index 00000000..5897fbb8 --- /dev/null +++ b/app/src/main/res/drawable/ic_language.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/drawable/ico_profile.png b/app/src/main/res/drawable/ico_profile.png new file mode 100755 index 0000000000000000000000000000000000000000..1687e85c4d203c0b8b16d03016927c5bb7003e02 GIT binary patch literal 20368 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/phonelink_lock_24px.xml b/app/src/main/res/drawable/phonelink_lock_24px.xml new file mode 100644 index 00000000..ff8ae552 --- /dev/null +++ b/app/src/main/res/drawable/phonelink_lock_24px.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/round_help_24px.xml b/app/src/main/res/drawable/round_help_24px.xml new file mode 100644 index 00000000..667b0201 --- /dev/null +++ b/app/src/main/res/drawable/round_help_24px.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/app/src/main/res/drawable/round_perm_phone_msg_24px.xml b/app/src/main/res/drawable/round_perm_phone_msg_24px.xml new file mode 100644 index 00000000..cf60f2f2 --- /dev/null +++ b/app/src/main/res/drawable/round_perm_phone_msg_24px.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/app/src/main/res/drawable/round_person_24px.xml b/app/src/main/res/drawable/round_person_24px.xml new file mode 100644 index 00000000..a3a1a128 --- /dev/null +++ b/app/src/main/res/drawable/round_person_24px.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/banner_item.xml b/app/src/main/res/layout/banner_item.xml new file mode 100644 index 00000000..d0eec1db --- /dev/null +++ b/app/src/main/res/layout/banner_item.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/app/src/main/res/layout/banner_view_layout.xml b/app/src/main/res/layout/banner_view_layout.xml new file mode 100644 index 00000000..8204ccf7 --- /dev/null +++ b/app/src/main/res/layout/banner_view_layout.xml @@ -0,0 +1,35 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_home_new.xml b/app/src/main/res/layout/fragment_home_new.xml index e76bb0b9..65383220 100644 --- a/app/src/main/res/layout/fragment_home_new.xml +++ b/app/src/main/res/layout/fragment_home_new.xml @@ -155,7 +155,7 @@ android:layout_width="@dimen/_30sdp" android:layout_height="@dimen/_30sdp" android:layout_marginRight="@dimen/_40sdp" - android:src="@drawable/flag_nepal" + android:src="@drawable/flag_japan" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_currency" @@ -362,5 +362,39 @@ android:layout_height="wrap_content" android:src="@drawable/ic_arrow_right" /> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml new file mode 100644 index 00000000..eed21b74 --- /dev/null +++ b/app/src/main/res/layout/fragment_profile.xml @@ -0,0 +1,632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/row_fragment_beneficiaries.xml b/app/src/main/res/layout/row_fragment_beneficiaries.xml index 61cb7c52..a76682ed 100644 --- a/app/src/main/res/layout/row_fragment_beneficiaries.xml +++ b/app/src/main/res/layout/row_fragment_beneficiaries.xml @@ -2,6 +2,7 @@ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0873b058..05b37a52 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -80,4 +80,7 @@ #1A0052FF #0000001F #CC0000 + #70e2cecf + #e0f4f4f4 + #F5F5F5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 17c89f7b..8f0ac3f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -661,4 +661,5 @@ ID Number Driving License Invalid Driving License + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c9e5ee3c..2116724a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -21,6 +21,15 @@ true + + +