From 846ab1edefa0f604a018b7c1db326f65dca79446 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 7 Jan 2025 20:38:03 +0100 Subject: [PATCH] fix crap introduced with Android 15 using fixes from GrapheneOS https://github.com/GrapheneOS/platform_packages_inputmethods_LatinIME/commit/bdc88aaf46b1041e09ef66e5e35cbcc3412a60da https://github.com/GrapheneOS/platform_packages_inputmethods_LatinIME/commit/3b7322437a2c3e9e35ffb56e1d290c676b0a59e7 fixes #1186 --- .../keyboard/keyboard/KeyboardLayoutSet.java | 2 +- .../keyboard/keyboard/KeyboardSwitcher.java | 5 ++-- .../clipboard/ClipboardHistoryView.kt | 6 ++-- .../clipboard/ClipboardLayoutParams.kt | 6 ++-- .../keyboard/emoji/EmojiCategory.java | 18 ++++++----- .../keyboard/emoji/EmojiPalettesView.java | 7 ++--- .../internal/keyboard_parser/EmojiParser.kt | 2 +- .../keyboard/latin/utils/ResourceUtils.java | 30 +++++++++++++++---- 8 files changed, 50 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java index 175860a09..0a3bcc041 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java @@ -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()); diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java index a392e4120..e676e014b 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java @@ -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()) diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt index b099f4ab4..1ead80770 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt @@ -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) } } diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt index 12b32eea7..baf033631 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt @@ -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, diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java index f89440c61..fbdfc99ae 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java @@ -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 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(); } diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index a475e4be3..641243002 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -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(); diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt index 66bdafb7b..8c13640aa 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -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) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java index c52ae0e45..321c7e3a1 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java @@ -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) {