一些基础util

This commit is contained in:
renhaoting 2025-12-08 15:12:53 +08:00
parent 3f10238136
commit 0f06e04a4e
7 changed files with 190 additions and 4 deletions

View File

@ -14,6 +14,7 @@ object VidiConst {
const val URL_YOUTUBE_API = "https://vd.rsappinc.com"
const val URL_ZERO_BUY: String = "https://jt.3idiotstudio.com"

View File

@ -2,6 +2,7 @@ package com.gamedog.vididin.beans
data class Account(
var userId: Int = 0,
val accountId: String,
val deviceUUId: String,
val token: String="",

View File

@ -2,6 +2,7 @@ package com.gamedog.vididin.core.network.di
import android.util.Log
import com.ama.core.architecture.util.DeviceUtil
import com.gamedog.vididin.request.RequestUtil
import okhttp3.Headers
import okhttp3.Interceptor
@ -44,6 +45,7 @@ class GlobalInterceptor : Interceptor {
.add("ApplicationId", RequestUtil.Request_APPId)
.add("Timestamp", timeSec.toString())
.add("Sign", RequestUtil.getRequestSign(timeSec))
.add("DeviceId", DeviceUtil.generateDeviceId())

View File

@ -45,7 +45,6 @@ internal object NetworkModule {
@Provides
@Singleton
fun providesRetrofit(
networkJson: Json,
okhttpCallFactory: dagger.Lazy<Call.Factory>,
): Retrofit {
return Retrofit.Builder()

View File

@ -9,9 +9,7 @@ import com.gamedog.vididin.VidiConst
import com.gamedog.vididin.VididinEvents
import com.gamedog.vididin.beans.Account
import com.gamedog.vididin.beans.BankInfo
import com.gamedog.vididin.main.fragments.task.TaskBean
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
object AccountManager {
@ -105,5 +103,12 @@ object AccountManager {
return false
}
fun saveUserIdInfo(userId: Int) {
mAccount?.let {
it.userId = userId
saveAccountInfo()
}
}
}

View File

@ -1,5 +1,6 @@
package com.ama.core.architecture.base
import android.view.View
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.ama.core.architecture.interfaces.LoadStateUiStateOwner
@ -8,10 +9,13 @@ import com.ama.core.architecture.message.MessageController
import com.ama.core.architecture.message.MessageDisplayManager
import com.ama.core.architecture.message.controller.DefaultMessageController
import com.ama.core.architecture.stateview.LoadStateUiState
import com.ama.core.architecture.stateview.isNormalException
import com.ama.core.architecture.util.toErrorMessage
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
abstract class BaseViewModel<UiState> : ViewModel(), UiStateOwner<UiState>,
LoadStateUiStateOwner,
@ -31,4 +35,153 @@ abstract class BaseViewModel<UiState> : ViewModel(), UiStateOwner<UiState>,
)
}
fun requestAsync(asyncFun: suspend () -> Unit) {
// 效果说明:不隐藏内容,仅展示加载中,加载失败改为展示消息提示(普通异常)。
requestAsyncSingleOnlyHint(
errorCallback = {
// 网络规则提示消息用于UI展示普通异常消息用于消息提示Toast其它状态不显示。
if (error.isNormalException()) {
// 普通异常消息用于消息提示
showMessage(error.toErrorMessage())
}
},
asyncFun = asyncFun
)
}
}
private fun <Data> BaseViewModel<*>.requestAsyncBase(
// 默认值,用于统一修改下面状态的默认值。
isShowContentLayoutAllStateDefault: Boolean?,
isShowStateViewAllStateDefault: Boolean,
// loading
isShowContentLayoutLoading: Boolean? = isShowContentLayoutAllStateDefault,
isShowStateViewLoading: Boolean = isShowStateViewAllStateDefault,
isStateViewLoadingDialog: Boolean = false,
loadingCallback: (LoadStateUiState.Loading.() -> Unit)? = null,
// error
isShowContentLayoutError: Boolean? = isShowContentLayoutAllStateDefault,
isShowStateViewError: Boolean = isShowStateViewAllStateDefault,
errorCallback: (LoadStateUiState.Error.() -> Unit)? = null,
// empty
isShowContentLayoutEmpty: Boolean? = isShowContentLayoutAllStateDefault,
isSuccessEmpty: Data.() -> Boolean = { false }, // 判断Success下什么情况下为空默认不支持为空。
isShowStateViewEmpty: Boolean = isShowStateViewAllStateDefault,
emptyCallback: (LoadStateUiState.Empty.() -> Unit)? = null,
// success
successCallback: (LoadStateUiState.Success.() -> Unit)? = null,
// asyncFun
asyncFun: suspend () -> Data,
) {
viewModelScope.launch {
// Loading
val loading =
LoadStateUiState.Loading(
isShowContentLayoutLoading,
isShowStateViewLoading,
isStateViewLoadingDialog
)
loadStateUiState.value = loading
loadingCallback?.invoke(loading)
try {
val data = asyncFun()
if (isSuccessEmpty(data)) {
// Empty
val empty = LoadStateUiState.Empty(isShowContentLayoutEmpty, isShowStateViewEmpty)
loadStateUiState.value = empty
emptyCallback?.invoke(empty)
} else {
// Success
// 加载成功一定要显示内容布局、显示StateView-Success防止其它操控loadStateUiState的设置了隐藏内容布局。
val success =
LoadStateUiState.Success(isShowContentLayout = true, isShowStateView = true)
loadStateUiState.value = success
successCallback?.invoke(success)
}
} catch (e: Exception) {
e.printStackTrace()
// Error
// 重试
val retry: (v: View) -> Unit = {
requestAsyncBase(
isShowContentLayoutAllStateDefault,
isShowStateViewAllStateDefault,
// loading
isShowContentLayoutLoading,
isShowStateViewLoading,
isStateViewLoadingDialog,
loadingCallback,
// error
isShowContentLayoutError,
isShowStateViewError,
errorCallback,
// empty
isShowContentLayoutEmpty,
isSuccessEmpty,
isShowStateViewEmpty,
emptyCallback,
// success
successCallback,
// asyncFun
asyncFun
)
}
val error =
LoadStateUiState.Error(isShowContentLayoutError, isShowStateViewError, e, retry)
loadStateUiState.value = error
errorCallback?.invoke(error)
}
}
}
/**
* 请求异步-单网络-仅提示内容布局全部显示StateView仅展示加载中加载失败默认改为展示消息提示
*/
fun <Data> BaseViewModel<*>.requestAsyncSingleOnlyHint(
errorCallback: (LoadStateUiState.Error.() -> Unit)? = null,
asyncFun: suspend () -> Data,
) {
if (loadStateUiState.value is LoadStateUiState.Loading) {
// 网络请求中,直接返回。
return
}
// 效果说明:不隐藏内容,仅展示加载中,加载失败改为展示消息提示。
requestAsyncBase(
// 所有状态默认显示内容布局
isShowContentLayoutAllStateDefault = true,
// 所有状态默认不显示StateViewLoading除外下面设置
isShowStateViewAllStateDefault = false,
// 设置显示StateView-Loading
isShowStateViewLoading = true,
// 设置显示StateView-Error改为定制先用参数的然后再用自己的消息提示
errorCallback = errorCallback ?: { showMessage(kotlin.error("").toString()) },
// 请求
asyncFun = asyncFun
)
}
/**
* 请求异步-单网络-展示所有状态StateView全部显示内容布局仅加载中成功显示
*/
fun <Data> BaseViewModel<*>.requestAsyncSingleShowAllState(
asyncFun: suspend () -> Data,
) {
if (loadStateUiState.value is LoadStateUiState.Loading) {
// 网络请求中,直接返回。
return
}
requestAsyncBase(
// 所有状态默认不显示内容布局Loading除外下面设置
isShowContentLayoutAllStateDefault = false,
// 所有状态默认显示StateView
isShowStateViewAllStateDefault = true,
// Loading不操作内容防止设置为true后强制显示内容布局导致显示闪烁
isShowContentLayoutLoading = null,
// 请求
asyncFun = asyncFun
)
}

View File

@ -10,18 +10,22 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.util.Base64
import android.view.View
import android.widget.Toast
import androidx.core.app.NotificationManagerCompat
import com.ama.core.architecture.BaseApp
import kotlin.random.Random
import androidx.core.graphics.createBitmap
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.nio.charset.Charset
class AndroidUtil private constructor() {
companion object {
val gson: Gson = Gson()
fun genRandomInt(rangeBegin: Int, rangeEnd: Int): Int {
return Random.nextInt(rangeBegin, rangeEnd)
@ -121,6 +125,27 @@ class AndroidUtil private constructor() {
return bitmap
}
inline fun <reified T> json2Object(jsonString: String): T? {
return try {
val type = object : TypeToken<T>() {}.type
gson.fromJson(jsonString, type)
} catch (e: Exception) {
e.printStackTrace()
null
}
}
fun <T> object2Json(obj : T) : String {
try {
return gson.toJson(obj)
} catch (e: Exception) {
e.printStackTrace()
}
return ""
}
}
}