This commit is contained in:
Eran Leshem 2025-04-10 23:07:37 +00:00 committed by GitHub
commit 6a72c6cdc4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 65 additions and 27 deletions

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: "
@ -120,7 +121,7 @@ public final class PopupKeysKeyboard extends Keyboard {
mBaseWidth = mOccupiedWidth = mNumColumns * mColumnWidth - mDividerWidth; mBaseWidth = mOccupiedWidth = mNumColumns * mColumnWidth - mDividerWidth;
// Need to subtract the bottom row's gutter only. // Need to subtract the bottom row's gutter only.
mBaseHeight = mOccupiedHeight = mNumRows * mDefaultAbsoluteRowHeight - mVerticalGap mBaseHeight = mOccupiedHeight = mNumRows * mDefaultAbsoluteRowHeight - mVerticalGap
+ mTopPadding + mBottomPadding; + mTopPadding + mBottomPadding - ResourceUtils.getBottomPaddingAdjustment(context);
} }
private int getFixedOrderTopRowAdjustment() { private int getFixedOrderTopRowAdjustment() {
@ -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

@ -37,9 +37,11 @@ class ClipboardLayoutParams(ctx: Context) {
defaultKeyboardWidth, defaultKeyboardWidth).toInt() defaultKeyboardWidth, defaultKeyboardWidth).toInt()
} }
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
+ ResourceUtils.getBottomPaddingAdjustment(ctx)).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()
val rowCount = KeyboardParams.DEFAULT_KEYBOARD_ROWS + if (sv.mShowsNumberRow) 1 else 0 val rowCount = KeyboardParams.DEFAULT_KEYBOARD_ROWS + if (sv.mShowsNumberRow) 1 else 0
bottomRowKeyboardHeight = (defaultKeyboardHeight - bottomPadding - topPadding) / rowCount - keyVerticalGap / 2 bottomRowKeyboardHeight = (defaultKeyboardHeight - bottomPadding - topPadding) / rowCount - keyVerticalGap / 2

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)
@ -32,7 +33,8 @@ internal class EmojiLayoutParams(res: Resources) {
defaultKeyboardHeight, defaultKeyboardHeight).toInt() defaultKeyboardHeight, defaultKeyboardHeight).toInt()
} }
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
+ ResourceUtils.getBottomPaddingAdjustment(ctx)).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

@ -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());

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;
@ -229,16 +224,8 @@ public class KeyboardParams {
R.styleable.Keyboard_keyboardTopPadding, height, height, 0); R.styleable.Keyboard_keyboardTopPadding, height, height, 0);
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)
+ ResourceUtils.getBottomPaddingAdjustment(context);
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)

View file

@ -6,6 +6,9 @@
package helium314.keyboard.latin.utils; package helium314.keyboard.latin.utils;
import java.util.function.BiFunction;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
@ -19,6 +22,7 @@ import android.view.WindowInsets;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.WindowMetrics; import android.view.WindowMetrics;
import androidx.annotation.RequiresApi;
import helium314.keyboard.latin.R; import helium314.keyboard.latin.R;
import helium314.keyboard.latin.settings.SettingsValues; import helium314.keyboard.latin.settings.SettingsValues;
@ -133,4 +137,47 @@ public final class ResourceUtils {
public static boolean isNight(final Resources res) { public static boolean isNight(final Resources res) {
return (res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; return (res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
} }
public static int getBottomPaddingAdjustment(Context context) {
if (Build.VERSION.SDK_INT < 35) {
return 0;
}
WindowManager wm = context.getSystemService(WindowManager.class);
logInsets(wm.getMaximumWindowMetrics(), "max-metrics");
logInsets(wm.getCurrentWindowMetrics(), "current-metrics");
WindowMetrics windowMetrics = wm.getMaximumWindowMetrics();
WindowInsets windowInsets = windowMetrics.getWindowInsets();
int insetTypes = WindowInsets.Type.navigationBars();
Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes);
return insets.bottom + insets.top;
}
@RequiresApi(api = Build.VERSION_CODES.R)
private static void logInsets(WindowMetrics metrics, String metricsType) {
logInsets(metrics, metricsType, WindowInsets::getInsets, "insets");
logInsets(metrics, metricsType, WindowInsets::getInsetsIgnoringVisibility, "insetsIgnoringVisibility");
}
@RequiresApi(api = Build.VERSION_CODES.R)
private static void logInsets(WindowMetrics metrics, String metricsType,
BiFunction<WindowInsets, Integer, Insets> insetsGetter, String visibility) {
logInsets(metrics, metricsType, WindowInsets.Type.navigationBars(),"navigationBars",
insetsGetter, visibility);
logInsets(metrics, metricsType, WindowInsets.Type.systemBars(), "systemBars", insetsGetter, visibility);
logInsets(metrics, metricsType, WindowInsets.Type.statusBars(), "statusBars", insetsGetter, visibility);
logInsets(metrics, metricsType, WindowInsets.Type.displayCutout(),"displayCutout",
insetsGetter, visibility);
}
@RequiresApi(api = Build.VERSION_CODES.R)
@SuppressLint("DefaultLocale")
private static void logInsets(WindowMetrics metrics, String metricsType, int insetTypes, String insetsType,
BiFunction<WindowInsets, Integer, Insets> insetsGetter, String visibility) {
WindowInsets windowInsets = metrics.getWindowInsets();
Insets insets = insetsGetter.apply(windowInsets, insetTypes);
Log.i("insets", String.format("%s, %s, %s, bottom %d, top %d", metricsType, insetsType, visibility,
insets.bottom, insets.top));
}
} }