diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/CustomTextFieldProperty.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/CustomTextFieldProperty.kt index 323f38c..759222b 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/CustomTextFieldProperty.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/CustomTextFieldProperty.kt @@ -24,9 +24,10 @@ data class CustomTextFieldProperty( var colors: OutlinedTextFieldColors? = null, var arrangementData: ArrangementData? = null, var invalidCharRegex: String? = null, - var showKeyboardOnRender : Boolean? = null, + var requestFocusOnRender : Boolean? = null, var cursorHandleColor: String? = null, - var cursorBackgroundColor: String? = null + var cursorBackgroundColor: String? = null, + var textToolBarStatus: String? = null ) : BaseProperty() { override fun copyNonNullFrom(property: BaseProperty?) { @@ -51,9 +52,10 @@ data class CustomTextFieldProperty( customTextFieldProperty?.colors?.let { colors = it } customTextFieldProperty?.arrangementData?.let { arrangementData = it } customTextFieldProperty?.invalidCharRegex?.let { invalidCharRegex = it } - customTextFieldProperty?.showKeyboardOnRender?.let { showKeyboardOnRender = it } + customTextFieldProperty?.requestFocusOnRender?.let { requestFocusOnRender = it } customTextFieldProperty?.cursorHandleColor?.let { cursorHandleColor = it } customTextFieldProperty?.cursorBackgroundColor?.let { cursorBackgroundColor = it } + customTextFieldProperty?.textToolBarStatus?.let { textToolBarStatus = it } } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt index c9633f4..e134d81 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt @@ -13,7 +13,10 @@ import androidx.compose.runtime.* import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.layout.layoutId @@ -21,6 +24,9 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.platform.LocalTextToolbar +import androidx.compose.ui.platform.TextToolbar +import androidx.compose.ui.platform.TextToolbarStatus import androidx.compose.ui.text.* import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp @@ -32,7 +38,8 @@ import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.* import com.navi.uitron.utils.CUSTOM_TEXT_FIELD_DATA import com.navi.uitron.utils.CUSTOM_TEXT_FIELD_PROPERTY -import com.navi.uitron.utils.EMPTY +import com.navi.uitron.utils.HIDE +import com.navi.uitron.utils.REMOVE_FOCUS import com.navi.uitron.utils.ShapeUtil import com.navi.uitron.utils.UI_TRON_VM import com.navi.uitron.viewmodel.UiTronViewModel @@ -113,13 +120,21 @@ class CustomTextFieldRenderer( mutableStateOf(property.colors?.unfocusedBorderColor) } val keyboardController = LocalSoftwareKeyboardController.current + val focusRequester = remember { + FocusRequester() + } - val customTextSelectionColors by remember(property?.cursorBackgroundColor,property?.cursorHandleColor) { + val customTextSelectionColors by remember( + property.cursorBackgroundColor, + property.cursorHandleColor + ) { mutableStateOf( getCustomTextSelectionColor(property) ) } + val localTextToolBar = LocalTextToolbar.current + if (property.visible.orTrue()) { Column( modifier = Modifier @@ -180,7 +195,11 @@ class CustomTextFieldRenderer( .layoutId(property.layoutId.orEmpty()) ) { CompositionLocalProvider( - LocalTextSelectionColors provides customTextSelectionColors + LocalTextSelectionColors provides customTextSelectionColors, + LocalTextToolbar provides getTextToolbar( + property.textToolBarStatus, + localTextToolBar + ) ) { BasicTextField( modifier = Modifier @@ -206,7 +225,8 @@ class CustomTextFieldRenderer( ?: ContentAlignmentType.CenterStart.name ) ) - .fillMaxWidth(), + .fillMaxWidth() + .focusRequester(focusRequester = focusRequester), textStyle = TextStyle( fontSize = property.inputTextProperty?.textStyle?.fontSize?.sp ?: 14.sp, @@ -302,9 +322,11 @@ class CustomTextFieldRenderer( } } } - LaunchedEffect(key1 = Unit) { - if (property.showKeyboardOnRender.orFalse()) { - keyboardController?.show() + LaunchedEffect(property.requestFocusOnRender) { + if (property.requestFocusOnRender.orFalse()) { + focusRequester.requestFocus() + property.requestFocusOnRender = false + uiTronViewModel.handle[property.getPropertyId()] = REMOVE_FOCUS } } } @@ -387,14 +409,35 @@ class CustomTextFieldRenderer( property.cursorHandleColor?.hexToComposeColor ?: colorPurple.hexToComposeColor val cursorBackgroundColor = property.cursorBackgroundColor?.hexToComposeColor - ?: ( - property.cursorHandleColor?.hexToComposeColor?.copy(alpha = alpha) - ?: colorPurple.hexToComposeColor.copy(alpha = alpha) - ) + ?: (property.cursorHandleColor?.hexToComposeColor?.copy(alpha = alpha) + ?: colorPurple.hexToComposeColor.copy(alpha = alpha)) return TextSelectionColors( handleColor = cursorHandleColor, backgroundColor = cursorBackgroundColor ) } -} \ No newline at end of file + + private fun getTextToolbar( + textToolbarStatus: String?, + localTextToolbar: TextToolbar + ): TextToolbar { + if (textToolbarStatus.orEmpty() == HIDE) { + return EmptyTextToolbar + } + return localTextToolbar + } +} + +object EmptyTextToolbar : TextToolbar { + override val status: TextToolbarStatus = TextToolbarStatus.Hidden + override fun hide() {} + override fun showMenu( + rect: Rect, + onCopyRequested: (() -> Unit)?, + onPasteRequested: (() -> Unit)?, + onCutRequested: (() -> Unit)?, + onSelectAllRequested: (() -> Unit)?, + ) { + } +} diff --git a/navi-uitron/src/main/java/com/navi/uitron/utils/Constants.kt b/navi-uitron/src/main/java/com/navi/uitron/utils/Constants.kt index 7d6483d..0ee0a46 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/utils/Constants.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/utils/Constants.kt @@ -7,6 +7,7 @@ const val DEFAULT_FORMAT_PATTERN = "ddMMyyyy" const val PACKAGE_COLON = "package:" const val STOP = "stop" const val DISABLE_RESTART_TIMER = "disableRestartTimer" +const val REMOVE_FOCUS = "removeFocus" const val KEY_MVEL_ACTION = "mvelAction" const val KEY_UI_TRON_DATA = "uiTronData" @@ -21,4 +22,5 @@ const val UUID_CONSTANT = "UUID" const val RESULT = "result" const val CUSTOM_TEXT_FIELD_DATA ="customTextFieldData" const val CUSTOM_TEXT_FIELD_PROPERTY ="customTextFieldProperty" -const val UI_TRON_VM ="uiTronVM" \ No newline at end of file +const val UI_TRON_VM ="uiTronVM" +const val HIDE = "HIDE" \ No newline at end of file