普通签到逻辑
This commit is contained in:
parent
2ef5e5deab
commit
4843f71574
|
|
@ -10,13 +10,15 @@ import com.gamedog.vididin.widget.DailySignItemView
|
|||
|
||||
class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(context, DialogDailySignBinding::inflate) {
|
||||
private var mCurDayIndex: Int = 0
|
||||
private var mDataList: List<RewardDetail>? = emptyList()
|
||||
private var mSignItemList: MutableList<DailySignItemView> = mutableListOf()
|
||||
private var mSelectedDayIndex: Int = 0
|
||||
private var mRewardDetailList: List<RewardDetail>? = emptyList()
|
||||
private var mSignItemViewList: MutableList<DailySignItemView> = mutableListOf()
|
||||
private var mSignStateList: MutableList<DailySignItemView> = mutableListOf()
|
||||
|
||||
|
||||
init {
|
||||
build()
|
||||
mDataList = TaskManager.instance().getDailyCheckInTask()?.reward_details
|
||||
mRewardDetailList = TaskManager.instance().getDailyCheckInTask()?.reward_details
|
||||
initSignItemViews()
|
||||
initSignState()
|
||||
}
|
||||
|
|
@ -30,13 +32,16 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
|||
|
||||
|
||||
mBinding.run {
|
||||
setOnClickBatch(butLeft, butRight, ivClose) {
|
||||
setOnClickBatch(butSign, butWatchAd, ivClose) {
|
||||
when (this) {
|
||||
butLeft, ivClose -> {
|
||||
ivClose -> {
|
||||
dismiss()
|
||||
}
|
||||
butRight -> {
|
||||
handleRightButClicked()
|
||||
butSign -> {
|
||||
handleNormalSignClicked()
|
||||
}
|
||||
butWatchAd -> {
|
||||
gotoWatchAdPage()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
|
@ -44,22 +49,29 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
|||
}
|
||||
}
|
||||
|
||||
private fun handleNormalSignClicked() {
|
||||
val rewardConfig = mRewardDetailList?.get(mSelectedDayIndex)
|
||||
if (TaskManager.instance().executeDailySign(mSelectedDayIndex, rewardConfig?.value ?: 0)) {
|
||||
DailySignSuccessDialog(context).setRewardNum(mRewardDetailList?.get(mCurDayIndex)?.value).show()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun initSignItemViews() {
|
||||
with(mBinding) {
|
||||
signItem7.setLargeWidthMode()
|
||||
|
||||
mSignItemList.add(signItem1)
|
||||
mSignItemList.add(signItem2)
|
||||
mSignItemList.add(signItem3)
|
||||
mSignItemList.add(signItem4)
|
||||
mSignItemList.add(signItem5)
|
||||
mSignItemList.add(signItem6)
|
||||
mSignItemList.add(signItem7)
|
||||
mSignItemViewList.add(signItem1)
|
||||
mSignItemViewList.add(signItem2)
|
||||
mSignItemViewList.add(signItem3)
|
||||
mSignItemViewList.add(signItem4)
|
||||
mSignItemViewList.add(signItem5)
|
||||
mSignItemViewList.add(signItem6)
|
||||
mSignItemViewList.add(signItem7)
|
||||
|
||||
mDataList?.let {
|
||||
mSignItemList.forEachIndexed { index, itemView->
|
||||
itemView.setData(mDataList!![index], { isSelected ->
|
||||
mRewardDetailList?.let {
|
||||
mSignItemViewList.forEachIndexed { index, itemView->
|
||||
itemView.setData(mRewardDetailList!![index], { isSelected ->
|
||||
handleItemSelectStateChanged(index, isSelected)
|
||||
})
|
||||
}
|
||||
|
|
@ -69,11 +81,13 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
|||
|
||||
private fun initSignState() {
|
||||
mCurDayIndex = TaskManager.instance().getCurDayIndexOfDailyCheckIn()
|
||||
mSignItemList[mCurDayIndex].setSelectState(true)
|
||||
mSelectedDayIndex = mCurDayIndex
|
||||
mSignItemViewList[mCurDayIndex].setSelectState(true)
|
||||
}
|
||||
|
||||
private fun handleItemSelectStateChanged(itemIndex: Int, selected: Boolean) {
|
||||
mSignItemList.forEachIndexed { index, itemView ->
|
||||
mSelectedDayIndex = itemIndex
|
||||
mSignItemViewList.forEachIndexed { index, itemView ->
|
||||
if (itemIndex != index) {
|
||||
itemView.setSelectState(false)
|
||||
}
|
||||
|
|
@ -81,7 +95,7 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
|||
}
|
||||
|
||||
|
||||
private fun handleRightButClicked() {
|
||||
private fun gotoWatchAdPage() {
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
package com.gamedog.vididin.main.fragments.task
|
||||
|
||||
import android.content.Context
|
||||
import com.ama.core.architecture.util.setOnClickBatch
|
||||
import com.ama.core.architecture.widget.BindingDialog
|
||||
import com.gamedog.vididin.databinding.DialogDailySignSuccessBinding as ViewBinding
|
||||
|
||||
|
||||
class DailySignSuccessDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||
|
||||
init {
|
||||
build()
|
||||
}
|
||||
|
||||
private fun build() {
|
||||
with()
|
||||
setCenter()
|
||||
setCanCancel(false)
|
||||
setMaskValue(0.9f)
|
||||
setWidthRatio(0.93)
|
||||
|
||||
|
||||
mBinding.run {
|
||||
setOnClickBatch(flAction, ivClose) {
|
||||
when (this) {
|
||||
ivClose -> {
|
||||
dismiss()
|
||||
}
|
||||
flAction -> {
|
||||
dismiss()
|
||||
gotoWatchAdPage()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun gotoWatchAdPage() {
|
||||
//TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
fun setRewardNum(goldNum: Int?) : DailySignSuccessDialog {
|
||||
mBinding.tvGoldNum.text = "+$goldNum"
|
||||
return this
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -41,12 +41,13 @@ class TaskManager private constructor() {
|
|||
}
|
||||
|
||||
|
||||
private var mCurDayIndexDailySign: Int = 0
|
||||
private val mutex = Mutex()
|
||||
|
||||
@Volatile
|
||||
private var initialized = false
|
||||
private var mTaskConfig: TaskBean? = null
|
||||
private var mTaskBean: TaskStateBean = TaskStateBean(DailySignBean())
|
||||
private var mDailySignData: DailySignBean = DailySignBean()
|
||||
private val mGson = GsonBuilder().create()
|
||||
|
||||
|
||||
|
|
@ -67,7 +68,7 @@ class TaskManager private constructor() {
|
|||
mutex.withLock {
|
||||
if (!initialized) {
|
||||
loadTaskConfigFromAsset()
|
||||
loadTaskStateFromSp()
|
||||
loadTaskStatesFromSp()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -82,13 +83,13 @@ class TaskManager private constructor() {
|
|||
}
|
||||
|
||||
|
||||
private suspend fun loadTaskStateFromSp() {
|
||||
private suspend fun loadTaskStatesFromSp() {
|
||||
return withContext(Dispatchers.IO) {
|
||||
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateBean>(SpUtil.KEY_TASK_BEAN)
|
||||
val taskStateBeanInSp = SpUtil.instance().getObject<DailySignBean>(SpUtil.KEY_TASK_BEAN)
|
||||
if (taskStateBeanInSp == null) {
|
||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
|
||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
||||
} else {
|
||||
mTaskBean = taskStateBeanInSp
|
||||
mDailySignData = taskStateBeanInSp
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -138,22 +139,39 @@ class TaskManager private constructor() {
|
|||
|
||||
|
||||
fun getCurDayIndexOfDailyCheckIn() : Int {
|
||||
val periodStartMs = mTaskBean.dailySignBean.startMs
|
||||
var dayIndexOfPeriod = 0
|
||||
|
||||
val periodStartMs = mDailySignData.startMs
|
||||
if (periodStartMs > 0) {
|
||||
val dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
|
||||
dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
|
||||
if (dayIndexOfPeriod > 6) {
|
||||
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs()
|
||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
|
||||
mDailySignData.startMs = DateUtil.getCurTimeMs()
|
||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
||||
}
|
||||
return dayIndexOfPeriod
|
||||
} else {
|
||||
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs()
|
||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
|
||||
return 0
|
||||
mDailySignData.startMs = DateUtil.getCurTimeMs()
|
||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
||||
}
|
||||
|
||||
mCurDayIndexDailySign = dayIndexOfPeriod
|
||||
return dayIndexOfPeriod
|
||||
}
|
||||
|
||||
fun executeDailySign(dayIndex: Int, rewardNum: Int) : Boolean {
|
||||
val daySignState = mDailySignData.signStateList[dayIndex]
|
||||
if ((dayIndex == mCurDayIndexDailySign && daySignState.signState == DailySignBean.SIGN_STATE_ENABLE)
|
||||
|| (daySignState.isComplementEnable)) {
|
||||
daySignState.signState = DailySignBean.SIGN_STATE_DONE
|
||||
daySignState.rewardNum += rewardNum
|
||||
saveDailySignInfo()
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun saveDailySignInfo() {
|
||||
SpUtil.instance().putObject(SpUtil.KEY_DAILY_SIGN, mDailySignData)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,32 +1,40 @@
|
|||
package com.gamedog.vididin.manager
|
||||
|
||||
import com.ama.core.architecture.util.DateUtil
|
||||
import com.gamedog.vididin.manager.DailySignBean.Companion.SIGN_STATE_DISABLE
|
||||
import java.io.Serializable
|
||||
|
||||
|
||||
data class TaskStateBean(
|
||||
val dailySignBean: DailySignBean
|
||||
): Serializable
|
||||
|
||||
|
||||
data class DailySignBean(
|
||||
var startMs: Long = 0,
|
||||
val signStateList: MutableList<Int> = mutableListOf()
|
||||
val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf()
|
||||
|
||||
): Serializable {
|
||||
companion object{
|
||||
const val SIGN_STATE_ENABLE = 1
|
||||
const val SIGN_STATE_WAIT = 2
|
||||
const val SIGN_STATE_FORGOT = 3
|
||||
const val SIGN_STATE_DISABLE = 2
|
||||
const val SIGN_STATE_DONE = 3
|
||||
const val SIGN_STATE_FORGOT = 4
|
||||
}
|
||||
|
||||
init {
|
||||
signStateList.add(SIGN_STATE_ENABLE)
|
||||
signStateList.add(SIGN_STATE_WAIT)
|
||||
signStateList.add(SIGN_STATE_WAIT)
|
||||
signStateList.add(SIGN_STATE_WAIT)
|
||||
signStateList.add(SIGN_STATE_WAIT)
|
||||
signStateList.add(SIGN_STATE_WAIT)
|
||||
signStateList.add(SIGN_STATE_WAIT)
|
||||
signStateList.add(DailySignDayInfoBean(signState = SIGN_STATE_ENABLE))
|
||||
signStateList.add(DailySignDayInfoBean())
|
||||
signStateList.add(DailySignDayInfoBean())
|
||||
signStateList.add(DailySignDayInfoBean())
|
||||
signStateList.add(DailySignDayInfoBean())
|
||||
signStateList.add(DailySignDayInfoBean())
|
||||
signStateList.add(DailySignDayInfoBean())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
data class DailySignDayInfoBean(
|
||||
var signState: Int = SIGN_STATE_DISABLE,
|
||||
var rewardNum: Int = 0,
|
||||
var finishExtraAd: Boolean = false,
|
||||
var isComplementEnable: Boolean = false, // 补签
|
||||
): Serializable
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ class DailySignItemView @JvmOverloads constructor(
|
|||
init {
|
||||
mBinding = DailySignItemBinding.inflate(LayoutInflater.from(context), this, true)
|
||||
mBinding.run {
|
||||
setOnClickBatch(contentRoot) {
|
||||
setOnClickBatch(contentRoot, ) {
|
||||
when(this) {
|
||||
contentRoot -> {
|
||||
if (!mIsSelected) {
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@
|
|||
android:orientation="horizontal">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/but_left"
|
||||
android:id="@+id/but_sign"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="42dp"
|
||||
android:layout_weight="1"
|
||||
|
|
@ -164,7 +164,7 @@
|
|||
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/but_right"
|
||||
android:id="@+id/but_watch_ad"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="10dp"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,101 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:src="@mipmap/temp"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/tv_desc"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:textSize="16sp"
|
||||
android:textColor="@color/white"
|
||||
android:text="@string/sign_success_desc"
|
||||
/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="24dp">
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/watch_video_gold_effect"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/tv_gold_num"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="20dp"
|
||||
android:textSize="40sp"
|
||||
android:textColor="@color/yellow_00"
|
||||
android:text="+100"
|
||||
/>
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/fl_action"
|
||||
android:layout_width="300dp"
|
||||
android:layout_height="54dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@mipmap/icon_action_but_bg">
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center_vertical">
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textSize="18sp"
|
||||
android:textColor="@color/white"
|
||||
android:text="@string/assistir"
|
||||
android:drawableLeft="@mipmap/task_video"
|
||||
android:drawablePadding="5dp"
|
||||
/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginLeft="15dp"
|
||||
android:textSize="21sp"
|
||||
android:textColor="@color/yellow_00"
|
||||
android:text="+100"
|
||||
android:drawableStart="@mipmap/task_gold"
|
||||
android:drawablePadding="5dp"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/iv_close"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="64dp"
|
||||
android:src="@mipmap/icon_close"/>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -63,6 +63,7 @@
|
|||
<string name="privacy">Privacy</string>
|
||||
<string name="version">Version\n</string>
|
||||
<string name="title_cash_record">Dinheiro</string>
|
||||
<string name="sign_success_desc">Você ganhou uma recompensa!</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
@ -15,6 +15,7 @@ class SpUtil private constructor(spFileName: String) {
|
|||
const val KEY_ACCOUNT = "KEY_ACCOUNT"
|
||||
const val KEY_ACCOUNT_TOKEN = "KEY_ACCOUNT_TOKEN"
|
||||
const val KEY_TASK_BEAN = "KEY_TASK_BEAN"
|
||||
const val KEY_DAILY_SIGN = "KEY_DAILY_SIGN"
|
||||
|
||||
private const val DEFAULT_SP_NAME = "enhanced_prefs"
|
||||
@Volatile
|
||||
|
|
|
|||
Loading…
Reference in New Issue