优化KPM模块列表的获取逻辑,添加定时刷新功能,并调整空状态显示
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user