This commit is contained in:
Eran Leshem 2025-04-15 03:00:36 +03:00 committed by GitHub
commit 4a845c8d24
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 238 additions and 200 deletions

View file

@ -148,6 +148,8 @@ public class KeyboardView extends View {
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
mTypeface = Settings.getInstance().getCustomTypeface(); mTypeface = Settings.getInstance().getCustomTypeface();
setFitsSystemWindows(true);
} }
@Nullable @Nullable

View file

@ -16,6 +16,7 @@ import helium314.keyboard.keyboard.internal.KeyboardParams;
import helium314.keyboard.keyboard.internal.PopupKeySpec; import helium314.keyboard.keyboard.internal.PopupKeySpec;
import helium314.keyboard.latin.R; import helium314.keyboard.latin.R;
import helium314.keyboard.latin.common.StringUtils; import helium314.keyboard.latin.common.StringUtils;
import helium314.keyboard.latin.utils.ResourceUtils;
import helium314.keyboard.latin.utils.TypefaceUtils; import helium314.keyboard.latin.utils.TypefaceUtils;
public final class PopupKeysKeyboard extends Keyboard { public final class PopupKeysKeyboard extends Keyboard {
@ -65,7 +66,7 @@ public final class PopupKeysKeyboard extends Keyboard {
public void setParameters(final int numKeys, final int numColumn, final int keyWidth, public void setParameters(final int numKeys, final int numColumn, final int keyWidth,
final int rowHeight, final int coordXInParent, final int parentKeyboardWidth, final int rowHeight, final int coordXInParent, final int parentKeyboardWidth,
final boolean isPopupKeysFixedColumn, final boolean isPopupKeysFixedOrder, final boolean isPopupKeysFixedColumn, final boolean isPopupKeysFixedOrder,
final int dividerWidth) { final int dividerWidth, Context context) {
mIsPopupKeysFixedOrder = isPopupKeysFixedOrder; mIsPopupKeysFixedOrder = isPopupKeysFixedOrder;
if (parentKeyboardWidth / keyWidth < Math.min(numKeys, numColumn)) { if (parentKeyboardWidth / keyWidth < Math.min(numKeys, numColumn)) {
throw new IllegalArgumentException("Keyboard is too small to hold popup keys: " throw new IllegalArgumentException("Keyboard is too small to hold popup keys: "
@ -305,7 +306,7 @@ public final class PopupKeysKeyboard extends Keyboard {
: (spaceForKeys > 0 ? spaceForKeys : defaultColumns); // in last case setParameters will throw an exception : (spaceForKeys > 0 ? spaceForKeys : defaultColumns); // in last case setParameters will throw an exception
mParams.setParameters(popupKeys.length, finalNumColumns, keyWidth, mParams.setParameters(popupKeys.length, finalNumColumns, keyWidth,
rowHeight, key.getX() + key.getWidth() / 2, keyboard.mId.mWidth, rowHeight, key.getX() + key.getWidth() / 2, keyboard.mId.mWidth,
key.isPopupKeysFixedColumn(), key.isPopupKeysFixedOrder(), dividerWidth); key.isPopupKeysFixedColumn(), key.isPopupKeysFixedOrder(), dividerWidth, context);
} }
private static int getMaxKeyWidth(final Key parentKey, final int minKeyWidth, private static int getMaxKeyWidth(final Key parentKey, final int minKeyWidth,

View file

@ -71,6 +71,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
getEnabledClipboardToolbarKeys(context.prefs()) getEnabledClipboardToolbarKeys(context.prefs())
.forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } .forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) }
keyboardAttr.recycle() keyboardAttr.recycle()
fitsSystemWindows = true
} }
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {

View file

@ -38,6 +38,7 @@ class ClipboardLayoutParams(ctx: Context) {
} }
val bottomPadding = (res.getFraction(R.fraction.config_keyboard_bottom_padding_holo, val bottomPadding = (res.getFraction(R.fraction.config_keyboard_bottom_padding_holo,
defaultKeyboardHeight, defaultKeyboardHeight) * sv.mBottomPaddingScale).toInt() defaultKeyboardHeight, defaultKeyboardHeight) * sv.mBottomPaddingScale).toInt()
val topPadding = res.getFraction(R.fraction.config_keyboard_top_padding_holo, val topPadding = res.getFraction(R.fraction.config_keyboard_top_padding_holo,
defaultKeyboardHeight, defaultKeyboardHeight).toInt() defaultKeyboardHeight, defaultKeyboardHeight).toInt()

View file

@ -5,7 +5,7 @@
*/ */
package helium314.keyboard.keyboard.emoji package helium314.keyboard.keyboard.emoji
import android.content.res.Resources import android.content.Context
import android.view.View import android.view.View
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -14,13 +14,14 @@ import helium314.keyboard.latin.R
import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.Settings
import helium314.keyboard.latin.utils.ResourceUtils import helium314.keyboard.latin.utils.ResourceUtils
internal class EmojiLayoutParams(res: Resources) { internal class EmojiLayoutParams(ctx: Context) {
private val emojiListBottomMargin: Int private val emojiListBottomMargin: Int
val emojiKeyboardHeight: Int val emojiKeyboardHeight: Int
private val emojiCategoryPageIdViewHeight: Int private val emojiCategoryPageIdViewHeight: Int
val bottomRowKeyboardHeight: Int val bottomRowKeyboardHeight: Int
init { init {
val res = ctx.resources
val sv = Settings.getValues() val sv = Settings.getValues()
val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv) val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv)

View file

@ -87,8 +87,7 @@ public final class EmojiPalettesView extends LinearLayout
super(context, attrs, defStyle); super(context, attrs, defStyle);
mColors = Settings.getValues().mColors; mColors = Settings.getValues().mColors;
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(context, null); final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(context, null);
final Resources res = context.getResources(); mEmojiLayoutParams = new EmojiLayoutParams(context);
mEmojiLayoutParams = new EmojiLayoutParams(res);
builder.setSubtype(RichInputMethodSubtype.Companion.getEmojiSubtype()); builder.setSubtype(RichInputMethodSubtype.Companion.getEmojiSubtype());
builder.setKeyboardGeometry(ResourceUtils.getKeyboardWidth(context, Settings.getValues()), builder.setKeyboardGeometry(ResourceUtils.getKeyboardWidth(context, Settings.getValues()),
mEmojiLayoutParams.getEmojiKeyboardHeight()); mEmojiLayoutParams.getEmojiKeyboardHeight());
@ -106,6 +105,7 @@ public final class EmojiPalettesView extends LinearLayout
R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0);
emojiPalettesViewAttr.recycle(); emojiPalettesViewAttr.recycle();
mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
setFitsSystemWindows(true);
} }
@Override @Override

View file

@ -8,14 +8,9 @@ package helium314.keyboard.keyboard.internal;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Insets;
import android.os.Build;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowMetrics;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -230,16 +225,6 @@ public class KeyboardParams {
mBottomPadding = (int) (keyboardAttr.getFraction( mBottomPadding = (int) (keyboardAttr.getFraction(
R.styleable.Keyboard_keyboardBottomPadding, height, height, 0) R.styleable.Keyboard_keyboardBottomPadding, height, height, 0)
* Settings.getValues().mBottomPaddingScale); * Settings.getValues().mBottomPaddingScale);
if (Build.VERSION.SDK_INT >= 35) {
WindowManager wm = context.getSystemService(WindowManager.class);
WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
WindowInsets windowInsets = windowMetrics.getWindowInsets();
int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout();
Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes);
mBottomPadding += insets.bottom;
}
mLeftPadding = (int) (keyboardAttr.getFraction( mLeftPadding = (int) (keyboardAttr.getFraction(
R.styleable.Keyboard_keyboardLeftPadding, width, width, 0) R.styleable.Keyboard_keyboardLeftPadding, width, width, 0)
* Settings.getValues().mSidePaddingScale); * Settings.getValues().mSidePaddingScale);

View file

@ -23,6 +23,7 @@ import helium314.keyboard.latin.utils.DictionaryInfoUtils.USER_DICTIONARY_SUFFIX
import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.LayoutType
import helium314.keyboard.latin.utils.LayoutType.Companion.folder import helium314.keyboard.latin.utils.LayoutType.Companion.folder
import helium314.keyboard.latin.utils.LayoutUtilsCustom import helium314.keyboard.latin.utils.LayoutUtilsCustom
import helium314.keyboard.latin.utils.Log
import helium314.keyboard.latin.utils.ScriptUtils.SCRIPT_LATIN import helium314.keyboard.latin.utils.ScriptUtils.SCRIPT_LATIN
import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.ScriptUtils.script
import helium314.keyboard.latin.utils.SubtypeSettings import helium314.keyboard.latin.utils.SubtypeSettings
@ -51,6 +52,14 @@ class App : Application() {
checkVersionUpgrade(this) checkVersionUpgrade(this)
app = this app = this
Defaults.initDynamicDefaults(this) Defaults.initDynamicDefaults(this)
val packageInfo = packageManager.getPackageInfo(packageName, 0)
@Suppress("DEPRECATION")
Log.i(
"startup", "Starting ${applicationInfo.processName} version ${packageInfo.versionName} (${
packageInfo.versionCode
}) on Android ${android.os.Build.VERSION.RELEASE} (SDK ${android.os.Build.VERSION.SDK_INT})"
)
} }
companion object { companion object {

View file

@ -6,6 +6,7 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -20,6 +21,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
@ -58,7 +60,11 @@ fun SearchSettingsScreen(
content = { content = {
if (content != null) content() if (content != null) content()
else { else {
Column(Modifier.verticalScroll(rememberScrollState())) { Scaffold { innerPadding ->
Column(
Modifier.verticalScroll(rememberScrollState())
.then(Modifier.padding(bottom = innerPadding.calculateBottomPadding()))
) {
settings.forEach { settings.forEach {
if (it is Int) { if (it is Int) {
PreferenceCategory(stringResource(it)) PreferenceCategory(stringResource(it))
@ -89,6 +95,7 @@ fun SearchSettingsScreen(
// } // }
// } // }
} }
}
}, },
filteredItems = { SettingsActivity.settingsContainer.filter(it) }, filteredItems = { SettingsActivity.settingsContainer.filter(it) },
itemContent = { it.Preference() } itemContent = { it.Preference() }
@ -195,7 +202,8 @@ fun <T: Any?> SearchScreen(
} }
} else { } else {
val items = filteredItems(searchText.text) val items = filteredItems(searchText.text)
LazyColumn { Scaffold { innerPadding ->
LazyColumn(contentPadding = PaddingValues.Absolute(bottom = innerPadding.calculateBottomPadding())) {
items(items) { items(items) {
itemContent(it) itemContent(it)
} }
@ -204,6 +212,7 @@ fun <T: Any?> SearchScreen(
} }
} }
} }
}
// from StreetComplete // from StreetComplete
/** Expandable text field that can be dismissed and requests focus when it is expanded */ /** Expandable text field that can be dismissed and requests focus when it is expanded */

View file

@ -13,6 +13,7 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -140,8 +141,10 @@ fun SubtypeScreen(
itemContent = { }, itemContent = { },
filteredItems = { emptyList<String>() } filteredItems = { emptyList<String>() }
) { ) {
Scaffold { innerPadding ->
Column( Column(
modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp), modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp)
.then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())),
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) } MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) }
@ -172,7 +175,10 @@ fun SubtypeScreen(
if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) { if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) {
WithSmallTitle(stringResource(R.string.show_popup_keys_title)) { WithSmallTitle(stringResource(R.string.show_popup_keys_title)) {
val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS)
val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!! val value = explicitValue ?: prefs.getString(
Settings.PREF_MORE_POPUP_KEYS,
Defaults.PREF_MORE_POPUP_KEYS
)!!
Row { Row {
TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f)) TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f))
{ Text(stringResource(morePopupKeysResId(value))) } { Text(stringResource(morePopupKeysResId(value))) }
@ -187,7 +193,10 @@ fun SubtypeScreen(
val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean()
Text(stringResource(R.string.localized_number_row), Modifier.weight(1f)) Text(stringResource(R.string.localized_number_row), Modifier.weight(1f))
Switch( Switch(
checked = checked ?: prefs.getBoolean(Settings.PREF_LOCALIZED_NUMBER_ROW, Defaults.PREF_LOCALIZED_NUMBER_ROW), checked = checked ?: prefs.getBoolean(
Settings.PREF_LOCALIZED_NUMBER_ROW,
Defaults.PREF_LOCALIZED_NUMBER_ROW
),
onCheckedChange = { onCheckedChange = {
setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString())) setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString()))
} }
@ -198,7 +207,10 @@ fun SubtypeScreen(
} }
} }
HorizontalDivider() HorizontalDivider()
Text(stringResource(R.string.settings_screen_secondary_layouts), style = MaterialTheme.typography.titleMedium) Text(
stringResource(R.string.settings_screen_secondary_layouts),
style = MaterialTheme.typography.titleMedium
)
LayoutType.entries.forEach { type -> LayoutType.entries.forEach { type ->
if (type == LayoutType.MAIN) return@forEach if (type == LayoutType.MAIN) return@forEach
WithSmallTitle(stringResource(type.displayNameId)) { WithSmallTitle(stringResource(type.displayNameId)) {
@ -212,11 +224,14 @@ fun SubtypeScreen(
onSelected = { onSelected = {
setCurrentSubtype(currentSubtype.withLayout(type, it)) setCurrentSubtype(currentSubtype.withLayout(type, it))
}, },
extraButton = { DefaultButton(explicitLayout == null) { extraButton = {
DefaultButton(explicitLayout == null) {
setCurrentSubtype(currentSubtype.withoutLayout(type)) setCurrentSubtype(currentSubtype.withoutLayout(type))
} }, }
},
) { ) {
val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it) val displayName =
if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it)
else it.getStringResourceOrName("layout_", ctx) else it.getStringResourceOrName("layout_", ctx)
var showLayoutEditDialog by remember { mutableStateOf(false) } var showLayoutEditDialog by remember { mutableStateOf(false) }
Row( Row(
@ -226,7 +241,14 @@ fun SubtypeScreen(
) { ) {
Text(displayName) Text(displayName)
if (LayoutUtilsCustom.isCustomLayout(it)) if (LayoutUtilsCustom.isCustomLayout(it))
IconButton({ showLayoutEditDialog = true }) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout)) } IconButton({
showLayoutEditDialog = true
}) {
Icon(
painterResource(R.drawable.ic_edit),
stringResource(R.string.edit_layout)
)
}
} }
if (showLayoutEditDialog) if (showLayoutEditDialog)
LayoutEditDialog( LayoutEditDialog(
@ -260,7 +282,10 @@ fun SubtypeScreen(
val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER)
PopupOrderDialog( PopupOrderDialog(
onDismissRequest = { showKeyOrderDialog = false }, onDismissRequest = { showKeyOrderDialog = false },
initialValue = setting ?: prefs.getString(Settings.PREF_POPUP_KEYS_ORDER, Defaults.PREF_POPUP_KEYS_ORDER)!!, initialValue = setting ?: prefs.getString(
Settings.PREF_POPUP_KEYS_ORDER,
Defaults.PREF_POPUP_KEYS_ORDER
)!!,
title = stringResource(R.string.popup_order), title = stringResource(R.string.popup_order),
showDefault = setting != null, showDefault = setting != null,
onConfirmed = { onConfirmed = {
@ -275,7 +300,10 @@ fun SubtypeScreen(
val setting = currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) val setting = currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER)
PopupOrderDialog( PopupOrderDialog(
onDismissRequest = { showHintOrderDialog = false }, onDismissRequest = { showHintOrderDialog = false },
initialValue = setting ?: prefs.getString(Settings.PREF_POPUP_KEYS_LABELS_ORDER, Defaults.PREF_POPUP_KEYS_LABELS_ORDER)!!, initialValue = setting ?: prefs.getString(
Settings.PREF_POPUP_KEYS_LABELS_ORDER,
Defaults.PREF_POPUP_KEYS_LABELS_ORDER
)!!,
title = stringResource(R.string.hint_source), title = stringResource(R.string.hint_source),
showDefault = setting != null, showDefault = setting != null,
onConfirmed = { onConfirmed = {
@ -299,6 +327,7 @@ fun SubtypeScreen(
) )
} }
} }
}
// from ReorderSwitchPreference // from ReorderSwitchPreference