两个activity hilt 以及 route 配置

This commit is contained in:
renhaoting 2025-11-21 14:00:09 +08:00
parent ad1735ad4e
commit 13410ad822
10 changed files with 337 additions and 86 deletions

View File

@ -0,0 +1,29 @@
package com.gamedog.vididin.di
import com.gamedog.vididin.features.benefit.BenefitRouter
import com.gamedog.vididin.features.benefit.DefaultBenefitRouter
import com.gamedog.vididin.features.zero.DefaultZeroBuyRouter
import com.gamedog.vididin.features.zero.ZeroBuyRouter
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object BenefitModule {
@Provides
@Singleton
fun provideRouter(): BenefitRouter = DefaultBenefitRouter()
}
@Module
@InstallIn(SingletonComponent::class)
object ZeroBuyModule {
@Provides
@Singleton
fun provideRouter(): ZeroBuyRouter = DefaultZeroBuyRouter()
}

View File

@ -4,6 +4,8 @@ import com.gamedog.vididin.core.router.interfaces.HomeRouter
import com.gamedog.vididin.core.router.interfaces.LoginRouter import com.gamedog.vididin.core.router.interfaces.LoginRouter
import com.gamedog.vididin.core.router.interfaces.MineRouter import com.gamedog.vididin.core.router.interfaces.MineRouter
import com.gamedog.vididin.core.router.interfaces.TaskRouter import com.gamedog.vididin.core.router.interfaces.TaskRouter
import com.gamedog.vididin.features.benefit.BenefitRouter
import com.gamedog.vididin.features.zero.ZeroBuyRouter
import dagger.hilt.EntryPoint import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
@ -16,5 +18,10 @@ interface RouterEntryPoint {
fun taskRouter(): TaskRouter fun taskRouter(): TaskRouter
fun mineRouter(): MineRouter fun mineRouter(): MineRouter
fun loginRouter(): LoginRouter fun loginRouter(): LoginRouter
fun benefitRouter(): BenefitRouter
fun zeroBuyRouter(): ZeroBuyRouter
} }

View File

@ -0,0 +1,7 @@
package com.gamedog.vididin.features.benefit
import android.app.Activity
interface BenefitRouter {
fun startActivity(activity: Activity)
}

View File

@ -0,0 +1,9 @@
package com.gamedog.vididin.features.benefit
import android.app.Activity
class DefaultBenefitRouter: BenefitRouter {
override fun startActivity(activity: Activity) {
BenefitActivity.startActivity(activity)
}
}

View File

@ -0,0 +1,9 @@
package com.gamedog.vididin.features.zero
import android.app.Activity
class DefaultZeroBuyRouter: ZeroBuyRouter {
override fun startActivity(activity: Activity) {
ZeroBuyActivity.Companion.startActivity(activity)
}
}

View File

@ -0,0 +1,7 @@
package com.gamedog.vididin.features.zero
import android.app.Activity
interface ZeroBuyRouter {
fun startActivity(activity: Activity)
}

View File

@ -15,6 +15,7 @@ import com.ama.core.architecture.appBase.AppViewsEmptyViewModelFragment
import com.ama.core.common.widget.PopMenuIconView import com.ama.core.common.widget.PopMenuIconView
import com.gamedog.vididin.R import com.gamedog.vididin.R
import com.gamedog.vididin.beans.YoutubeVideo import com.gamedog.vididin.beans.YoutubeVideo
import com.gamedog.vididin.router.Router
import com.gamedog.vididin.widget.MyPlayerControlView import com.gamedog.vididin.widget.MyPlayerControlView
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
@ -55,7 +56,7 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
popMenu.setMenuList( popMenu.setMenuList(
mutableListOf( mutableListOf(
PopMenuIconView.MenuItem(R.mipmap.home_menu_1) { PopMenuIconView.MenuItem(R.mipmap.home_menu_1) {
Router.Benefit.startActivity(requireActivity())
}, },
PopMenuIconView.MenuItem(R.mipmap.home_menu_2) { PopMenuIconView.MenuItem(R.mipmap.home_menu_2) {
@ -64,95 +65,11 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
}, },
PopMenuIconView.MenuItem(R.mipmap.home_menu_4) { PopMenuIconView.MenuItem(R.mipmap.home_menu_4) {
Router.Benefit.startActivity(requireActivity())
} }
)) ))
} }
fun initAndStartPlay() {
/*
val youtubePlayerView: YouTubePlayerView = binding?.youtubePlayerView!!
val iFramePlayerOptions = IFramePlayerOptions.Builder(requireContext())
.rel(1)
.ccLoadPolicy(1)
.controls(0)
.listType("playlist")
.list(PLAYLIST_ID)
.fullscreen(0)
.build()
youtubePlayerView.initialize(object : YouTubePlayerListener {
override fun onReady(youTubePlayer: YouTubePlayer) {
}
override fun onStateChange(
youTubePlayer: YouTubePlayer,
state: PlayerConstants.PlayerState
) {
}
override fun onPlaybackQualityChange(
youTubePlayer: YouTubePlayer,
playbackQuality: PlayerConstants.PlaybackQuality
) {
}
override fun onPlaybackRateChange(
youTubePlayer: YouTubePlayer,
playbackRate: PlayerConstants.PlaybackRate
) {
}
override fun onError(
youTubePlayer: YouTubePlayer,
error: PlayerConstants.PlayerError
) {
}
override fun onCurrentSecond(
youTubePlayer: YouTubePlayer,
second: Float
) {
}
override fun onVideoDuration(
youTubePlayer: YouTubePlayer,
duration: Float
) {
}
override fun onVideoLoadedFraction(
youTubePlayer: YouTubePlayer,
loadedFraction: Float
) {
}
override fun onVideoId(
youTubePlayer: YouTubePlayer,
videoId: String
) {
}
override fun onApiChange(youTubePlayer: YouTubePlayer) {
}
}, iFramePlayerOptions)*/
}
override fun ViewBinding.initListeners() { override fun ViewBinding.initListeners() {
ivStar.setOnClickListener { ivStar.setOnClickListener {

View File

@ -6,6 +6,8 @@ import com.gamedog.vididin.core.router.interfaces.LoginRouter
import com.gamedog.vididin.core.router.interfaces.MineRouter import com.gamedog.vididin.core.router.interfaces.MineRouter
import com.gamedog.vididin.core.router.interfaces.TaskRouter import com.gamedog.vididin.core.router.interfaces.TaskRouter
import com.gamedog.vididin.di.RouterEntryPoint import com.gamedog.vididin.di.RouterEntryPoint
import com.gamedog.vididin.features.benefit.BenefitRouter
import com.gamedog.vididin.features.zero.ZeroBuyRouter
import dagger.hilt.android.EntryPointAccessors import dagger.hilt.android.EntryPointAccessors
import kotlin.getValue import kotlin.getValue
import kotlin.jvm.java import kotlin.jvm.java
@ -23,5 +25,9 @@ object Router : RouterContract {
override val Mine: MineRouter by lazy { routerEntryPoint.mineRouter() } override val Mine: MineRouter by lazy { routerEntryPoint.mineRouter() }
override val Login: LoginRouter by lazy { routerEntryPoint.loginRouter() } override val Login: LoginRouter by lazy { routerEntryPoint.loginRouter() }
override val Benefit: BenefitRouter by lazy { routerEntryPoint.benefitRouter() }
override val ZeroBuy: ZeroBuyRouter by lazy { routerEntryPoint.zeroBuyRouter() }
} }

View File

@ -4,6 +4,8 @@ import com.gamedog.vididin.core.router.interfaces.HomeRouter
import com.gamedog.vididin.core.router.interfaces.LoginRouter import com.gamedog.vididin.core.router.interfaces.LoginRouter
import com.gamedog.vididin.core.router.interfaces.TaskRouter import com.gamedog.vididin.core.router.interfaces.TaskRouter
import com.gamedog.vididin.core.router.interfaces.MineRouter import com.gamedog.vididin.core.router.interfaces.MineRouter
import com.gamedog.vididin.features.benefit.BenefitRouter
import com.gamedog.vididin.features.zero.ZeroBuyRouter
@Suppress("PropertyName") @Suppress("PropertyName")
@ -12,4 +14,7 @@ interface RouterContract {
val Task: TaskRouter val Task: TaskRouter
val Mine: MineRouter val Mine: MineRouter
val Login: LoginRouter val Login: LoginRouter
val Benefit: BenefitRouter
val ZeroBuy: ZeroBuyRouter
} }

View File

@ -0,0 +1,255 @@
package com.ama.core.architecture.widget
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.core.view.setPadding
import com.ama.core.architecture.R
import com.ama.core.common.util.dp
import com.ama.core.common.util.sp
class CustomTitleBar @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
private lateinit var ivLeft: ImageView
private lateinit var tvTitle: TextView
private lateinit var llRight: LinearLayout
// 点击回调
private var onLeftClick: (() -> Unit)? = null
private var onRightButtonClick: ((index: Int) -> Unit)? = null
// 右侧按钮列表
private val rightButtons = mutableListOf<ImageView>()
init {
initView()
initAttributes(attrs, defStyleAttr)
}
private fun initView() {
// 设置水平方向布局
orientation = HORIZONTAL
gravity = Gravity.CENTER_VERTICAL
// 设置默认内边距
setPadding(16.dp)
// 创建左侧ImageView
ivLeft = ImageView(context).apply {
layoutParams = LayoutParams(
24.dp,
24.dp
).apply {
gravity = Gravity.CENTER_VERTICAL
}
scaleType = ImageView.ScaleType.CENTER_INSIDE
setOnClickListener { onLeftClick?.invoke() }
}
// 创建中间标题TextView
tvTitle = TextView(context).apply {
layoutParams = LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
).apply {
weight = 1f // 占据剩余空间
gravity = Gravity.CENTER
}
gravity = Gravity.CENTER
setTextColor(ContextCompat.getColor(context, android.R.color.white))
textSize = 18f
}
// 创建右侧LinearLayout
llRight = LinearLayout(context).apply {
layoutParams = LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
).apply {
gravity = Gravity.CENTER_VERTICAL or Gravity.END
}
orientation = HORIZONTAL
gravity = Gravity.CENTER_VERTICAL
}
// 添加子视图
addView(ivLeft)
addView(tvTitle)
addView(llRight)
}
private fun initAttributes(attrs: AttributeSet?, defStyleAttr: Int) {
val typedArray = context.obtainStyledAttributes(
attrs,
R.styleable.CustomTitleBar,
defStyleAttr,
0
)
try {
// 设置标题文本
tvTitle.text = typedArray.getString(R.styleable.CustomTitleBar_titleText) ?: ""
// 设置标题颜色
val titleColor = typedArray.getColor(
R.styleable.CustomTitleBar_titleTextColor,
ContextCompat.getColor(context, android.R.color.white)
)
tvTitle.setTextColor(titleColor)
// 设置标题大小
val titleSize = typedArray.getDimension(
R.styleable.CustomTitleBar_titleTextSize,
18f.sp.toFloat()
)
tvTitle.textSize = titleSize.sp.toFloat()
// 设置左侧图标
val leftIconRes = typedArray.getResourceId(R.styleable.CustomTitleBar_leftIcon, 0)
if (leftIconRes != 0) {
setLeftIcon(leftIconRes)
}
// 设置左侧图标可见性
val leftIconVisible = typedArray.getBoolean(
R.styleable.CustomTitleBar_leftIconVisible,
true
)
ivLeft.visibility = if (leftIconVisible) VISIBLE else GONE
// 设置背景颜色
val background = typedArray.getColor(
R.styleable.CustomTitleBar_titleBarBackground,
ContextCompat.getColor(context, R.color.title_bar_default_bg)
)
setBackgroundColor(background)
// 设置右侧按钮间距
val buttonSpacing = typedArray.getDimension(
R.styleable.CustomTitleBar_rightButtonSpacing,
8.dp.toFloat()
)
llRight.setPadding(0, 0, 0, 0)
} finally {
typedArray.recycle()
}
}
/**
* 设置左侧图标
*/
fun setLeftIcon(@DrawableRes resId: Int) {
ivLeft.setImageResource(resId)
ivLeft.visibility = VISIBLE
}
/**
* 设置左侧图标可见性
*/
fun setLeftIconVisible(visible: Boolean) {
ivLeft.visibility = if (visible) VISIBLE else GONE
}
/**
* 设置标题文本
*/
fun setTitle(text: String) {
tvTitle.text = text
}
/**
* 设置标题颜色
*/
fun setTitleColor(color: Int) {
tvTitle.setTextColor(color)
}
/**
* 设置标题大小
*/
fun setTitleSize(sp: Float) {
tvTitle.textSize = sp
}
/**
* 添加右侧按钮
*/
fun addRightButton(@DrawableRes resId: Int, spacing: Int = 8.dp): Int {
val imageView = ImageView(context).apply {
layoutParams = LayoutParams(
24.dp,
24.dp
).apply {
if (rightButtons.isNotEmpty()) {
marginStart = spacing
}
}
setImageResource(resId)
scaleType = ImageView.ScaleType.CENTER_INSIDE
setOnClickListener {
onRightButtonClick?.invoke(rightButtons.size - 1)
}
}
rightButtons.add(imageView)
llRight.addView(imageView)
return rightButtons.size - 1
}
/**
* 移除右侧按钮
*/
fun removeRightButton(index: Int) {
if (index in 0 until rightButtons.size) {
llRight.removeView(rightButtons[index])
rightButtons.removeAt(index)
// 更新剩余按钮的点击事件索引
updateRightButtonsClickListeners()
}
}
/**
* 清空右侧按钮
*/
fun clearRightButtons() {
llRight.removeAllViews()
rightButtons.clear()
}
/**
* 设置左侧点击回调
*/
fun setOnLeftClickListener(listener: () -> Unit) {
onLeftClick = listener
}
/**
* 设置右侧按钮点击回调
*/
fun setOnRightButtonClickListener(listener: (index: Int) -> Unit) {
onRightButtonClick = listener
}
/**
* 更新右侧按钮点击监听器
*/
private fun updateRightButtonsClickListeners() {
rightButtons.forEachIndexed { index, imageView ->
imageView.setOnClickListener {
onRightButtonClick?.invoke(index)
}
}
}
}