fix crap introduced with Android 15

using fixes from GrapheneOS
bdc88aaf46
3b7322437a

fixes #1186
This commit is contained in:
Helium314 2025-01-07 20:38:03 +01:00
parent 5251bcd989
commit 846ab1edef
8 changed files with 50 additions and 26 deletions

View file

@ -220,7 +220,7 @@ public final class KeyboardLayoutSet {
builder.mParams.mMode = KeyboardId.MODE_TEXT;
// always full width, but height should consider scale and number row to align nicely
// actually the keyboard does not have full height, but at this point we use it to get correct key heights
final int width = ResourceUtils.getDefaultKeyboardWidth(context.getResources());
final int width = ResourceUtils.getDefaultKeyboardWidth(context);
final int height = ResourceUtils.getKeyboardHeight(context.getResources(), Settings.getInstance().getCurrent());
builder.setKeyboardGeometry(width, height);
builder.setSubtype(RichInputMethodManager.getInstance().getCurrentSubtype());

View file

@ -137,9 +137,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
final int currentAutoCapsState, final int currentRecapitalizeState) {
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
mThemeContext, editorInfo);
final Resources res = mThemeContext.getResources();
final int keyboardWidth = ResourceUtils.getKeyboardWidth(res, settingsValues);
final int keyboardHeight = ResourceUtils.getKeyboardHeight(res, settingsValues);
final int keyboardWidth = ResourceUtils.getKeyboardWidth(mThemeContext, settingsValues);
final int keyboardHeight = ResourceUtils.getKeyboardHeight(mThemeContext.getResources(), settingsValues);
final boolean oneHandedModeEnabled = settingsValues.mOneHandedModeEnabled;
mKeyboardLayoutSet = builder.setKeyboardGeometry(keyboardWidth, keyboardHeight)
.setSubtype(mRichImm.getCurrentSubtype())

View file

@ -43,7 +43,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
) : LinearLayout(context, attrs, defStyle), View.OnClickListener,
ClipboardHistoryManager.OnHistoryChangeListener, OnKeyEventListener, View.OnLongClickListener {
private val clipboardLayoutParams = ClipboardLayoutParams(context.resources)
private val clipboardLayoutParams = ClipboardLayoutParams(context)
private val pinIconId: Int
private val keyBackgroundId: Int
private var initialized = false
@ -78,7 +78,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val res = context.resources
// The main keyboard expands to the entire this {@link KeyboardView}.
val width = ResourceUtils.getKeyboardWidth(res, Settings.getInstance().current) + paddingLeft + paddingRight
val width = ResourceUtils.getKeyboardWidth(context, Settings.getInstance().current) + paddingLeft + paddingRight
val height = ResourceUtils.getKeyboardHeight(res, Settings.getInstance().current) + paddingTop + paddingBottom
setMeasuredDimension(width, height)
}
@ -166,7 +166,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
}
clipboardRecyclerView.apply {
adapter = clipboardAdapter
layoutParams.width = ResourceUtils.getKeyboardWidth(context.resources, Settings.getInstance().current)
layoutParams.width = ResourceUtils.getKeyboardWidth(context, Settings.getInstance().current)
}
}

View file

@ -2,6 +2,7 @@
package helium314.keyboard.keyboard.clipboard
import android.content.Context
import android.content.res.Resources
import android.view.View
import android.widget.FrameLayout
@ -11,7 +12,7 @@ import helium314.keyboard.latin.R
import helium314.keyboard.latin.settings.Settings
import helium314.keyboard.latin.utils.ResourceUtils
class ClipboardLayoutParams(res: Resources) {
class ClipboardLayoutParams(ctx: Context) {
private val keyVerticalGap: Int
private val keyHorizontalGap: Int
@ -19,9 +20,10 @@ class ClipboardLayoutParams(res: Resources) {
val bottomRowKeyboardHeight: Int
init {
val res = ctx.resources
val sv = Settings.getInstance().current
val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv)
val defaultKeyboardWidth = ResourceUtils.getKeyboardWidth(res, sv)
val defaultKeyboardWidth = ResourceUtils.getKeyboardWidth(ctx, sv)
if (sv.mNarrowKeyGaps) {
keyVerticalGap = res.getFraction(R.fraction.config_key_vertical_gap_holo_narrow,

View file

@ -6,11 +6,14 @@
package helium314.keyboard.keyboard.emoji;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.graphics.Rect;
import helium314.keyboard.latin.utils.DeviceProtectedUtils;
import helium314.keyboard.latin.utils.Log;
import androidx.core.graphics.PaintCompat;
@ -114,6 +117,7 @@ final class EmojiCategory {
private final SharedPreferences mPrefs;
private final Resources mRes;
private final Context mContext;
private final int mMaxRecentsKeyCount;
private final KeyboardLayoutSet mLayoutSet;
private final HashMap<String, Integer> mCategoryNameToIdMap = new HashMap<>();
@ -124,11 +128,11 @@ final class EmojiCategory {
private int mCurrentCategoryId = EmojiCategory.ID_UNSPECIFIED;
private int mCurrentCategoryPageId = 0;
public EmojiCategory(final SharedPreferences prefs, final Resources res,
final KeyboardLayoutSet layoutSet, final TypedArray emojiPaletteViewAttr) {
mPrefs = prefs;
mRes = res;
mMaxRecentsKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_recents_key_count);
public EmojiCategory(final Context ctx, final KeyboardLayoutSet layoutSet, final TypedArray emojiPaletteViewAttr) {
mPrefs = DeviceProtectedUtils.getSharedPreferences(ctx);
mRes = ctx.getResources();
mContext = ctx;
mMaxRecentsKeyCount = mRes.getInteger(R.integer.config_emoji_keyboard_max_recents_key_count);
mLayoutSet = layoutSet;
for (int i = 0; i < sCategoryName.length; ++i) {
mCategoryNameToIdMap.put(sCategoryName[i], i);
@ -297,7 +301,7 @@ final class EmojiCategory {
return mCategoryKeyboardMap.get(categoryKeyboardMapKey);
}
final int currentWidth = ResourceUtils.getKeyboardWidth(mRes, Settings.getInstance().getCurrent());
final int currentWidth = ResourceUtils.getKeyboardWidth(mContext, Settings.getInstance().getCurrent());
if (categoryId == EmojiCategory.ID_RECENTS) {
final DynamicGridKeyboard kbd = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
@ -330,7 +334,7 @@ final class EmojiCategory {
private int computeMaxKeyCountPerPage() {
final DynamicGridKeyboard tempKeyboard = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
0, 0, ResourceUtils.getKeyboardWidth(mRes, Settings.getInstance().getCurrent()));
0, 0, ResourceUtils.getKeyboardWidth(mContext, Settings.getInstance().getCurrent()));
return MAX_LINE_COUNT_PER_PAGE * tempKeyboard.getColumnsCount();
}

View file

@ -90,13 +90,12 @@ public final class EmojiPalettesView extends LinearLayout
final Resources res = context.getResources();
mEmojiLayoutParams = new EmojiLayoutParams(res);
builder.setSubtype(RichInputMethodSubtype.getEmojiSubtype());
builder.setKeyboardGeometry(ResourceUtils.getKeyboardWidth(res, Settings.getInstance().getCurrent()),
builder.setKeyboardGeometry(ResourceUtils.getKeyboardWidth(context, Settings.getInstance().getCurrent()),
mEmojiLayoutParams.getEmojiKeyboardHeight());
final KeyboardLayoutSet layoutSet = builder.build();
final TypedArray emojiPalettesViewAttr = context.obtainStyledAttributes(attrs,
R.styleable.EmojiPalettesView, defStyle, R.style.EmojiPalettesView);
mEmojiCategory = new EmojiCategory(DeviceProtectedUtils.getSharedPreferences(context),
res, layoutSet, emojiPalettesViewAttr);
mEmojiCategory = new EmojiCategory(context, layoutSet, emojiPalettesViewAttr);
mCategoryIndicatorEnabled = emojiPalettesViewAttr.getBoolean(
R.styleable.EmojiPalettesView_categoryIndicatorEnabled, false);
mCategoryIndicatorDrawableResId = emojiPalettesViewAttr.getResourceId(
@ -114,7 +113,7 @@ public final class EmojiPalettesView extends LinearLayout
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final Resources res = getContext().getResources();
// The main keyboard expands to the entire this {@link KeyboardView}.
final int width = ResourceUtils.getKeyboardWidth(res, Settings.getInstance().getCurrent())
final int width = ResourceUtils.getKeyboardWidth(getContext(), Settings.getInstance().getCurrent())
+ getPaddingLeft() + getPaddingRight();
final int height = ResourceUtils.getKeyboardHeight(res, Settings.getInstance().getCurrent())
+ getPaddingTop() + getPaddingBottom();

View file

@ -43,7 +43,7 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte
// determine key width for default settings (no number row, no one-handed mode, 100% height and bottom padding scale)
// this is a bit long, but ensures that emoji size stays the same, independent of these settings
val defaultKeyWidth = (ResourceUtils.getDefaultKeyboardWidth(context.resources) - params.mLeftPadding - params.mRightPadding) * params.mDefaultKeyWidth
val defaultKeyWidth = (ResourceUtils.getDefaultKeyboardWidth(context) - params.mLeftPadding - params.mRightPadding) * params.mDefaultKeyWidth
val keyWidth = defaultKeyWidth * sqrt(Settings.getInstance().current.mKeyboardHeightScale)
val defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false)
val defaultBottomPadding = context.resources.getFraction(R.fraction.config_keyboard_bottom_padding_holo, defaultKeyboardHeight, defaultKeyboardHeight)

View file

@ -6,11 +6,20 @@
package helium314.keyboard.latin.utils;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Build;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowMetrics;
import androidx.core.util.TypedValueCompat;
@ -26,17 +35,28 @@ public final class ResourceUtils {
// This utility class is not publicly instantiable.
}
public static int getKeyboardWidth(final Resources res, final SettingsValues settingsValues) {
final int defaultKeyboardWidth = getDefaultKeyboardWidth(res);
public static int getKeyboardWidth(final Context ctx, final SettingsValues settingsValues) {
final int defaultKeyboardWidth = getDefaultKeyboardWidth(ctx);
if (settingsValues.mOneHandedModeEnabled) {
return (int) (settingsValues.mOneHandedModeScale * defaultKeyboardWidth);
}
return defaultKeyboardWidth;
}
public static int getDefaultKeyboardWidth(final Resources res) {
final DisplayMetrics dm = res.getDisplayMetrics();
return dm.widthPixels;
public static int getDefaultKeyboardWidth(final Context ctx) {
if (Build.VERSION.SDK_INT < 35) {
final DisplayMetrics dm = ctx.getResources().getDisplayMetrics();
return dm.widthPixels;
}
// Since Android 15, insets aren't subtracted from DisplayMetrics.widthPixels, despite
// targetSdk remaining set to 30.
WindowManager wm = ctx.getSystemService(WindowManager.class);
WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
Rect windowBounds = windowMetrics.getBounds();
WindowInsets windowInsets = windowMetrics.getWindowInsets();
int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout();
Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes);
return windowBounds.width() - insets.left - insets.right;
}
public static int getKeyboardHeight(final Resources res, final SettingsValues settingsValues) {