Runt
2025-12-26 442e37c2ae14b2fab73afd4f3ef928cc47f1af30
libmvi/src/main/java/com/runt/open/mvi/base/model/BaseViewModel.kt
@@ -3,14 +3,16 @@
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.compose.ui.text.input.KeyboardType
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModel
import com.google.gson.Gson
import com.runt.open.mvi.base.BaseActivity
import com.runt.open.mvi.base.LayoutView
import com.runt.open.mvi.data.InputMessageState
import com.runt.open.mvi.data.LoadingState
import com.runt.open.mvi.data.Message
import com.runt.open.mvi.data.MessageState
import com.runt.open.mvi.data.PopupMessage
import com.runt.open.mvi.retrofit.AndroidScheduler
@@ -20,11 +22,13 @@
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import okhttp3.Callback
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
@@ -44,9 +48,9 @@
    val isLoading = _isLoading.asStateFlow()
    val messageSetDismiss = {
        _messageState.value = _messageState.value.copy(isVisible = false);
        _messageState.value = MessageState(isVisible = false)
    }
    private val _messageState = MutableStateFlow(MessageState(isVisible = false, setDismiss = { }))
    private val _messageState = MutableStateFlow(Message(isVisible = false, setDismiss = { }))
    val messageState = _messageState.asStateFlow()
    private val _popupState = MutableStateFlow(PopupMessage(isVisible = false,"",""))
@@ -57,7 +61,27 @@
        TAG = javaClass.simpleName;
    }
    fun getActivity(): ComponentActivity {
    open fun onPause(){
    }
    open fun onResume(){
    }
    open fun onStart(){
    }
    open fun onStop(){
    }
    open fun onDestroy(){
    }
    fun getActivity(): BaseActivity<LayoutView<BaseViewModel> , BaseViewModel> {
        return mActivity!!;
    }
@@ -68,18 +92,44 @@
    fun hideLoading() {
        _isLoading.value = _isLoading.value.copy(isVisible = false);
    }
    fun showDialog( title:String = "", message: String = "", confirmText:String = "确定", cancelText:String = "",
        touchOutside:Boolean = true,//空白和系统返回 是否关闭
        showClose:Boolean = false,//显示关闭图标(默认不显示)
        confirmDissmiss:Boolean = true,//点击确定是否关闭
        cancelDissmiss:Boolean = true,//点击取消是否关闭
        onDismissRequest : () -> Unit = {},
        onConfirmRequest : () -> Unit = {}, ){
        _messageState.value = MessageState(title = title, message = message, touchOutside = touchOutside, showClose = showClose, confirmText = confirmText,
            cancelText = cancelText, confirmDissmiss = confirmDissmiss, cancelDissmiss = cancelDissmiss, onDismissRequest = onDismissRequest,
    fun showInputDialog(
        title : String = "" , message : String = "" , hint : String = "",regex : String = "",
        confirmText:String = "确定", cancelText:String = "取消",
        maxLines:Int = 0, minLength:Int = 0, maxLength:Int = 0,
        inputType : KeyboardType = KeyboardType.Text ,
        touchOutside : Boolean = true , //空白和系统返回 是否关闭
        showClose : Boolean = false , //显示关闭图标(默认不显示)
        confirmDismiss : Boolean = true , //点击确定是否关闭
        cancelDismiss : Boolean = true , //点击取消是否关闭
        onDismissRequest : () -> Unit = {} ,
        onCancelRequest : () -> Unit = {} ,
        onConfirmRequest : (String) -> Unit = {} ,
    ){
        _messageState.value = InputMessageState(title = title, message = message, hint = hint, regex = regex,
            maxLines = maxLines, minLength = minLength, maxLength = maxLength, inputType = inputType,
            touchOutside = touchOutside, showClose = showClose, confirmText = confirmText,
            cancelText = cancelText, confirmDismiss = confirmDismiss, cancelDismiss = cancelDismiss, onCancelRequest = onCancelRequest, onDismissRequest = onDismissRequest,
            onConfirmRequest = onConfirmRequest, setDismiss = messageSetDismiss);
    }
    fun showDialog(
        title : String = "" , message : String = "" ,
        confirmText : String = "确定" , cancelText : String = "" ,
        touchOutside : Boolean = true , //空白和系统返回 是否关闭
        showClose : Boolean = false , //显示关闭图标(默认不显示)
        confirmDismiss : Boolean = true , //点击确定是否关闭
        cancelDismiss : Boolean = true , //点击取消是否关闭
        onDismissRequest : () -> Unit = {} ,
        onCancelRequest : () -> Unit = {} ,
        onConfirmRequest : () -> Unit = {} ,
    ){
        _messageState.value = MessageState(title = title, message = message,  touchOutside = touchOutside, showClose = showClose, confirmText = confirmText,
            cancelText = cancelText, confirmDismiss = confirmDismiss, cancelDismiss = cancelDismiss, onCancelRequest = onCancelRequest, onDismissRequest = onDismissRequest,
            onConfirmRequest = onConfirmRequest, setDismiss = messageSetDismiss);
    }
    fun dismissDialog(){
        messageSetDismiss.invoke();
    }
    fun showPopupWindow(title : String,message : String){
@@ -250,30 +300,10 @@
            }.subscribe(observer)
    }
    fun getFilePathFromUri(uri:Uri):String?{
        var filePath = "";
        var filePathColumn = arrayOf(MediaStore.Video.Media.DATA)
        var cursor = mActivity!!.contentResolver.query(uri!!,filePathColumn,null,null,null)
        cursor?.let {
            it.moveToFirst()
            var index = it.getColumnIndex(filePathColumn[0])
            if(index > -1 && index < it.columnCount){
                filePath = it.getString(index)
            }
            it.close();
        }
        var file = File(filePath);
        Log.i(TAG,"文件是否存在=${file.exists()} file=${filePath} ")
        if(file.exists()){
            try {
                var inputStream = FileInputStream(file)
                inputStream.close();
                return filePath;
            }catch (e:Exception){
                return null;
            }
        }else{
            return null;
        }
    fun createJsonBody(obj : Any) : RequestBody {
        val mediaType = "application/json; charset=utf-8".toMediaType()
        val json = if (obj is String) obj else Gson().toJson(obj)
        val requestBody = json.toString().toRequestBody(mediaType)
        return requestBody;
    }
}