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
Show 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 {
// implementation 'com.dinuscxj:circleprogressbar:1.3.6'
// 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'
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
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.ImageView
import
androidx.recyclerview.widget.RecyclerView
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.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
)
{
val
imageView
:
ImageView
=
itemView
.
findViewById
(
R
.
id
.
imageView
)
}
private
val
newList
:
List
<
BannersModel
>
=
listOf
(
banners
.
last
())
+
banners
+
listOf
(
banners
.
first
())
class
SliderVH
(
val
binding
:
ItemHomeBannerBinding
)
:
RecyclerView
.
ViewHolder
(
binding
.
root
)
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
ViewHolder
{
val
view
=
LayoutInflater
.
from
(
parent
.
context
).
inflate
(
R
.
layout
.
item_image_slider
,
parent
,
false
)
return
ViewHolder
(
view
)
lateinit
var
binding
:
ItemHomeBannerBinding
override
fun
onCreateViewHolder
(
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
)
{
val
banner
=
banners
[
position
]
Glide
.
with
(
holder
.
imageView
.
context
)
.
load
(
banner
.
imageUrl
)
// Use banner.url here
.
into
(
holder
.
imageView
)
override
fun
onBindViewHolder
(
holder
:
ImageSliderAdapter
.
SliderVH
,
position
:
Int
)
{
val
banner
=
newList
[
position
]
Glide
.
with
(
holder
.
itemView
.
context
).
load
(
banner
.
imageUrl
).
into
(
holder
.
binding
.
imageView
)
holder
.
itemView
.
setOnClickListener
(
View
.
OnClickListener
{
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
{
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
import
android.content.Intent
import
android.net.Uri
import
android.os.Bundle
import
android.os.Handler
import
android.os.Looper
import
android.text.TextUtils
import
android.util.Log
import
android.view.LayoutInflater
...
...
@@ -12,6 +14,7 @@ import android.view.ViewGroup
import
android.widget.RelativeLayout
import
android.widget.Toast
import
androidx.recyclerview.widget.LinearLayoutManager
import
androidx.viewpager2.widget.ViewPager2
import
coil.load
import
coil.transform.CircleCropTransformation
import
com.android.volley.Request
...
...
@@ -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.TopUpActivity
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.BannersInteractor
import
com.seatel.mobilehall.ui.home.interactor.CategoryInteractor
...
...
@@ -98,8 +102,11 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
//private lateinit var homeImageSliderAdapter: HomeImageSliderAdapter
private
lateinit
var
imageSliderAdapter
:
ImageSliderAdapter
private
var
handler
=
Handler
(
Looper
.
getMainLooper
())
private
lateinit
var
categoryAdapter
:
CategoryAdapter
private
var
autoScrollRunnable
:
Runnable
?
=
null
private
val
autoScrollDelay
=
3000L
override
fun
onAttach
(
context
:
Context
)
{
super
.
onAttach
(
context
)
...
...
@@ -122,8 +129,8 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
binding
.
mSwipeRefreshLayout
.
isRefreshing
=
false
// initEvent()
// checkLogin()
stopAutoScroll
()
}
return
binding
.
root
}
...
...
@@ -247,6 +254,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
override
fun
onStop
()
{
super
.
onStop
()
if
(
player
!=
null
)
player
!!
.
stop
()
stopAutoScroll
()
}
private
fun
checkLogin
()
{
...
...
@@ -287,6 +295,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
btnBalance
.
setOnClickListener
(
this
@HomeFragment
)
btnTopUp
.
setOnClickListener
(
this
@HomeFragment
)
btnNumber
.
setOnClickListener
(
this
@HomeFragment
)
viewpager2
.
setOnClickListener
(
this
@HomeFragment
)
}
}
...
...
@@ -295,6 +304,7 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
super
.
onResume
()
getDataMainScreen
(
token
)
checkLogin
()
stopAutoScroll
()
}
private
fun
getDataMainScreen
(
token
:
String
)
{
...
...
@@ -377,8 +387,6 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
txtExpiresVal
.
visibility
=
View
.
VISIBLE
txtExpires
.
visibility
=
View
.
VISIBLE
}
}
dataMainScreen
.
getContactService
().
forEach
{
...
...
@@ -466,24 +474,64 @@ class HomeFragment : BaseFragment(), View.OnClickListener, BannersInteractor.Vie
}
override
fun
onGetBannersSucceed
(
bannersList
:
ArrayList
<
BannersModel
>)
{
// binding.run {
// bannersList.let {
// it.run {
//// homeImageSliderAdapter = HomeImageSliderAdapter(requireContext()) {
//// gotoPlayStore(packageName = "com.nacd.stopdrug")
//// }
//// homeImageSliderAdapter.addItem(it)
//// homeImageSlider.setSliderAdapter(homeImageSliderAdapter)
//// homeImageSlider.setIndicatorAnimation(IndicatorAnimationType.WORM)
//// homeImageSlider.autoCycleDirection = SliderView.LAYOUT_DIRECTION_INHERIT
//// homeImageSlider.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION)
//// homeImageSlider.scrollTimeInSec = 3
//// homeImageSlider.startAutoCycle()
// }
// }
// }
if
(
bannersList
.
isEmpty
())
{
println
(
"bannersList is empty"
)
}
else
{
binding
.
run
{
imageSliderAdapter
=
ImageSliderAdapter
(
bannersList
,
onActionLink
=
{
Toast
.
makeText
(
context
,
"Banner clicked at position: $it"
,
Toast
.
LENGTH_SHORT
).
show
()
gotoPlayStore
(
packageName
=
"com.nacd.stopdrug"
)
}
)
if
(
bannersList
.
isNotEmpty
()){
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
}
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