From 3107144f3869722525047a4857995f03e8d78810 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 11 Dec 2023 10:03:21 +0100 Subject: [PATCH] load emoji keyboards only when used, and not on keyboard start ca 30% faster keyboard loading (on first start, or when theme/color change) ca 5-10% reduced memory use may result in short loading times when an emoji tab is opened for the first time --- .../openboard/inputmethod/keyboard/Key.java | 28 +++++++++++++++++++ .../keyboard/emoji/DynamicGridKeyboard.java | 12 +++++--- .../keyboard/emoji/EmojiCategory.java | 21 +++++++------- .../internal/keyboard_parser/EmojiParser.kt | 1 + 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java index 1cfa2c79d..78127d08c 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java @@ -265,6 +265,34 @@ public class Key implements Comparable { mEnabled = key.mEnabled; } + /** constructor for creating emoji recent keys when there is no keyboard to take keys from */ + public Key(@NonNull final Key key, @Nullable final MoreKeySpec[] moreKeys, + @Nullable final String labelHint, final int backgroundType, final int code, @Nullable final String outputText) { + // Final attributes. + mCode = outputText == null ? code : CODE_OUTPUT_TEXT; + mLabel = outputText == null ? StringUtils.newSingleCodePointString(code) : outputText; + mHintLabel = labelHint; + mLabelFlags = key.mLabelFlags; + mIconId = key.mIconId; + mWidth = key.mWidth; + mHeight = key.mHeight; + mHorizontalGap = key.mHorizontalGap; + mVerticalGap = key.mVerticalGap; + mX = key.mX; + mY = key.mY; + mHitBox.set(key.mHitBox); + mMoreKeys = moreKeys; + mMoreKeysColumnAndFlags = key.mMoreKeysColumnAndFlags; + mBackgroundType = backgroundType; + mActionFlags = key.mActionFlags; + mKeyVisualAttributes = key.mKeyVisualAttributes; + mOptionalAttributes = outputText == null ? null : Key.OptionalAttributes.newInstance(outputText, CODE_UNSPECIFIED, ICON_UNDEFINED, 0, 0); + mHashCode = key.mHashCode; + // Key state. + mPressed = key.mPressed; + mEnabled = key.mEnabled; + } + /** constructor from KeyParams */ private Key(KeyParams keyParams) { // stuff to copy diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java index bd34e288d..4f96848c8 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java @@ -158,7 +158,7 @@ final class DynamicGridKeyboard extends Keyboard { Settings.writeEmojiRecentKeys(mPrefs, jsonStr); } - private static Key getKeyByCode(final Collection keyboards, + private Key getKeyByCode(final Collection keyboards, final int code) { for (final DynamicGridKeyboard keyboard : keyboards) { for (final Key key : keyboard.getSortedKeys()) { @@ -167,10 +167,12 @@ final class DynamicGridKeyboard extends Keyboard { } } } - return null; + + // fall back to creating the key + return new Key(getTemplateKey(TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, code, null); } - private static Key getKeyByOutputText(final Collection keyboards, + private Key getKeyByOutputText(final Collection keyboards, final String outputText) { for (final DynamicGridKeyboard keyboard : keyboards) { for (final Key key : keyboard.getSortedKeys()) { @@ -179,7 +181,9 @@ final class DynamicGridKeyboard extends Keyboard { } } } - return null; + + // fall back to creating the key + return new Key(getTemplateKey(TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, 0, outputText); } public void loadRecentKeys(final Collection keyboards) { diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java index 7d54f64ae..09d5e76d4 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java @@ -48,10 +48,14 @@ final class EmojiCategory { public final class CategoryProperties { public final int mCategoryId; - public final int mPageCount; - public CategoryProperties(final int categoryId, final int pageCount) { + private int mPageCount = -1; + public CategoryProperties(final int categoryId) { mCategoryId = categoryId; - mPageCount = pageCount; + } + public int getPageCount() { + if (mPageCount < 0) + mPageCount = computeCategoryPageCount(mCategoryId); + return mPageCount; } } @@ -147,8 +151,7 @@ final class EmojiCategory { } addShownCategoryId(EmojiCategory.ID_EMOTICONS); - DynamicGridKeyboard recentsKbd = - getKeyboard(EmojiCategory.ID_RECENTS, 0 /* categoryPageId */); + DynamicGridKeyboard recentsKbd = getKeyboard(EmojiCategory.ID_RECENTS, 0); recentsKbd.loadRecentKeys(mCategoryKeyboardMap.values()); mCurrentCategoryId = Settings.readLastShownEmojiCategoryId(mPrefs, defaultCategoryId); @@ -167,9 +170,7 @@ final class EmojiCategory { private void addShownCategoryId(final int categoryId) { // Load a keyboard of categoryId - getKeyboard(categoryId, 0 /* categoryPageId */); - final CategoryProperties properties = - new CategoryProperties(categoryId, computeCategoryPageCount(categoryId)); + final CategoryProperties properties = new CategoryProperties(categoryId); mShownCategories.add(properties); } @@ -214,7 +215,7 @@ final class EmojiCategory { public int getCategoryPageCount(final int categoryId) { for (final CategoryProperties prop : mShownCategories) { if (prop.mCategoryId == categoryId) { - return prop.mPageCount; + return prop.getPageCount(); } } Log.w(TAG, "Invalid category id: " + categoryId); @@ -258,7 +259,7 @@ final class EmojiCategory { if (props.mCategoryId == categoryId) { return sum + categoryPageId; } - sum += props.mPageCount; + sum += props.getPageCount(); } Log.w(TAG, "categoryId not found: " + categoryId); return 0; diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/EmojiParser.kt index 18befa5e6..6c80e7c40 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-only package org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser import android.content.Context