Skip to content

Commit

Permalink
refactor: 将UI和业务逻辑代码分离
Browse files Browse the repository at this point in the history
  • Loading branch information
jixiaoyong committed Mar 29, 2024
1 parent f054ea7 commit 3a9b850
Show file tree
Hide file tree
Showing 12 changed files with 536 additions and 407 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.jixiaoyong.pages.signapp
package io.github.jixiaoyong.beans

/**
* @author : jixiaoyong
Expand Down
2 changes: 1 addition & 1 deletion src/main/kotlin/io/github/jixiaoyong/pages/MainPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ fun App() {
val pageIndex by viewModel.currentIndex.collectAsState()

// 将viewModel放在这里避免切换页面时丢失
val signInfoViewModel = viewModel { SignInfoViewModel() }
val signInfoViewModel = viewModel { SignInfoViewModel(settings) }
val signAppViewModel = viewModel { SignAppViewModel(settings) }

DisposableEffect(Unit) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package io.github.jixiaoyong.pages.settings

import androidx.compose.runtime.mutableStateOf
import io.github.jixiaoyong.base.BaseViewModel
import io.github.jixiaoyong.utils.SettingsTool
import io.github.jixiaoyong.utils.StorageKeys
import io.github.jixiaoyong.utils.showToast
import kotlinx.coroutines.flow.*

/**
* @author : jixiaoyong
Expand All @@ -10,14 +13,121 @@ import io.github.jixiaoyong.base.BaseViewModel
* @email : jixiaoyong1995@gmail.com
* @date : 25/3/2024
*/
class SettingInfoViewModel : BaseViewModel() {
class SettingInfoViewModel(private val settings: SettingsTool) : BaseViewModel() {

val version = mutableStateOf("未知")
private val uiStateFlow: MutableStateFlow<SettingInfoUiState> = MutableStateFlow(SettingInfoUiState())
val uiState = uiStateFlow.asStateFlow()

override fun onInit() {
// 用 gradle runDistributable 或者 packageReleaseDistributionForCurrentOS 等运行应用程序才会有值
System.getProperty("jpackage.app-version")?.let {
version.value = it
uiStateFlow.value = uiStateFlow.value.copy(version = it)
}

combine(
settings.apkSigner,
settings.zipAlign,
settings.aapt,
settings.isAutoMatchSignature
) { apkSigner, zipAlign, aapt, isAutoMatchSignature ->
uiStateFlow.value.copy(
apkSign = apkSigner,
zipAlign = zipAlign,
aapt = aapt,
isAutoMatchSignature = isAutoMatchSignature
)
}.onEach {
uiStateFlow.emit(it)
}
.launchIn(viewModelScope)

}

fun toggleResetDialog() {
uiStateFlow.value = uiStateFlow.value.copy(
resetInfo = uiStateFlow.value.resetInfo.copy(showResetDialog = !uiStateFlow.value.resetInfo.showResetDialog)
)
}

/**
* Updates the reset configuration values based on the provided parameters.
* null 表示不修改现有值
*/
fun updateResetConfig(
resetSignInfo: Boolean? = null,
resetApkTools: Boolean? = null,
resetSignTypes: Boolean? = null,
resetSignedDirectory: Boolean? = null,
) {
uiStateFlow.value = uiStateFlow.value.copy(
resetInfo = uiStateFlow.value.resetInfo.copy(
resetSignInfo = resetSignInfo ?: uiStateFlow.value.resetInfo.resetSignInfo,
resetApkTools = resetApkTools ?: uiStateFlow.value.resetInfo.resetApkTools,
resetSignTypes = resetSignTypes ?: uiStateFlow.value.resetInfo.resetSignTypes,
resetSignedDirectory = resetSignedDirectory ?: uiStateFlow.value.resetInfo.resetSignedDirectory
)
)
}
}

fun runRestConfig() {
toggleResetDialog()

val resetConfig = uiStateFlow.value.resetInfo

if (resetConfig.resetSignInfo) {
settings.save(StorageKeys.SIGN_INFO_LIST, null)
settings.save(StorageKeys.SIGN_INFO_SELECT, null)
}
if (resetConfig.resetApkTools) {
settings.save(StorageKeys.APK_SIGNER_PATH, null)
settings.save(StorageKeys.ZIP_ALIGN_PATH, null)
}
if (resetConfig.resetSignTypes) {
settings.save(StorageKeys.SIGN_TYPE_LIST, null)
}
if (resetConfig.resetSignedDirectory) {
settings.save(StorageKeys.SIGNED_DIRECTORY, null)
}
}

fun setupBuildToolsConfig(buildToolDir: String) {
val result = ApkSigner.init(buildToolDir)
saveApkSigner(ApkSigner.apkSignerPath)
saveZipAlign(ApkSigner.zipAlignPath)
saveAapt(ApkSigner.aaptPath)
showToast(result ?: "修改成功")
}

fun saveApkSigner(apkSigner: String?) {
settings.save(StorageKeys.APK_SIGNER_PATH, apkSigner)
}

fun saveZipAlign(zipAlign: String?) {
settings.save(StorageKeys.ZIP_ALIGN_PATH, zipAlign)
}

fun saveAapt(aapt: String?) {
settings.save(StorageKeys.AAPT_PATH, aapt)
}

fun saveAutoMatchSignature(autoMatch: Boolean) {
settings.save(StorageKeys.AUTO_MATCH_SIGNATURE, autoMatch)
}
}

data class SettingInfoUiState(
val apkSign: String? = null,
val zipAlign: String? = null,
val aapt: String? = null,
val isAutoMatchSignature: Boolean = false,
val version: String = "未知",
val resetInfo: SettingInfoResetState = SettingInfoResetState()
)

data class SettingInfoResetState(
val showResetDialog: Boolean = false,
val resetSignInfo: Boolean = false,
val resetApkTools: Boolean = false,
val resetSignTypes: Boolean = false,
val resetSignedDirectory: Boolean = false
)
116 changes: 35 additions & 81 deletions src/main/kotlin/io/github/jixiaoyong/pages/settings/Settings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.ClickableText
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Expand Down Expand Up @@ -52,39 +55,17 @@ fun PageSettingInfo() {
val window = LocalWindow.current
val settings = LocalSettings.current

val viewModel = viewModel { SettingInfoViewModel() }
val version by viewModel.version
val viewModel = viewModel { SettingInfoViewModel(settings) }
val uiState by viewModel.uiState.collectAsState()
val resetConfig = uiState.resetInfo

val apkSign by settings.apkSigner.collectAsState(null)
val zipAlign by settings.zipAlign.collectAsState(null)
val aapt by settings.aapt.collectAsState(null)
val isAutoMatchSignature by settings.isAutoMatchSignature.collectAsState(false)
var showResetDialog by remember { mutableStateOf(false) }

if (showResetDialog) {
var resetSignInfo by remember { mutableStateOf(false) }
var resetApkTools by remember { mutableStateOf(false) }
var resetSignTypes by remember { mutableStateOf(false) }
var resetSignedDirectory by remember { mutableStateOf(false) }
if (resetConfig.showResetDialog) {
AlertDialog(onDismissRequest = {
showResetDialog = false
viewModel.toggleResetDialog()
}, confirmButton = {
ButtonWidget(onClick = {
showResetDialog = false
if (resetSignInfo) {
settings.save(StorageKeys.SIGN_INFO_LIST, null)
settings.save(StorageKeys.SIGN_INFO_SELECT, null)
}
if (resetApkTools) {
settings.save(StorageKeys.APK_SIGNER_PATH, null)
settings.save(StorageKeys.ZIP_ALIGN_PATH, null)
}
if (resetSignTypes) {
settings.save(StorageKeys.SIGN_TYPE_LIST, null)
}
if (resetSignedDirectory) {
settings.save(StorageKeys.SIGNED_DIRECTORY, null)
}
viewModel.runRestConfig()
showToast("重置成功")
}, title = "确定")

}, title = {
Expand All @@ -94,26 +75,28 @@ fun PageSettingInfo() {
Text("重置会清除以下内容,请谨慎操作")
Row(verticalAlignment = Alignment.CenterVertically) {
Checkbox(
checked = resetSignInfo,
onCheckedChange = { resetSignInfo = !resetSignInfo })
checked = resetConfig.resetSignInfo,
onCheckedChange = {
viewModel.updateResetConfig(resetSignInfo = !resetConfig.resetSignInfo)
})
Text("签名信息")
}
Row(verticalAlignment = Alignment.CenterVertically) {
Checkbox(
checked = resetApkTools,
onCheckedChange = { resetApkTools = !resetApkTools })
checked = resetConfig.resetApkTools,
onCheckedChange = { viewModel.updateResetConfig(resetApkTools = !resetConfig.resetApkTools) })
Text("签名工具配置(不会删除文件)")
}
Row(verticalAlignment = Alignment.CenterVertically) {
Checkbox(
checked = resetSignTypes,
onCheckedChange = { resetSignTypes = !resetSignTypes })
checked = resetConfig.resetSignTypes,
onCheckedChange = { viewModel.updateResetConfig(resetSignTypes = !resetConfig.resetSignTypes) })
Text("签名方案")
}
Row(verticalAlignment = Alignment.CenterVertically) {
Checkbox(
checked = resetSignedDirectory,
onCheckedChange = { resetSignedDirectory = !resetSignedDirectory })
checked = resetConfig.resetSignedDirectory,
onCheckedChange = { viewModel.updateResetConfig(resetSignedDirectory = !resetConfig.resetSignedDirectory) })
Text("签名文件输出目录")
}
}
Expand All @@ -127,14 +110,11 @@ fun PageSettingInfo() {
) {
DropBoxPanel(window,
modifier = Modifier.fillMaxWidth().height(100.dp).padding(10.dp)
.background(
color = MaterialTheme.colors.surface,
shape = RoundedCornerShape(15.dp)
)
.background(color = MaterialTheme.colors.surface, shape = RoundedCornerShape(15.dp))
.padding(15.dp)
.clickable {
scope.launch {
val oldDirectory = apkSign?.substringBeforeLast(File.separator)
val oldDirectory = uiState.apkSign?.substringBeforeLast(File.separator)
val chooseFileName =
FileChooseUtil.chooseSignDirectory(
window,
Expand All @@ -144,24 +124,20 @@ fun PageSettingInfo() {
if (chooseFileName.isNullOrBlank()) {
showToast("请选择build-tools目录", ToastConfig.DURATION.Long)
} else {
setupBuildToolsConfig(chooseFileName, settings)
viewModel.setupBuildToolsConfig(chooseFileName)
}
}
},
component = JPanel(),
onFileDrop = {
scope.launch {
setupBuildToolsConfig(it.first(), settings)
}
}) {
onFileDrop = { scope.launch { viewModel.setupBuildToolsConfig(it.first()) } }) {
Text(
text = "请拖拽Android SDK的build-tools的子文件夹到这里,以一次性修改apkSigner和zipAlign目录",
modifier = Modifier.align(alignment = Alignment.Center)
)
}

InfoItemWidget("apk signer目录",
apkSign ?: "尚未初始化",
uiState.apkSign ?: "尚未初始化",
description = "请选择Android SDK中build-tools目录apksigner文件",
onClick = {
scope.launch {
Expand All @@ -171,13 +147,13 @@ fun PageSettingInfo() {
showToast("请选择apksigner文件", ToastConfig.DURATION.Long)
} else {
val result = ApkSigner.setupApkSigner(chooseFileName)
saveApkSigner(settings, ApkSigner.apkSignerPath)
viewModel.saveApkSigner(ApkSigner.apkSignerPath)
showToast(result ?: "修改成功")
}
}

})
InfoItemWidget("zipalign目录", zipAlign ?: "尚未初始化",
InfoItemWidget("zipalign目录", uiState.zipAlign ?: "尚未初始化",
description = "请选择Android SDK中build-tools目录zipalign文件",
onClick = {
scope.launch {
Expand All @@ -186,7 +162,7 @@ fun PageSettingInfo() {
showToast("请选择zipAlign文件", ToastConfig.DURATION.Long)
} else {
val result = ApkSigner.setupZipAlign(chooseFileName)
saveZipAlign(settings, ApkSigner.zipAlignPath)
viewModel.saveZipAlign(ApkSigner.zipAlignPath)
showToast(result ?: "修改成功")
}
}
Expand All @@ -208,15 +184,13 @@ fun PageSettingInfo() {
Text("当只有一个apk文件时,则自动尝试匹配上次使用的签名信息")
}
Switch(
isAutoMatchSignature,
{ autoMatch ->
settings.save(StorageKeys.AUTO_MATCH_SIGNATURE, autoMatch)
},
uiState.isAutoMatchSignature,
{ autoMatch -> viewModel.saveAutoMatchSignature(autoMatch) },
colors = SwitchDefaults.colors(checkedThumbColor = MaterialTheme.colors.secondary)
)
}

if (isAutoMatchSignature) InfoItemWidget("aapt目录", aapt ?: "尚未初始化",
if (uiState.isAutoMatchSignature) InfoItemWidget("aapt目录", uiState.aapt ?: "尚未初始化",
description = "若要自动匹配签名,请正确配置Android SDK中build-tools目录aapt文件",
onClick = {
scope.launch {
Expand All @@ -225,7 +199,7 @@ fun PageSettingInfo() {
showToast("请选择aapt文件", ToastConfig.DURATION.Long)
} else {
val result = ApkSigner.setupAapt(chooseFileName)
saveAapt(settings, ApkSigner.aaptPath)
viewModel.saveAapt(ApkSigner.aaptPath)
showToast(result ?: "修改成功")
}
}
Expand All @@ -234,7 +208,7 @@ fun PageSettingInfo() {

Row(horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth().padding(top = 80.dp)) {
ButtonWidget(
onClick = { showResetDialog = true },
onClick = { viewModel.toggleResetDialog() },
title = "重置",
modifier = Modifier.size(250.dp, 50.dp)
)
Expand All @@ -246,7 +220,7 @@ fun PageSettingInfo() {
horizontalAlignment = Alignment.CenterHorizontally
) {
val str = "这是一个本地可视化签名APK的小工具。为了避免泄漏密钥等信息,本工具不会联网。\n" +
"当前版本:$version,查看最新版本请点击访问:$PROJECT_WEBSITE"
"当前版本:${uiState.version},查看最新版本请点击访问:$PROJECT_WEBSITE"
val startIndex = str.indexOf(PROJECT_WEBSITE)
val endIndex = startIndex + PROJECT_WEBSITE.length

Expand Down Expand Up @@ -281,23 +255,3 @@ fun PageSettingInfo() {
}

}

private fun setupBuildToolsConfig(it: String, settings: SettingsTool) {
val result = ApkSigner.init(it)
saveApkSigner(settings, ApkSigner.apkSignerPath)
saveZipAlign(settings, ApkSigner.zipAlignPath)
saveAapt(settings, ApkSigner.aaptPath)
showToast(result ?: "修改成功")
}

private fun saveApkSigner(settings: SettingsTool, apkSigner: String?) {
settings.save(StorageKeys.APK_SIGNER_PATH, apkSigner)
}

private fun saveZipAlign(settings: SettingsTool, zipAlign: String?) {
settings.save(StorageKeys.ZIP_ALIGN_PATH, zipAlign)
}

private fun saveAapt(settings: SettingsTool, aapt: String?) {
settings.save(StorageKeys.AAPT_PATH, aapt)
}

0 comments on commit 3a9b850

Please sign in to comment.