Commit 03db4603 authored by satya's avatar satya

yes member project

parent 10663e97
......@@ -3,6 +3,11 @@
<component name="WizardSettings">
<option name="children">
<map>
<entry key="imageWizard">
<value>
<PersistentState />
</value>
</entry>
<entry key="vectorWizard">
<value>
<PersistentState>
......
......@@ -47,6 +47,28 @@
<option name="screenX" value="1840" />
<option name="screenY" value="2944" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="a15" />
<option name="id" value="a15" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="A15" />
<option name="screenDensity" value="450" />
<option name="screenX" value="1080" />
<option name="screenY" value="2340" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="a35x" />
<option name="id" value="a35x" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="A35" />
<option name="screenDensity" value="450" />
<option name="screenX" value="1080" />
<option name="screenY" value="2340" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="samsung" />
......@@ -245,6 +267,17 @@
<option name="screenX" value="1080" />
<option name="screenY" value="2340" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="gts7xllite" />
<option name="id" value="gts7xllite" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="SM-T738U" />
<option name="screenDensity" value="340" />
<option name="screenX" value="1600" />
<option name="screenY" value="2560" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="samsung" />
......@@ -256,6 +289,17 @@
<option name="screenX" value="1848" />
<option name="screenY" value="2960" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="gts8wifi" />
<option name="id" value="gts8wifi" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Tab S8" />
<option name="screenDensity" value="274" />
<option name="screenX" value="1600" />
<option name="screenY" value="2560" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
......@@ -311,6 +355,17 @@
<option name="screenX" value="720" />
<option name="screenY" value="1600" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="o1q" />
<option name="id" value="o1q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S21" />
<option name="screenDensity" value="421" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="google" />
......@@ -367,6 +422,17 @@
<option name="screenY" value="384" />
<option name="type" value="WEAR_OS" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="r11q" />
<option name="id" value="r11q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="SM-S711U" />
<option name="screenDensity" value="450" />
<option name="screenX" value="1080" />
<option name="screenY" value="2340" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="google" />
......@@ -389,6 +455,17 @@
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="t2q" />
<option name="id" value="t2q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S21 Plus" />
<option name="screenDensity" value="394" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
......
This diff is collapsed.
......@@ -5,6 +5,7 @@ plugins {
id 'org.jetbrains.kotlin.kapt'
id 'com.google.gms.google-services'
id 'realm-android'
id("kotlin-parcelize")
//id 'dagger.hilt.android.plugin'
}
......@@ -26,8 +27,8 @@ android {
applicationId "com.seatel.mobilehall"
minSdk 23
targetSdk 34
versionCode 201907117
versionName "2.3.16"
versionCode 201907118
versionName "2.3.17"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
signingConfig signingConfigs.release
......@@ -49,7 +50,7 @@ android {
}
debug {
resValue "string", "app_name", "yes dev"
resValue "string", "app_name", "yes seatel dev"
buildConfigField 'String', 'CLIENT_ID', '"eyJhbGciOiJIUzI1NiJ9.c2VhdGVsLWFwaS1kZXY.NsFhP0C7pqeONbcGAf42lQLLe6AIgy1QdOUOrg0uqcI"'
buildConfigField 'String', 'BASE_URL', '"http://api-dev.yes.com.kh/"'
buildConfigField 'String', 'CLIENT_SECRET', '"MjExNzM0NWNiNTA3NDZmNzg4NmE0NTNlYjYyMWNkODk="'
......@@ -116,6 +117,7 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:4.13.0'
implementation 'com.google.firebase:firebase-messaging-ktx:23.1.2'
implementation 'androidx.work:work-runtime-ktx:2.8.1'
implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.github.bigstark:fresco-parallax-drawee-view:1.2.1'
......@@ -132,6 +134,7 @@ dependencies {
implementation 'com.google.android.gms:play-services-analytics:17.0.0'
implementation 'com.google.android.gms:play-services-measurement-api:21.1.0'
implementation 'com.google.android.gms:play-services-vision:20.1.3'
implementation("com.google.android.material:material:1.12.0")
//firebase
implementation platform('com.google.firebase:firebase-bom:31.2.3')
......
This diff is collapsed.
......@@ -37,36 +37,25 @@ class HomeImageSliderAdapter(var context: Context) :
ItemHomeImageSliderBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return SliderAdapterVH(binding)
/*val inflate =
LayoutInflater.from(parent.context).inflate(R.layout.home_image_slider_item, null)
return SliderAdapterVH(inflate)*/
}
override fun onBindViewHolder(viewHolder: SliderAdapterVH, position: Int) {
val sliderItem = mSliderItems[position]
if (sliderItem.getMobileUrl().isEmpty()) {
viewHolder.view.ivAutoImageSlider.load(sliderItem.getUrl()) {
crossfade(true)
placeholder(R.drawable.bg_button_primary)
error(R.drawable.bg_button_primary)
// Load image with Coil
viewHolder.view.ivAutoImageSlider.load(sliderItem.getMobileUrl()) {
crossfade(true)
placeholder(R.drawable.bg_round_gray_section)
error(R.drawable.bg_round_gray_section)
}
viewHolder.itemView.setOnClickListener(View.OnClickListener {
if (sliderItem.getUrl().isNotBlank()) {
TermsAndConditionsActivity.launch(
context, sliderItem.getUrl()
)
}
} else
viewHolder.view.ivAutoImageSlider.load(sliderItem.getMobileUrl()) {
crossfade(true)
placeholder(R.drawable.bg_round_gray_section)
error(R.drawable.bg_round_gray_section)
}
viewHolder.itemView.setOnClickListener(
View.OnClickListener {
if (sliderItem.getUrl().isNotBlank()) {
TermsAndConditionsActivity.launch(
context,
sliderItem.getUrl()
)
}
})
})
}
override fun getCount(): Int {
......
......@@ -304,7 +304,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
private fun getDataMainScreen(token: String) {
mCountBadges?.onGetBadgesCount(getPhoneLogin())
Log.d(TAG, "getDataMainScreenToken: $token")
GetMainData(requireActivity(), getPhoneLogin(), token) { it ->
if (it) {
......@@ -314,7 +314,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
)
dataMainScreen?.let {
showDataMainScreen(it)
Log.d(TAG, "getMainData: $it")
}
......@@ -332,6 +332,8 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
profileNumber.text = dataMainScreen.getPhonNumber()
circleProfile.load(dataMainScreen.getProfilePicture()) {
crossfade(true)
error(R.drawable.ic_yes_profile)
placeholder(R.drawable.ic_yes_profile)
transformations(CircleCropTransformation())
}
......@@ -414,7 +416,8 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
}
private fun showExpiredDate(isShow: Boolean) {
binding.layoutBalanceTotal.visibility = if (isShow) View.VISIBLE else View.INVISIBLE
binding.signDolla.visibility = if (isShow) View.VISIBLE else View.INVISIBLE
binding.txtMainBalance.visibility = if (isShow) View.VISIBLE else View.INVISIBLE
}
private fun showPlanView(isShow: Boolean) {
......
......@@ -16,17 +16,16 @@ import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.seatel.mobilehall.R
import com.seatel.mobilehall.databinding.ActivityMainBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.util.SeatelUtils.Companion.translatForDialog
import com.seatel.mobilehall.util.viewBinding
class MainActivity : AppCompatActivity(){
class MainActivity : AppCompatActivity() {
private val binding by viewBinding(ActivityMainBinding::inflate)
/* override fun getViewBinding(): ActivityMainBinding {
return ActivityMainBinding.inflate(layoutInflater)
}*/
/* override fun getViewBinding(): ActivityMainBinding {
return ActivityMainBinding.inflate(layoutInflater)
}*/
private lateinit var navController: NavController
var yesMember = true
......@@ -44,7 +43,7 @@ class MainActivity : AppCompatActivity(){
val navView: BottomNavigationView = binding.navView
navController = findNavController(R.id.nav_host_fragment_activity_main)
navView.setupWithNavController(navController)
// navView.itemIconTintList = null
navView.itemIconTintList = null
navView.menu.findItem(R.id.navigation_home).title =
......@@ -58,50 +57,50 @@ class MainActivity : AppCompatActivity(){
// Hide text for the "yes member" item
// val yesMemberMenuItem = navView.menu.findItem(R.id.navigation_yes_member)
val yesMemberMenuItem = navView.menu.findItem(R.id.navigation_yes_member)
/*
val drawable = if (yesMember) {
ContextCompat.getDrawable(this, R.drawable.ic_seatel_logo_selected)
ContextCompat.getDrawable(this, R.drawable.ic_yes_membber_active)
} else {
ContextCompat.getDrawable(this, R.drawable.ic_seatel_logo)
ContextCompat.getDrawable(this, R.drawable.ic_yes_memeber_unactive)
}
// Apply color tint to the drawable
drawable?.setTint(ContextCompat.getColor(this, R.color.colorPrimary))
yesMemberMenuItem.icon = drawable*/
// drawable?.setTint(ContextCompat.getColor(this, R.color.colorPrimary))
yesMemberMenuItem.icon = drawable
/* navView.findViewById<View>(yesMemberMenuItem.itemId)?.let { itemView ->
navView.findViewById<View>(yesMemberMenuItem.itemId)?.let { itemView ->
itemView.findViewById<View>(com.google.android.material.R.id.text)?.visibility =
View.GONE
itemView.findViewById<View>(com.google.android.material.R.id.navigation_bar_item_large_label_view)?.visibility =
View.GONE
itemView.findViewById<View>(com.google.android.material.R.id.text)?.visibility =
View.GONE
itemView.findViewById<View>(com.google.android.material.R.id.navigation_bar_item_large_label_view)?.visibility =
View.GONE
// Customize the icon size if needed
val iconView =
itemView.findViewById<View>(com.google.android.material.R.id.navigation_bar_item_icon_view)
// Customize the icon size if needed
val iconView =
itemView.findViewById<View>(com.google.android.material.R.id.navigation_bar_item_icon_view)
val iconViewParams: FrameLayout.LayoutParams =
iconView.layoutParams as FrameLayout.LayoutParams
iconViewParams.width = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50F, resources.displayMetrics
).toInt()
iconViewParams.height = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50F, resources.displayMetrics
).toInt()
iconView.layoutParams = iconViewParams
}*/
val iconViewParams: FrameLayout.LayoutParams =
iconView.layoutParams as FrameLayout.LayoutParams
iconViewParams.width = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 40F, resources.displayMetrics
).toInt()
iconViewParams.height = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 40F, resources.displayMetrics
).toInt()
iconView.layoutParams = iconViewParams
}
}
/*override fun isDisplayToolbar(): Boolean {
return false
}*/
/* override fun isDisplayToolbar(): Boolean {
return false
}*/
override fun onBackPressed() {
......@@ -127,7 +126,6 @@ class MainActivity : AppCompatActivity(){
}
}
companion object {
fun lunch(context: Context) {
val intent = Intent(context, MainActivity::class.java)
......
......@@ -118,6 +118,7 @@ class Roaming1Adapter(
mContext,
"",
mContext.getString(R.string.not_special_sim_msg),
"",
R.drawable.ic_warning, "OK", ""
).setPositiveButton(
"Ok",
......@@ -168,6 +169,7 @@ class Roaming1Adapter(
mContext,
"Attention",
mContext.getString(R.string.inactive_roaming_service_msg),
"",
R.drawable.ic_warning, "Ok", ""
).setPositiveButton(
"Ok",
......@@ -231,7 +233,7 @@ class Roaming1Adapter(
CustomDialog(
mContext,
"Confirmation",
mContext.getString(R.string.active_roaming_service_msg),
mContext.getString(R.string.active_roaming_service_msg), "",
R.drawable.ic_confirmation, "Confirm", "NO"
).setPositiveButton("Confirm", DialogInterface.OnClickListener { dialog, which ->
requestRoamingService(
......@@ -259,7 +261,7 @@ class Roaming1Adapter(
val dialog =
CustomDialog(
mContext,
"Confirmation", mContext.getString(R.string.confirm_deactivate_roaming_msg),
"Confirmation", mContext.getString(R.string.confirm_deactivate_roaming_msg), "",
R.drawable.ic_confirmation, "Confirm", "NO"
).setPositiveButton("Confirm", DialogInterface.OnClickListener { dialog, _ ->
requestRoamingService(
......@@ -308,7 +310,7 @@ class Roaming1Adapter(
CustomDialog(
mContext,
"Attention",
mContext.getString(R.string.active_roaming_service_success_msg),
mContext.getString(R.string.active_roaming_service_success_msg), "",
R.drawable.ic_warning, "OK", ""
).setPositiveButton(mContext.getString(R.string.enable_roaming_msg),
DialogInterface.OnClickListener { dialog, _ ->
......@@ -328,7 +330,7 @@ class Roaming1Adapter(
mContext,
"Attention",
"You’ve successfully deactivated the Roaming Service. Please disable the 'Data Roaming' function in your device settings.",
R.drawable.ic_warning, "Confirm", ""
"", R.drawable.ic_warning, "Confirm", ""
).setPositiveButton(
"Disable Data Roaming in Settings",
DialogInterface.OnClickListener { dialog, which ->
......
......@@ -117,7 +117,7 @@ class RoamingAdapter(
CustomDialog(
mContext,
"",
mContext.getString(R.string.not_special_sim_msg),
mContext.getString(R.string.not_special_sim_msg), "",
R.drawable.ic_warning, "OK", ""
).setPositiveButton(
"Ok",
......@@ -165,7 +165,7 @@ class RoamingAdapter(
CustomDialog(
mContext,
"Attention",
mContext.getString(R.string.inactive_roaming_service_msg),
mContext.getString(R.string.inactive_roaming_service_msg), "",
R.drawable.ic_warning, "Ok", ""
).setPositiveButton(
"Ok",
......@@ -229,7 +229,7 @@ class RoamingAdapter(
CustomDialog(
mContext,
"Confirmation",
mContext.getString(R.string.active_roaming_service_msg),
mContext.getString(R.string.active_roaming_service_msg), "",
R.drawable.ic_confirmation, "Confirm", "NO"
).setPositiveButton("Confirm", DialogInterface.OnClickListener { dialog, which ->
requestRoamingService(
......@@ -257,7 +257,7 @@ class RoamingAdapter(
val dialog =
CustomDialog(
mContext,
"Confirmation", mContext.getString(R.string.confirm_deactivate_roaming_msg),
"Confirmation", mContext.getString(R.string.confirm_deactivate_roaming_msg), "",
R.drawable.ic_confirmation, "Confirm", "NO"
).setPositiveButton("Confirm", DialogInterface.OnClickListener { dialog, _ ->
requestRoamingService(
......@@ -306,7 +306,7 @@ class RoamingAdapter(
CustomDialog(
mContext,
"Attention",
mContext.getString(R.string.active_roaming_service_success_msg),
mContext.getString(R.string.active_roaming_service_success_msg), "",
R.drawable.ic_warning, "OK", ""
).setPositiveButton(mContext.getString(R.string.enable_roaming_msg),
DialogInterface.OnClickListener { dialog, _ ->
......@@ -326,7 +326,7 @@ class RoamingAdapter(
mContext,
"Attention",
"You’ve successfully deactivated the Roaming Service. Please disable the 'Data Roaming' function in your device settings.",
R.drawable.ic_warning, "Confirm", ""
"", R.drawable.ic_warning, "Confirm", ""
).setPositiveButton(
"Disable Data Roaming in Settings",
DialogInterface.OnClickListener { dialog, which ->
......
......@@ -152,6 +152,7 @@ class ProfilesFragment : BaseFragment(), RequestSlideAccountUserNameInteractor.V
ivProfile.load(it.getProfilePicture()) {
crossfade(true)
transformations(CircleCropTransformation())
error(R.drawable.ic_yes_profile)
placeholder(R.drawable.ic_yes_profile)
}
......
package com.seatel.mobilehall.ui.yes_member
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.VolleyError
import com.seatel.mobilehall.R
import com.seatel.mobilehall.ui.yes_member.adapter.PartnerCategoryAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.TopPartnerInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.TopPartnerModelItem
import com.seatel.mobilehall.ui.yes_member.presenter.TopPartnerPresenter
class YesMemberFragment : Fragment(), TopPartnerInteractor.View {
private lateinit var recyclerPartner: RecyclerView
private lateinit var recyclerPartnerCategory: RecyclerView
private lateinit var adapter: YesMemberAdapter
private lateinit var partnerCategoryAdapter: PartnerCategoryAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
TopPartnerPresenter(requireContext(), this).onTopPartnerData()
TopPartnerPresenter(requireContext(), this).onPartnerCategory()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_yes_member, container, false)
recyclerPartner = view.findViewById(R.id.RecyclerPartner)
recyclerPartnerCategory = view.findViewById(R.id.RecyclerPartnerCategory)
return view
}
override fun responseTopPartnerSucceed(topPartnerList: ArrayList<TopPartnerModelItem>) {
Log.d("TAG::>>>", "responseTopPartnerSucceed: $topPartnerList")
recyclerPartner.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
adapter = YesMemberAdapter(requireContext(), topPartnerList)
recyclerPartner.adapter = adapter
}
override fun responseTopPartnerFail(error: VolleyError) {
Log.d("TAG::>>>", "responseTopPartnerFail: ${error.message}")
}
override fun responsePartnerCategorySucceed(partnerCategory: ArrayList<PartnerCategoryModelItem>) {
recyclerPartnerCategory.layoutManager = GridLayoutManager(context, 2)
partnerCategoryAdapter = PartnerCategoryAdapter(requireContext(), partnerCategory)
recyclerPartnerCategory.adapter = partnerCategoryAdapter
}
override fun responsePartnerCategoryFail(error: VolleyError) {
Log.d("TAG::>>>", "responsePartnerCategoryFail: ${error.message}")
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import coil.load
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityCoinBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.RewardAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.RewardInteractor
import com.seatel.mobilehall.ui.yes_member.model.RewardModel
import com.seatel.mobilehall.ui.yes_member.presenter.RewardPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class CoinActivity : BaseActivity<ActivityCoinBinding>(), RewardInteractor.View {
companion object {
fun launch(context: Context, imgCoin: String, coinEarn: String, coinDescription: String) {
val intent = Intent(context, CoinActivity::class.java)
intent.putExtra("img_coin", imgCoin)
intent.putExtra("coin_earn", coinEarn)
intent.putExtra("coin_description", coinDescription)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityCoinBinding {
return ActivityCoinBinding.inflate(layoutInflater)
}
private val TAG = "CoinActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityEnterRightAnimation()
init()
}
private fun init() {
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.tvCoinEarn.text = "Your coins " + intent.getStringExtra("coin_earn")
binding.tvCoinDescription.text = intent.getStringExtra("coin_description")
binding.ivCoinBanner.load(intent.getStringExtra("img_coin")) {
crossfade(true)
}
RewardPresenter(this, this).getReward(getPhoneLogin())
binding.btnHowEarnCoin.setOnClickListener {
EarnCoinActivity.launch(this)
}
binding.btnEarnCoinHistory.setOnClickListener {
EarnCoinHistoryActivity.launch(this)
}
binding.btnRewardHistory.setOnClickListener {
RewardHistoryActivity.launch(this)
}
}
override fun responseRewardSucceed(rewardList: ArrayList<RewardModel>) {
val adapter = RewardAdapter(this, rewardList)
binding.recylerReward.adapter = adapter
}
override fun responseRewardFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityEarnCoinBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.EarnCoinAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.EarnCoinInteractor
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinModel
import com.seatel.mobilehall.ui.yes_member.presenter.EarnCoinPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class EarnCoinActivity : BaseActivity<ActivityEarnCoinBinding>(), EarnCoinInteractor.View {
companion object {
fun launch(context: Context) {
val intent = Intent(context, EarnCoinActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityEarnCoinBinding {
return ActivityEarnCoinBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityEnterRightAnimation()
EarnCoinPresenter(this, this).getEarnCoins()
}
override fun getStringToolbarTitle(): String? {
return "How to Earn yesCoins"
}
override fun responseEarnCoinSucceed(earnCoinList: ArrayList<EarnCoinModel>) {
val adapter = EarnCoinAdapter(this, earnCoinList)
binding.recyclerEarnCoin.adapter = adapter
}
override fun responseEarnCoinFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityEarnCoinHistoryBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.EarnCoinHistoryAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.EarnCoinHistoryInteractor
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinHistoryModel
import com.seatel.mobilehall.ui.yes_member.presenter.EarnCoinHistoryPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class EarnCoinHistoryActivity : BaseActivity<ActivityEarnCoinHistoryBinding>(),
EarnCoinHistoryInteractor.View {
companion object {
fun launch(context: Context) {
val intent = Intent(context, EarnCoinHistoryActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityEarnCoinHistoryBinding {
return ActivityEarnCoinHistoryBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityEnterRightAnimation()
EarnCoinHistoryPresenter(this, this).getEarnCoinHistory(getPhoneLogin())
}
override fun responseEarnCoinHistorySucceed(earnCoinHistoryList: EarnCoinHistoryModel) {
binding.recyclerCoinHistory.adapter = EarnCoinHistoryAdapter(this, earnCoinHistoryList.data)
}
override fun responseEarnCoinHistoryFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun getStringToolbarTitle(): String? {
return "Earn Coins History"
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.android.volley.VolleyError
import com.google.mlkit.vision.barcode.BarcodeScanner
import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.common.InputImage
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityOutletScanQrBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.interactor.RedeemCodeInteractor
import com.seatel.mobilehall.ui.yes_member.presenter.RedeemCodePresenter
import com.seatel.mobilehall.util.dialogannouncement.RedeemCustomDialog
import org.json.JSONObject
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class OutLetScanQrActivity : BaseActivity<ActivityOutletScanQrBinding>(),
RedeemCodeInteractor.View {
private lateinit var cameraExecutor: ExecutorService
private var isScanned = false
companion object {
fun launch(context: Context) {
val intent = Intent(context, OutLetScanQrActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityOutletScanQrBinding {
return ActivityOutletScanQrBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.overlay.post {
createTransparentHole()
}
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.btnTypeOutletCode.setOnClickListener {
RedeemActivity.launch(this)
}
cameraExecutor = Executors.newSingleThreadExecutor()
requestCameraPermission()
}
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder().build().also {
it.setSurfaceProvider(binding.scanQr.surfaceProvider)
}
// Barcode Scanner
val barcodeScanner = BarcodeScanning.getClient()
// Image Analysis for QR/Barcode
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build().also {
it.setAnalyzer(cameraExecutor) { imageProxy ->
scanBarcode(imageProxy, barcodeScanner)
}
}
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)
} catch (e: Exception) {
Log.e("CameraX", "Use case binding failed", e)
}
}, ContextCompat.getMainExecutor(this))
}
private fun scanBarcode(imageProxy: ImageProxy, scanner: BarcodeScanner) {
if (isScanned) {
imageProxy.close()
return
}
val mediaImage = imageProxy.image ?: return
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
scanner.process(image)
.addOnSuccessListener { barcodes ->
for (barcode in barcodes) {
val scannedData = barcode.displayValue
Log.d("QR", "Scanned: $scannedData")
if (!scannedData.isNullOrEmpty()) {
isScanned = true
runOnUiThread {
RedeemCodePresenter(this, this).onRedeemCode(
"qrcode",
scannedData,
getPhoneLogin()
)
}
}
}
}
.addOnFailureListener { e ->
Log.e("QR", "Barcode scanning failed: ${e.message}")
}
.addOnCompleteListener {
imageProxy.close()
}
}
private fun requestCameraPermission() {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 100)
} else {
startCamera() // Start camera if permission is granted
}
}
override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<out String>, grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 100 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startCamera()
} else {
Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show()
}
}
private fun createTransparentHole() {
val overlay = binding.overlay
val frame = binding.frameOverlay
overlay.post {
val overlayWidth = overlay.width
val overlayHeight = overlay.height
val frameWidth = frame.width
val frameHeight = frame.height
val x = (overlayWidth - frameWidth) / 2f
val y = (overlayHeight - frameHeight) / 2f
val cornerRadius = 40f // Adjust for more or less rounding
val bitmap = Bitmap.createBitmap(overlayWidth, overlayHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
// 🎨 Pink semi-transparent overlay
val backgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.parseColor("#80000000") // Soft pink with transparency
}
canvas.drawRect(
0f,
0f,
overlayWidth.toFloat(),
overlayHeight.toFloat(),
backgroundPaint
)
// ✂️ Cut out the transparent hole with rounded corners
val clearPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
}
canvas.drawRoundRect(
x,
y,
x + frameWidth,
y + frameHeight,
cornerRadius,
cornerRadius,
clearPaint
)
// Set the overlay background
overlay.background = BitmapDrawable(resources, bitmap)
}
}
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
ProcessCameraProvider.getInstance(this).get().unbindAll()
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun onRedeemCodeSuccess(jsonObject: JSONObject) {
val status = jsonObject.optString("status")
val message = jsonObject.optString("message")
val description = jsonObject.optString("description")
SuccessRedeemActivity.launch(this, message, description)
}
override fun onRedeemCodeFailure(errorMessage: VolleyError) {
errorMessage.networkResponse.statusCode
val mErrorMessage = String(errorMessage.networkResponse.data)
val jsonObject = JSONObject(mErrorMessage)
val message = jsonObject.optString("message")
val statusCode = jsonObject.optInt("statusCode")
RedeemCustomDialog(this, message, statusCode.toString(), "Done").setPositiveButton(
"Done"
) { dialog, which ->
dialog.dismiss()
}.show()
// SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(errorMessage)).show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import androidx.core.content.ContextCompat
import coil.load
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.BitmapDescriptor
import com.google.android.gms.maps.model.BitmapDescriptorFactory
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.LatLngBounds
import com.google.android.gms.maps.model.MarkerOptions
import com.seatel.mobilehall.R
import com.seatel.mobilehall.databinding.ActivityOutletLocationBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.model.PartnerByNameOutlet
class OutletLocationActivity : BaseActivity<ActivityOutletLocationBinding>(), OnMapReadyCallback {
companion object {
fun launch(context: Context, partnerByNameOutlet: PartnerByNameOutlet) {
val intent = Intent(context, OutletLocationActivity::class.java)
intent.putExtra("partnerOutlet", partnerByNameOutlet)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityOutletLocationBinding {
return ActivityOutletLocationBinding.inflate(layoutInflater)
}
private lateinit var googleMap: GoogleMap
private var rewardData: PartnerByNameOutlet? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivBack.setOnClickListener {
onBackPressed()
}
rewardData =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra("partnerOutlet", PartnerByNameOutlet::class.java)
} else {
intent.getParcelableExtra("partnerOutlet")
}
val mapFragment =
supportFragmentManager.findFragmentById(R.id.mapFragment) as SupportMapFragment
mapFragment.getMapAsync(this)
binding.tvShopName.text = rewardData?.name
binding.tvShopDescription.text = rewardData?.description
binding.tvShopAddress.text = rewardData?.address
binding.tvShopNumber.text = rewardData?.phoneNumber
binding.ivShopLogo.load(rewardData?.icon) {
crossfade(true)
}
binding.btnRedeem.setOnClickListener {
OutLetScanQrActivity.launch(this)
}
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun onMapReady(map: GoogleMap?) {
googleMap = map ?: return
/* val rewardData: PartnerByNameOutlet? =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra("partnerOutlet", PartnerByNameOutlet::class.java)
} else {
intent.getParcelableExtra("partnerOutlet")
}*/
rewardData?.let { outlets ->
val boundsBuilder = LatLngBounds.Builder()
val latLongParts = outlets.latLong.split(", ")
if (latLongParts.size == 2) {
val lat = latLongParts[0].toDoubleOrNull()
val lng = latLongParts[1].toDoubleOrNull()
if (lat != null && lng != null) {
val outletLocation = LatLng(lat, lng)
// Add marker for each outlet
googleMap.addMarker(
MarkerOptions()
.position(outletLocation)
.title(outlets.name)
.icon(bitmapFromVector(this, R.drawable.ic_map_pin))
)
// Include this location in the bounds
boundsBuilder.include(outletLocation)
}
}
// Move camera to fit all markers
val bounds = boundsBuilder.build()
googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100))
}
}
private fun bitmapFromVector(context: Context, vectorResId: Int): BitmapDescriptor {
val vectorDrawable: Drawable = ContextCompat.getDrawable(context, vectorResId)
?: return BitmapDescriptorFactory.defaultMarker()
val bitmap = Bitmap.createBitmap(
vectorDrawable.intrinsicWidth,
vectorDrawable.intrinsicHeight,
Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
vectorDrawable.setBounds(0, 0, canvas.width, canvas.height)
vectorDrawable.draw(canvas)
return BitmapDescriptorFactory.fromBitmap(bitmap)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import coil.load
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityPartnerBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.PartnerAdapter
import com.seatel.mobilehall.ui.yes_member.adapter.PartnerCategoryListAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.TopPartnerInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
import com.seatel.mobilehall.ui.yes_member.presenter.TopPartnerPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class PartnerActivity : BaseActivity<ActivityPartnerBinding>(), TopPartnerInteractor.View {
companion object {
fun launch(context: Context, imgBanner: String) {
val intent = Intent(context, PartnerActivity::class.java)
intent.putExtra("imgBanner", imgBanner)
context.startActivity(intent)
}
}
private lateinit var adapter: PartnerAdapter
override fun getViewBinding(): ActivityPartnerBinding {
return ActivityPartnerBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.ivPartnerBanner.load(intent.getStringExtra("imgBanner")) {
crossfade(true)
}
TopPartnerPresenter(this, this).onTopPartner()
binding.btnSearch.setOnClickListener {
PartnerSearchActivity.launch(this)
}
}
override fun responseTopPartnerSucceed(topPartnerList: ArrayList<PartnerModelItem>) {
binding.recyclerTopPartner.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
adapter = PartnerAdapter(this, topPartnerList)
binding.recyclerTopPartner.adapter = adapter
binding.recyclerPartner.adapter = PartnerCategoryListAdapter(this, topPartnerList)
}
override fun responseTopPartnerFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityPartnerSearchBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.MainPartnerCategoryAdapter
import com.seatel.mobilehall.ui.yes_member.adapter.TopPartnerSearchAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.PartnerSearchInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
import com.seatel.mobilehall.ui.yes_member.presenter.PartnerSearchPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class PartnerSearchActivity : BaseActivity<ActivityPartnerSearchBinding>(),
PartnerSearchInteractor.View {
companion object {
fun launch(context: Context) {
val intent = Intent(context, PartnerSearchActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityPartnerSearchBinding {
return ActivityPartnerSearchBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.tvCancel.setOnClickListener {
binding.btnSearch.text?.clear()
}
PartnerSearchPresenter(this, this).onTopPartner()
PartnerSearchPresenter(this, this).onPartnerCategory()
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun onTopPartnerSucceed(partnerSearchList: ArrayList<PartnerModelItem>) {
binding.recyclerPartner.adapter = TopPartnerSearchAdapter(this, partnerSearchList)
}
override fun onTopPartnerFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun responsePartnerCategorySucceed(partnerCategory: ArrayList<PartnerCategoryModelItem>) {
binding.recyclerCategoryPartner.layoutManager = GridLayoutManager(this, 2)
binding.recyclerCategoryPartner.adapter = MainPartnerCategoryAdapter(this, partnerCategory)
}
override fun responsePartnerCategoryFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.KeyEvent
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityPartnerSearchCategoryBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.PartnerSearchCategoryListAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.PartnerCategoryInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerSearchCategoryModel
import com.seatel.mobilehall.ui.yes_member.presenter.PartnerCategoryPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class PartnerSearchCategoryActivity : BaseActivity<ActivityPartnerSearchCategoryBinding>(),
PartnerCategoryInteractor.View {
private lateinit var originalList: ArrayList<PartnerSearchCategoryModel>
private lateinit var adapter: PartnerSearchCategoryListAdapter
companion object {
fun launch(context: Context, category: String) {
val intent = Intent(context, PartnerSearchCategoryActivity::class.java)
intent.putExtra("category", category)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityPartnerSearchCategoryBinding {
return ActivityPartnerSearchCategoryBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
PartnerCategoryPresenter(this, this).onPartnerCategory(intent.getStringExtra("category")!!)
setupSearch(binding.btnSearch)
binding.ivBack.setOnClickListener {
onBackPressed()
}
}
private fun setupSearch(searchEditText: EditText) {
searchEditText.setOnEditorActionListener { _, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH ||
(event != null && event.keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_DOWN)
) {
filterList(searchEditText.text.toString())
return@setOnEditorActionListener true
}
false
}
}
private fun filterList(query: String) {
val filteredList = originalList.filter {
it.name.contains(
query,
ignoreCase = true
) // Assuming PartnerSearchCategoryModel has a `name` field
}
adapter.updateList(ArrayList(filteredList)) // Update the adapter with the filtered data
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun responsePartnerCategorySucceed(topPartnerList: ArrayList<PartnerSearchCategoryModel>) {
originalList = topPartnerList
adapter = PartnerSearchCategoryListAdapter(this, originalList)
binding.recyclerPartner.adapter = adapter
}
override fun responsePartnerCategoryFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import coil.load
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityPartnerSearchCategoryDetailBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.PartnerSearchCategoryDetailAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.PartnerCategoryByNameInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerByNameModel
import com.seatel.mobilehall.ui.yes_member.presenter.PartnerCategoryByNamePresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class PartnerSearchCategoryDetailActivity :
BaseActivity<ActivityPartnerSearchCategoryDetailBinding>(),
PartnerCategoryByNameInteractor.View {
companion object {
fun launch(context: Context, name: String) {
val intent = Intent(context, PartnerSearchCategoryDetailActivity::class.java)
intent.putExtra("name", name)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityPartnerSearchCategoryDetailBinding {
return ActivityPartnerSearchCategoryDetailBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivBack.setOnClickListener {
onBackPressed()
}
PartnerCategoryByNamePresenter(
this,
this
).onPartnerCategoryByName(intent.getStringExtra("name")!!)
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun responsePartnerCategoryByNameSucceed(topPartnerList: ArrayList<PartnerByNameModel>) {
for (topPartner in topPartnerList) {
binding.ivHeaderBanner.load(topPartner.banner)
binding.tvCategoryName.text = topPartner.category
binding.tvName.text = topPartner.name
binding.tvCategoryDescription.text = topPartner.description
binding.recyclerOutlet.adapter =
PartnerSearchCategoryDetailAdapter(this, topPartner.outlet)
}
}
override fun responsePartnerCategoryByNameFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityRedeemBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.interactor.RedeemCodeInteractor
import com.seatel.mobilehall.ui.yes_member.presenter.RedeemCodePresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
import org.json.JSONObject
class RedeemActivity : BaseActivity<ActivityRedeemBinding>(), RedeemCodeInteractor.View {
companion object {
fun launch(context: Context) {
val intent = Intent(context, RedeemActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityRedeemBinding {
return ActivityRedeemBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.btnRedeem.setOnClickListener {
RedeemCodePresenter(this, this).onRedeemCode(
"code",
binding.edCode.text.toString(),
getPhoneLogin()
)
}
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun onRedeemCodeSuccess(jsonObject: JSONObject) {
val status = jsonObject.optString("status")
val message = jsonObject.optString("message")
val description = jsonObject.optString("description")
SuccessRedeemActivity.launch(this, message, description)
}
override fun onRedeemCodeFailure(errorMessage: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(errorMessage))
.show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityRewardHistoryBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.RewardHistoryAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.RewardHistoryInteractor
import com.seatel.mobilehall.ui.yes_member.model.RewardHistoryModel
import com.seatel.mobilehall.ui.yes_member.presenter.RewardHistoryPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class RewardHistoryActivity : BaseActivity<ActivityRewardHistoryBinding>(),
RewardHistoryInteractor.View {
companion object {
fun launch(context: Context) {
val intent = Intent(context, RewardHistoryActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityRewardHistoryBinding {
return ActivityRewardHistoryBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
RewardHistoryPresenter(this, this).getRewardHistory(getPhoneLogin())
}
override fun responseRewardHistorySucceed(rewardHistoryList: RewardHistoryModel) {
binding.recyclerRewardHistory.adapter = RewardHistoryAdapter(this, rewardHistoryList.data)
}
override fun responseRewardHistoryFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun getStringToolbarTitle(): String? {
return "Redeemed Reward History"
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import androidx.annotation.RequiresApi
import coil.load
import com.seatel.mobilehall.databinding.ActivityRewardHistoryDetailBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.model.RewardHistoryData
import com.seatel.mobilehall.util.SeatelUtils
class RewardHistoryDetailActivity : BaseActivity<ActivityRewardHistoryDetailBinding>() {
companion object {
fun launch(context: Context, rewardHistoryData: RewardHistoryData) {
val intent = Intent(context, RewardHistoryDetailActivity::class.java)
intent.putExtra("rewardHistoryModel", rewardHistoryData)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityRewardHistoryDetailBinding {
return ActivityRewardHistoryDetailBinding.inflate(layoutInflater)
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
val rewardData: RewardHistoryData? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra("rewardHistoryModel", RewardHistoryData::class.java)
} else {
intent.getParcelableExtra("rewardHistoryModel")
}
rewardData?.let {
binding.tvRewardImg.load(it.rewardImage) {
crossfade(true)
}
binding.tvRewardName.text = it.rewardName
binding.tvRewardStatus.text = it.status
binding.tvRewardCode.text = it.redeemCode
binding.tvRewardExpiry.text = SeatelUtils.formatDateCoin(it.expiredAt)
binding.tvRewardDate.text = SeatelUtils.formatDateCoin(it.createdAt)
}
}
override fun getStringToolbarTitle(): String? {
return "Rewards"
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import coil.load
import com.android.volley.VolleyError
import com.seatel.mobilehall.R
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivityRewardsDetailBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.interactor.RedeemRewardInteractor
import com.seatel.mobilehall.ui.yes_member.presenter.RedeemRewardPresenter
import com.seatel.mobilehall.util.SeatelUtils
import com.seatel.mobilehall.util.dialogannouncement.YesMemberDialog
import org.json.JSONObject
class RewardsDetailActivity : BaseActivity<ActivityRewardsDetailBinding>(),
RedeemRewardInteractor.View {
companion object {
fun launch(
context: Context,
imageUrl: String,
name: String,
coin: String,
termCondition: String,
reward: String,
shop: String
) {
val intent = Intent(context, RewardsDetailActivity::class.java)
intent.putExtra("reward_image", imageUrl)
intent.putExtra("reward_name", name)
intent.putExtra("reward_coin", coin)
intent.putExtra("reward_term_condition", termCondition)
intent.putExtra("reward", reward)
intent.putExtra("shop", shop)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityRewardsDetailBinding {
return ActivityRewardsDetailBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivRewardImg.load(intent.getStringExtra("reward_image")) {
crossfade(true)
}
binding.tvRewardName.text = intent.getStringExtra("reward_name")
binding.tvRewardCoin.text = intent.getStringExtra("reward_coin")
binding.tvRewardTermConditionDetail.text = intent.getStringExtra("reward_term_condition")
binding.btnRedeem.setOnClickListener {
//show dialog
val dialog = YesMemberDialog(
this,
"",
intent.getStringExtra("reward_name")!!,
"",
intent.getStringExtra("reward_coin")!!,
intent.getStringExtra("reward_image")!!,
0,
"OK",
""
).setPositiveButton(
"Redeem"
) { dialog, which ->
RedeemRewardPresenter(this, this).redeemReward(
getPhoneLogin(),
intent.getStringExtra("reward").toString(),
intent.getStringExtra("shop").toString()
)
dialog.dismiss()
}.setNegativeButton(
"Cancel"
) { dialog, which ->
dialog.dismiss()
}
dialog.show()
}
}
override fun getStringToolbarTitle(): String? {
return "Rewards"
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
override fun responseRedeemRewardSucceed(rewardDetail: JSONObject) {
val redeemCode = rewardDetail.optString("redeemCode")
Log.d("TAG::>>>", "responseRedeemRewardSucceed: $redeemCode")
val dialog = YesMemberDialog(
this, "Redeem Successful",
"Your reward code is",
redeemCode, "",
"",
R.drawable.ic_register_success,
"Done",
""
).setPositiveButton("Done") { dialog, which ->
dialog.dismiss()
}
dialog.show()
}
override fun responseRedeemRewardFail(error: VolleyError) {
val dialog = YesMemberDialog(
this,
"",
SeatelUtils.translatForDialog(this, SeatelSuperRequest.getErrorMessageFrom(error)),
"",
"",
"",
R.drawable.ic_cry_emoji,
"",
"Done"
).setNegativeButton(
"Done"
) { dialog, which ->
dialog.dismiss()
}
dialog.show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import coil.load
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.ActivitySelectShopBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
import com.seatel.mobilehall.ui.yes_member.adapter.SelectShopAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.SelectShopInteractor
import com.seatel.mobilehall.ui.yes_member.model.SelectShopModel
import com.seatel.mobilehall.ui.yes_member.presenter.SelectShopPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
class SelectShopActivity : BaseActivity<ActivitySelectShopBinding>(),
SelectShopInteractor.View {
companion object {
fun launch(context: Context, id: String) {
val intent = Intent(context, SelectShopActivity::class.java)
intent.putExtra("id", id)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivitySelectShopBinding {
return ActivitySelectShopBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
SelectShopPresenter(this, this).getSelectShop(
intent.getStringExtra("id").toString(),
getPhoneLogin()
)
}
override fun responseSelectShopSucceed(rewardDetail: SelectShopModel) {
Log.d("TAG::>>>", "responseRewardDetailSucceed: $rewardDetail")
binding.ivRewardDetailImg.load(rewardDetail.imageUrl) {
crossfade(true)
}
binding.recyclerShop.adapter = SelectShopAdapter(this, rewardDetail.availableShops) {
RewardsDetailActivity.launch(
this,
rewardDetail.imageUrl,
rewardDetail.name,
rewardDetail.exchangePoint.toString(),
rewardDetail.description,
rewardDetail._id,
it.shop.toString()
)
}
}
override fun responseSelectShopFail(error: VolleyError) {
SeatelAlertDialog.with(this, SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun getStringToolbarTitle(): String? {
return "Select Shop"
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.seatel.mobilehall.databinding.ActivitySuccessRedeemBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
class SuccessRedeemActivity : BaseActivity<ActivitySuccessRedeemBinding>() {
companion object {
fun launch(context: Context, message: String, description: String) {
val intent = Intent(context, SuccessRedeemActivity::class.java)
intent.putExtra("message", message)
intent.putExtra("description", description)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivitySuccessRedeemBinding {
return ActivitySuccessRedeemBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.title.text = intent.getStringExtra("message")
binding.description.text = intent.getStringExtra("description")
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.webkit.WebViewClient
import com.seatel.mobilehall.BuildConfig
import com.seatel.mobilehall.databinding.ActivityYesMemberTermConditionBinding
import com.seatel.mobilehall.ui.base.activity.BaseActivity
class YesMemberTermConditionActivity : BaseActivity<ActivityYesMemberTermConditionBinding>() {
companion object {
fun launch(context: Context) {
val intent = Intent(context, YesMemberTermConditionActivity::class.java)
context.startActivity(intent)
}
}
override fun getViewBinding(): ActivityYesMemberTermConditionBinding {
return ActivityYesMemberTermConditionBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.activityEnterRightAnimation()
// getTermCondition()
binding.ivBack.setOnClickListener {
onBackPressed()
}
loadTermsInWebView()
}
private fun loadTermsInWebView() {
binding.wvTermCondition.settings.apply {
javaScriptEnabled = true // Enable JavaScript (if needed)
domStorageEnabled = true // Enable local storage (if required)
loadsImagesAutomatically = true
useWideViewPort = true
}
binding.wvTermCondition.webViewClient = WebViewClient() // Prevent opening in a browser
// Load API URL directly in WebView
val url = BuildConfig.BASE_URL + "yes-member-term"
binding.wvTermCondition.loadUrl(url)
}
override fun isDisplayToolbar(): Boolean {
return false
}
override fun onBackPressed() {
super.onBackPressed()
super.activityExitLeftAnimation()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.seatel.mobilehall.databinding.ItemEarnCoinBinding
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinModel
class EarnCoinAdapter(var mContext: Context, var earnCoinList: ArrayList<EarnCoinModel>) :
RecyclerView.Adapter<EarnCoinAdapter.ViewHolder>() {
class ViewHolder(var binding: ItemEarnCoinBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(earnCoinModel: EarnCoinModel) {
binding.tvPlanService.text = earnCoinModel.planService
binding.tvCoin.text = earnCoinModel.coinDesc
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EarnCoinAdapter.ViewHolder {
val binding = ItemEarnCoinBinding.inflate(
android.view.LayoutInflater.from(parent.context), parent, false
)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: EarnCoinAdapter.ViewHolder, position: Int) {
holder.bind(earnCoinList[position])
}
override fun getItemCount(): Int {
return earnCoinList.size
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.RecyclerView
import com.seatel.mobilehall.databinding.ItemEarnCoinHistoryBinding
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinHistoryData
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.Locale
class EarnCoinHistoryAdapter(
private val mContext: Context,
private val earnCoinHistoryModel: ArrayList<EarnCoinHistoryData>
) : RecyclerView.Adapter<EarnCoinHistoryAdapter.ViewHolder>() {
@RequiresApi(Build.VERSION_CODES.O)
private fun formatDateCoin(input: String): String {
return try {
val inputFormatter = DateTimeFormatter.ISO_DATE_TIME
val outputFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH)
val dateTime = ZonedDateTime.parse(input, inputFormatter).toLocalDate()
dateTime.format(outputFormatter)
} catch (e: Exception) {
input // Return original input if parsing fails
}
}
inner class ViewHolder(private val binding: ItemEarnCoinHistoryBinding) :
RecyclerView.ViewHolder(binding.root) {
@RequiresApi(Build.VERSION_CODES.O)
fun bind(data: EarnCoinHistoryData) {
binding.tvPlanName.text = data.pricePlan
binding.tvDate.text = formatDateCoin(data.earnDate)
binding.tvExpiry.text = formatDateCoin(data.expiredDate)
binding.tvEarnCoin.text = "+${data.coin}"
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemEarnCoinHistoryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(earnCoinHistoryModel[position])
}
override fun getItemCount(): Int = earnCoinHistoryModel.size
}
......@@ -10,12 +10,13 @@ import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.seatel.mobilehall.R
import com.seatel.mobilehall.ui.base.adapter.BaseAdapter
import com.seatel.mobilehall.ui.yes_member.activity.PartnerSearchCategoryActivity
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
class PartnerCategoryAdapter(
class MainPartnerCategoryAdapter(
private var mContext: Context,
private var yesPartnerModelItem: ArrayList<PartnerCategoryModelItem>
) : BaseAdapter<PartnerCategoryAdapter.ViewHolder>() {
) : BaseAdapter<MainPartnerCategoryAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val title = itemView.findViewById<TextView>(R.id.tv_title)
......@@ -24,17 +25,21 @@ class PartnerCategoryAdapter(
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): PartnerCategoryAdapter.ViewHolder {
): MainPartnerCategoryAdapter.ViewHolder {
return ViewHolder(
LayoutInflater.from(mContext).inflate(R.layout.item_partner_category, parent, false)
LayoutInflater.from(mContext).inflate(R.layout.item_main_partner_category, parent, false)
)
}
override fun onBindViewHolder(holder: PartnerCategoryAdapter.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: MainPartnerCategoryAdapter.ViewHolder, position: Int) {
val data = yesPartnerModelItem[position]
holder.image.load(data.icon)
holder.title.text = data.name
holder.itemView.setOnClickListener {
PartnerSearchCategoryActivity.launch(mContext,data.code)
}
}
override fun getItemCount(): Int {
......
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.seatel.mobilehall.R
import com.seatel.mobilehall.ui.base.adapter.BaseAdapter
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
import com.seatel.mobilehall.ui.yes_member.model.TopPartnerModelItem
class PartnerAdapter(
private var mContext: Context, private var yesPartnerModelItem: ArrayList<PartnerModelItem>
) : BaseAdapter<PartnerAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val logo = itemView.findViewById<ImageView>(R.id.iv_partner_logo)
val title = itemView.findViewById<TextView>(R.id.tv_partner_title)
val image = itemView.findViewById<ImageView>(R.id.iv_image)
val discount = itemView.findViewById<TextView>(R.id.tv_discount)
val discountBg = itemView.findViewById<ImageView>(R.id.iv_discount_bg)
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): ViewHolder {
return ViewHolder(
LayoutInflater.from(mContext).inflate(R.layout.item_yes_member, parent, false)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = yesPartnerModelItem[position]
holder.logo.load(data.icon)
holder.title.text = data.name
holder.image.load(data.banner)
if (data.discount > 0) {
holder.discount.visibility = View.VISIBLE
holder.discountBg.visibility = View.VISIBLE
} else {
holder.discount.visibility = View.GONE
holder.discountBg.visibility = View.GONE
}
holder.discount.text = data.discountDesc
}
override fun getItemCount(): Int {
return yesPartnerModelItem.size
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.seatel.mobilehall.databinding.ItemPartnerCategoryListBinding
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
class PartnerCategoryListAdapter(
private var mContext: Context,
private var partnerModelItem: ArrayList<PartnerModelItem>
) : RecyclerView.Adapter<PartnerCategoryListAdapter.ViewHolder>() {
class ViewHolder(var binding: ItemPartnerCategoryListBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(context: Context, partnerModelItem: PartnerModelItem) {
Glide.with(context).load(partnerModelItem.icon).into(binding.ivIcon)
binding.tvPartnerName.text = partnerModelItem.name
binding.tvPartnerOutlet.text = partnerModelItem.totalOutlet.toString() + " Outlet"
binding.btnDiscount.text = partnerModelItem.discountDesc
}
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): ViewHolder {
val binding = ItemPartnerCategoryListBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
return ViewHolder(binding)
}
override fun getItemCount(): Int {
return partnerModelItem.size
}
override fun onBindViewHolder(holder: PartnerCategoryListAdapter.ViewHolder, position: Int) {
val data = partnerModelItem[position]
holder.bind(mContext, data)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.seatel.mobilehall.databinding.ItemPartnerSearchCategoryDetailBinding
import com.seatel.mobilehall.ui.yes_member.activity.OutletLocationActivity
import com.seatel.mobilehall.ui.yes_member.model.PartnerByNameOutlet
class PartnerSearchCategoryDetailAdapter(
private val context: Context,
private val partnerByName: ArrayList<PartnerByNameOutlet>
) : RecyclerView.Adapter<PartnerSearchCategoryDetailAdapter.ViewHolder>() {
class ViewHolder(val binding: ItemPartnerSearchCategoryDetailBinding) :
RecyclerView.ViewHolder(binding.root) {
fun binding(context: Context, item: PartnerByNameOutlet) {
Glide.with(context).load(item.icon).into(binding.ivIcon)
binding.tvPartnerName.text = item.name
binding.btnDiscount.text = item.discountDesc
}
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
val binding = ItemPartnerSearchCategoryDetailBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return ViewHolder(binding)
}
override fun onBindViewHolder(
holder: ViewHolder,
position: Int
) {
holder.binding(context, partnerByName[position])
holder.itemView.setOnClickListener {
OutletLocationActivity.launch(context, partnerByName[position])
}
}
override fun getItemCount(): Int {
return partnerByName.size
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.seatel.mobilehall.databinding.ItemPartnerCategoryListBinding
import com.seatel.mobilehall.ui.yes_member.activity.PartnerSearchCategoryDetailActivity
import com.seatel.mobilehall.ui.yes_member.model.PartnerSearchCategoryModel
class PartnerSearchCategoryListAdapter(
private var mContext: Context,
private var partnerModelItem: ArrayList<PartnerSearchCategoryModel>
) : RecyclerView.Adapter<PartnerSearchCategoryListAdapter.ViewHolder>() {
class ViewHolder(var binding: ItemPartnerCategoryListBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(context: Context, partnerModelItem: PartnerSearchCategoryModel) {
Glide.with(context).load(partnerModelItem.icon).into(binding.ivIcon)
binding.tvPartnerName.text = partnerModelItem.name
binding.tvPartnerOutlet.text = partnerModelItem.totalOutlet.toString() + " Outlet"
binding.btnDiscount.text = partnerModelItem.discountDesc
}
}
fun updateList(newList: ArrayList<PartnerSearchCategoryModel>) {
partnerModelItem = newList
notifyDataSetChanged() // Refresh RecyclerView
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): ViewHolder {
val binding = ItemPartnerCategoryListBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
return ViewHolder(binding)
}
override fun getItemCount(): Int {
return partnerModelItem.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = partnerModelItem[position]
holder.bind(mContext, data)
holder.itemView.setOnClickListener {
PartnerSearchCategoryDetailActivity.launch(mContext, data.name)
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.seatel.mobilehall.databinding.ItemRewardBinding
import com.seatel.mobilehall.ui.yes_member.activity.SelectShopActivity
import com.seatel.mobilehall.ui.yes_member.model.RewardModel
class RewardAdapter(var mContext: Context, var rewardList: ArrayList<RewardModel>) :
RecyclerView.Adapter<RewardAdapter.ViewHolder>() {
class ViewHolder(var binding: ItemRewardBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(rewardModel: RewardModel) {
binding.tvCoin.text = rewardModel.exchangePoint.toString()
binding.ivTextReward.text = rewardModel.name
binding.ivReward.load(rewardModel.imageUrl) {
crossfade(true)
}
}
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): RewardAdapter.ViewHolder {
val binding = ItemRewardBinding.inflate(
android.view.LayoutInflater.from(parent.context), parent, false
)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: RewardAdapter.ViewHolder, position: Int) {
holder.bind(rewardList[position])
holder.binding.root.setOnClickListener {
SelectShopActivity.launch(mContext, rewardList[position]._id)
}
}
override fun getItemCount(): Int {
return rewardList.size
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.RecyclerView
import com.seatel.mobilehall.databinding.ItemRewardHistoryBinding
import com.seatel.mobilehall.ui.yes_member.activity.RewardHistoryDetailActivity
import com.seatel.mobilehall.ui.yes_member.model.RewardHistoryData
import com.seatel.mobilehall.util.SeatelUtils
class RewardHistoryAdapter(
private val mContext: Context,
private val rewardHistoryData: ArrayList<RewardHistoryData>
) : RecyclerView.Adapter<RewardHistoryAdapter.ViewHolder>() {
inner class ViewHolder(private val binding: ItemRewardHistoryBinding) :
RecyclerView.ViewHolder(binding.root) {
@RequiresApi(Build.VERSION_CODES.O)
fun bind(data: RewardHistoryData) {
binding.tvItemName.text = data.rewardName
binding.tvClaimRewardDate.text = SeatelUtils.formatDateCoin(data.expiredAt)
binding.tvRewardCoin.text = "-${data.coin}"
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding =
ItemRewardHistoryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(rewardHistoryData[position])
holder.itemView.setOnClickListener {
RewardHistoryDetailActivity.launch(mContext, rewardHistoryData[position])
}
}
override fun getItemCount(): Int = rewardHistoryData.size
}
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.seatel.mobilehall.R
import com.seatel.mobilehall.databinding.ItemSelectShopBinding
import com.seatel.mobilehall.ui.yes_member.model.AvailableShop
class SelectShopAdapter(
private var mContext: Context,
private var rewardDetailList: ArrayList<AvailableShop>,
private var onItemClick: ((AvailableShop) -> Unit)? = null
) : RecyclerView.Adapter<SelectShopAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(context: Context, availableShop: AvailableShop) {
val binding = ItemSelectShopBinding.bind(itemView)
if (availableShop.isAvailableStock) {
binding.frameContent.setBackgroundResource(R.drawable.bg_button_round_service)
binding.btnRedeem.setTextColor(
ContextCompat.getColor(
context,
R.color.colorPrimary
)
)
} else {
binding.frameContent.setBackgroundResource(R.drawable.bg_round_gray_section)
binding.btnRedeem.setTextColor(
ContextCompat.getColor(
context,
R.color.colorGray
)
)
}
binding.tvShopName.text = availableShop.name
if (availableShop.address != null) {
binding.tvLocation.text = availableShop.address
}
binding.ivShopImg.load(availableShop.imageUrl) {
crossfade(true)
}
}
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): SelectShopAdapter.ViewHolder {
val binding = ItemSelectShopBinding.inflate(LayoutInflater.from(mContext), parent, false)
return ViewHolder(binding.root)
}
override fun onBindViewHolder(holder: SelectShopAdapter.ViewHolder, position: Int) {
holder.bind(mContext, rewardDetailList[position])
holder.itemView.setOnClickListener {
onItemClick?.invoke(rewardDetailList[position])
}
}
override fun getItemCount(): Int {
return rewardDetailList.size
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.seatel.mobilehall.R
import com.seatel.mobilehall.databinding.ItemTopPartnerSearchBinding
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
class TopPartnerSearchAdapter(
private var mContext: Context, private var partnerSearchList: ArrayList<PartnerModelItem>
) : RecyclerView.Adapter<TopPartnerSearchAdapter.ViewHolder>() {
class ViewHolder(var binding: ItemTopPartnerSearchBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(mContext: Context, partnerModelItem: PartnerModelItem) {
Glide.with(mContext).load(partnerModelItem.icon)
.placeholder(R.drawable.ic_yes_profile).dontAnimate().into(binding.ivIcon)
binding.tvPartnerName.text = partnerModelItem.name
}
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): TopPartnerSearchAdapter.ViewHolder {
val binding = ItemTopPartnerSearchBinding.inflate(
android.view.LayoutInflater.from(parent.context), parent, false
)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: TopPartnerSearchAdapter.ViewHolder, position: Int) {
holder.bind(mContext, partnerSearchList[position])
}
override fun getItemCount(): Int {
return partnerSearchList.size
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member
package com.seatel.mobilehall.ui.yes_member.adapter
import android.content.Context
import android.view.LayoutInflater
......@@ -20,22 +20,34 @@ class YesMemberAdapter(
val logo = itemView.findViewById<ImageView>(R.id.iv_partner_logo)
val title = itemView.findViewById<TextView>(R.id.tv_partner_title)
val image = itemView.findViewById<ImageView>(R.id.iv_image)
val discount = itemView.findViewById<TextView>(R.id.tv_discount)
val discountBg = itemView.findViewById<ImageView>(R.id.iv_discount_bg)
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): YesMemberAdapter.ViewHolder {
): ViewHolder {
return ViewHolder(
LayoutInflater.from(mContext).inflate(R.layout.item_yes_member, parent, false)
)
}
override fun onBindViewHolder(holder: YesMemberAdapter.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = yesPartnerModelItem[position]
holder.logo.load(data.icon)
holder.title.text = data.name
holder.image.load(data.banner)
if (data.discount > 0) {
holder.discount.visibility = View.VISIBLE
holder.discountBg.visibility = View.VISIBLE
} else {
holder.discount.visibility = View.GONE
holder.discountBg.visibility = View.GONE
}
holder.discount.text = data.discountDesc
}
override fun getItemCount(): Int {
......
package com.seatel.mobilehall.ui.yes_member.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.android.volley.VolleyError
import com.seatel.mobilehall.data.network.SeatelSuperRequest
import com.seatel.mobilehall.databinding.FragmentYesMemberBinding
import com.seatel.mobilehall.ui.base.fragment.BaseFragment
import com.seatel.mobilehall.ui.yes_member.activity.CoinActivity
import com.seatel.mobilehall.ui.yes_member.activity.PartnerActivity
import com.seatel.mobilehall.ui.yes_member.activity.YesMemberTermConditionActivity
import com.seatel.mobilehall.ui.yes_member.adapter.MainPartnerCategoryAdapter
import com.seatel.mobilehall.ui.yes_member.adapter.YesMemberAdapter
import com.seatel.mobilehall.ui.yes_member.interactor.MainTopPartnerInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.TopPartnerModelItem
import com.seatel.mobilehall.ui.yes_member.model.YesMemberMainModel
import com.seatel.mobilehall.ui.yes_member.presenter.MainTopPartnerPresenter
import com.seatel.mobilehall.util.SeatelAlertDialog
import com.seatel.mobilehall.util.viewFragmentBinding
class YesMemberFragment : BaseFragment(), MainTopPartnerInteractor.View {
private lateinit var adapter: YesMemberAdapter
private lateinit var partnerCategoryAdapter: MainPartnerCategoryAdapter
private var imgCoin: String? = null
private var imgBanner: String? = null
private var coinEarn: String? = null
private var coinDescription: String? = null
private val binding by viewFragmentBinding(
FragmentYesMemberBinding::inflate
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return binding.root
}
private fun init() {
MainTopPartnerPresenter(requireContext(), this).getYesMemberMain(getPhoneLogin())
MainTopPartnerPresenter(requireContext(), this).onTopPartnerData()
MainTopPartnerPresenter(requireContext(), this).onPartnerCategory()
binding.btnCoin.setOnClickListener {
CoinActivity.launch(requireContext(), imgCoin!!, coinEarn!!, coinDescription!!)
}
binding.btnNotification.setOnClickListener {
YesMemberTermConditionActivity.launch(requireContext())
}
binding.btnPartner.setOnClickListener {
PartnerActivity.launch(requireContext(), imgBanner!!)
}
}
override fun responseTopPartnerSucceed(topPartnerList: ArrayList<TopPartnerModelItem>) {
binding.recyclerPartner.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
adapter = YesMemberAdapter(requireContext(), topPartnerList)
binding.recyclerPartner.adapter = adapter
}
override fun responsePartnerCategorySucceed(partnerCategory: ArrayList<PartnerCategoryModelItem>) {
binding.RecyclerPartnerCategory.layoutManager = GridLayoutManager(context, 2)
partnerCategoryAdapter = MainPartnerCategoryAdapter(requireContext(), partnerCategory)
binding.RecyclerPartnerCategory.adapter = partnerCategoryAdapter
}
override fun responseTopPartnerFail(error: VolleyError) {
SeatelAlertDialog.with(requireContext(), SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun responsePartnerCategoryFail(error: VolleyError) {
SeatelAlertDialog.with(requireContext(), SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
override fun responseYesMemberMainSucceed(mainModel: YesMemberMainModel) {
coinEarn = mainModel.coinEarn.toString()
coinDescription = mainModel.coinDescription
imgCoin = mainModel.coinBanner
imgBanner = mainModel.partnerBanner
binding.tvCoinEarn.text = "Your coins " + mainModel.coinEarn
binding.tvCoinDescription.text = mainModel.coinDescription
binding.tvPartnerDescription.text = mainModel.partnerDescription
}
override fun responseYesMemberMainFail(error: VolleyError) {
SeatelAlertDialog.with(requireContext(), SeatelSuperRequest.getErrorMessageFrom(error))
.show()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinHistoryModel
interface EarnCoinHistoryInteractor {
interface View {
fun responseEarnCoinHistorySucceed(earnCoinHistoryList: EarnCoinHistoryModel)
fun responseEarnCoinHistoryFail(error: VolleyError)
}
interface Presenter {
fun getEarnCoinHistory(phoneNumber: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinModel
interface EarnCoinInteractor {
interface View {
fun responseEarnCoinSucceed(earnCoinList: ArrayList<EarnCoinModel>)
fun responseEarnCoinFail(error: VolleyError)
}
interface Presenter {
fun getEarnCoins()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.TopPartnerModelItem
import com.seatel.mobilehall.ui.yes_member.model.YesMemberMainModel
interface MainTopPartnerInteractor {
interface View {
fun responseTopPartnerSucceed(topPartnerList: ArrayList<TopPartnerModelItem>)
fun responseTopPartnerFail(error: VolleyError)
fun responsePartnerCategorySucceed(partnerCategory: ArrayList<PartnerCategoryModelItem>)
fun responsePartnerCategoryFail(error: VolleyError)
fun responseYesMemberMainSucceed(mainModel: YesMemberMainModel)
fun responseYesMemberMainFail(error: VolleyError)
}
interface Presenter {
fun onTopPartnerData()
fun onPartnerCategory()
fun getYesMemberMain(phoneNumber: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.PartnerByNameModel
import com.seatel.mobilehall.ui.yes_member.model.PartnerSearchCategoryModel
interface PartnerCategoryByNameInteractor {
interface View {
fun responsePartnerCategoryByNameSucceed(topPartnerList: ArrayList<PartnerByNameModel>)
fun responsePartnerCategoryByNameFail(error: VolleyError)
}
interface Presenter {
fun onPartnerCategoryByName(name: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.PartnerSearchCategoryModel
interface PartnerCategoryInteractor {
interface View {
fun responsePartnerCategorySucceed(topPartnerList: ArrayList<PartnerSearchCategoryModel>)
fun responsePartnerCategoryFail(error: VolleyError)
}
interface Presenter {
fun onPartnerCategory(category: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
interface PartnerSearchInteractor {
interface View {
fun onTopPartnerSucceed(partnerSearchList: ArrayList<PartnerModelItem>)
fun onTopPartnerFail(error: VolleyError)
fun responsePartnerCategorySucceed(partnerCategory: ArrayList<PartnerCategoryModelItem>)
fun responsePartnerCategoryFail(error: VolleyError)
}
interface Presenter {
fun onTopPartner()
fun onPartnerCategory()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import org.json.JSONObject
interface RedeemCodeInteractor {
interface View {
fun onRedeemCodeSuccess(jsonObject: JSONObject)
fun onRedeemCodeFailure(errorMessage: VolleyError)
}
interface Presenter {
fun onRedeemCode(type: String, data: String, phoneNumber: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import org.json.JSONObject
interface RedeemRewardInteractor {
interface View {
fun responseRedeemRewardSucceed(rewardDetail: JSONObject)
fun responseRedeemRewardFail(error: VolleyError)
}
interface Presenter {
fun redeemReward(phoneNumber: String, reward: String, shop: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.RewardHistoryModel
interface RewardHistoryInteractor {
interface View {
fun responseRewardHistorySucceed(rewardHistoryList: RewardHistoryModel)
fun responseRewardHistoryFail(error: VolleyError)
}
interface Presenter {
fun getRewardHistory(phoneNumber: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.RewardModel
interface RewardInteractor {
interface View {
fun responseRewardSucceed(rewardList: ArrayList<RewardModel>)
fun responseRewardFail(error: VolleyError)
}
interface Presenter {
fun getReward(phoneNumber: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.SelectShopModel
interface SelectShopInteractor {
interface View {
fun responseSelectShopSucceed(rewardDetail: SelectShopModel)
fun responseSelectShopFail(error: VolleyError)
}
interface Presenter {
fun getSelectShop(id: String, phoneNumber: String)
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.interactor
import com.android.volley.VolleyError
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.TopPartnerModelItem
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
interface TopPartnerInteractor {
interface View {
fun responseTopPartnerSucceed(topPartnerList: ArrayList<TopPartnerModelItem>)
fun responseTopPartnerSucceed(topPartnerList: ArrayList<PartnerModelItem>)
fun responseTopPartnerFail(error: VolleyError)
fun responsePartnerCategorySucceed(partnerCategory: ArrayList<PartnerCategoryModelItem>)
fun responsePartnerCategoryFail(error: VolleyError)
}
interface Presenter {
fun onTopPartnerData()
fun onPartnerCategory()
fun onTopPartner()
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class AvailableShop(
val imageUrl: String? = null,
val address: String? = null,
val name: String? = null,
val shop: String? = null,
var isAvailableStock: Boolean = false
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class EarnCoinHistoryData(
val _id: String,
val amount: Int,
val coin: Int,
val createdAt: String,
val earnDate: String,
val expiredDate: String,
val phoneNumber: String,
val pricePlan: String,
val status: String,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class EarnCoinHistoryMetadata(
val limit: Int,
val offset: Int,
val total: Int
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class EarnCoinHistoryModel(
val `data`: ArrayList<EarnCoinHistoryData>,
val metadata: EarnCoinHistoryMetadata
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class EarnCoinModel(
val _id: String,
val coin: String,
val coinDesc: String,
val createdAt: String,
val crmOfferCode: String,
val crmOfferId: String,
val crmOfferName: String,
val description: String,
val planPackage: String,
val planService: String,
val status: String,
val subscription: String,
val termCondition: String,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
import java.util.ArrayList
data class PartnerByNameModel(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val outlet: ArrayList<PartnerByNameOutlet>,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val totalOutlet: Int,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class PartnerByNameOutlet(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val updatedAt: String
) : Parcelable
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class PartnerModelItem(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val outlet: List<PartnerOutlet>,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val totalOutlet: Int,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class PartnerOutlet(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val updatedAt: String
) : Parcelable
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class PartnerSearchCategoryModel(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val outlet: List<PartnerSearchCategoryOutlet>,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val totalOutlet: Int,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class PartnerSearchCategoryOutlet(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class RewardHistoryData(
val __v: Int,
val _id: String,
val coin: Int,
val createdAt: String,
val expiredAt: String,
val phoneNumber: String,
val redeemCode: String,
val reward: String,
val rewardImage: String,
val rewardName: String,
val shop: String,
val shopName: String,
val status: String,
val updatedAt: String
): Parcelable
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class RewardHistoryMetadata(
val limit: Int,
val offset: Int,
val total: Int
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class RewardHistoryModel(
val `data`: ArrayList<RewardHistoryData>,
val metadata: RewardHistoryMetadata
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class RewardModel(
val __v: Int,
val _id: String,
val availableShops: List<Any>,
val createdAt: String,
val dailyQuantity: Int,
val description: String,
val exchangePoint: Int,
val imageUrl: String,
val initialQuantity: Int,
val isPhysicalPrize: Boolean,
val name: String,
val remainingQuantity: Int,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class SelectShopModel(
val __v: Int,
val _id: String,
val availableShops: ArrayList<AvailableShop>,
val createdAt: String,
val dailyQuantity: Int,
val description: String,
val exchangePoint: Int,
val imageUrl: String,
val initialQuantity: Int,
val isPhysicalPrize: Boolean,
val name: String,
val remainingQuantity: Int,
val updatedAt: String
)
\ No newline at end of file
......@@ -3,18 +3,23 @@ package com.seatel.mobilehall.ui.yes_member.model
data class TopPartnerModelItem(
val __v: Int,
val _id: String,
val address: String,
val banner: String,
val category: String,
val code: String,
val createdAt: String,
val description: String,
val discount: Int,
val discountDesc: String,
val icon: String,
val latLong: String,
val name: String,
val outlet: List<PartnerOutlet>,
val phoneNumber: String,
val qrCode: String,
val shopParent: String,
val shopRating: String,
val status: String,
val updatedAt: String,
val banner: String
val totalOutlet: Int,
val updatedAt: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.model
data class YesMemberMainModel(
val coinBanner: String,
val coinDescription: String,
val coinEarn: Int,
val coinExpiry: String,
val eligiblePartner: Boolean,
val partnerBanner: String,
val partnerDescription: String,
val status: String
)
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.seatel.mobilehall.data.network.SeatelJSONObjectRequest
import com.seatel.mobilehall.ui.yes_member.interactor.EarnCoinHistoryInteractor
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinHistoryModel
import org.json.JSONObject
class EarnCoinHistoryPresenter(
private var mContext: Context,
private var earnCoinHistoryInteractor: EarnCoinHistoryInteractor.View
) : EarnCoinHistoryInteractor.Presenter {
override fun getEarnCoinHistory(phoneNumber: String) {
getEarnCoinHistoryRequest(phoneNumber).setOnErrorListener {
earnCoinHistoryInteractor.responseEarnCoinHistoryFail(it)
}.setOnResponseListener { response ->
earnCoinHistoryInteractor.responseEarnCoinHistorySucceed(getEarnCoinHistoryList(response as JSONObject)!!)
}.execute()
}
private fun getEarnCoinHistoryList(response: JSONObject): EarnCoinHistoryModel? {
val gson = Gson()
val data = gson.fromJson(response.toString(), EarnCoinHistoryModel::class.java)
return data
}
private fun getEarnCoinHistoryRequest(phoneNumber: String): SeatelJSONObjectRequest {
return object : SeatelJSONObjectRequest(mContext) {
override fun getMethod(): Int {
return Request.Method.GET
}
override fun getFunctionName(): String {
return "yes-member/coin-history?phoneNumber=$phoneNumber"
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.seatel.mobilehall.data.network.SeatelJSONArrayRequest
import com.seatel.mobilehall.ui.yes_member.interactor.EarnCoinInteractor
import com.seatel.mobilehall.ui.yes_member.model.EarnCoinModel
import org.json.JSONArray
class EarnCoinPresenter(
private var mContext: Context, private var earnCoinInteractor: EarnCoinInteractor.View
) : EarnCoinInteractor.Presenter {
override fun getEarnCoins() {
getEarnCoinRequest().setOnErrorListener { error ->
earnCoinInteractor.responseEarnCoinFail(error)
}.setOnResponseListener { response ->
earnCoinInteractor.responseEarnCoinSucceed(getEarnCoinList(response as JSONArray))
}.execute()
}
private fun getEarnCoinList(response: JSONArray): ArrayList<EarnCoinModel> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<EarnCoinModel>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun getEarnCoinRequest(): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/coin-rating"
}
override fun getMethod(): kotlin.Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.seatel.mobilehall.data.network.SeatelJSONArrayRequest
import com.seatel.mobilehall.data.network.SeatelJSONObjectRequest
import com.seatel.mobilehall.ui.yes_member.interactor.MainTopPartnerInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.TopPartnerModelItem
import com.seatel.mobilehall.ui.yes_member.model.YesMemberMainModel
import org.json.JSONArray
import org.json.JSONObject
class MainTopPartnerPresenter(
private var mContext: Context, private var topPartnerInteractor: MainTopPartnerInteractor.View
) : MainTopPartnerInteractor.Presenter {
override fun onTopPartnerData() {
topPartnerRequest().setOnErrorListener { error ->
topPartnerInteractor.responseTopPartnerFail(error)
}.setOnResponseListener { response ->
topPartnerInteractor.responseTopPartnerSucceed(getTopPartnerList(response as JSONArray))
}.execute()
}
override fun onPartnerCategory() {
partnerCategory().setOnErrorListener { error ->
topPartnerInteractor.responsePartnerCategoryFail(error)
}.setOnResponseListener { response ->
topPartnerInteractor.responsePartnerCategorySucceed(getPartnerCategory(response as JSONArray))
}.execute()
}
override fun getYesMemberMain(phoneNumber: String) {
requestYesMemberMain(phoneNumber).setOnErrorListener { error ->
topPartnerInteractor.responseYesMemberMainFail(error)
}.setOnResponseListener { response ->
topPartnerInteractor.responseYesMemberMainSucceed(getYesMemberMain(response as JSONObject))
}.execute()
}
private fun getYesMemberMain(response: JSONObject): YesMemberMainModel {
return Gson().fromJson(response.toString(), YesMemberMainModel::class.java)
}
private fun getTopPartnerList(response: JSONArray): ArrayList<TopPartnerModelItem> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<TopPartnerModelItem>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun topPartnerRequest(): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/top-partner"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
private fun getPartnerCategory(response: JSONArray): ArrayList<PartnerCategoryModelItem> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<PartnerCategoryModelItem>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun partnerCategory(): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/partner-category"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
private fun requestYesMemberMain(phoneNumber: String): SeatelJSONObjectRequest {
return object : SeatelJSONObjectRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/main?phoneNumber=$phoneNumber"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.seatel.mobilehall.data.network.SeatelJSONArrayRequest
import com.seatel.mobilehall.ui.yes_member.interactor.PartnerCategoryByNameInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerByNameModel
import org.json.JSONArray
class PartnerCategoryByNamePresenter(
private var mContext: Context,
private var topPartnerInteractor: PartnerCategoryByNameInteractor.View
) : PartnerCategoryByNameInteractor.Presenter {
override fun onPartnerCategoryByName(name: String) {
partnerCategroyRequest(name).setOnErrorListener { error ->
topPartnerInteractor.responsePartnerCategoryByNameFail(error)
}.setOnResponseListener { response ->
topPartnerInteractor.responsePartnerCategoryByNameSucceed(
getPartnerCategoryByNameList(
response as JSONArray
)
)
}.execute()
}
private fun getPartnerCategoryByNameList(response: JSONArray): ArrayList<PartnerByNameModel> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<PartnerByNameModel>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun partnerCategroyRequest(name: String): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/partner?name=$name"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.seatel.mobilehall.data.network.SeatelJSONArrayRequest
import com.seatel.mobilehall.ui.yes_member.interactor.PartnerCategoryInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
import com.seatel.mobilehall.ui.yes_member.model.PartnerSearchCategoryModel
import org.json.JSONArray
class PartnerCategoryPresenter(
private var mContext: Context, private var topPartnerInteractor: PartnerCategoryInteractor.View
) : PartnerCategoryInteractor.Presenter {
override fun onPartnerCategory(category: String) {
partnerCategroyRequest(category).setOnErrorListener { error ->
topPartnerInteractor.responsePartnerCategoryFail(error)
}.setOnResponseListener { response ->
topPartnerInteractor.responsePartnerCategorySucceed(getPartnerCategoryList(response as JSONArray))
}.execute()
}
private fun getPartnerCategoryList(response: JSONArray): ArrayList<PartnerSearchCategoryModel> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<PartnerSearchCategoryModel>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun partnerCategroyRequest(category: String): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/partner?category=$category"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.seatel.mobilehall.data.network.SeatelJSONArrayRequest
import com.seatel.mobilehall.ui.yes_member.interactor.PartnerSearchInteractor
import com.seatel.mobilehall.ui.yes_member.model.PartnerCategoryModelItem
import com.seatel.mobilehall.ui.yes_member.model.PartnerModelItem
import org.json.JSONArray
class PartnerSearchPresenter(
private var mContext: Context,
private var partnerSearchInteractor: PartnerSearchInteractor.View
) : PartnerSearchInteractor.Presenter {
override fun onTopPartner() {
getTopPartnerRequest().setOnErrorListener { error ->
partnerSearchInteractor.onTopPartnerFail(error)
}.setOnResponseListener { response ->
partnerSearchInteractor.onTopPartnerSucceed(getTopPartnerList(response as JSONArray))
}.execute()
}
private fun getTopPartnerList(response: JSONArray): ArrayList<PartnerModelItem> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<PartnerModelItem>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun getTopPartnerRequest(): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/top-partner"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
override fun onPartnerCategory() {
partnerCategory().setOnErrorListener { error ->
partnerSearchInteractor.responsePartnerCategoryFail(error)
}.setOnResponseListener { response ->
partnerSearchInteractor.responsePartnerCategorySucceed(getPartnerCategory(response as JSONArray))
}.execute()
}
private fun getPartnerCategory(response: JSONArray): ArrayList<PartnerCategoryModelItem> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<PartnerCategoryModelItem>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun partnerCategory(): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/partner-category"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.seatel.mobilehall.data.network.SeatelJSONObjectRequest
import com.seatel.mobilehall.ui.yes_member.interactor.RedeemCodeInteractor
import org.json.JSONObject
class RedeemCodePresenter(var context: Context, private val view: RedeemCodeInteractor.View) :
RedeemCodeInteractor.Presenter {
override fun onRedeemCode(type: String, data: String, phoneNumber: String) {
requestRedeemCode(type, data, phoneNumber).setOnErrorListener {
view.onRedeemCodeFailure(it)
}.setOnResponseListener {
view.onRedeemCodeSuccess(it as JSONObject)
}.execute()
}
private fun requestRedeemCode(
type: String, data: String, phoneNumber: String
): SeatelJSONObjectRequest {
return object : SeatelJSONObjectRequest(context) {
override fun getFunctionName(): String {
return "yes-member/member/redeem-discount"
}
override fun getMethod(): Int {
return Request.Method.POST
}
override fun onGetBodyRequest(): String {
val jsonObject = JSONObject()
jsonObject.put("type", type)
jsonObject.put("data", data)
jsonObject.put("phoneNumber", phoneNumber)
return jsonObject.toString()
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.seatel.mobilehall.data.network.SeatelJSONObjectRequest
import com.seatel.mobilehall.ui.yes_member.interactor.RedeemRewardInteractor
import org.json.JSONObject
class RedeemRewardPresenter(
private var mContext: Context, private val view: RedeemRewardInteractor.View
) : RedeemRewardInteractor.Presenter {
override fun redeemReward(phoneNumber: String, reward: String, shop: String) {
requestRedeemReward(phoneNumber, reward, shop).setOnErrorListener {
view.responseRedeemRewardFail(it)
}.setOnResponseListener {
view.responseRedeemRewardSucceed(getRedeemReward(it as JSONObject))
}.execute()
}
private fun getRedeemReward(response: JSONObject): JSONObject {
return response
}
private fun requestRedeemReward(
phoneNumber: String, reward: String, shop: String
): SeatelJSONObjectRequest {
return object : SeatelJSONObjectRequest(mContext) {
override fun onGetBodyRequest(): String {
val jsonObject = JSONObject()
jsonObject.put("phoneNumber", phoneNumber)
jsonObject.put("reward", reward)
jsonObject.put("shop", shop)
return jsonObject.toString()
}
override fun getMethod(): Int {
return Request.Method.POST
}
override fun getFunctionName(): String {
return "yes-member/redeem-reward"
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.seatel.mobilehall.data.network.SeatelJSONObjectRequest
import com.seatel.mobilehall.ui.yes_member.interactor.RewardHistoryInteractor
import com.seatel.mobilehall.ui.yes_member.model.RewardHistoryModel
import org.json.JSONObject
class RewardHistoryPresenter(
private var mContext: Context,
private var rewardHistoryInteractor: RewardHistoryInteractor.View
) : RewardHistoryInteractor.Presenter {
override fun getRewardHistory(phoneNumber: String) {
getRewardHistoryRequest(phoneNumber).setOnErrorListener {
rewardHistoryInteractor.responseRewardHistoryFail(it)
}.setOnResponseListener { response ->
rewardHistoryInteractor.responseRewardHistorySucceed(getRewardHistoryList(response as JSONObject)!!)
}.execute()
}
private fun getRewardHistoryList(response: JSONObject): RewardHistoryModel? {
val gson = Gson()
val data = gson.fromJson(response.toString(), RewardHistoryModel::class.java)
return data
}
private fun getRewardHistoryRequest(phoneNumber: String): SeatelJSONObjectRequest {
return object : SeatelJSONObjectRequest(mContext) {
override fun getMethod(): Int {
return Request.Method.GET
}
override fun getFunctionName(): String {
return "yes-member/redeem-reward-history?phoneNumber=$phoneNumber"
}
}
}
}
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.seatel.mobilehall.data.network.SeatelJSONArrayRequest
import com.seatel.mobilehall.ui.yes_member.interactor.RewardInteractor
import com.seatel.mobilehall.ui.yes_member.model.RewardModel
import org.json.JSONArray
class RewardPresenter(
private var mContext: Context,
private var rewardInteractor: RewardInteractor.View
) : RewardInteractor.Presenter {
override fun getReward(phoneNumber: String) {
getRewardRequest(phoneNumber).setOnErrorListener { error ->
rewardInteractor.responseRewardFail(error)
}.setOnResponseListener { response ->
rewardInteractor.responseRewardSucceed(getRewardList(response as JSONArray))
}.execute()
}
private fun getRewardList(response: JSONArray): ArrayList<RewardModel> {
val gson = Gson()
val responseString = response.toString()
val listType = object : TypeToken<ArrayList<RewardModel>>() {}.type
return gson.fromJson(responseString, listType)
}
private fun getRewardRequest(phoneNumber: String): SeatelJSONArrayRequest {
return object : SeatelJSONArrayRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/reward?phoneNumber=$phoneNumber"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
package com.seatel.mobilehall.ui.yes_member.presenter
import android.content.Context
import com.android.volley.Request
import com.google.gson.Gson
import com.seatel.mobilehall.data.network.SeatelJSONObjectRequest
import com.seatel.mobilehall.ui.yes_member.interactor.SelectShopInteractor
import com.seatel.mobilehall.ui.yes_member.model.SelectShopModel
import org.json.JSONObject
class SelectShopPresenter(
private var mContext: Context, private var rewardsDetailInteractor: SelectShopInteractor.View
) : SelectShopInteractor.Presenter {
override fun getSelectShop(id: String, phoneNumber: String) {
getSelectShopRequest(id, phoneNumber).setOnErrorListener {
rewardsDetailInteractor.responseSelectShopFail(it)
}.setOnResponseListener {
rewardsDetailInteractor.responseSelectShopSucceed(getSelectShopList(it as JSONObject)!!)
}.execute()
}
private fun getSelectShopList(response: JSONObject): SelectShopModel? {
val data = Gson().fromJson(response.toString(), SelectShopModel::class.java)
return data
}
private fun getSelectShopRequest(id: String, phoneNumber: String): SeatelJSONObjectRequest {
return object : SeatelJSONObjectRequest(mContext) {
override fun getFunctionName(): String {
return "yes-member/reward/$id?phoneNumber=$phoneNumber"
}
override fun getMethod(): Int {
return Request.Method.GET
}
}
}
}
\ No newline at end of file
......@@ -17,6 +17,7 @@ import android.util.Log
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import com.seatel.mobilehall.BuildConfig
import com.seatel.mobilehall.R
......@@ -31,6 +32,8 @@ import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.text.*
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.*
import java.util.regex.Pattern
import javax.crypto.Mac
......@@ -681,5 +684,17 @@ class SeatelUtils {
value
}
}
@RequiresApi(Build.VERSION_CODES.O)
fun formatDateCoin(input: String): String {
return try {
val inputFormatter = DateTimeFormatter.ISO_DATE_TIME
val outputFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH)
val dateTime = ZonedDateTime.parse(input, inputFormatter).toLocalDate()
dateTime.format(outputFormatter)
} catch (e: Exception) {
input // Return original input if parsing fails
}
}
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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