VidiDin-Android/app/src/main/java/com/gamedog/vididin/login/AccountManager.kt

160 lines
4.8 KiB
Kotlin

package com.gamedog.vididin.core.login.login
import com.ama.core.architecture.util.AndroidUtil
import com.ama.core.architecture.util.DateUtil
import com.ama.core.architecture.util.DeviceUtil
import com.ama.core.architecture.util.SpUtil
import com.ama.core.architecture.util.eventbus.NotifyMan
import com.gamedog.vididin.VidiConst
import com.gamedog.vididin.VididinEvents
import com.gamedog.vididin.beans.Account
import com.gamedog.vididin.beans.BankInfo
import kotlinx.coroutines.sync.Mutex
object AccountManager {
private val mutex = Mutex()
init {
NotifyMan.instance().register(object: NotifyMan.ICallback(true) {
override fun onEvent(data: NotifyMan.NotifyData<*>?) {
when (data?.mEventType) {
VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND -> {
addDiamond(VidiConst.DIAMOND_NUM_FOR_ONE_AD)
}
}
}
}, VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND)
}
private val mAccount: Account? by lazy {
var account = SpUtil.instance().getObject<Account>(SpUtil.KEY_ACCOUNT)
if (account == null) {
val deviceUUId = DeviceUtil.generateDeviceId()
account = Account(accountId = "user_$deviceUUId", deviceUUId=deviceUUId, createdAt = DateUtil.getCurTimeMs())
account.let {
SpUtil.instance().putObject(SpUtil.KEY_ACCOUNT, account)
}
}
account
}
private fun saveAccountInfo() {
SpUtil.instance().putObject(SpUtil.KEY_ACCOUNT, mAccount)
}
fun getAccount() : Account? {
return mAccount
}
fun getGold(): Long {
return mAccount?.goldCount ?: 0L
}
fun getCash(): Float {
return mAccount?.cashCount ?: 0F
}
@Synchronized
fun addGold(newGold: Int) {
mAccount?.goldCount += newGold
saveAccountInfo()
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Gold_Changed, null)
}
@Synchronized
private fun addDiamond(diamondNum: Int) {
mAccount?.diamondCount += diamondNum
saveAccountInfo()
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Diamond_Changed, null)
}
@Synchronized
fun adjustAccountCash(newCash: Float): Boolean {
val result = false
mAccount?.let {
val newCashTotal = it.cashCount + newCash
if (newCashTotal >= 0F) {
it.cashCount = newCashTotal
saveAccountInfo()
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Cash_Changed, null)
return true
}
}
return result
}
fun getBankInfo(): BankInfo? {
return mAccount?.bankInfo
}
fun hasValidBankInfo(): Boolean {
val backInfo = getBankInfo()
return !backInfo?.bankName.isNullOrEmpty() && !backInfo.bankAccount.isNullOrEmpty()
}
fun saveBankAccount(bankAccount: String?) {
if (bankAccount.isNullOrEmpty()) {
mAccount?.bankInfo = null
} else {
mAccount?.bankInfo = BankInfo(bankAccount=bankAccount)
}
saveAccountInfo()
NotifyMan.instance().sendEvent(
VididinEvents.Event_Account_Bank_Info_Changed, NotifyMan.NotifyData(bankAccount))
}
@Synchronized
fun convertGold2Cash(): Boolean {
try {
val couldCovertCashTotal = mAccount?.goldCount?.div(VidiConst.PER_01CASH_COST_GOLD_NUM) ?: 0
if (couldCovertCashTotal > 0) {
val costGoldNum = couldCovertCashTotal * VidiConst.PER_01CASH_COST_GOLD_NUM
mAccount?.goldCount?.let {
if (it >= costGoldNum) {
addGold(-1 * costGoldNum.toInt())
adjustAccountCash(couldCovertCashTotal * 0.1F)
AndroidUtil.showToast("Has convert $costGoldNum gold to $couldCovertCashTotal cash.")
return true
}
}
} else {
AndroidUtil.showToast("You don't have enough gold.")
}
} catch (e: Exception) {
e.printStackTrace()
}
return false
}
fun saveUserIdInfo(userId: Int) {
mAccount?.let {
it.userId = userId
saveAccountInfo()
}
}
fun isBankAccountExist(): Boolean {
return !mAccount?.bankInfo?.bankAccount.isNullOrEmpty()
}
fun adjustDiamond(diamondCost: Int): Boolean {
mAccount?.let {
if (it.diamondCount >= diamondCost) {
it.diamondCount -= diamondCost
saveAccountInfo()
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Diamond_Changed, null)
return true
}
}
return false
}
}