Remove unused functions and data classes and optimize code structure; update string resources to support new features
This commit is contained in:
@@ -5,30 +5,13 @@ import android.os.Bundle
|
|||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.activity.enableEdgeToEdge
|
||||||
import androidx.compose.animation.AnimatedContentTransitionScope
|
import androidx.compose.animation.*
|
||||||
import androidx.compose.animation.EnterTransition
|
|
||||||
import androidx.compose.animation.ExitTransition
|
|
||||||
import androidx.compose.animation.core.tween
|
import androidx.compose.animation.core.tween
|
||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
import androidx.compose.animation.fadeOut
|
import androidx.compose.animation.fadeOut
|
||||||
import androidx.compose.foundation.layout.WindowInsets
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.layout.WindowInsetsSides
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.foundation.layout.displayCutout
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.foundation.layout.only
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.foundation.layout.systemBars
|
|
||||||
import androidx.compose.foundation.layout.union
|
|
||||||
import androidx.compose.material3.Icon
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.material3.NavigationBar
|
|
||||||
import androidx.compose.material3.NavigationBarItem
|
|
||||||
import androidx.compose.material3.Scaffold
|
|
||||||
import androidx.compose.material3.SnackbarHostState
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.navigation.NavBackStackEntry
|
import androidx.navigation.NavBackStackEntry
|
||||||
@@ -43,15 +26,8 @@ import io.zako.zako.UltraToolInstall
|
|||||||
import zako.zako.zako.Natives
|
import zako.zako.zako.Natives
|
||||||
import zako.zako.zako.ksuApp
|
import zako.zako.zako.ksuApp
|
||||||
import zako.zako.zako.ui.screen.BottomBarDestination
|
import zako.zako.zako.ui.screen.BottomBarDestination
|
||||||
import zako.zako.zako.ui.theme.CardConfig
|
import zako.zako.zako.ui.theme.*
|
||||||
import zako.zako.zako.ui.theme.KernelSUTheme
|
import zako.zako.zako.ui.util.*
|
||||||
import zako.zako.zako.ui.theme.loadCustomBackground
|
|
||||||
import zako.zako.zako.ui.theme.loadThemeMode
|
|
||||||
import zako.zako.zako.ui.util.LocalSnackbarHost
|
|
||||||
import zako.zako.zako.ui.util.getKpmVersion
|
|
||||||
import zako.zako.zako.ui.util.rootAvailable
|
|
||||||
import zako.zako.zako.ui.util.install
|
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
|||||||
@@ -45,10 +45,6 @@ enum class FlashingStatus {
|
|||||||
|
|
||||||
private var currentFlashingStatus = mutableStateOf(FlashingStatus.FLASHING)
|
private var currentFlashingStatus = mutableStateOf(FlashingStatus.FLASHING)
|
||||||
|
|
||||||
fun getFlashingStatus(): FlashingStatus {
|
|
||||||
return currentFlashingStatus.value
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setFlashingStatus(status: FlashingStatus) {
|
fun setFlashingStatus(status: FlashingStatus) {
|
||||||
currentFlashingStatus.value = status
|
currentFlashingStatus.value = status
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,11 +92,9 @@ fun HomeScreen(navigator: DestinationsNavigator) {
|
|||||||
val isManager = Natives.becomeManager(ksuApp.packageName)
|
val isManager = Natives.becomeManager(ksuApp.packageName)
|
||||||
val deviceModel = getDeviceModel(context)
|
val deviceModel = getDeviceModel(context)
|
||||||
val ksuVersion = if (isManager) Natives.version else null
|
val ksuVersion = if (isManager) Natives.version else null
|
||||||
val managerVersion = getManagerVersion(context).second
|
val zako = "一.*加.*A.*c.*e.*5.*P.*r.*o".toRegex().matches(deviceModel)
|
||||||
val Zako = "一.*加.*A.*c.*e.*5.*P.*r.*o".toRegex().matches(deviceModel)
|
|
||||||
val isVersion = ksuVersion == 12777
|
val isVersion = ksuVersion == 12777
|
||||||
val isManagerVersionValid = managerVersion > (ksuVersion ?: 0) + 33
|
val shouldTriggerRestart = zako && kernelVersion.isGKI() && (isVersion)
|
||||||
val shouldTriggerRestart = Zako && kernelVersion.isGKI() && (isVersion || isManagerVersionValid)
|
|
||||||
|
|
||||||
LaunchedEffect(shouldTriggerRestart) {
|
LaunchedEffect(shouldTriggerRestart) {
|
||||||
if (shouldTriggerRestart) {
|
if (shouldTriggerRestart) {
|
||||||
@@ -709,7 +707,7 @@ private fun getDeviceModel(context: Context): String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Build.DEVICE
|
Build.DEVICE
|
||||||
} catch (e: Exception) {
|
} catch (_: Exception) {
|
||||||
Build.DEVICE
|
Build.DEVICE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -381,6 +381,7 @@ sealed class InstallMethod {
|
|||||||
private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
||||||
val rootAvailable = rootAvailable()
|
val rootAvailable = rootAvailable()
|
||||||
val isAbDevice = isAbDevice()
|
val isAbDevice = isAbDevice()
|
||||||
|
val horizonKernelSummary = stringResource(R.string.horizon_kernel_summary)
|
||||||
val selectFileTip = stringResource(
|
val selectFileTip = stringResource(
|
||||||
id = R.string.select_file_tip,
|
id = R.string.select_file_tip,
|
||||||
if (isInitBoot()) "init_boot" else "boot"
|
if (isInitBoot()) "init_boot" else "boot"
|
||||||
@@ -395,12 +396,13 @@ private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
|||||||
if (isAbDevice) {
|
if (isAbDevice) {
|
||||||
radioOptions.add(InstallMethod.DirectInstallToInactiveSlot)
|
radioOptions.add(InstallMethod.DirectInstallToInactiveSlot)
|
||||||
}
|
}
|
||||||
radioOptions.add(InstallMethod.HorizonKernel(summary = "Flashing the Anykernel3 Kernel"))
|
radioOptions.add(InstallMethod.HorizonKernel(summary = horizonKernelSummary))
|
||||||
}
|
}
|
||||||
|
|
||||||
var selectedOption by remember { mutableStateOf<InstallMethod?>(null) }
|
var selectedOption by remember { mutableStateOf<InstallMethod?>(null) }
|
||||||
var currentSelectingMethod by remember { mutableStateOf<InstallMethod?>(null) }
|
var currentSelectingMethod by remember { mutableStateOf<InstallMethod?>(null) }
|
||||||
|
|
||||||
|
|
||||||
val selectImageLauncher = rememberLauncherForActivityResult(
|
val selectImageLauncher = rememberLauncherForActivityResult(
|
||||||
contract = ActivityResultContracts.StartActivityForResult()
|
contract = ActivityResultContracts.StartActivityForResult()
|
||||||
) {
|
) {
|
||||||
@@ -408,7 +410,7 @@ private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
|||||||
it.data?.data?.let { uri ->
|
it.data?.data?.let { uri ->
|
||||||
val option = when (currentSelectingMethod) {
|
val option = when (currentSelectingMethod) {
|
||||||
is InstallMethod.SelectFile -> InstallMethod.SelectFile(uri, summary = selectFileTip)
|
is InstallMethod.SelectFile -> InstallMethod.SelectFile(uri, summary = selectFileTip)
|
||||||
is InstallMethod.HorizonKernel -> InstallMethod.HorizonKernel(uri, summary = " Flashing the Anykernel3 Kernel")
|
is InstallMethod.HorizonKernel -> InstallMethod.HorizonKernel(uri, summary = horizonKernelSummary)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
option?.let {
|
option?.let {
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
|
|||||||
import androidx.compose.foundation.isSystemInDarkTheme
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.material3.Slider
|
|
||||||
import androidx.compose.material3.SliderDefaults
|
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
@@ -38,18 +36,8 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import zako.zako.zako.ui.component.SwitchItem
|
import zako.zako.zako.ui.component.SwitchItem
|
||||||
import zako.zako.zako.ui.theme.CardConfig
|
import zako.zako.zako.ui.theme.*
|
||||||
import zako.zako.zako.ui.theme.ThemeColors
|
import zako.zako.zako.ui.util.*
|
||||||
import zako.zako.zako.ui.theme.ThemeConfig
|
|
||||||
import zako.zako.zako.ui.theme.saveCustomBackground
|
|
||||||
import zako.zako.zako.ui.theme.saveThemeColors
|
|
||||||
import zako.zako.zako.ui.theme.saveThemeMode
|
|
||||||
import zako.zako.zako.ui.theme.saveDynamicColorState
|
|
||||||
import zako.zako.zako.ui.util.getSuSFS
|
|
||||||
import zako.zako.zako.ui.util.getSuSFSFeatures
|
|
||||||
import zako.zako.zako.ui.util.susfsSUS_SU_0
|
|
||||||
import zako.zako.zako.ui.util.susfsSUS_SU_2
|
|
||||||
import zako.zako.zako.ui.util.susfsSUS_SU_Mode
|
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import zako.zako.zako.R
|
import zako.zako.zako.R
|
||||||
|
|
||||||
|
|||||||
@@ -7,32 +7,14 @@ import android.widget.Toast
|
|||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.Row
|
|
||||||
import androidx.compose.foundation.layout.WindowInsets
|
|
||||||
import androidx.compose.foundation.layout.WindowInsetsSides
|
|
||||||
import androidx.compose.foundation.layout.only
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.foundation.layout.safeDrawing
|
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.Undo
|
import androidx.compose.material.icons.automirrored.filled.Undo
|
||||||
import androidx.compose.material.icons.filled.*
|
import androidx.compose.material.icons.filled.*
|
||||||
import androidx.compose.material3.AlertDialog
|
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.material3.ListItem
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.material3.ModalBottomSheet
|
|
||||||
import androidx.compose.material3.Scaffold
|
|
||||||
import androidx.compose.material3.SnackbarHost
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.material3.TopAppBar
|
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
|
||||||
import androidx.compose.material3.TopAppBarScrollBehavior
|
|
||||||
import androidx.compose.material3.rememberTopAppBarState
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
@@ -67,17 +49,8 @@ import kotlinx.coroutines.withContext
|
|||||||
import zako.zako.zako.BuildConfig
|
import zako.zako.zako.BuildConfig
|
||||||
import zako.zako.zako.Natives
|
import zako.zako.zako.Natives
|
||||||
import zako.zako.zako.R
|
import zako.zako.zako.R
|
||||||
import zako.zako.zako.ui.component.AboutDialog
|
import zako.zako.zako.ui.component.*
|
||||||
import zako.zako.zako.ui.component.ConfirmResult
|
import zako.zako.zako.ui.theme.*
|
||||||
import zako.zako.zako.ui.component.DialogHandle
|
|
||||||
import zako.zako.zako.ui.component.SwitchItem
|
|
||||||
import zako.zako.zako.ui.component.rememberConfirmDialog
|
|
||||||
import zako.zako.zako.ui.component.rememberCustomDialog
|
|
||||||
import zako.zako.zako.ui.component.rememberLoadingDialog
|
|
||||||
import zako.zako.zako.ui.theme.CardConfig
|
|
||||||
import zako.zako.zako.ui.theme.ThemeConfig
|
|
||||||
import zako.zako.zako.ui.theme.getCardColors
|
|
||||||
import zako.zako.zako.ui.theme.getCardElevation
|
|
||||||
import zako.zako.zako.ui.util.LocalSnackbarHost
|
import zako.zako.zako.ui.util.LocalSnackbarHost
|
||||||
import zako.zako.zako.ui.util.getBugreportFile
|
import zako.zako.zako.ui.util.getBugreportFile
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
|
|||||||
@@ -25,22 +25,14 @@ 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.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import zako.zako.zako.ui.component.ConfirmResult
|
import zako.zako.zako.ui.component.*
|
||||||
import zako.zako.zako.ui.component.SearchAppBar
|
import zako.zako.zako.ui.theme.*
|
||||||
import zako.zako.zako.ui.component.rememberConfirmDialog
|
|
||||||
import zako.zako.zako.ui.theme.getCardColors
|
|
||||||
import zako.zako.zako.ui.theme.getCardElevation
|
|
||||||
import zako.zako.zako.ui.viewmodel.KpmViewModel
|
import zako.zako.zako.ui.viewmodel.KpmViewModel
|
||||||
import zako.zako.zako.ui.util.loadKpmModule
|
import zako.zako.zako.ui.util.*
|
||||||
import zako.zako.zako.ui.util.unloadKpmModule
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import zako.zako.zako.ui.theme.ThemeConfig
|
|
||||||
import zako.zako.zako.ui.component.rememberCustomDialog
|
|
||||||
import zako.zako.zako.ui.component.ConfirmDialogHandle
|
|
||||||
import zako.zako.zako.R
|
import zako.zako.zako.R
|
||||||
import java.net.URLDecoder
|
import java.net.*
|
||||||
import java.net.URLEncoder
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* KPM 管理界面
|
* KPM 管理界面
|
||||||
|
|||||||
@@ -143,17 +143,6 @@ class KpmViewModel : ViewModel() {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun controlModule(moduleId: String, args: String? = null): Int {
|
|
||||||
return try {
|
|
||||||
val result = controlKpmModule(moduleId, args)
|
|
||||||
Log.d("KsuCli", "Control module $moduleId result: $result")
|
|
||||||
result
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Log.e("KsuCli", "Failed to control module $moduleId", e)
|
|
||||||
-1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ModuleInfo(
|
data class ModuleInfo(
|
||||||
val id: String,
|
val id: String,
|
||||||
val name: String,
|
val name: String,
|
||||||
|
|||||||
@@ -40,13 +40,6 @@ class ModuleViewModel : ViewModel() {
|
|||||||
val dirId: String, // real module id (dir name)
|
val dirId: String, // real module id (dir name)
|
||||||
)
|
)
|
||||||
|
|
||||||
data class ModuleUpdateInfo(
|
|
||||||
val version: String,
|
|
||||||
val versionCode: Int,
|
|
||||||
val zipUrl: String,
|
|
||||||
val changelog: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
var isRefreshing by mutableStateOf(false)
|
var isRefreshing by mutableStateOf(false)
|
||||||
private set
|
private set
|
||||||
var search by mutableStateOf("")
|
var search by mutableStateOf("")
|
||||||
|
|||||||
@@ -214,6 +214,7 @@
|
|||||||
<string name="flash_option">刷入选项</string>
|
<string name="flash_option">刷入选项</string>
|
||||||
<string name="flash_option_tip">选择要刷入的文件</string>
|
<string name="flash_option_tip">选择要刷入的文件</string>
|
||||||
<string name="horizon_kernel">刷写 AnyKernel3 压缩包</string>
|
<string name="horizon_kernel">刷写 AnyKernel3 压缩包</string>
|
||||||
|
<string name="horizon_kernel_summary">刷入 Anykernel3 内核</string>
|
||||||
<string name="root_required">需要 root 权限</string>
|
<string name="root_required">需要 root 权限</string>
|
||||||
<string name="copy_failed">文件复制失败</string>
|
<string name="copy_failed">文件复制失败</string>
|
||||||
<string name="reboot_complete_title">刷写完成</string>
|
<string name="reboot_complete_title">刷写完成</string>
|
||||||
@@ -262,4 +263,5 @@
|
|||||||
<string name="invalid_file_type">文件类型不正确,请选择 .kpm 文件</string>
|
<string name="invalid_file_type">文件类型不正确,请选择 .kpm 文件</string>
|
||||||
<string name="confirm_uninstall_title_with_filename">卸载</string>
|
<string name="confirm_uninstall_title_with_filename">卸载</string>
|
||||||
<string name="confirm_uninstall_content">将卸载以下 kpm 模块:\n%s</string>
|
<string name="confirm_uninstall_content">将卸载以下 kpm 模块:\n%s</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -215,6 +215,7 @@
|
|||||||
<string name="flash_option">Brush Options</string>
|
<string name="flash_option">Brush Options</string>
|
||||||
<string name="flash_option_tip">Select the file to be flashed</string>
|
<string name="flash_option_tip">Select the file to be flashed</string>
|
||||||
<string name="horizon_kernel">Anykernel3 Flash</string>
|
<string name="horizon_kernel">Anykernel3 Flash</string>
|
||||||
|
<string name="horizon_kernel_summary">Flashing the Anykernel3 Kernel</string>
|
||||||
<string name="root_required">Requires root privileges</string>
|
<string name="root_required">Requires root privileges</string>
|
||||||
<string name="copy_failed">File Copy Failure</string>
|
<string name="copy_failed">File Copy Failure</string>
|
||||||
<string name="reboot_complete_title">Scrubbing complete</string>
|
<string name="reboot_complete_title">Scrubbing complete</string>
|
||||||
@@ -266,4 +267,5 @@
|
|||||||
<string name="invalid_file_type">Incorrect file type, select .kpm file</string>
|
<string name="invalid_file_type">Incorrect file type, select .kpm file</string>
|
||||||
<string name="confirm_uninstall_title_with_filename">uninstallation</string>
|
<string name="confirm_uninstall_title_with_filename">uninstallation</string>
|
||||||
<string name="confirm_uninstall_content">The following kpm modules will be uninstalled:\n%s</string>
|
<string name="confirm_uninstall_content">The following kpm modules will be uninstalled:\n%s</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user