优化KPM模块列表的获取逻辑,添加定时刷新功能,并调整空状态显示

This commit is contained in:
ShirkNeko
2025-04-01 16:16:56 +08:00
parent 57c65fdcda
commit f71de1742a

View File

@@ -1,5 +1,3 @@
package shirkneko.zako.sukisu.ui.screen
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -14,8 +12,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.* import androidx.compose.material.icons.outlined.*
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -27,6 +23,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import shirkneko.zako.sukisu.R import shirkneko.zako.sukisu.R
import shirkneko.zako.sukisu.ui.component.ConfirmResult import shirkneko.zako.sukisu.ui.component.ConfirmResult
@@ -42,7 +39,6 @@ import java.io.File
import androidx.core.content.edit import androidx.core.content.edit
import shirkneko.zako.sukisu.ui.theme.ThemeConfig import shirkneko.zako.sukisu.ui.theme.ThemeConfig
/** /**
* KPM 管理界面 * KPM 管理界面
* 以下内核模块功能由KernelPatch开发经过修改后加入SukiSU Ultra的内核模块功能 * 以下内核模块功能由KernelPatch开发经过修改后加入SukiSU Ultra的内核模块功能
@@ -132,8 +128,9 @@ fun KpmScreen(
} }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
if (viewModel.moduleList.isEmpty()) { while(true) {
viewModel.fetchModuleList() viewModel.fetchModuleList()
delay(5000)
} }
} }
@@ -206,69 +203,63 @@ fun KpmScreen(
} }
} }
PullToRefreshBox( if (viewModel.moduleList.isEmpty()) {
onRefresh = { viewModel.fetchModuleList() }, Box(
isRefreshing = viewModel.isRefreshing, modifier = Modifier.fillMaxSize(),
modifier = Modifier, contentAlignment = Alignment.Center
) { ) {
if (viewModel.moduleList.isEmpty()) { Text(
Box( stringResource(R.string.kpm_empty),
modifier = Modifier.fillMaxSize(), textAlign = TextAlign.Center
contentAlignment = Alignment.Center )
) { }
Text( } else {
stringResource(R.string.kpm_empty), LazyColumn(
textAlign = TextAlign.Center modifier = Modifier.fillMaxSize(),
) contentPadding = PaddingValues(16.dp),
} verticalArrangement = Arrangement.spacedBy(16.dp)
} else { ) {
LazyColumn( items(viewModel.moduleList) { module ->
modifier = Modifier.fillMaxSize(), val kpmUninstallConfirm = String.format(kpmUninstallConfirmTemplate, module.name)
contentPadding = PaddingValues(16.dp), KpmModuleItem(
verticalArrangement = Arrangement.spacedBy(16.dp) module = module,
) { onUninstall = {
items(viewModel.moduleList) { module -> scope.launch {
val kpmUninstallConfirm = String.format(kpmUninstallConfirmTemplate, module.name) val confirmResult = confirmDialog.awaitConfirm(
KpmModuleItem( title = kpmUninstall,
module = module, content = kpmUninstallConfirm,
onUninstall = { confirm = uninstall,
scope.launch { dismiss = cancel
val confirmResult = confirmDialog.awaitConfirm( )
title = kpmUninstall, if (confirmResult == ConfirmResult.Confirmed) {
content = kpmUninstallConfirm, val success = loadingDialog.withLoading {
confirm = uninstall, try {
dismiss = cancel unloadKpmModule(module.id)
) true
if (confirmResult == ConfirmResult.Confirmed) { } catch (e: Exception) {
val success = loadingDialog.withLoading { Log.e("KsuCli", "Failed to unload KPM module: ${e.message}")
try { false
unloadKpmModule(module.id)
true
} catch (e: Exception) {
Log.e("KsuCli", "Failed to unload KPM module: ${e.message}")
false
}
}
if (success) {
viewModel.fetchModuleList()
snackBarHost.showSnackbar(
message = kpmUninstallSuccess,
duration = SnackbarDuration.Short
)
} else {
snackBarHost.showSnackbar(
message = kpmUninstallFailed,
duration = SnackbarDuration.Short
)
} }
} }
if (success) {
viewModel.fetchModuleList()
snackBarHost.showSnackbar(
message = kpmUninstallSuccess,
duration = SnackbarDuration.Short
)
} else {
snackBarHost.showSnackbar(
message = kpmUninstallFailed,
duration = SnackbarDuration.Short
)
}
} }
},
onControl = {
viewModel.loadModuleDetail(module.id)
} }
) },
} onControl = {
viewModel.loadModuleDetail(module.id)
}
)
} }
} }
} }