Runt
2025-12-14 caed45171d5811a0f92cea6e29d63dc818606928
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.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
@@ -27,7 +29,6 @@
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
@@ -47,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,"",""))
@@ -58,6 +59,26 @@
    open fun onCreate(activity : BaseActivity<LayoutView<BaseViewModel> , BaseViewModel>) {
        mActivity = activity
        TAG = javaClass.simpleName;
    }
    open fun onPause(){
    }
    open fun onResume(){
    }
    open fun onStart(){
    }
    open fun onStop(){
    }
    open fun onDestroy(){
    }
    fun getActivity(): BaseActivity<LayoutView<BaseViewModel> , BaseViewModel> {
@@ -71,20 +92,44 @@
    fun hideLoading() {
        _isLoading.value = _isLoading.value.copy(isVisible = false);
    }
    fun showDialog(
        title : String = "" , message : String = "" , confirmText : String = "确定" , cancelText : String = "" ,
    fun showInputDialog(
        title : String = "" , message : String = "" , hint : String = "",regex : String = "",
        confirmText:String = "确定", cancelText:String = "取消",
        maxLines:Int = 1, minLength:Int = 0, maxLength:Int = 0,
        inputType : KeyboardType = KeyboardType.Text ,
        touchOutside : Boolean = true , //空白和系统返回 是否关闭
        showClose : Boolean = false , //显示关闭图标(默认不显示)
        confirmDissmiss : Boolean = true , //点击确定是否关闭
        cancelDissmiss : Boolean = true , //点击取消是否关闭
        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, confirmDissmiss = confirmDissmiss, cancelDissmiss = cancelDissmiss, onDismissRequest = onDismissRequest,
        _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){
@@ -260,32 +305,5 @@
        val json = if (obj is String) obj else Gson().toJson(obj)
        val requestBody = json.toString().toRequestBody(mediaType)
        return requestBody;
    }
    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;
        }
    }
}