Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,10 @@ android {
res.srcDirs = ['java/unstable/res', translationsWithoutEngValues('translations/devbuild')]
}

test {
java.srcDirs = ['java/test']
}

androidTest {
res.srcDirs = ['tests/res']
java.srcDirs = ['tests/src']
Expand Down
20 changes: 20 additions & 0 deletions java/res/values/strings-uix.xml
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,26 @@
<string name="voice_input_settings_change_models">Models</string>
<string name="voice_input_settings_change_models_subtitle">To change the models, visit Languages &amp; Models menu</string>

<!-- Dictation commands settings -->
<string name="dictation_commands_title">Dictation Commands</string>
<string name="dictation_commands_subtitle">Replace spoken phrases like \"new line\" or \"dollar sign\" with symbols and formatting</string>
<string name="dictation_formatting_title">Formatting</string>
<string name="dictation_formatting_subtitle">New line, new paragraph, tab, numeral, no space on/off</string>
<string name="dictation_capitalization_title">Capitalization</string>
<string name="dictation_capitalization_subtitle">Caps on/off, all caps</string>
<string name="dictation_punctuation_title">Punctuation &amp; Brackets</string>
<string name="dictation_punctuation_subtitle">Quotes, brackets, parentheses, dash, ellipsis</string>
<string name="dictation_symbols_title">Symbols</string>
<string name="dictation_symbols_subtitle">Ampersand, asterisk, at sign, hashtag, etc.</string>
<string name="dictation_math_title">Math Symbols</string>
<string name="dictation_math_subtitle">Equal, plus, minus, greater than, less than</string>
<string name="dictation_currency_title">Currency Symbols</string>
<string name="dictation_currency_subtitle">Dollar, euro, pound, yen, cent</string>
<string name="dictation_emoticons_title">Emoticons</string>
<string name="dictation_emoticons_subtitle">Smiley, frowny, winky face</string>
<string name="dictation_ip_marks_title">Intellectual Property Marks</string>
<string name="dictation_ip_marks_subtitle">Copyright, registered, trademark</string>

<!-- Prediction menu -->
<string name="prediction_settings_title">Text Prediction</string>
<string name="prediction_settings_transformer">Transformer LM</string>
Expand Down
46 changes: 46 additions & 0 deletions java/src/org/futo/inputmethod/latin/uix/VoiceInputSettingKeys.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,50 @@ val LANGUAGE_TOGGLES = SettingsKey(
val USE_PERSONAL_DICT = SettingsKey(
key = booleanPreferencesKey("use_personal_dict_voice_input"),
default = true
)

// Dictation command settings
val DICTATION_COMMANDS_ENABLED = SettingsKey(
key = booleanPreferencesKey("dictation_commands_enabled"),
default = true
)

val DICTATION_FORMATTING = SettingsKey(
key = booleanPreferencesKey("dictation_formatting"),
default = true
)

val DICTATION_CAPITALIZATION = SettingsKey(
key = booleanPreferencesKey("dictation_capitalization"),
default = true
)

val DICTATION_PUNCTUATION = SettingsKey(
key = booleanPreferencesKey("dictation_punctuation"),
default = true
)

val DICTATION_SYMBOLS = SettingsKey(
key = booleanPreferencesKey("dictation_symbols"),
default = true
)

val DICTATION_MATH = SettingsKey(
key = booleanPreferencesKey("dictation_math"),
default = true
)

val DICTATION_CURRENCY = SettingsKey(
key = booleanPreferencesKey("dictation_currency"),
default = true
)

val DICTATION_EMOTICONS = SettingsKey(
key = booleanPreferencesKey("dictation_emoticons"),
default = true
)

val DICTATION_IP_MARKS = SettingsKey(
key = booleanPreferencesKey("dictation_ip_marks"),
default = true
)
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,20 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.yield
import org.futo.inputmethod.latin.R
import org.futo.inputmethod.latin.uix.AUDIO_FOCUS
import org.futo.inputmethod.latin.uix.Action
import org.futo.inputmethod.latin.uix.ActionWindow
import org.futo.inputmethod.latin.uix.AUDIO_FOCUS
import org.futo.inputmethod.latin.uix.CAN_EXPAND_SPACE
import org.futo.inputmethod.latin.uix.CloseResult
import org.futo.inputmethod.latin.uix.DICTATION_CAPITALIZATION
import org.futo.inputmethod.latin.uix.DICTATION_COMMANDS_ENABLED
import org.futo.inputmethod.latin.uix.DICTATION_CURRENCY
import org.futo.inputmethod.latin.uix.DICTATION_EMOTICONS
import org.futo.inputmethod.latin.uix.DICTATION_FORMATTING
import org.futo.inputmethod.latin.uix.DICTATION_IP_MARKS
import org.futo.inputmethod.latin.uix.DICTATION_MATH
import org.futo.inputmethod.latin.uix.DICTATION_PUNCTUATION
import org.futo.inputmethod.latin.uix.DICTATION_SYMBOLS
import org.futo.inputmethod.latin.uix.DISALLOW_SYMBOLS
import org.futo.inputmethod.latin.uix.ENABLE_SOUND
import org.futo.inputmethod.latin.uix.KeyboardManagerForAction
Expand All @@ -42,6 +51,8 @@ import org.futo.inputmethod.latin.uix.VERBOSE_PROGRESS
import org.futo.inputmethod.latin.uix.getSetting
import org.futo.inputmethod.latin.uix.setSetting
import org.futo.inputmethod.latin.uix.settings.SettingsActivity
import org.futo.inputmethod.latin.uix.utils.DictationCommandProcessor
import org.futo.inputmethod.latin.uix.utils.DictationSettings
import org.futo.inputmethod.latin.uix.utils.ModelOutputSanitizer
import org.futo.inputmethod.latin.xlm.UserDictionaryObserver
import org.futo.inputmethod.updates.openURI
Expand Down Expand Up @@ -118,6 +129,7 @@ private class VoiceInputActionWindow(
val context = manager.getContext()

private var shouldPlaySounds: Boolean = false
private var dictationSettings: DictationSettings = DictationSettings()
private fun loadSettings(): RecognizerViewSettings {
val enableSound = context.getSetting(ENABLE_SOUND)
val verboseFeedback = false//context.getSetting(VERBOSE_PROGRESS)
Expand All @@ -139,6 +151,18 @@ private class VoiceInputActionWindow(

shouldPlaySounds = enableSound

dictationSettings = DictationSettings(
enabled = context.getSetting(DICTATION_COMMANDS_ENABLED),
formatting = context.getSetting(DICTATION_FORMATTING),
capitalization = context.getSetting(DICTATION_CAPITALIZATION),
punctuation = context.getSetting(DICTATION_PUNCTUATION),
symbols = context.getSetting(DICTATION_SYMBOLS),
math = context.getSetting(DICTATION_MATH),
currency = context.getSetting(DICTATION_CURRENCY),
emoticons = context.getSetting(DICTATION_EMOTICONS),
ipMarks = context.getSetting(DICTATION_IP_MARKS)
)

return RecognizerViewSettings(
shouldShowInlinePartialResult = false,
shouldShowVerboseFeedback = verboseFeedback,
Expand Down Expand Up @@ -263,8 +287,10 @@ private class VoiceInputActionWindow(
wasFinished = true

manager.getLifecycleScope().launch(Dispatchers.Main) {
// Sanitize first so dictation formatting chars aren't mangled by trim()
val sanitized = ModelOutputSanitizer.sanitize(result, inputTransaction.textContext)
inputTransaction.commit(sanitized)
val processed = DictationCommandProcessor.process(sanitized, dictationSettings)
inputTransaction.commit(processed)
manager.announce(result)
manager.closeActionWindow()
}
Expand All @@ -273,7 +299,8 @@ private class VoiceInputActionWindow(
override fun partialResult(result: String) {
manager.getLifecycleScope().launch(Dispatchers.Main) {
val sanitized = ModelOutputSanitizer.sanitize(result, inputTransaction.textContext)
inputTransaction.updatePartial(sanitized)
val processed = DictationCommandProcessor.process(sanitized, dictationSettings)
inputTransaction.updatePartial(processed)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import org.futo.inputmethod.latin.uix.settings.pages.SelectLanguageScreen
import org.futo.inputmethod.latin.uix.settings.pages.SelectLayoutsScreen
import org.futo.inputmethod.latin.uix.settings.pages.themes.ThemeScreen
import org.futo.inputmethod.latin.uix.settings.pages.TypingSettingsMenu
import org.futo.inputmethod.latin.uix.settings.pages.DictationCommandsMenu
import org.futo.inputmethod.latin.uix.settings.pages.VoiceInputMenu
import org.futo.inputmethod.latin.uix.settings.pages.addModelManagerNavigation
import org.futo.inputmethod.latin.uix.settings.pages.buggyeditors.BuggyTextEditVariations
Expand Down Expand Up @@ -86,6 +87,7 @@ val SettingsMenus = listOf(
PredictiveTextMenu,
BlacklistScreenLite,
VoiceInputMenu,
DictationCommandsMenu,
ActionsScreen,
HelpMenu,
MiscMenu,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ import androidx.compose.runtime.Composable
import org.futo.inputmethod.latin.R
import org.futo.inputmethod.latin.uix.AUDIO_FOCUS
import org.futo.inputmethod.latin.uix.CAN_EXPAND_SPACE
import org.futo.inputmethod.latin.uix.DICTATION_CAPITALIZATION
import org.futo.inputmethod.latin.uix.DICTATION_COMMANDS_ENABLED
import org.futo.inputmethod.latin.uix.DICTATION_CURRENCY
import org.futo.inputmethod.latin.uix.DICTATION_EMOTICONS
import org.futo.inputmethod.latin.uix.DICTATION_FORMATTING
import org.futo.inputmethod.latin.uix.DICTATION_IP_MARKS
import org.futo.inputmethod.latin.uix.DICTATION_MATH
import org.futo.inputmethod.latin.uix.DICTATION_PUNCTUATION
import org.futo.inputmethod.latin.uix.DICTATION_SYMBOLS
import org.futo.inputmethod.latin.uix.DISALLOW_SYMBOLS
import org.futo.inputmethod.latin.uix.ENABLE_SOUND
import org.futo.inputmethod.latin.uix.PREFER_BLUETOOTH
Expand All @@ -22,6 +31,66 @@ private val visibilityCheckNotSystemVoiceInput = @Composable {
useDataStoreValue(USE_SYSTEM_VOICE_INPUT) == false
}

val DictationCommandsMenu = UserSettingsMenu(
title = R.string.dictation_commands_title,
navPath = "dictationCommands", registerNavPath = true,
settings = listOf(
userSettingToggleDataStore(
title = R.string.dictation_commands_title,
subtitle = R.string.dictation_commands_subtitle,
setting = DICTATION_COMMANDS_ENABLED
),

userSettingToggleDataStore(
title = R.string.dictation_formatting_title,
subtitle = R.string.dictation_formatting_subtitle,
setting = DICTATION_FORMATTING
),

userSettingToggleDataStore(
title = R.string.dictation_capitalization_title,
subtitle = R.string.dictation_capitalization_subtitle,
setting = DICTATION_CAPITALIZATION
),

userSettingToggleDataStore(
title = R.string.dictation_punctuation_title,
subtitle = R.string.dictation_punctuation_subtitle,
setting = DICTATION_PUNCTUATION
),

userSettingToggleDataStore(
title = R.string.dictation_symbols_title,
subtitle = R.string.dictation_symbols_subtitle,
setting = DICTATION_SYMBOLS
),

userSettingToggleDataStore(
title = R.string.dictation_math_title,
subtitle = R.string.dictation_math_subtitle,
setting = DICTATION_MATH
),

userSettingToggleDataStore(
title = R.string.dictation_currency_title,
subtitle = R.string.dictation_currency_subtitle,
setting = DICTATION_CURRENCY
),

userSettingToggleDataStore(
title = R.string.dictation_emoticons_title,
subtitle = R.string.dictation_emoticons_subtitle,
setting = DICTATION_EMOTICONS
),

userSettingToggleDataStore(
title = R.string.dictation_ip_marks_title,
subtitle = R.string.dictation_ip_marks_subtitle,
setting = DICTATION_IP_MARKS
)
)
)

val VoiceInputMenu = UserSettingsMenu(
title = R.string.voice_input_settings_title,
navPath = "voiceInput", registerNavPath = true,
Expand Down Expand Up @@ -82,6 +151,13 @@ val VoiceInputMenu = UserSettingsMenu(
setting = USE_VAD_AUTOSTOP
).copy(visibilityCheck = visibilityCheckNotSystemVoiceInput),

userSettingNavigationItem(
title = R.string.dictation_commands_title,
subtitle = R.string.dictation_commands_subtitle,
style = NavigationItemStyle.Misc,
navigateTo = "dictationCommands"
).copy(visibilityCheck = visibilityCheckNotSystemVoiceInput),

userSettingNavigationItem(
title = R.string.voice_input_settings_change_models,
subtitle = R.string.voice_input_settings_change_models_subtitle,
Expand Down
Loading