From d7304a4dff39796d963af77c5276897264d3da4e Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Sat, 12 Jul 2025 16:22:30 +0800 Subject: [PATCH 01/13] =?UTF-8?q?ci:=20=F0=9F=8E=A1=20ignore=20project=20c?= =?UTF-8?q?overage=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codecov.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/codecov.yml b/codecov.yml index bfdc987..0b449d9 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,8 +1,9 @@ -coverage: - status: - project: - default: - informational: true - patch: - default: - informational: true + <<<<<<< HEAD + coverage: + status: + project: + default: + informational: true + patch: + default: + informational: true From d052d919446c91886848491729e5fb99b8fc65b5 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Fri, 11 Jul 2025 14:59:05 +0800 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20replace=20delete?= =?UTF-8?q?=20text=20with=20icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt | 9 ++++----- app/src/main/res/drawable/ic_backspace_filled.xml | 5 +++++ app/src/main/res/drawable/ic_backspace_outlined.xml | 5 +++++ 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_backspace_filled.xml create mode 100644 app/src/main/res/drawable/ic_backspace_outlined.xml diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt index e89900f..5922f92 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt @@ -99,11 +99,10 @@ fun ControlKeyButtonRow( onClick = deleteButtonAction, isDarkTheme = isDarkTheme, content = { - Text( - "⌫", - color = keyColor, - fontSize = 18.sp, - textAlign = TextAlign.Center + Icon( + painter = painterResource(R.drawable.ic_backspace_outlined), + tint = keyColor, + contentDescription = "Delete" ) } ) diff --git a/app/src/main/res/drawable/ic_backspace_filled.xml b/app/src/main/res/drawable/ic_backspace_filled.xml new file mode 100644 index 0000000..4069f83 --- /dev/null +++ b/app/src/main/res/drawable/ic_backspace_filled.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_backspace_outlined.xml b/app/src/main/res/drawable/ic_backspace_outlined.xml new file mode 100644 index 0000000..a014f24 --- /dev/null +++ b/app/src/main/res/drawable/ic_backspace_outlined.xml @@ -0,0 +1,5 @@ + + + + + From f28d15babcd715df98ac3141d2ef75aa6874601f Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Fri, 11 Jul 2025 15:19:35 +0800 Subject: [PATCH 03/13] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20onLongPress?= =?UTF-8?q?=20action=20to=20toggle=20smart=20delete=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyboard/ui/buttons/ControlKeyButton.kt | 11 +++++++++-- .../keyboard/ui/rows/ControlKeyButtonRow.kt | 15 ++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt index 2398c9f..aaa037f 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt @@ -1,10 +1,11 @@ package com.rickyhu.hushkeyboard.keyboard.ui.buttons -import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -17,11 +18,17 @@ import com.rickyhu.hushkeyboard.theme.LightSecondary fun ControlKeyButton( modifier: Modifier = Modifier, onClick: () -> Unit, + onLongClick: (() -> Unit)? = null, isDarkTheme: Boolean, content: @Composable () -> Unit ) { KeyButton( - modifier = modifier.clickable(onClick = onClick), + modifier = modifier.pointerInput(Unit) { + detectTapGestures( + onTap = { onClick() }, + onLongPress = { onLongClick?.invoke() } + ) + }, buttonColor = if (isDarkTheme) DarkSecondary else LightSecondary, content = content ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt index 5922f92..6395cde 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt @@ -8,6 +8,10 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag @@ -94,13 +98,22 @@ fun ControlKeyButtonRow( ) } ) + + var isSmartDelete by remember { mutableStateOf(false) } ControlKeyButton( modifier = controlKeyModifier.testTag("DeleteButton"), onClick = deleteButtonAction, + onLongClick = { isSmartDelete = !isSmartDelete }, isDarkTheme = isDarkTheme, content = { Icon( - painter = painterResource(R.drawable.ic_backspace_outlined), + painter = if (isSmartDelete) { + painterResource(R.drawable.ic_backspace_filled) + } else { + painterResource( + R.drawable.ic_backspace_outlined + ) + }, tint = keyColor, contentDescription = "Delete" ) From 4592f0faf99031779f1a82f4b75c097d586a27c3 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Fri, 11 Jul 2025 15:50:29 +0800 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20smart=20dele?= =?UTF-8?q?te=20to=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rickyhu/hushkeyboard/data/AppSettings.kt | 5 +- .../hushkeyboard/data/SettingsRepository.kt | 4 ++ .../hushkeyboard/keyboard/HushKeyboardView.kt | 2 + .../keyboard/KeyboardViewModel.kt | 2 + .../keyboard/ui/rows/ControlKeyButtonRow.kt | 15 ++---- .../hushkeyboard/settings/SettingsScreen.kt | 7 +++ .../settings/SettingsViewModel.kt | 12 ++++- .../settings/ui/SmartDeleteSwitchItem.kt | 48 +++++++++++++++++++ 8 files changed, 81 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/rickyhu/hushkeyboard/settings/ui/SmartDeleteSwitchItem.kt diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt b/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt index 5446521..2b7a9b4 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt @@ -5,9 +5,10 @@ import kotlinx.serialization.Serializable @Serializable data class AppSettings( val themeOption: ThemeOption = ThemeOption.System, + val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW, + val smartDelete: Boolean = false, val addSpaceAfterNotation: Boolean = true, - val vibrateOnTap: Boolean = true, - val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW + val vibrateOnTap: Boolean = true ) enum class ThemeOption { System, Light, Dark } diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/data/SettingsRepository.kt b/app/src/main/java/com/rickyhu/hushkeyboard/data/SettingsRepository.kt index f627508..d0489a9 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/data/SettingsRepository.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/data/SettingsRepository.kt @@ -22,6 +22,10 @@ class SettingsRepository @Inject constructor( dataStore.updateData { it.copy(wideNotationOption = wideNotationOption) } } + suspend fun updateSmartDelete(smartDelete: Boolean) { + dataStore.updateData { it.copy(smartDelete = smartDelete) } + } + suspend fun updateAddSpaceBetweenNotation(addSpaceBetweenNotation: Boolean) { dataStore.updateData { it.copy(addSpaceAfterNotation = addSpaceBetweenNotation) } } diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt index 81e9758..2011140 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt @@ -99,6 +99,7 @@ fun HushKeyboardContent(state: KeyboardState) { ControlKeyButtonRow( turns = keyConfigState.turns, isDarkTheme = isDarkTheme, + smartDelete = state.smartDelete, inputMethodButtonAction = { inputMethodManager.showInputMethodPicker() if (state.vibrateOnTap) vibratorManager?.maybeVibrate() @@ -143,6 +144,7 @@ fun HushKeyboardPreview() { state = KeyboardState( themeOption = ThemeOption.System, addSpaceAfterNotation = true, + smartDelete = false, vibrateOnTap = true, wideNotationOption = WideNotationOption.WideWithW ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt index 962f311..22d80c4 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt @@ -23,6 +23,7 @@ class KeyboardViewModel @Inject constructor( KeyboardState( themeOption = settings.themeOption, addSpaceAfterNotation = settings.addSpaceAfterNotation, + smartDelete = settings.smartDelete, vibrateOnTap = settings.vibrateOnTap, wideNotationOption = settings.wideNotationOption ) @@ -32,6 +33,7 @@ class KeyboardViewModel @Inject constructor( data class KeyboardState( val themeOption: ThemeOption = ThemeOption.System, val addSpaceAfterNotation: Boolean = true, + val smartDelete: Boolean = true, val vibrateOnTap: Boolean = true, val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt index 6395cde..242bf04 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt @@ -8,10 +8,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag @@ -30,6 +26,7 @@ fun ControlKeyButtonRow( modifier: Modifier = Modifier, turns: Turns, isDarkTheme: Boolean, + smartDelete: Boolean, inputMethodButtonAction: () -> Unit, rotateDirectionButtonAction: () -> Unit, turnDegreeButtonAction: () -> Unit, @@ -99,20 +96,17 @@ fun ControlKeyButtonRow( } ) - var isSmartDelete by remember { mutableStateOf(false) } ControlKeyButton( modifier = controlKeyModifier.testTag("DeleteButton"), onClick = deleteButtonAction, - onLongClick = { isSmartDelete = !isSmartDelete }, +// onLongClick = { isSmartDelete = !isSmartDelete }, isDarkTheme = isDarkTheme, content = { Icon( - painter = if (isSmartDelete) { + painter = if (smartDelete) { painterResource(R.drawable.ic_backspace_filled) } else { - painterResource( - R.drawable.ic_backspace_outlined - ) + painterResource(R.drawable.ic_backspace_outlined) }, tint = keyColor, contentDescription = "Delete" @@ -141,6 +135,7 @@ private fun ControlKeyButtonRowPreview() { ControlKeyButtonRow( turns = Turns.Single, isDarkTheme = false, + smartDelete = false, inputMethodButtonAction = {}, rotateDirectionButtonAction = {}, turnDegreeButtonAction = {}, diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsScreen.kt b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsScreen.kt index 10ca98b..89a0c33 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsScreen.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsScreen.kt @@ -20,6 +20,7 @@ import com.rickyhu.hushkeyboard.data.ThemeOption import com.rickyhu.hushkeyboard.data.WideNotationOption import com.rickyhu.hushkeyboard.settings.ui.AddSpaceBetweenNotationSwitchItem import com.rickyhu.hushkeyboard.settings.ui.AppVersionItem +import com.rickyhu.hushkeyboard.settings.ui.SmartDeleteSwitchItem import com.rickyhu.hushkeyboard.settings.ui.ThemeOptionDropdownItem import com.rickyhu.hushkeyboard.settings.ui.VibrateOnTapSwitchItem import com.rickyhu.hushkeyboard.settings.ui.WideNotationOptionDropdownItem @@ -35,6 +36,7 @@ fun SettingsScreen( state, onThemeSelected = viewModel::updateThemeOption, onWideNotationOptionSelected = viewModel::updateWideNotationOption, + onSmartDeleteChanged = viewModel::updateSmartDelete, onAddSpaceBetweenNotationChanged = viewModel::updateAddSpaceBetweenNotation, onVibrateOnTapChanged = viewModel::updateVibrateOnTap ) @@ -47,6 +49,7 @@ fun SettingsContent( state: SettingsState, onThemeSelected: (themeOption: ThemeOption) -> Unit, onWideNotationOptionSelected: (wideNotationOption: WideNotationOption) -> Unit, + onSmartDeleteChanged: (smartDelete: Boolean) -> Unit, onAddSpaceBetweenNotationChanged: (addSpaceAfterNotation: Boolean) -> Unit, onVibrateOnTapChanged: (vibrateOnTap: Boolean) -> Unit ) { @@ -66,6 +69,10 @@ fun SettingsContent( currentOption = state.wideNotationOption, onOptionSelected = onWideNotationOptionSelected ) + SmartDeleteSwitchItem( + value = state.smartDelete, + onValueChanged = onSmartDeleteChanged + ) AddSpaceBetweenNotationSwitchItem( value = state.addSpaceAfterNotation, onValueChanged = onAddSpaceBetweenNotationChanged diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt index 1aae40b..1d8e491 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt @@ -26,6 +26,7 @@ class SettingsViewModel @Inject constructor( SettingsState( themeOption = settings.themeOption, addSpaceAfterNotation = settings.addSpaceAfterNotation, + smartDelete = settings.smartDelete, vibrateOnTap = settings.vibrateOnTap, wideNotationOption = settings.wideNotationOption ) @@ -43,6 +44,12 @@ class SettingsViewModel @Inject constructor( } } + fun updateSmartDelete(smartDelete: Boolean) { + viewModelScope.launch { + settingsRepository.updateSmartDelete(smartDelete) + } + } + fun updateAddSpaceBetweenNotation(addSpaceBetweenNotation: Boolean) { viewModelScope.launch { settingsRepository.updateAddSpaceBetweenNotation(addSpaceBetweenNotation) @@ -58,7 +65,8 @@ class SettingsViewModel @Inject constructor( data class SettingsState( val themeOption: ThemeOption = ThemeOption.System, + val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW, + val smartDelete: Boolean = false, val addSpaceAfterNotation: Boolean = true, - val vibrateOnTap: Boolean = true, - val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW + val vibrateOnTap: Boolean = true ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/settings/ui/SmartDeleteSwitchItem.kt b/app/src/main/java/com/rickyhu/hushkeyboard/settings/ui/SmartDeleteSwitchItem.kt new file mode 100644 index 0000000..dd3f19f --- /dev/null +++ b/app/src/main/java/com/rickyhu/hushkeyboard/settings/ui/SmartDeleteSwitchItem.kt @@ -0,0 +1,48 @@ +package com.rickyhu.hushkeyboard.settings.ui + +import androidx.compose.foundation.clickable +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import com.rickyhu.hushkeyboard.R +import com.rickyhu.hushkeyboard.theme.HushKeyboardTheme + +@Composable +fun SmartDeleteSwitchItem( + value: Boolean, + onValueChanged: (Boolean) -> Unit = {} +) { + ListItem( + modifier = Modifier.clickable { onValueChanged(!value) }, + headlineContent = { Text("Smart Delete") }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.ic_backspace_filled), + contentDescription = "Delete" + ) + }, + trailingContent = { + Switch( + checked = value, + onCheckedChange = onValueChanged, + modifier = Modifier.testTag("SmartDeleteSwitchItem") + ) + } + ) +} + +@Preview(showBackground = true) +@Composable +fun SmartDeleteSwitchItemPreview() { + HushKeyboardTheme { + AddSpaceBetweenNotationSwitchItem( + value = true + ) + } +} From 39f787856577442a726de70b6d78c1ebf32696ba Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Fri, 11 Jul 2025 17:29:30 +0800 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20implement=20smart?= =?UTF-8?q?=20delete=20for=20deleting=20a=20notation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hushkeyboard/keyboard/HushKeyboardView.kt | 7 ++- .../rickyhu/hushkeyboard/model/Notation.kt | 6 ++- .../hushkeyboard/utils/InputConnection.kt | 44 +++++++++++++++++-- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt index 2011140..d75c086 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt @@ -34,6 +34,7 @@ import com.rickyhu.hushkeyboard.theme.LightBackground import com.rickyhu.hushkeyboard.utils.deleteText import com.rickyhu.hushkeyboard.utils.inputText import com.rickyhu.hushkeyboard.utils.maybeVibrate +import com.rickyhu.hushkeyboard.utils.smartDelete import com.rickyhu.hushkeyboard.utils.toInputConnection import splitties.systemservices.inputMethodManager @@ -125,7 +126,11 @@ fun HushKeyboardContent(state: KeyboardState) { if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, deleteButtonAction = { - context.toInputConnection().deleteText() + if (state.smartDelete) { + context.toInputConnection().smartDelete() + } else { + context.toInputConnection().deleteText() + } if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, newLineButtonAction = { diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/model/Notation.kt b/app/src/main/java/com/rickyhu/hushkeyboard/model/Notation.kt index 9f5f7ac..30ac0d1 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/model/Notation.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/model/Notation.kt @@ -12,5 +12,9 @@ enum class Notation(val value: String) { S("S"), X("x"), Y("y"), - Z("z") + Z("z"); + + companion object { + fun getCharList(): List = Notation.entries.map { it.value.single() } + } } diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt index 6300864..d49e446 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt @@ -1,15 +1,21 @@ package com.rickyhu.hushkeyboard.utils import android.content.Context +import android.util.Log import android.view.inputmethod.InputConnection +import com.rickyhu.hushkeyboard.model.Notation import com.rickyhu.hushkeyboard.service.HushIMEService -private const val CURSOR_POSITION = 1 +private const val END_CURSOR_POSITION = 1 +private const val MAX_NOTATION_LENGTH = 5 + +val notationCharList = Notation.getCharList() + listOf('\n') fun Context.toInputConnection(): InputConnection = (this as HushIMEService).currentInputConnection fun InputConnection.inputText(text: String) { - commitText(text, CURSOR_POSITION) + commitText(text, END_CURSOR_POSITION) + Log.d("InputConnection", "inputText $text") } fun InputConnection.deleteText() { @@ -17,7 +23,39 @@ fun InputConnection.deleteText() { if (selectedText.isNullOrEmpty()) { deleteSurroundingText(1, 0) + Log.d("InputConnection", "deleteText") } else { - commitText("", CURSOR_POSITION) + commitText("", END_CURSOR_POSITION) // delete selected text + Log.d("InputConnection", "deleteText $selectedText") + } +} + +fun InputConnection.smartDelete() { + Log.d("InputConnection", "smartDelete") + + beginBatchEdit() + if (!getSelectedText(0).isNullOrEmpty()) { + deleteSurroundingText(1, 0) + endBatchEdit() + return } + + while (true) { + val endTextChunk = getTextBeforeCursor(MAX_NOTATION_LENGTH, 0) + if (endTextChunk.isNullOrEmpty()) break + + for (i in endTextChunk.indices.reversed()) { + val char = endTextChunk[i] + if (char in notationCharList) { + deleteSurroundingText(MAX_NOTATION_LENGTH, 0) + commitText(endTextChunk.substring(0, i), END_CURSOR_POSITION) + endBatchEdit() + return + } + } + + deleteSurroundingText(MAX_NOTATION_LENGTH, 0) + } + + endBatchEdit() } From 851025d6ebf5be71cf8da8090fecb15648cdc1ee Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Sat, 12 Jul 2025 15:12:17 +0800 Subject: [PATCH 06/13] =?UTF-8?q?fix:=20=F0=9F=90=9B=20re-implement=20to?= =?UTF-8?q?=20resolve=20batchEdit=20crash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hushkeyboard/utils/InputConnection.kt | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt index d49e446..75f7983 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt @@ -7,7 +7,6 @@ import com.rickyhu.hushkeyboard.model.Notation import com.rickyhu.hushkeyboard.service.HushIMEService private const val END_CURSOR_POSITION = 1 -private const val MAX_NOTATION_LENGTH = 5 val notationCharList = Notation.getCharList() + listOf('\n') @@ -32,30 +31,34 @@ fun InputConnection.deleteText() { fun InputConnection.smartDelete() { Log.d("InputConnection", "smartDelete") - - beginBatchEdit() if (!getSelectedText(0).isNullOrEmpty()) { - deleteSurroundingText(1, 0) - endBatchEdit() + commitText("", END_CURSOR_POSITION) return } - while (true) { - val endTextChunk = getTextBeforeCursor(MAX_NOTATION_LENGTH, 0) - if (endTextChunk.isNullOrEmpty()) break - - for (i in endTextChunk.indices.reversed()) { - val char = endTextChunk[i] - if (char in notationCharList) { - deleteSurroundingText(MAX_NOTATION_LENGTH, 0) - commitText(endTextChunk.substring(0, i), END_CURSOR_POSITION) - endBatchEdit() - return + beginBatchEdit() + try { + val scanWindow = 50 + val textBeforeCursor = getTextBeforeCursor(scanWindow, 0) + + if (textBeforeCursor.isNullOrEmpty()) { + deleteSurroundingText(1, 0) + return + } + + var charsToDelete = 0 + for (i in textBeforeCursor.indices.reversed()) { + val char = textBeforeCursor[i] + charsToDelete++ + if (char.uppercaseChar() in notationCharList) { + break } } - deleteSurroundingText(MAX_NOTATION_LENGTH, 0) + if (charsToDelete > 0) { + deleteSurroundingText(charsToDelete, 0) + } + } finally { + endBatchEdit() } - - endBatchEdit() } From dd89252367f518e76914993814cf3baba145d831 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Sat, 12 Jul 2025 15:30:36 +0800 Subject: [PATCH 07/13] =?UTF-8?q?test:=20=F0=9F=92=8D=20fix=20SettingsScre?= =?UTF-8?q?enUiTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/rickyhu/hushkeyboard/ui/SettingsScreenUiTest.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/test/java/com/rickyhu/hushkeyboard/ui/SettingsScreenUiTest.kt b/app/src/test/java/com/rickyhu/hushkeyboard/ui/SettingsScreenUiTest.kt index 7ee57c2..6c8628d 100644 --- a/app/src/test/java/com/rickyhu/hushkeyboard/ui/SettingsScreenUiTest.kt +++ b/app/src/test/java/com/rickyhu/hushkeyboard/ui/SettingsScreenUiTest.kt @@ -27,6 +27,7 @@ class SettingsScreenUiTest { private var addSpaceAfterNotationSwitchValue = true private var vibrateOnTapSwitchValue = true + private var smartDeleteValue = true @Before fun setUp() { @@ -35,6 +36,9 @@ class SettingsScreenUiTest { state = SettingsState(), onThemeSelected = {}, onWideNotationOptionSelected = {}, + onSmartDeleteChanged = { value -> + smartDeleteValue = value + }, onAddSpaceBetweenNotationChanged = { value -> addSpaceAfterNotationSwitchValue = value }, From e21b96983ef9cd40c6e53036a8866c123ba6efd2 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Sat, 12 Jul 2025 15:45:36 +0800 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20=F0=9F=90=9B=20remove=20unused=20l?= =?UTF-8?q?ong=20press=20action=20to=20pass=20unit=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyboard/ui/buttons/ControlKeyButton.kt | 11 ++--------- .../keyboard/ui/rows/ControlKeyButtonRow.kt | 1 - 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt index aaa037f..2398c9f 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/buttons/ControlKeyButton.kt @@ -1,11 +1,10 @@ package com.rickyhu.hushkeyboard.keyboard.ui.buttons -import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -18,17 +17,11 @@ import com.rickyhu.hushkeyboard.theme.LightSecondary fun ControlKeyButton( modifier: Modifier = Modifier, onClick: () -> Unit, - onLongClick: (() -> Unit)? = null, isDarkTheme: Boolean, content: @Composable () -> Unit ) { KeyButton( - modifier = modifier.pointerInput(Unit) { - detectTapGestures( - onTap = { onClick() }, - onLongPress = { onLongClick?.invoke() } - ) - }, + modifier = modifier.clickable(onClick = onClick), buttonColor = if (isDarkTheme) DarkSecondary else LightSecondary, content = content ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt index 242bf04..2c08f10 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt @@ -99,7 +99,6 @@ fun ControlKeyButtonRow( ControlKeyButton( modifier = controlKeyModifier.testTag("DeleteButton"), onClick = deleteButtonAction, -// onLongClick = { isSmartDelete = !isSmartDelete }, isDarkTheme = isDarkTheme, content = { Icon( From 0b363e2c0d49d2369899cdfbd786136c93390b59 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Sat, 12 Jul 2025 16:44:37 +0800 Subject: [PATCH 09/13] =?UTF-8?q?ci:=20=F0=9F=8E=A1=20remove=20text=20duri?= =?UTF-8?q?ng=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codecov.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/codecov.yml b/codecov.yml index 0b449d9..bfdc987 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,9 +1,8 @@ - <<<<<<< HEAD - coverage: - status: - project: - default: - informational: true - patch: - default: - informational: true +coverage: + status: + project: + default: + informational: true + patch: + default: + informational: true From 9e37b975b6479d93c500e1c8b98121e120167db3 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Wed, 23 Jul 2025 20:37:25 +0800 Subject: [PATCH 10/13] =?UTF-8?q?fix:=20=F0=9F=90=9B=20resolve=20smart=20d?= =?UTF-8?q?elete=20state=20management=20from=20dataStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Closes: \ --- .../rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt index d75c086..c2da6ae 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt @@ -125,13 +125,16 @@ fun HushKeyboardContent(state: KeyboardState) { ) if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, - deleteButtonAction = { - if (state.smartDelete) { + deleteButtonAction = if (state.smartDelete) { + { context.toInputConnection().smartDelete() - } else { + if (state.vibrateOnTap) vibratorManager?.maybeVibrate() + } + } else { + { context.toInputConnection().deleteText() + if (state.vibrateOnTap) vibratorManager?.maybeVibrate() } - if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, newLineButtonAction = { context.toInputConnection().inputText("\n") From 3fb62254f063a43d8aeffb5843ccc17c374fd6fa Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Wed, 23 Jul 2025 20:43:53 +0800 Subject: [PATCH 11/13] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20default=20true?= =?UTF-8?q?=20for=20smart=20delete=20feature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/rickyhu/hushkeyboard/data/AppSettings.kt | 2 +- .../hushkeyboard/keyboard/HushKeyboardView.kt | 6 +++--- .../hushkeyboard/keyboard/KeyboardViewModel.kt | 12 ++++++------ .../keyboard/ui/rows/ControlKeyButtonRow.kt | 2 +- .../hushkeyboard/settings/SettingsViewModel.kt | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt b/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt index 2b7a9b4..c1e3627 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/data/AppSettings.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable data class AppSettings( val themeOption: ThemeOption = ThemeOption.System, val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW, - val smartDelete: Boolean = false, + val smartDelete: Boolean = true, val addSpaceAfterNotation: Boolean = true, val vibrateOnTap: Boolean = true ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt index c2da6ae..6e9ef87 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt @@ -151,10 +151,10 @@ fun HushKeyboardPreview() { HushKeyboardContent( state = KeyboardState( themeOption = ThemeOption.System, + wideNotationOption = WideNotationOption.WideWithW, + smartDelete = true, addSpaceAfterNotation = true, - smartDelete = false, - vibrateOnTap = true, - wideNotationOption = WideNotationOption.WideWithW + vibrateOnTap = true ) ) } diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt index 22d80c4..14b3b5c 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/KeyboardViewModel.kt @@ -22,18 +22,18 @@ class KeyboardViewModel @Inject constructor( ).map { settings -> KeyboardState( themeOption = settings.themeOption, - addSpaceAfterNotation = settings.addSpaceAfterNotation, + wideNotationOption = settings.wideNotationOption, smartDelete = settings.smartDelete, - vibrateOnTap = settings.vibrateOnTap, - wideNotationOption = settings.wideNotationOption + addSpaceAfterNotation = settings.addSpaceAfterNotation, + vibrateOnTap = settings.vibrateOnTap ) } } data class KeyboardState( val themeOption: ThemeOption = ThemeOption.System, - val addSpaceAfterNotation: Boolean = true, + val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW, val smartDelete: Boolean = true, - val vibrateOnTap: Boolean = true, - val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW + val addSpaceAfterNotation: Boolean = true, + val vibrateOnTap: Boolean = true ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt index 2c08f10..4becd37 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/ui/rows/ControlKeyButtonRow.kt @@ -134,7 +134,7 @@ private fun ControlKeyButtonRowPreview() { ControlKeyButtonRow( turns = Turns.Single, isDarkTheme = false, - smartDelete = false, + smartDelete = true, inputMethodButtonAction = {}, rotateDirectionButtonAction = {}, turnDegreeButtonAction = {}, diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt index 1d8e491..2bc00c5 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt @@ -7,11 +7,11 @@ import com.rickyhu.hushkeyboard.data.SettingsRepository import com.rickyhu.hushkeyboard.data.ThemeOption import com.rickyhu.hushkeyboard.data.WideNotationOption import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( @@ -66,7 +66,7 @@ class SettingsViewModel @Inject constructor( data class SettingsState( val themeOption: ThemeOption = ThemeOption.System, val wideNotationOption: WideNotationOption = WideNotationOption.WideWithW, - val smartDelete: Boolean = false, + val smartDelete: Boolean = true, val addSpaceAfterNotation: Boolean = true, val vibrateOnTap: Boolean = true ) From ed05f14099bbd99f3f4914a9b0ea616af8a0a2f9 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Wed, 23 Jul 2025 20:51:12 +0800 Subject: [PATCH 12/13] =?UTF-8?q?chore:=20=F0=9F=A4=96=20add=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hushkeyboard/keyboard/HushKeyboardView.kt | 11 +++++++++++ .../hushkeyboard/settings/SettingsViewModel.kt | 2 +- .../hushkeyboard/utils/InputConnection.kt | 16 ++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt index 6e9ef87..114b55b 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt @@ -3,6 +3,7 @@ package com.rickyhu.hushkeyboard.keyboard import android.content.Context import android.os.Build import android.os.VibratorManager +import android.util.Log import androidx.annotation.RequiresApi import androidx.annotation.VisibleForTesting import androidx.compose.foundation.background @@ -38,6 +39,8 @@ import com.rickyhu.hushkeyboard.utils.smartDelete import com.rickyhu.hushkeyboard.utils.toInputConnection import splitties.systemservices.inputMethodManager +private const val TAG = "HushKeyboardView" + class HushKeyboardView(context: Context) : AbstractComposeView(context) { @RequiresApi(Build.VERSION_CODES.S) @@ -81,6 +84,7 @@ fun HushKeyboardContent(state: KeyboardState) { addSpaceAfterNotation = state.addSpaceAfterNotation, wideNotationOption = state.wideNotationOption, onTextInput = { + Log.d(TAG, "Notation key tapped") context.toInputConnection().inputText(it) if (state.vibrateOnTap) vibratorManager?.maybeVibrate() } @@ -102,16 +106,19 @@ fun HushKeyboardContent(state: KeyboardState) { isDarkTheme = isDarkTheme, smartDelete = state.smartDelete, inputMethodButtonAction = { + Log.d(TAG, "Input method picker tapped") inputMethodManager.showInputMethodPicker() if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, rotateDirectionButtonAction = { + Log.d(TAG, "Rotate direction button tapped") keyConfigState = keyConfigState.copy( isCounterClockwise = !keyConfigState.isCounterClockwise ) if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, turnDegreeButtonAction = { + Log.d(TAG, "Turn degree button tapped") keyConfigState = when (keyConfigState.turns) { Turns.Single -> keyConfigState.copy(turns = Turns.Double) Turns.Double -> keyConfigState.copy(turns = Turns.Triple) @@ -120,6 +127,7 @@ fun HushKeyboardContent(state: KeyboardState) { if (state.vibrateOnTap) vibratorManager?.maybeVibrate() }, wideTurnButtonAction = { + Log.d(TAG, "Wide turn button tapped") keyConfigState = keyConfigState.copy( isWideTurn = !keyConfigState.isWideTurn ) @@ -127,16 +135,19 @@ fun HushKeyboardContent(state: KeyboardState) { }, deleteButtonAction = if (state.smartDelete) { { + Log.d(TAG, "Delete button tapped") context.toInputConnection().smartDelete() if (state.vibrateOnTap) vibratorManager?.maybeVibrate() } } else { { + Log.d(TAG, "Smart delete button tapped") context.toInputConnection().deleteText() if (state.vibrateOnTap) vibratorManager?.maybeVibrate() } }, newLineButtonAction = { + Log.d(TAG, "New line button tapped") context.toInputConnection().inputText("\n") if (state.vibrateOnTap) vibratorManager?.maybeVibrate() } diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt index 2bc00c5..9fb0d4b 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/settings/SettingsViewModel.kt @@ -7,11 +7,11 @@ import com.rickyhu.hushkeyboard.data.SettingsRepository import com.rickyhu.hushkeyboard.data.ThemeOption import com.rickyhu.hushkeyboard.data.WideNotationOption import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt index 75f7983..508fa61 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt @@ -6,6 +6,7 @@ import android.view.inputmethod.InputConnection import com.rickyhu.hushkeyboard.model.Notation import com.rickyhu.hushkeyboard.service.HushIMEService +private const val TAG = "InputConnection" private const val END_CURSOR_POSITION = 1 val notationCharList = Notation.getCharList() + listOf('\n') @@ -14,7 +15,7 @@ fun Context.toInputConnection(): InputConnection = (this as HushIMEService).curr fun InputConnection.inputText(text: String) { commitText(text, END_CURSOR_POSITION) - Log.d("InputConnection", "inputText $text") + Log.d(TAG, "inputText $text") } fun InputConnection.deleteText() { @@ -22,17 +23,20 @@ fun InputConnection.deleteText() { if (selectedText.isNullOrEmpty()) { deleteSurroundingText(1, 0) - Log.d("InputConnection", "deleteText") + Log.d(TAG, "deleteText") } else { - commitText("", END_CURSOR_POSITION) // delete selected text - Log.d("InputConnection", "deleteText $selectedText") + commitText("", END_CURSOR_POSITION) + Log.d(TAG, "delete selected text: $selectedText") } } fun InputConnection.smartDelete() { - Log.d("InputConnection", "smartDelete") - if (!getSelectedText(0).isNullOrEmpty()) { + Log.d(TAG, "smartDelete") + + val selectedText = getSelectedText(0) + if (!selectedText.isNullOrEmpty()) { commitText("", END_CURSOR_POSITION) + Log.d(TAG, "delete selected text: $selectedText") return } From 36e343f27660f10af6349a8133522899cc959680 Mon Sep 17 00:00:00 2001 From: Ricky Hu Date: Thu, 24 Jul 2025 15:02:46 +0800 Subject: [PATCH 13/13] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20extract=20cons?= =?UTF-8?q?tants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt | 3 ++- .../com/rickyhu/hushkeyboard/utils/InputConnection.kt | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt index 114b55b..bb9fa7d 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/keyboard/HushKeyboardView.kt @@ -33,6 +33,7 @@ import com.rickyhu.hushkeyboard.service.HushIMEService import com.rickyhu.hushkeyboard.theme.DarkBackground import com.rickyhu.hushkeyboard.theme.LightBackground import com.rickyhu.hushkeyboard.utils.deleteText +import com.rickyhu.hushkeyboard.utils.inputNewline import com.rickyhu.hushkeyboard.utils.inputText import com.rickyhu.hushkeyboard.utils.maybeVibrate import com.rickyhu.hushkeyboard.utils.smartDelete @@ -148,7 +149,7 @@ fun HushKeyboardContent(state: KeyboardState) { }, newLineButtonAction = { Log.d(TAG, "New line button tapped") - context.toInputConnection().inputText("\n") + context.toInputConnection().inputNewline() if (state.vibrateOnTap) vibratorManager?.maybeVibrate() } ) diff --git a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt index 508fa61..7a9d1c7 100644 --- a/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt +++ b/app/src/main/java/com/rickyhu/hushkeyboard/utils/InputConnection.kt @@ -7,9 +7,11 @@ import com.rickyhu.hushkeyboard.model.Notation import com.rickyhu.hushkeyboard.service.HushIMEService private const val TAG = "InputConnection" +private const val NEWLINE = '\n' private const val END_CURSOR_POSITION = 1 +private const val SCAN_WINDOW_SIZE = 50 -val notationCharList = Notation.getCharList() + listOf('\n') +val notationCharList = Notation.getCharList() + listOf(NEWLINE) fun Context.toInputConnection(): InputConnection = (this as HushIMEService).currentInputConnection @@ -18,6 +20,10 @@ fun InputConnection.inputText(text: String) { Log.d(TAG, "inputText $text") } +fun InputConnection.inputNewline() { + inputText(NEWLINE.toString()) +} + fun InputConnection.deleteText() { val selectedText = getSelectedText(0) @@ -42,8 +48,7 @@ fun InputConnection.smartDelete() { beginBatchEdit() try { - val scanWindow = 50 - val textBeforeCursor = getTextBeforeCursor(scanWindow, 0) + val textBeforeCursor = getTextBeforeCursor(SCAN_WINDOW_SIZE, 0) if (textBeforeCursor.isNullOrEmpty()) { deleteSurroundingText(1, 0)