Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
android-yes
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kheang Chenda
android-yes
Commits
c0fa8c41
Commit
c0fa8c41
authored
Jul 10, 2025
by
Seatel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
enhance home fragment.
parent
525d55fd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
142 additions
and
38 deletions
+142
-38
build.gradle
app/build.gradle
+1
-1
ImageSliderAdapter.kt
...m/seatel/mobilehall/ui/home/adapter/ImageSliderAdapter.kt
+37
-15
HomeFragment.kt
...va/com/seatel/mobilehall/ui/home/fragment/HomeFragment.kt
+91
-22
item_home_banner.xml
app/src/main/res/layout/item_home_banner.xml
+13
-0
No files found.
app/build.gradle
View file @
c0fa8c41
...
@@ -193,7 +193,7 @@ dependencies {
...
@@ -193,7 +193,7 @@ dependencies {
// implementation 'com.dinuscxj:circleprogressbar:1.3.6'
// implementation 'com.dinuscxj:circleprogressbar:1.3.6'
// implementation(name: 'circleprogressbar-debug', ext: 'aar')
// implementation(name: 'circleprogressbar-debug', ext: 'aar')
implementation
'com.github.smarteist:autoimageslider:1.4.0'
//
implementation 'com.github.smarteist:autoimageslider:1.4.0'
//api 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
//api 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
implementation
(
"com.vanniktech:android-image-cropper:4.6.0"
)
implementation
(
"com.vanniktech:android-image-cropper:4.6.0"
)
...
...
app/src/main/java/com/seatel/mobilehall/ui/home/adapter/ImageSliderAdapter.kt
View file @
c0fa8c41
...
@@ -3,31 +3,53 @@ package com.seatel.mobilehall.ui.home.adapter
...
@@ -3,31 +3,53 @@ package com.seatel.mobilehall.ui.home.adapter
import
android.view.LayoutInflater
import
android.view.LayoutInflater
import
android.view.View
import
android.view.View
import
android.view.ViewGroup
import
android.view.ViewGroup
import
android.widget.ImageView
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView
import
com.bumptech.glide.Glide
import
com.bumptech.glide.Glide
import
com.seatel.mobilehall.
R
import
com.seatel.mobilehall.
databinding.ItemHomeBannerBinding
import
com.seatel.mobilehall.ui.home.model.BannersModel
import
com.seatel.mobilehall.ui.home.model.BannersModel
import
com.seatel.mobilehall.ui.login.activity.TermsAndConditionsActivity
class
ImageSliderAdapter
(
private
val
banners
:
List
<
BannersModel
>)
:
RecyclerView
.
Adapter
<
ImageSliderAdapter
.
ViewHolder
>()
{
class
ImageSliderAdapter
(
private
val
banners
:
List
<
BannersModel
>,
private
var
onActionLink
:
(
String
)
->
Unit
,
)
:
RecyclerView
.
Adapter
<
ImageSliderAdapter
.
SliderVH
>()
{
class
ViewHolder
(
itemView
:
View
)
:
RecyclerView
.
ViewHolder
(
itemView
)
{
private
val
newList
:
List
<
BannersModel
>
=
val
imageView
:
ImageView
=
itemView
.
findViewById
(
R
.
id
.
imageView
)
listOf
(
banners
.
last
())
+
banners
+
listOf
(
banners
.
first
())
}
class
SliderVH
(
val
binding
:
ItemHomeBannerBinding
)
:
RecyclerView
.
ViewHolder
(
binding
.
root
)
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
ViewHolder
{
lateinit
var
binding
:
ItemHomeBannerBinding
val
view
=
LayoutInflater
.
from
(
parent
.
context
).
inflate
(
R
.
layout
.
item_image_slider
,
parent
,
false
)
override
fun
onCreateViewHolder
(
return
ViewHolder
(
view
)
parent
:
ViewGroup
,
viewType
:
Int
):
ImageSliderAdapter
.
SliderVH
{
val
binding
=
ItemHomeBannerBinding
.
inflate
(
LayoutInflater
.
from
(
parent
.
context
),
parent
,
false
)
return
SliderVH
(
binding
)
}
}
override
fun
onBindViewHolder
(
holder
:
ViewHolder
,
position
:
Int
)
{
override
fun
onBindViewHolder
(
holder
:
ImageSliderAdapter
.
SliderVH
,
position
:
Int
)
{
val
banner
=
banners
[
position
]
val
banner
=
newList
[
position
]
Glide
.
with
(
holder
.
imageView
.
context
)
Glide
.
with
(
holder
.
itemView
.
context
).
load
(
banner
.
imageUrl
).
into
(
holder
.
binding
.
imageView
)
.
load
(
banner
.
imageUrl
)
// Use banner.url here
holder
.
itemView
.
setOnClickListener
(
View
.
OnClickListener
{
.
into
(
holder
.
imageView
)
println
(
"action action banner"
)
when
(
banner
.
actionType
)
{
"in-app"
->
{
TermsAndConditionsActivity
.
launch
(
holder
.
itemView
.
context
,
banner
.
imageUrl
!!
)
}
"out-app"
->
{
banner
.
url
?.
let
{
url
->
onActionLink
.
invoke
(
url
)
}
}
}
})
}
}
override
fun
getItemCount
():
Int
{
override
fun
getItemCount
():
Int
{
return
banners
.
size
return
newList
.
size
}
}
}
}
\ No newline at end of file
app/src/main/java/com/seatel/mobilehall/ui/home/fragment/HomeFragment.kt
View file @
c0fa8c41
...
@@ -4,6 +4,8 @@ import android.content.Context
...
@@ -4,6 +4,8 @@ import android.content.Context
import
android.content.Intent
import
android.content.Intent
import
android.net.Uri
import
android.net.Uri
import
android.os.Bundle
import
android.os.Bundle
import
android.os.Handler
import
android.os.Looper
import
android.text.TextUtils
import
android.text.TextUtils
import
android.util.Log
import
android.util.Log
import
android.view.LayoutInflater
import
android.view.LayoutInflater
...
@@ -12,6 +14,7 @@ import android.view.ViewGroup
...
@@ -12,6 +14,7 @@ import android.view.ViewGroup
import
android.widget.RelativeLayout
import
android.widget.RelativeLayout
import
android.widget.Toast
import
android.widget.Toast
import
androidx.recyclerview.widget.LinearLayoutManager
import
androidx.recyclerview.widget.LinearLayoutManager
import
androidx.viewpager2.widget.ViewPager2
import
coil.load
import
coil.load
import
coil.transform.CircleCropTransformation
import
coil.transform.CircleCropTransformation
import
com.android.volley.Request
import
com.android.volley.Request
...
@@ -45,6 +48,7 @@ import com.seatel.mobilehall.ui.home.activity.PromotionActivity
...
@@ -45,6 +48,7 @@ import com.seatel.mobilehall.ui.home.activity.PromotionActivity
import
com.seatel.mobilehall.ui.home.activity.SupportActivity
import
com.seatel.mobilehall.ui.home.activity.SupportActivity
import
com.seatel.mobilehall.ui.home.activity.TopUpActivity
import
com.seatel.mobilehall.ui.home.activity.TopUpActivity
import
com.seatel.mobilehall.ui.home.adapter.CategoryAdapter
import
com.seatel.mobilehall.ui.home.adapter.CategoryAdapter
import
com.seatel.mobilehall.ui.home.adapter.ImageSliderAdapter
import
com.seatel.mobilehall.ui.home.interactor.BadgesCountInteractor
import
com.seatel.mobilehall.ui.home.interactor.BadgesCountInteractor
import
com.seatel.mobilehall.ui.home.interactor.BannersInteractor
import
com.seatel.mobilehall.ui.home.interactor.BannersInteractor
import
com.seatel.mobilehall.ui.home.interactor.CategoryInteractor
import
com.seatel.mobilehall.ui.home.interactor.CategoryInteractor
...
@@ -98,8 +102,11 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -98,8 +102,11 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
//private lateinit var homeImageSliderAdapter: HomeImageSliderAdapter
//private lateinit var homeImageSliderAdapter: HomeImageSliderAdapter
private
lateinit
var
imageSliderAdapter
:
ImageSliderAdapter
private
var
handler
=
Handler
(
Looper
.
getMainLooper
())
private
lateinit
var
categoryAdapter
:
CategoryAdapter
private
lateinit
var
categoryAdapter
:
CategoryAdapter
private
var
autoScrollRunnable
:
Runnable
?
=
null
private
val
autoScrollDelay
=
3000L
override
fun
onAttach
(
context
:
Context
)
{
override
fun
onAttach
(
context
:
Context
)
{
super
.
onAttach
(
context
)
super
.
onAttach
(
context
)
...
@@ -122,8 +129,8 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -122,8 +129,8 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
binding
.
mSwipeRefreshLayout
.
isRefreshing
=
false
binding
.
mSwipeRefreshLayout
.
isRefreshing
=
false
// initEvent()
// initEvent()
// checkLogin()
// checkLogin()
stopAutoScroll
()
}
}
return
binding
.
root
return
binding
.
root
}
}
...
@@ -247,6 +254,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -247,6 +254,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
override
fun
onStop
()
{
override
fun
onStop
()
{
super
.
onStop
()
super
.
onStop
()
if
(
player
!=
null
)
player
!!
.
stop
()
if
(
player
!=
null
)
player
!!
.
stop
()
stopAutoScroll
()
}
}
private
fun
checkLogin
()
{
private
fun
checkLogin
()
{
...
@@ -287,6 +295,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -287,6 +295,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
btnBalance
.
setOnClickListener
(
this
@HomeFragment
)
btnBalance
.
setOnClickListener
(
this
@HomeFragment
)
btnTopUp
.
setOnClickListener
(
this
@HomeFragment
)
btnTopUp
.
setOnClickListener
(
this
@HomeFragment
)
btnNumber
.
setOnClickListener
(
this
@HomeFragment
)
btnNumber
.
setOnClickListener
(
this
@HomeFragment
)
viewpager2
.
setOnClickListener
(
this
@HomeFragment
)
}
}
}
}
...
@@ -295,6 +304,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -295,6 +304,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
super
.
onResume
()
super
.
onResume
()
getDataMainScreen
(
token
)
getDataMainScreen
(
token
)
checkLogin
()
checkLogin
()
stopAutoScroll
()
}
}
private
fun
getDataMainScreen
(
token
:
String
)
{
private
fun
getDataMainScreen
(
token
:
String
)
{
...
@@ -377,8 +387,6 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -377,8 +387,6 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
txtExpiresVal
.
visibility
=
View
.
VISIBLE
txtExpiresVal
.
visibility
=
View
.
VISIBLE
txtExpires
.
visibility
=
View
.
VISIBLE
txtExpires
.
visibility
=
View
.
VISIBLE
}
}
}
}
dataMainScreen
.
getContactService
().
forEach
{
dataMainScreen
.
getContactService
().
forEach
{
...
@@ -466,24 +474,64 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -466,24 +474,64 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
}
}
override
fun
onGetBannersSucceed
(
bannersList
:
ArrayList
<
BannersModel
>)
{
override
fun
onGetBannersSucceed
(
bannersList
:
ArrayList
<
BannersModel
>)
{
// binding.run {
if
(
bannersList
.
isEmpty
())
{
// bannersList.let {
println
(
"bannersList is empty"
)
// it.run {
}
else
{
//// homeImageSliderAdapter = HomeImageSliderAdapter(requireContext()) {
binding
.
run
{
//// gotoPlayStore(packageName = "com.nacd.stopdrug")
imageSliderAdapter
=
ImageSliderAdapter
(
//// }
bannersList
,
//// homeImageSliderAdapter.addItem(it)
onActionLink
=
{
//// homeImageSlider.setSliderAdapter(homeImageSliderAdapter)
Toast
.
makeText
(
context
,
"Banner clicked at position: $it"
,
Toast
.
LENGTH_SHORT
).
show
()
//// homeImageSlider.setIndicatorAnimation(IndicatorAnimationType.WORM)
gotoPlayStore
(
packageName
=
"com.nacd.stopdrug"
)
//// homeImageSlider.autoCycleDirection = SliderView.LAYOUT_DIRECTION_INHERIT
}
//// homeImageSlider.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION)
)
//// homeImageSlider.scrollTimeInSec = 3
if
(
bannersList
.
isNotEmpty
()){
//// homeImageSlider.startAutoCycle()
viewpager2
.
adapter
=
imageSliderAdapter
// }
viewpager2
.
currentItem
=
1
// }
setupAutoScroll
(
bannersList
.
size
+
2
)
// }
startAutoScroll
()
}
binding
.
viewpager2
.
setMarginsInDp
(
top
=
6
)
}
}
}
private
fun
setupAutoScroll
(
bannerList
:
Int
){
binding
.
viewpager2
.
registerOnPageChangeCallback
(
object
:
ViewPager2
.
OnPageChangeCallback
(){
override
fun
onPageScrollStateChanged
(
state
:
Int
)
{
super
.
onPageScrollStateChanged
(
state
)
if
(
state
==
ViewPager2
.
SCROLL_STATE_IDLE
){
when
(
binding
.
viewpager2
.
currentItem
){
bannerList
-
1
->
binding
.
viewpager2
.
setCurrentItem
(
1
,
false
)
0
->
binding
.
viewpager2
.
setCurrentItem
(
bannerList
-
2
,
false
)
}
}
}
override
fun
onPageSelected
(
position
:
Int
)
{
super
.
onPageSelected
(
position
)
if
(
position
!=
0
&&
position
!=
bannerList
-
1
)
{
//pageIndicatorView.setSelected(position-1)
}
}
})
}
private
fun
stopAutoScroll
()
{
autoScrollRunnable
?.
let
{
handler
.
removeCallbacks
(
it
)
}
}
private
fun
startAutoScroll
()
{
autoScrollRunnable
=
object
:
Runnable
{
override
fun
run
()
{
val
current
=
binding
.
viewpager2
.
currentItem
val
next
=
current
+
1
binding
.
viewpager2
.
setCurrentItem
(
next
,
true
)
handler
.
postDelayed
(
this
,
autoScrollDelay
)
}
}
handler
.
postDelayed
(
autoScrollRunnable
!!
,
autoScrollDelay
)
}
}
...
@@ -670,4 +718,25 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
...
@@ -670,4 +718,25 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
}
}
}
private
fun
View
.
setMarginsInDp
(
left
:
Int
=
0
,
top
:
Int
=
0
,
right
:
Int
=
0
,
bottom
:
Int
=
0
)
{
val
scale
=
context
.
resources
.
displayMetrics
.
density
val
params
=
layoutParams
as
?
ViewGroup
.
MarginLayoutParams
?:
ViewGroup
.
MarginLayoutParams
(
layoutParams
)
params
.
setMargins
(
(
left
*
scale
+
0.5f
).
toInt
(),
(
top
*
scale
+
0.5f
).
toInt
(),
(
right
*
scale
+
0.5f
).
toInt
(),
(
bottom
*
scale
+
0.5f
).
toInt
()
)
layoutParams
=
params
}
}
\ No newline at end of file
app/src/main/res/layout/item_home_banner.xml
0 → 100644
View file @
c0fa8c41
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<androidx.appcompat.widget.AppCompatImageView
android:id=
"@+id/imageView"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:adjustViewBounds=
"true"
android:scaleType=
"fitXY"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment