Skip to content

Commit

Permalink
feat: 使用toast替代部分snackbar
Browse files Browse the repository at this point in the history
  • Loading branch information
jixiaoyong committed Jan 30, 2024
1 parent 3a321a1 commit add9394
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 40 deletions.
4 changes: 4 additions & 0 deletions src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import io.github.jixiaoyong.pages.signapp.PageSignApp
import io.github.jixiaoyong.theme.AppTheme
import io.github.jixiaoyong.utils.AppProcessUtil
import io.github.jixiaoyong.utils.SettingsTool
import io.github.jixiaoyong.utils.ToasterUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -73,6 +74,8 @@ fun App(window: ComposeWindow) {
isDarkTheme = isDark
}

ToasterUtil.init(isDarkTheme)

LaunchedEffect(Unit) {
settings.apkSigner.first()?.let { ApkSigner.setupApkSigner(it) }
settings.zipAlign.first()?.let { ApkSigner.setupZipAlign(it) }
Expand Down Expand Up @@ -109,6 +112,7 @@ fun App(window: ComposeWindow) {
}
}
Divider(color = MaterialTheme.colors.surface)

when (pageIndex.value) {
Routes.SignInfo -> PageSignInfo(window, settings, newSignInfo)

Expand Down
35 changes: 16 additions & 19 deletions src/main/kotlin/io/github/jixiaoyong/pages/settings/Settings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import io.github.jixiaoyong.pages.signapp.DropBoxPanel
import io.github.jixiaoyong.utils.FileChooseUtil
import io.github.jixiaoyong.utils.SettingsTool
import io.github.jixiaoyong.utils.StorageKeys
import io.github.jixiaoyong.utils.*
import io.github.jixiaoyong.widgets.ButtonWidget
import io.github.jixiaoyong.widgets.InfoItemWidget
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -133,12 +131,12 @@ fun PageSettingInfo(window: ComposeWindow, settings: SettingsTool) {
oldDirectory
)
if (chooseFileName.isNullOrBlank()) {
scaffoldState.snackbarHostState.showSnackbar("请选择build-tools目录")
showToast("请选择build-tools目录",ToastConfig.DURATION.Long)
} else {
val result = ApkSigner.init(chooseFileName)
saveApkSigner(settings, ApkSigner.apkSignerPath)
saveZipAlign(settings, ApkSigner.zipAlignPath)
scaffoldState.snackbarHostState.showSnackbar(result ?: "修改成功")
showToast(result ?: "修改成功")
}
}
},
Expand All @@ -149,8 +147,7 @@ fun PageSettingInfo(window: ComposeWindow, settings: SettingsTool) {

saveApkSigner(settings, ApkSigner.apkSignerPath)
saveZipAlign(settings, ApkSigner.zipAlignPath)

scaffoldState.snackbarHostState.showSnackbar(result ?: "修改成功")
showToast(result ?: "修改成功")
}
}) {
Text(
Expand All @@ -167,29 +164,29 @@ fun PageSettingInfo(window: ComposeWindow, settings: SettingsTool) {
val chooseFileName =
FileChooseUtil.chooseSignFile(window, "请选择apksigner文件")
if (chooseFileName.isNullOrBlank()) {
scaffoldState.snackbarHostState.showSnackbar("请选择apksigner文件")
showToast("请选择apksigner文件",ToastConfig.DURATION.Long)
} else {
val result = ApkSigner.setupApkSigner(chooseFileName)
saveApkSigner(settings, ApkSigner.apkSignerPath)
scaffoldState.snackbarHostState.showSnackbar(result ?: "修改成功")
showToast(result ?: "修改成功")
}
}

})
InfoItemWidget("zipalign目录", zipAlign ?: "尚未初始化",
description = "请选择Android SDK中build-tools目录zipalign文件",
onClick = {
scope.launch {
val chooseFileName = FileChooseUtil.chooseSignFile(window, "请选择zipAlign文件")
if (chooseFileName.isNullOrBlank()) {
scaffoldState.snackbarHostState.showSnackbar("请选择zipAlign文件")
} else {
val result = ApkSigner.setupZipAlign(chooseFileName)
saveZipAlign(settings, ApkSigner.zipAlignPath)
scaffoldState.snackbarHostState.showSnackbar(result ?: "修改成功")
scope.launch {
val chooseFileName = FileChooseUtil.chooseSignFile(window, "请选择zipAlign文件")
if (chooseFileName.isNullOrBlank()) {
showToast("请选择zipAlign文件",ToastConfig.DURATION.Long)
} else {
val result = ApkSigner.setupZipAlign(chooseFileName)
saveZipAlign(settings, ApkSigner.zipAlignPath)
showToast(result ?: "修改成功")
}
}
}
})
})

Row(horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth()) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,7 @@ import androidx.compose.ui.text.style.LineBreak
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.github.jixiaoyong.utils.FileChooseUtil
import io.github.jixiaoyong.utils.SettingsTool
import io.github.jixiaoyong.utils.StorageKeys
import io.github.jixiaoyong.utils.gson
import io.github.jixiaoyong.utils.*
import io.github.jixiaoyong.widgets.ButtonWidget
import io.github.jixiaoyong.widgets.HoverableTooltip
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -160,7 +157,7 @@ fun PageSignInfo(window: ComposeWindow, settings: SettingsTool, newSignInfo: Mut
val result =
FileChooseUtil.chooseSignFile(window, "请选择Android签名文件")
if (result.isNullOrBlank()) {
scaffoldState.snackbarHostState.showSnackbar("请选择Android签名文件")
showToast("请选择Android签名文件")
} else {
newSignInfo.value = newSignInfo.value.copy(keyStorePath = result)
}
Expand Down
31 changes: 15 additions & 16 deletions src/main/kotlin/io/github/jixiaoyong/pages/signapp/SignApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import androidx.compose.ui.window.Popup
import io.github.jixiaoyong.utils.FileChooseUtil
import io.github.jixiaoyong.utils.SettingsTool
import io.github.jixiaoyong.utils.StorageKeys
import io.github.jixiaoyong.utils.showToast
import io.github.jixiaoyong.widgets.ButtonWidget
import io.github.jixiaoyong.widgets.InfoItemWidget
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -115,7 +116,7 @@ fun PageSignApp(

is CommandResult.Error<*> -> {
scope.launch {
scaffoldState.snackbarHostState.showSnackbar("查询签名失败:${local.message}")
showToast("查询签名失败:${local.message}")
}
}

Expand Down Expand Up @@ -168,7 +169,7 @@ fun PageSignApp(
name.toLowerCase(Locale.getDefault()).endsWith(".apk")
})
if (chooseFileName.isNullOrEmpty()) {
scaffoldState.snackbarHostState.showSnackbar("请选择要签名的apk文件")
showToast("请选择要签名的apk文件")
} else {
onChangeApk(chooseFileName)
if (!signedDirectory.isNullOrBlank()) {
Expand All @@ -177,7 +178,7 @@ fun PageSignApp(
chooseFileName.first().substringBeforeLast(File.separator)
)
}
scaffoldState.snackbarHostState.showSnackbar("修改成功")
showToast("修改成功")
}
}
},
Expand All @@ -188,10 +189,10 @@ fun PageSignApp(
it.lowercase(Locale.getDefault()).endsWith(".apk")
}
if (file.isNullOrEmpty()) {
scaffoldState.snackbarHostState.showSnackbar("请先选择正确的apk文件")
showToast("请先选择正确的apk文件")
} else {
onChangeApk(file)
scaffoldState.snackbarHostState.showSnackbar("选择apk文件成功")
showToast("选择apk文件成功")
}
}
}
Expand All @@ -209,7 +210,7 @@ fun PageSignApp(
onClick = {
scope.launch(Dispatchers.IO) {
if (currentApkFilePath.isEmpty()) {
scaffoldState.snackbarHostState.showSnackbar("请先选择apk文件")
showToast("请先选择apk文件")
} else {
signInfoResult = CommandResult.EXECUTING
val resultList = currentApkFilePath.map { ApkSigner.getApkSignInfo(it) }
Expand Down Expand Up @@ -239,10 +240,10 @@ fun PageSignApp(
signedDirectory ?: currentApkFilePath.firstOrNull()
)
if (outputDirectory.isNullOrBlank()) {
scaffoldState.snackbarHostState.showSnackbar(errorTips)
showToast(errorTips)
} else {
settings.save(StorageKeys.SIGNED_DIRECTORY, outputDirectory)
scaffoldState.snackbarHostState.showSnackbar("修改成功")
showToast("修改成功")
}
}
}
Expand Down Expand Up @@ -276,7 +277,7 @@ fun PageSignApp(
contentDescription = item.description,
modifier = Modifier.padding(end = 10.dp).size(18.dp).clickable {
scope.launch {
scaffoldState.snackbarHostState.showSnackbar(item.description)
showToast(item.description)
}
})
}
Expand Down Expand Up @@ -315,25 +316,25 @@ fun PageSignApp(
if (currentApkFilePath.filter { it.lowercase(Locale.getDefault()).endsWith(".apk") }
.isNullOrEmpty()
) {
scaffoldState.snackbarHostState.showSnackbar("请先选择正确的apk文件")
showToast("请先选择正确的apk文件")
return@launch
}

val localSelectedSignInfo = selectedSignInfo
if (null == localSelectedSignInfo || !localSelectedSignInfo.isValid()) {
onChangePage(Routes.SignInfo)
scaffoldState.snackbarHostState.showSnackbar("请先配置正确的签名文件")
showToast("请先配置正确的签名文件")
return@launch
}

if (!ApkSigner.isInitialized()) {
onChangePage(Routes.SettingInfo)
scaffoldState.snackbarHostState.showSnackbar("请先配置apksigner和zipalign路径")
showToast("请先配置apksigner和zipalign路径")
return@launch
}

if (apkSignType.isEmpty()) {
scaffoldState.snackbarHostState.showSnackbar("请至少选择一种签名方式")
showToast("请至少选择一种签名方式")
return@launch
}

Expand Down Expand Up @@ -379,9 +380,7 @@ fun PageSignApp(
Desktop.getDesktop().open(file.parentFile)
}
} else if (mergedResult is CommandResult.Error<*>) {
scaffoldState.snackbarHostState.showSnackbar(
"签名失败:${mergedResult.message}",
)
showToast("签名失败:${mergedResult.message}")
}

signApkResult = CommandResult.NOT_EXECUT
Expand Down
86 changes: 86 additions & 0 deletions src/main/kotlin/io/github/jixiaoyong/utils/ToasterUtil.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package io.github.jixiaoyong.utils

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupProperties
import kotlinx.coroutines.delay
import java.util.*
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds

/**
* @author : jixiaoyong
* @description :toast
*
* @email : jixiaoyong1995@gmail.com
* @date : 30/1/2024
*/
object ToasterUtil {

private var toastConfig: MutableState<ToastConfig?> = mutableStateOf(null)

@Composable
fun init(isDarkTheme: Boolean) {
val backgroundColor = if (isDarkTheme) Color.White else Color.Black
val fontColor = if (isDarkTheme) Color.Black else Color.White
val config = toastConfig.value
if (null != config && config.msg.isNotBlank()) {
Popup(
alignment = Alignment.BottomCenter,
properties = PopupProperties(
dismissOnBackPress = false,
dismissOnClickOutside = false,
clippingEnabled = false
)
) {
Row(
modifier = Modifier.padding(bottom = 100.dp)
.padding(horizontal = 10.dp, vertical = 5.dp)
.background(color = backgroundColor.copy(alpha = 0.8f), shape = RoundedCornerShape(5.dp))
.padding(horizontal = 15.dp, vertical = 10.dp),
) {
Text(config.msg, color = fontColor, maxLines = 2, overflow = TextOverflow.Ellipsis)
}
}
}

LaunchedEffect(toastConfig.value) {
val config = toastConfig.value
if (null != config) {
delay(config.duration.duration)
toastConfig.value = null
}
}
}

fun show(msg: String, duration: ToastConfig.DURATION = ToastConfig.DURATION.Short) {
toastConfig.value = ToastConfig(msg, duration)
}

}

data class ToastConfig(val msg: String, val duration: DURATION, val id: UUID = UUID.randomUUID()) {

sealed class DURATION(val duration: Duration) {
object Short : DURATION(1.seconds)
object Long : DURATION(3.5.seconds)
data class Custom(val customDuration: Duration) : DURATION(customDuration)
}
}

fun showToast(msg: String, duration: ToastConfig.DURATION = ToastConfig.DURATION.Short) {
ToasterUtil.show(msg, duration)
}

0 comments on commit add9394

Please sign in to comment.