Skip to content

Commit 09b5a8d

Browse files
barmiroabb128
authored andcommitted
Add keyboard preview on ThemeScreen (#1422)
Signed-off-by: Aleksandras Kostarevas <[email protected]>
1 parent 1526ecb commit 09b5a8d

File tree

1 file changed

+85
-4
lines changed

1 file changed

+85
-4
lines changed
Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,111 @@
11
package org.futo.inputmethod.latin.uix.settings.pages
22

3+
import android.app.Activity
4+
import android.os.Build
35
import androidx.compose.foundation.layout.Column
46
import androidx.compose.foundation.layout.fillMaxSize
7+
import androidx.compose.foundation.layout.padding
8+
import androidx.compose.material3.FabPosition
9+
import androidx.compose.material3.Scaffold
10+
import androidx.compose.material3.SmallFloatingActionButton
511
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.DisposableEffect
13+
import androidx.compose.runtime.getValue
14+
import androidx.compose.runtime.mutableStateOf
15+
import androidx.compose.runtime.remember
16+
import androidx.compose.runtime.setValue
617
import androidx.compose.ui.Modifier
718
import androidx.compose.ui.platform.LocalContext
19+
import androidx.compose.ui.platform.LocalTextInputService
820
import androidx.compose.ui.res.stringResource
21+
import androidx.compose.ui.text.input.ImeOptions
22+
import androidx.compose.ui.text.input.PlatformImeOptions
23+
import androidx.compose.ui.text.input.TextFieldValue
24+
import androidx.compose.ui.text.input.TextInputSession
925
import androidx.compose.ui.tooling.preview.Preview
26+
import androidx.core.view.ViewCompat
27+
import androidx.core.view.WindowInsetsCompat
1028
import androidx.navigation.NavHostController
1129
import androidx.navigation.compose.rememberNavController
1230
import org.futo.inputmethod.latin.uix.THEME_KEY
1331
import org.futo.inputmethod.latin.uix.settings.ScreenTitle
1432
import org.futo.inputmethod.latin.uix.settings.useDataStore
1533
import org.futo.inputmethod.latin.uix.theme.selector.ThemePicker
1634
import org.futo.inputmethod.latin.R
35+
import org.futo.inputmethod.latin.uix.settings.RotatingChevronIcon
1736

1837
@Preview
1938
@Composable
2039
fun ThemeScreen(navController: NavHostController = rememberNavController()) {
2140
val (theme, setTheme) = useDataStore(THEME_KEY.key, THEME_KEY.default)
2241

2342
val context = LocalContext.current
24-
Column(modifier = Modifier.fillMaxSize()) {
25-
ScreenTitle(stringResource(R.string.theme_settings_title), showBack = true, navController)
26-
ThemePicker {
27-
setTheme(it.key)
43+
val enableKeyboardPreview = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
44+
var showKeyboard by remember { mutableStateOf(false) }
45+
46+
if (enableKeyboardPreview) {
47+
val textInputService = LocalTextInputService.current
48+
val rootView = (context as? Activity)?.window?.decorView?.rootView
49+
val session = remember { mutableStateOf<TextInputSession?>(null) }
50+
51+
DisposableEffect(showKeyboard, theme) {
52+
val service = textInputService ?: return@DisposableEffect onDispose { }
53+
54+
if (showKeyboard) {
55+
session.value = service.startInput(
56+
TextFieldValue(""),
57+
imeOptions = ImeOptions.Default.copy(
58+
platformImeOptions = PlatformImeOptions(
59+
privateImeOptions = "org.futo.inputmethod.latin.NoSuggestions=1"
60+
)
61+
),
62+
onEditCommand = { },
63+
onImeActionPerformed = { }
64+
)
65+
}
66+
67+
onDispose {
68+
service.stopInput(session.value ?: return@onDispose)
69+
}
70+
}
71+
72+
// Detect manual keyboard dismissal (e.g., back button press)
73+
rootView?.let { view ->
74+
DisposableEffect(view) {
75+
ViewCompat.setOnApplyWindowInsetsListener(view) { _, insets ->
76+
val isKeyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
77+
if (!isKeyboardVisible && showKeyboard) {
78+
showKeyboard = false
79+
}
80+
insets
81+
}
82+
83+
onDispose {
84+
ViewCompat.setOnApplyWindowInsetsListener(view, null)
85+
}
86+
}
87+
}
88+
}
89+
90+
Scaffold(
91+
floatingActionButton = {
92+
if (enableKeyboardPreview) {
93+
SmallFloatingActionButton(
94+
onClick = {
95+
showKeyboard = !showKeyboard
96+
}
97+
) {
98+
RotatingChevronIcon(!showKeyboard)
99+
}
100+
}
101+
},
102+
floatingActionButtonPosition = FabPosition.Start
103+
) { innerPadding ->
104+
Column(modifier = Modifier.fillMaxSize().padding(innerPadding)) {
105+
ScreenTitle(stringResource(R.string.theme_settings_title), showBack = true, navController)
106+
ThemePicker {
107+
setTheme(it.key)
108+
}
28109
}
29110
}
30111
}

0 commit comments

Comments
 (0)