diff --git a/app/src/main/java/org/autojs/autojs/ui/build/BuildPage.kt b/app/src/main/java/org/autojs/autojs/ui/build/BuildPage.kt index a8b27f13f..46cca2e5c 100644 --- a/app/src/main/java/org/autojs/autojs/ui/build/BuildPage.kt +++ b/app/src/main/java/org/autojs/autojs/ui/build/BuildPage.kt @@ -11,19 +11,52 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.ZeroCornerSize import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll -import androidx.compose.material.* +import androidx.compose.material.AlertDialog +import androidx.compose.material.Card +import androidx.compose.material.Checkbox +import androidx.compose.material.ContentAlpha +import androidx.compose.material.Divider +import androidx.compose.material.FabPosition +import androidx.compose.material.FloatingActionButton +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.LocalContentAlpha +import androidx.compose.material.LocalTextStyle +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Scaffold +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.material.TextField +import androidx.compose.material.TextFieldColors +import androidx.compose.material.TextFieldDefaults +import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Done -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusDirection @@ -47,7 +80,6 @@ import com.stardust.pio.PFile import com.stardust.pio.PFiles import com.stardust.util.IntentUtil import org.autojs.autojs.Pref -import org.autojs.autoxjs.R import org.autojs.autojs.build.ApkKeyStore import org.autojs.autojs.build.ApkSigner import org.autojs.autojs.external.fileprovider.AppFileProvider @@ -55,7 +87,9 @@ import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder import org.autojs.autojs.ui.compose.widget.ProgressDialog import org.autojs.autojs.ui.filechooser.FileChooserDialogBuilder import org.autojs.autojs.ui.shortcut.ShortcutIconSelectResult +import org.autojs.autoxjs.R import java.io.File +import kotlin.reflect.KMutableProperty0 /** * @author wilinz @@ -226,42 +260,18 @@ private fun PackagingOptionCard( onValueChange = { model.abiList = it }, label = { Text(text = stringResource(id = R.string.text_abi)) } ) - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredOpenCv, - onCheckedChange = { model.isRequiredOpenCv = it }) - Text(text = stringResource(id = R.string.text_required_opencv)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredMlKitOCR, - onCheckedChange = { model.isRequiredMlKitOCR = it }) - Text(text = stringResource(id = R.string.text_required_google_mlkit_ocr)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredPaddleOCR, - onCheckedChange = { model.isRequiredPaddleOCR = it }) - Text(text = stringResource(id = R.string.text_required_paddle_ocr)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredTesseractOCR, - onCheckedChange = { model.isRequiredTesseractOCR = it }) - Text(text = stringResource(id = R.string.text_required_tesseract_ocr)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequired7Zip, - onCheckedChange = { model.isRequired7Zip = it }) - Text(text = stringResource(id = R.string.text_required_7zip)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredDefaultOcrModelData, - onCheckedChange = { model.isRequiredDefaultOcrModelData = it }) - Text(text = stringResource(id = R.string.text_required_default_paddle_ocr_model)) + val map = mapOf( + stringResource(id = R.string.text_required_opencv) to model::isRequiredOpenCv, + stringResource(id = R.string.text_required_google_mlkit_ocr) to model::isRequiredMlKitOCR, + stringResource(id = R.string.text_required_paddle_ocr) to model::isRequiredPaddleOCR, + stringResource(id = R.string.text_required_tesseract_ocr) to model::isRequiredTesseractOCR, + stringResource(id = R.string.text_required_7zip) to model::isRequired7Zip, + stringResource(id = R.string.text_required_default_paddle_ocr_model) to model::isRequiredDefaultOcrModelData, + ) + for ((t, v) in map) { + CheckboxOption(v, t) } + //目前必须为true /*Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( @@ -273,6 +283,21 @@ private fun PackagingOptionCard( } } +@Composable +fun CheckboxOption(value: KMutableProperty0, name: String) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { value.set(!value.get()) }, + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = value.get(), + onCheckedChange = { value.set(it) }) + Text(text = name) + } +} + @Composable private fun SignatureCard( model: BuildViewModel @@ -311,7 +336,7 @@ private fun RunConfigCard(model: BuildViewModel) { } ) - Card() { + Card { Column( Modifier .fillMaxSize() @@ -324,60 +349,21 @@ private fun RunConfigCard(model: BuildViewModel) { label = { Text(text = stringResource(id = R.string.text_main_file_name)) }, ) Spacer(modifier = Modifier.height(8.dp)) - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isHideLauncher, - onCheckedChange = { model.isHideLauncher = it }) - Text(text = stringResource(id = R.string.text_hideLaucher)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isStableMode, - onCheckedChange = { model.isStableMode = it }) - Text(text = stringResource(id = R.string.text_stable_mode)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isHideLogs, - onCheckedChange = { model.isHideLogs = it }) - Text(text = stringResource(id = R.string.text_hideLogs)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isVolumeUpControl, - onCheckedChange = { model.isVolumeUpControl = it }) - Text(text = stringResource(id = R.string.text_volumeUpcontrol)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredAccessibilityServices, - onCheckedChange = { model.isRequiredAccessibilityServices = it }) - Text(text = stringResource(id = R.string.text_required_accessibility_service)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isHideAccessibilityServices, - onCheckedChange = { model.isHideAccessibilityServices = it }) - Text(text = stringResource(id = R.string.text_hide_accessibility_services)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredBackgroundStart, - onCheckedChange = { model.isRequiredBackgroundStart = it }) - Text(text = stringResource(id = R.string.text_required_background_start)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.isRequiredDrawOverlay, - onCheckedChange = { model.isRequiredDrawOverlay = it }) - Text(text = stringResource(id = R.string.text_required_draw_overlay)) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = model.displaySplash, - onCheckedChange = { model.displaySplash = it }) - Text(text = stringResource(id = R.string.text_display_splash)) + val map = mapOf( + stringResource(id = R.string.text_hideLaucher) to model::isHideLauncher, + stringResource(id = R.string.text_stable_mode) to model::isStableMode, + stringResource(id = R.string.text_hideLogs) to model::isHideLogs, + stringResource(id = R.string.text_volumeUpcontrol) to model::isVolumeUpControl, + stringResource(id = R.string.text_required_accessibility_service) to model::isRequiredAccessibilityServices, + stringResource(id = R.string.text_hide_accessibility_services) to model::isHideAccessibilityServices, + stringResource(id = R.string.text_required_background_start) to model::isRequiredBackgroundStart, + stringResource(id = R.string.text_required_draw_overlay) to model::isRequiredDrawOverlay, + stringResource(id = R.string.text_display_splash) to model::displaySplash + ) + for ((t, v) in map) { + CheckboxOption(v, t) } + MyTextField( value = model.splashText, onValueChange = { model.splashText = it }, diff --git a/app/src/main/java/org/autojs/autojs/ui/build/BuildViewModel.kt b/app/src/main/java/org/autojs/autojs/ui/build/BuildViewModel.kt index 9175d72d6..fbd759367 100644 --- a/app/src/main/java/org/autojs/autojs/ui/build/BuildViewModel.kt +++ b/app/src/main/java/org/autojs/autojs/ui/build/BuildViewModel.kt @@ -253,8 +253,8 @@ class BuildViewModel(private val app: Application, private var source: String) : projectDirectory = directory!! outputPath = viewModel.outputPath assets = updateAssets(assets) - libs = updateLibs(libs).toMutableList() - abis = updateAbiList(abis).toMutableList() + updateLibs(libs) + updateAbiList(abis) if (ignoredDirs.isEmpty()) ignoredDirs = listOf(buildDir) name = viewModel.appName versionCode = viewModel.versionCode.toInt() @@ -271,7 +271,7 @@ class BuildViewModel(private val app: Application, private var source: String) : splashText = viewModel.splashText splashIcon = viewModel.splashIcon?.toRelativePathOrString() serviceDesc = viewModel.serviceDesc - permissions = updatePermissions(permissions) + permissions = updatePermissions() isHideAccessibilityServices = viewModel.isHideAccessibilityServices } signingConfig.apply { @@ -345,15 +345,6 @@ class BuildViewModel(private val app: Application, private var source: String) : ) ) } -// if (customOcrModelPath.isNotBlank()) { -// val dirName = File(customOcrModelPath).name -// assetsList.add( -// Asset( -// form = customOcrModelPath, -// to = "/${Constant.Assets.OCR_MODELS}/$dirName" -// ) -// ) -// } if (!isSingleFile) { assetsList.addIfNotExist( Asset( @@ -365,28 +356,29 @@ class BuildViewModel(private val app: Application, private var source: String) : return assetsList.distinct() } - private fun updateAbiList(oldAbis: List): List { - val newAbis = abiList.split(",").map { it.trim() } - return oldAbis.toMutableList().apply { addAllIfNotExist(newAbis) }.distinct() + private fun updateAbiList(aLibs: MutableList) { + aLibs.clear() + abiList.split(",").forEach { + aLibs.add(it.trim()) + } } - private fun updateLibs(oldLibs: List): List { - val libList = oldLibs.toMutableList() - if (isRequiredOpenCv) libList.addAllIfNotExist(Constant.Libraries.OPEN_CV) - if (isRequiredPaddleOCR) libList.addAllIfNotExist(Constant.Libraries.PADDLE_OCR) - if (isRequiredMlKitOCR) libList.addAllIfNotExist(Constant.Libraries.GOOGLE_ML_KIT_OCR) - if (isRequiredTesseractOCR) libList.addAllIfNotExist(Constant.Libraries.TESSERACT_OCR) - if (isRequired7Zip) libList.addAllIfNotExist(Constant.Libraries.P7ZIP) - if (isRequiredTerminalEmulator) libList.addAllIfNotExist(Constant.Libraries.TERMINAL_EMULATOR) - return libList.distinct() + private fun updateLibs(libs: MutableList) { + libs.clear() + if (isRequiredOpenCv) libs.addAll(Constant.Libraries.OPEN_CV) + if (isRequiredPaddleOCR) libs.addAll(Constant.Libraries.PADDLE_OCR) + if (isRequiredMlKitOCR) libs.addAll(Constant.Libraries.GOOGLE_ML_KIT_OCR) + if (isRequiredTesseractOCR) libs.addAll(Constant.Libraries.TESSERACT_OCR) + if (isRequired7Zip) libs.addAll(Constant.Libraries.P7ZIP) + if (isRequiredTerminalEmulator) libs.addAll(Constant.Libraries.TERMINAL_EMULATOR) } - private fun updatePermissions(oldPermissions: List): List { - val permissionList = oldPermissions.toMutableList() - if (isRequiredAccessibilityServices) permissionList.addIfNotExist(Constant.Permissions.ACCESSIBILITY_SERVICES) - if (isRequiredBackgroundStart) permissionList.addIfNotExist(Constant.Permissions.BACKGROUND_START) - if (isRequiredDrawOverlay) permissionList.addIfNotExist(Constant.Permissions.DRAW_OVERLAY) - return permissionList.distinct() + private fun updatePermissions(): List { + val permissionList = ArrayList() + if (isRequiredAccessibilityServices) permissionList.add(Constant.Permissions.ACCESSIBILITY_SERVICES) + if (isRequiredBackgroundStart) permissionList.add(Constant.Permissions.BACKGROUND_START) + if (isRequiredDrawOverlay) permissionList.add(Constant.Permissions.DRAW_OVERLAY) + return permissionList } @@ -410,15 +402,11 @@ class BuildViewModel(private val app: Application, private var source: String) : var isRequiredMlKitOCRLibs = false var isRequiredMlKitOCRModels = false projectConfig.libs.let { - when { - it.containsAll(Constant.Libraries.GOOGLE_ML_KIT_OCR) -> isRequiredMlKitOCRLibs = - true - - it.containsAll(Constant.Libraries.PADDLE_OCR) -> isRequiredPaddleOCR = true - it.containsAll(Constant.Libraries.TESSERACT_OCR) -> isRequiredTesseractOCR = true - it.containsAll(Constant.Libraries.P7ZIP) -> isRequired7Zip = true - it.containsAll(Constant.Libraries.OPEN_CV) -> isRequiredOpenCv = true - } + isRequiredMlKitOCRLibs = it.containsAll(Constant.Libraries.GOOGLE_ML_KIT_OCR) + isRequiredPaddleOCR = it.containsAll(Constant.Libraries.PADDLE_OCR) + isRequiredTesseractOCR = it.containsAll(Constant.Libraries.TESSERACT_OCR) + isRequired7Zip = it.containsAll(Constant.Libraries.P7ZIP) + isRequiredOpenCv = it.containsAll(Constant.Libraries.OPEN_CV) } projectConfig.assets.forEach { if (it.form == "${Constant.Protocol.ASSETS}${Constant.Assets.GOOGLE_ML_KIT_OCR}") { @@ -428,18 +416,23 @@ class BuildViewModel(private val app: Application, private var source: String) : isRequiredDefaultOcrModelData = true } } - isRequiredMlKitOCR = isRequiredMlKitOCRLibs && isRequiredMlKitOCRModels } private fun setPermissions(projectConfig: ProjectConfig) { projectConfig.launchConfig.permissions.forEach { when (it) { - Constant.Permissions.ACCESSIBILITY_SERVICES -> isRequiredAccessibilityServices = - true + Constant.Permissions.ACCESSIBILITY_SERVICES -> { + isRequiredAccessibilityServices = true + } - Constant.Permissions.BACKGROUND_START -> isRequiredBackgroundStart = true - Constant.Permissions.DRAW_OVERLAY -> isRequiredDrawOverlay = true + Constant.Permissions.BACKGROUND_START -> { + isRequiredBackgroundStart = true + } + + Constant.Permissions.DRAW_OVERLAY -> { + isRequiredDrawOverlay = true + } } } }