diff --git a/java/res/values/strings-uix.xml b/java/res/values/strings-uix.xml
index 6627fea9f4..3ef348041f 100644
--- a/java/res/values/strings-uix.xml
+++ b/java/res/values/strings-uix.xml
@@ -470,6 +470,8 @@
Configure additional layouts in the languages screen
Show action/suggestions bar
Show the bar containing suggestions. Recommended to keep enabled
+ Compact suggestion bar
+ Reduce the height of the suggestion bar and remove buttons from it
Inline autofill
Display password manager autofill and auto-reply suggestions (provided by app) in suggestion bar
Quick period key
diff --git a/java/src/org/futo/inputmethod/latin/uix/ActionBar.kt b/java/src/org/futo/inputmethod/latin/uix/ActionBar.kt
index 0d981c1e17..d755eed96d 100644
--- a/java/src/org/futo/inputmethod/latin/uix/ActionBar.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/ActionBar.kt
@@ -49,6 +49,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableFloatState
@@ -161,6 +162,17 @@ import kotlin.math.roundToInt
*/
val ActionBarHeight = 40.dp
+val CompactActionBarHeight = 26.dp
+
+val SuggestionBarCompactSetting = SettingsKey(
+ booleanPreferencesKey("suggestion_bar_compact"),
+ false
+)
+
+val LocalSuggestionBarCompact = staticCompositionLocalOf { false }
+
+val currentActionBarHeight: Dp
+ @Composable get() = if (LocalSuggestionBarCompact.current) CompactActionBarHeight else ActionBarHeight
val ActionBarScrollIndexSetting = SettingsKey(
intPreferencesKey("action_bar_scroll_index"),
@@ -196,7 +208,6 @@ val suggestionStylePrimary = TextStyle(
fontSize = 18.sp,
lineHeight = 26.sp,
letterSpacing = 0.5.sp,
- //textAlign = TextAlign.Center
)
val suggestionStyleAlternative = TextStyle(
@@ -205,7 +216,22 @@ val suggestionStyleAlternative = TextStyle(
fontSize = 18.sp,
lineHeight = 26.sp,
letterSpacing = 0.5.sp,
- //textAlign = TextAlign.Center
+)
+
+val suggestionStylePrimaryCompact = TextStyle(
+ fontFamily = FontFamily.SansSerif,
+ fontWeight = FontWeight.Medium,
+ fontSize = 14.sp,
+ lineHeight = 18.sp,
+ letterSpacing = 0.5.sp,
+)
+
+val suggestionStyleAlternativeCompact = TextStyle(
+ fontFamily = FontFamily.SansSerif,
+ fontWeight = FontWeight.Normal,
+ fontSize = 14.sp,
+ lineHeight = 18.sp,
+ letterSpacing = 0.5.sp,
)
val suggestionStyleCandidateDescription = TextStyle(
@@ -315,9 +341,12 @@ fun RowScope.SuggestionItem(words: SuggestedWords, idx: Int, isPrimary: Boolean,
else -> Modifier
}
- val textStyle = when(isAutocorrect) {
- true -> suggestionStylePrimary
- false -> suggestionStyleAlternative
+ val compact = LocalSuggestionBarCompact.current
+ val textStyle = when {
+ isAutocorrect && compact -> suggestionStylePrimaryCompact
+ isAutocorrect -> suggestionStylePrimary
+ compact -> suggestionStyleAlternativeCompact
+ else -> suggestionStyleAlternative
}.copy(color = color).withCustomFont()
Box(
@@ -787,13 +816,15 @@ fun ActionBar(
val view = LocalView.current
val context = LocalContext.current
+ val compact = LocalSuggestionBarCompact.current
+ val barHeight = if (compact) CompactActionBarHeight else ActionBarHeight
val oldActionBar = useDataStore(OldStyleActionsBar)
- val useDoubleHeight = isActionsExpanded && oldActionBar.value == false
+ val useDoubleHeight = isActionsExpanded && oldActionBar.value == false && !compact
Column(Modifier
.height(
- ActionBarHeight * (if (useDoubleHeight) 2 else 1).let {
+ barHeight * (if (useDoubleHeight) 2 else 1).let {
if(needToUseExpandableSuggestionUi) {
it - 1
} else {
@@ -805,7 +836,7 @@ fun ActionBar(
testTag = "ActionBar"
testTagsAsResourceId = true
}) {
- if(isActionsExpanded && !oldActionBar.value) {
+ if(isActionsExpanded && !oldActionBar.value && !compact) {
ActionSep()
Surface(
@@ -827,30 +858,33 @@ fun ActionBar(
.weight(1.0f), color = actionBarColor()
) {
Row(Modifier.safeKeyboardPadding()) {
- ExpandActionsButton(isActionsExpanded) {
- toggleActionsExpanded()
+ if (!compact) {
+ ExpandActionsButton(isActionsExpanded) {
+ toggleActionsExpanded()
- keyboardManagerForAction?.performHapticAndAudioFeedback(
- Constants.CODE_TAB,
- view
- )
+ keyboardManagerForAction?.performHapticAndAudioFeedback(
+ Constants.CODE_TAB,
+ view
+ )
+ }
}
- if(oldActionBar.value && isActionsExpanded) {
+ if(oldActionBar.value && isActionsExpanded && !compact) {
Box(modifier = Modifier
.weight(1.0f)
.fillMaxHeight()) {
ActionItems(onActionActivated, onActionAltActivated)
}
} else {
- if (importantNotice != null) {
+ if (importantNotice != null && !compact) {
ImportantNoticeView(importantNotice)
} else {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
&& inlineSuggestions.isNotEmpty()
+ && !compact
) {
InlineSuggestions(inlineSuggestions)
- } else if(quickClipState != null) {
+ } else if(quickClipState != null && !compact) {
QuickClipView(quickClipState, onQuickClipDismiss)
} else if (words != null) {
SuggestionItems(
@@ -873,7 +907,7 @@ fun ActionBar(
Spacer(modifier = Modifier.weight(1.0f))
}
- if(inlineSuggestions.isEmpty()) {
+ if(inlineSuggestions.isEmpty() && !compact) {
PinnedActionItems(onActionActivated, onActionAltActivated)
}
}
@@ -892,7 +926,7 @@ fun ActionWindowBar(
onBack: () -> Unit,
onExpand: () -> Unit
) {
- Column(Modifier.height(ActionBarHeight)) {
+ Column(Modifier.height(currentActionBarHeight)) {
ActionSep()
Surface(
modifier = Modifier
@@ -955,7 +989,7 @@ fun CollapsibleSuggestionsBar(
words: SuggestedWords?,
suggestionStripListener: SuggestionStripViewListener,
) {
- Column(Modifier.height(ActionBarHeight)) {
+ Column(Modifier.height(currentActionBarHeight)) {
ActionSep()
Surface(
modifier = Modifier
@@ -1215,7 +1249,7 @@ private fun RowScope.InlineCandidates(
}
}
itemsIndexed(wordList) { i, it ->
- CandidateItem(Modifier.height(ActionBarHeight), it,
+ CandidateItem(Modifier.height(currentActionBarHeight), it,
listener = suggestionStripListener,
last = i == wordList.size-1,
width = with(LocalDensity.current) {
@@ -1335,7 +1369,7 @@ fun BoxScope.ActionBarWithExpandableCandidates(
if(canShowSuggest) {
Surface(
- Modifier.fillMaxWidth().padding(0.dp, ActionBarHeight, 0.dp, 0.dp)
+ Modifier.fillMaxWidth().padding(0.dp, currentActionBarHeight, 0.dp, 0.dp)
.heightIn(max = with(density) { keyboardOffset?.intValue?.toDp() ?: 0.dp })
.safeKeyboardPadding()
) {
@@ -1343,7 +1377,7 @@ fun BoxScope.ActionBarWithExpandableCandidates(
listToRender ?: emptyList(),
itemMeasurer = { measureWord(density, widths, it) }
) { allocatedWidth, item, isLast ->
- CandidateItem(Modifier.height(ActionBarHeight), item, listener = suggestionStripListener, width=with(density) { allocatedWidth.toDp() }, last=isLast)
+ CandidateItem(Modifier.height(currentActionBarHeight), item, listener = suggestionStripListener, width=with(density) { allocatedWidth.toDp() }, last=isLast)
}
}
}
@@ -1353,7 +1387,7 @@ fun BoxScope.ActionBarWithExpandableCandidates(
testTag = "ActionBar"
testTagsAsResourceId = true
}
- .height(ActionBarHeight)
+ .height(currentActionBarHeight)
.align(Alignment.TopCenter)
) {
ActionSep()
diff --git a/java/src/org/futo/inputmethod/latin/uix/QuickClip.kt b/java/src/org/futo/inputmethod/latin/uix/QuickClip.kt
index aeb88e8e23..625850e544 100644
--- a/java/src/org/futo/inputmethod/latin/uix/QuickClip.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/QuickClip.kt
@@ -322,7 +322,7 @@ object QuickClip {
@Preview
@Composable
private fun PreviewQuickClips() {
- Row(Modifier.height(ActionBarHeight)) {
+ Row(Modifier.height(currentActionBarHeight)) {
QuickClipView(QuickClipState(
texts = listOf(QuickClipItem(
kind = QuickClipKind.FullString,
diff --git a/java/src/org/futo/inputmethod/latin/uix/UixManager.kt b/java/src/org/futo/inputmethod/latin/uix/UixManager.kt
index 831f0ff540..5581cd6508 100644
--- a/java/src/org/futo/inputmethod/latin/uix/UixManager.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/UixManager.kt
@@ -132,6 +132,7 @@ import org.futo.inputmethod.latin.uix.settings.DataStoreCacheProvider
import org.futo.inputmethod.latin.uix.settings.pages.ActionBarDisplayedSetting
import org.futo.inputmethod.latin.uix.settings.pages.InlineAutofillSetting
import org.futo.inputmethod.latin.uix.settings.useDataStore
+import org.futo.inputmethod.latin.uix.settings.useDataStoreValue
import org.futo.inputmethod.latin.uix.theme.KeyboardSurfaceShaderBackground
import org.futo.inputmethod.latin.uix.theme.Typography
import org.futo.inputmethod.latin.uix.theme.UixThemeAuto
@@ -227,12 +228,13 @@ fun BoxScope.KeyboardBackground(
shader != null -> KeyboardSurfaceShaderBackground(shader, modifier = Modifier.matchParentSize())
image != null && rect != null -> {
val navbarHeight = navBarHeight()
+ val actionBarHeightDp = currentActionBarHeight
Canvas(Modifier.matchParentSize()) {
drawRect(colorScheme.keyboardSurface)
val fixedWidth = computedSize?.width?.toFloat() ?: size.width
val fixedHeight = when {
- (computedSize != null) -> computedSize.height + ActionBarHeight.toPx() + navbarHeight.toPx()
+ (computedSize != null) -> computedSize.height + actionBarHeightDp.toPx() + navbarHeight.toPx()
else -> size.height
}
@@ -777,7 +779,7 @@ class UixManager(private val latinIME: LatinIME) {
currWindowActionWindow.value?.fixedWindowHeight ?: ((latinIME
.getInputViewHeight()
.toFloat() / heightDiv.toFloat()).toDp() +
- if (actionsExpanded) ActionBarHeight else 0.dp)
+ if (actionsExpanded) currentActionBarHeight else 0.dp)
})
.safeKeyboardPadding()
) {
@@ -1099,7 +1101,7 @@ class UixManager(private val latinIME: LatinIME) {
Column(modifier = Modifier
.matchParentSize()
.absolutePadding(
- top = if (isActionsExpanded.value) ActionBarHeight else 0.dp
+ top = if (isActionsExpanded.value) currentActionBarHeight else 0.dp
), horizontalAlignment = when(size.direction) {
// Aligned opposite of the keyboard
OneHandedDirection.Left -> Alignment.End
@@ -1185,11 +1187,13 @@ class UixManager(private val latinIME: LatinIME) {
private fun ProvidersAndWrapper(content: @Composable () -> Unit) {
UixThemeWrapper(latinIME.colorScheme) {
DataStoreCacheProvider {
+ val compactSuggestionBar = useDataStoreValue(SuggestionBarCompactSetting)
CompositionLocalProvider(
LocalManager provides keyboardManagerForAction,
LocalThemeProvider provides latinIME.getDrawableProvider(),
LocalLayoutDirection provides LayoutDirection.Ltr,
- LocalFoldingState provides foldingOptions.value
+ LocalFoldingState provides foldingOptions.value,
+ LocalSuggestionBarCompact provides compactSuggestionBar
) {
Box(Modifier
.fillMaxSize()
diff --git a/java/src/org/futo/inputmethod/latin/uix/actions/EmojiAction.kt b/java/src/org/futo/inputmethod/latin/uix/actions/EmojiAction.kt
index 3526a44ed9..499485a1a9 100644
--- a/java/src/org/futo/inputmethod/latin/uix/actions/EmojiAction.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/actions/EmojiAction.kt
@@ -100,6 +100,7 @@ import org.futo.inputmethod.latin.uix.EmojiTracker.getRecentEmojis
import org.futo.inputmethod.latin.uix.EmojiTracker.resetRecentEmojis
import org.futo.inputmethod.latin.uix.EmojiTracker.useEmoji
import org.futo.inputmethod.latin.uix.LocalKeyboardScheme
+import org.futo.inputmethod.latin.uix.LocalSuggestionBarCompact
import org.futo.inputmethod.latin.uix.PersistentActionState
import org.futo.inputmethod.latin.uix.actions.emoji.EmojiItem
import org.futo.inputmethod.latin.uix.actions.emoji.EmojiView
@@ -1011,6 +1012,11 @@ val EmojiAction = Action(
@Composable
override fun WindowTitleBar(rowScope: RowScope) {
val context = LocalContext.current
+ val compact = LocalSuggestionBarCompact.current
+ if(compact) {
+ super.WindowTitleBar(rowScope)
+ return
+ }
if(searching.value) {
with(rowScope) {
Surface(
diff --git a/java/src/org/futo/inputmethod/latin/uix/actions/KeyboardSizingActions.kt b/java/src/org/futo/inputmethod/latin/uix/actions/KeyboardSizingActions.kt
index 5375ea9d95..8670b8d7fb 100644
--- a/java/src/org/futo/inputmethod/latin/uix/actions/KeyboardSizingActions.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/actions/KeyboardSizingActions.kt
@@ -26,6 +26,7 @@ import androidx.compose.ui.unit.dp
import org.futo.inputmethod.latin.R
import org.futo.inputmethod.latin.uix.Action
import org.futo.inputmethod.latin.uix.ActionBarHeight
+import org.futo.inputmethod.latin.uix.currentActionBarHeight
import org.futo.inputmethod.latin.uix.ActionWindow
import org.futo.inputmethod.latin.uix.CloseResult
import org.futo.inputmethod.latin.uix.TutorialMode
@@ -92,7 +93,7 @@ val KeyboardModeAction = Action(
override fun WindowContents(keyboardShown: Boolean) {
val currMode = sizeCalculator.getSavedSettings().currentMode
Column {
- Row(Modifier.height(ActionBarHeight)) {
+ Row(Modifier.height(currentActionBarHeight)) {
// Hide the back button in the resize tutorial
if(manager.getTutorialMode() != TutorialMode.ResizerTutorial) {
IconButton(onClick = {
diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt
index de8fea13c6..0f952dedd8 100644
--- a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt
@@ -96,6 +96,7 @@ import org.futo.inputmethod.latin.settings.toLongPressKeyLayoutItems
import org.futo.inputmethod.latin.uix.AndroidTextInput
import org.futo.inputmethod.latin.uix.BasicThemeProvider
import org.futo.inputmethod.latin.uix.KeyHintsSetting
+import org.futo.inputmethod.latin.uix.SuggestionBarCompactSetting
import org.futo.inputmethod.latin.uix.LocalKeyboardScheme
import org.futo.inputmethod.latin.uix.SHOW_EMOJI_SUGGESTIONS
import org.futo.inputmethod.latin.uix.SettingsKey
@@ -783,6 +784,13 @@ val KeyboardSettingsMenu = UserSettingsMenu(
Icon(painterResource(id = R.drawable.more_horizontal), contentDescription = null)
}
),
+ userSettingToggleDataStore(
+ title = R.string.keyboard_settings_compact_suggestion_bar,
+ subtitle = R.string.keyboard_settings_compact_suggestion_bar_subtitle,
+ setting = SuggestionBarCompactSetting,
+ ).copy(visibilityCheck = {
+ useDataStore(ActionBarDisplayedSetting).value
+ }),
userSettingToggleDataStore(
title = R.string.keyboard_settings_inline_autofill,
subtitle = R.string.keyboard_settings_inline_autofill_subtitle,
diff --git a/java/src/org/futo/inputmethod/v2keyboard/KeyboardSizingCalculator.kt b/java/src/org/futo/inputmethod/v2keyboard/KeyboardSizingCalculator.kt
index 6aa363ff41..1c39f9683d 100644
--- a/java/src/org/futo/inputmethod/v2keyboard/KeyboardSizingCalculator.kt
+++ b/java/src/org/futo/inputmethod/v2keyboard/KeyboardSizingCalculator.kt
@@ -26,6 +26,7 @@ import org.futo.inputmethod.latin.FoldStateProvider
import org.futo.inputmethod.latin.LatinIME
import org.futo.inputmethod.latin.settings.SettingsValues
import org.futo.inputmethod.latin.uix.OldStyleActionsBar
+import org.futo.inputmethod.latin.uix.SuggestionBarCompactSetting
import org.futo.inputmethod.latin.uix.SettingsKey
import org.futo.inputmethod.latin.uix.UixManager
import org.futo.inputmethod.latin.uix.getSetting
@@ -553,7 +554,8 @@ class KeyboardSizingCalculator(val context: Context, val uixManager: UixManager)
}
fun calculateSuggestionBarHeightDp(): Float {
- return 40.0f
+ val compact = context.getSetting(SuggestionBarCompactSetting) == true
+ return if (compact) 26.0f else 40.0f
}
fun calculateTotalActionBarHeightPx(): Int =