From 7a01d1e6e6c651b29a4949c9bbc23087bf3c84e8 Mon Sep 17 00:00:00 2001 From: Aleksandras Kostarevas Date: Tue, 17 Sep 2024 09:58:56 +0300 Subject: [PATCH] Update key preview positioning and scaling, use touch origin offset for moreKey detection --- .../keyboard/MainKeyboardView.java | 26 ++++---------- .../keyboard/MoreKeysKeyboard.java | 2 +- .../keyboard/MoreKeysKeyboardView.java | 6 ++-- .../inputmethod/keyboard/MoreKeysPanel.java | 2 +- .../internal/KeyPreviewChoreographer.java | 17 ++++++++-- .../keyboard/internal/KeyPreviewView.java | 10 +++--- .../latin/uix/BasicThemeProvider.kt | 34 ++++++------------- 7 files changed, 42 insertions(+), 55 deletions(-) diff --git a/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java b/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java index 0e5cef40d..d637843ca 100644 --- a/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java @@ -622,25 +622,13 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy final int[] lastCoords = CoordinateUtils.newInstance(); tracker.getLastCoordinates(lastCoords); - final boolean keyPreviewEnabled = mKeyPreviewDrawParams.isPopupEnabled(); - // The more keys keyboard is usually horizontally aligned with the center of the parent key. - // If showMoreKeysKeyboardAtTouchedPoint is true and the key preview is disabled, the more - // keys keyboard is placed at the touch point of the parent key. - final int pointX = (mConfigShowMoreKeysKeyboardAtTouchedPoint && !keyPreviewEnabled) - ? CoordinateUtils.x(lastCoords) - : key.getX() + key.getWidth() / 2; - // The more keys keyboard is usually vertically aligned with the top edge of the parent key - // (plus vertical gap). If the key preview is enabled, the more keys keyboard is vertically - // aligned with the bottom edge of the visible part of the key preview. - // {@code mPreviewVisibleOffset} has been set appropriately in - // {@link KeyboardView#showKeyPreview(PointerTracker)}. - final int pointY; - if(key.isActionKey()) { - pointY = key.getY(); - } else { - pointY = key.getY() + mKeyPreviewDrawParams.getVisibleOffset() + (keyPreviewEnabled ? key.getHeight() : key.getVerticalGap()); - } - moreKeysKeyboardView.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener); + + final int bottomPadding = mKeyPreviewChoreographer.getBottomPaddingForKey(getContext(), key); + + final int pointX = key.getDrawX() + key.getDrawWidth() / 2; + final int pointY = key.getY() + key.getHeight() - bottomPadding; + + moreKeysKeyboardView.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener, lastCoords); return moreKeysKeyboardView; } diff --git a/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboard.java index 4cc625398..d70c6ba33 100644 --- a/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboard.java +++ b/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboard.java @@ -318,7 +318,7 @@ public final class MoreKeysKeyboard extends Keyboard { int dimension = (int)(context.getResources().getDisplayMetrics().density * 44.5f); keyWidth = getMaxKeyWidth(key, Math.min(dimension, key.getTotalWidth()), padding, paintToMeasure); - rowHeight = dimension; + rowHeight = Math.max(key.getHeight(), dimension); } final int dividerWidth = 0; // TODO: Remove divider final List moreKeys = key.getMoreKeys(); diff --git a/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboardView.java index 475a7c9ef..56a0debe2 100644 --- a/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboardView.java +++ b/java/src/org/futo/inputmethod/keyboard/MoreKeysKeyboardView.java @@ -121,7 +121,7 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel @Override public void showMoreKeysPanel(final View parentView, final Controller controller, - final int pointX, final int pointY, final KeyboardActionListener listener) { + final int pointX, final int pointY, final KeyboardActionListener listener, final int[] touchOrigin) { mController = controller; mListener = listener; final View container = getContainerView(); @@ -139,8 +139,8 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel container.setX(panelX); container.setY(panelY); - mOriginX = x + container.getPaddingLeft(); - mOriginY = y + container.getPaddingTop(); + mOriginX = CoordinateUtils.x(touchOrigin) - getDefaultCoordX(); + mOriginY = CoordinateUtils.y(touchOrigin) - container.getMeasuredHeight(); controller.onShowMoreKeysPanel(this); final MoreKeysKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; if (accessibilityDelegate != null diff --git a/java/src/org/futo/inputmethod/keyboard/MoreKeysPanel.java b/java/src/org/futo/inputmethod/keyboard/MoreKeysPanel.java index 45d5dd7be..853072ee5 100644 --- a/java/src/org/futo/inputmethod/keyboard/MoreKeysPanel.java +++ b/java/src/org/futo/inputmethod/keyboard/MoreKeysPanel.java @@ -61,7 +61,7 @@ public interface MoreKeysPanel { // TODO: Currently the MoreKeysPanel is inside a container view that is added to the parent. // Consider the simpler approach of placing the MoreKeysPanel itself into the parent view. public void showMoreKeysPanel(View parentView, Controller controller, int pointX, - int pointY, KeyboardActionListener listener); + int pointY, KeyboardActionListener listener, int[] touchOrigin); /** * Dismisses the more keys panel and calls the controller's onDismissMoreKeysPanel to remove diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewChoreographer.java index 1c029f76f..c993fbf2c 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewChoreographer.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewChoreographer.java @@ -103,6 +103,11 @@ public final class KeyPreviewChoreographer { showKeyPreview(key, keyPreviewView, withAnimation); } + public int getBottomPaddingForKey(final Context context, final Key key) { + final float density = context.getResources().getDisplayMetrics().density; + return Math.max(key.getHeight(), (int)(64.0f * density)); + } + private void placeKeyPreview(final Key key, final KeyPreviewView keyPreviewView, final KeyboardIconsSet iconsSet, final KeyDrawParams drawParams, final int keyboardViewWidth, final int[] originCoords) { @@ -110,8 +115,16 @@ public final class KeyPreviewChoreographer { keyPreviewView.measure( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); mParams.setGeometry(keyPreviewView); - final int previewWidth = keyPreviewView.getMeasuredWidth(); - final int previewHeight = mParams.mPreviewHeight; + + final float density = keyPreviewView.getContext().getResources().getDisplayMetrics().density; + + final int bottomPadding = getBottomPaddingForKey(keyPreviewView.getContext(), key); + final int topArea = Math.max(key.getHeight(), (int)(44.0f * density)); + + final int previewWidth = Math.min(Math.max(key.getWidth(), (int)(34.0f * density)), (int)(80.0f * density)); + final int previewHeight = topArea + bottomPadding; + keyPreviewView.setPadding(0, 0, 0, bottomPadding); + final int keyDrawWidth = key.getDrawWidth(); // The key preview is horizontally aligned with the center of the visible part of the // parent key. If it doesn't fit in this {@link KeyboardView}, it is moved inward to fit and diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewView.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewView.java index 86707ba88..828f07245 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewView.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyPreviewView.java @@ -49,7 +49,7 @@ public class KeyPreviewView extends androidx.appcompat.widget.AppCompatTextView public KeyPreviewView(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); - setGravity(Gravity.CENTER); + setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); } public void setPreviewVisual(final Key key, final KeyboardIconsSet iconsSet, @@ -64,13 +64,13 @@ public class KeyPreviewView extends androidx.appcompat.widget.AppCompatTextView setCompoundDrawables(null, null, null, null); setTextColor(drawParams.mPreviewTextColor); - setTextSize(TypedValue.COMPLEX_UNIT_PX, key.selectPreviewTextSize(drawParams)); + setTextSize(TypedValue.COMPLEX_UNIT_PX, key.selectTextSize(drawParams)); setTypeface(key.selectPreviewTypeface(drawParams)); // TODO Should take care of temporaryShiftLabel here. - setTextAndScaleX(key.getPreviewLabel()); + setTextAndScaleX(key.getWidth(), key.getPreviewLabel()); } - private void setTextAndScaleX(final String text) { + private void setTextAndScaleX(int maxWidth, final String text) { setTextScaleX(1.0f); setText(text); if (sNoScaleXTextSet.contains(text)) { @@ -83,8 +83,6 @@ public class KeyPreviewView extends androidx.appcompat.widget.AppCompatTextView return; } background.getPadding(mBackgroundPadding); - final int maxWidth = background.getIntrinsicWidth() - mBackgroundPadding.left - - mBackgroundPadding.right; final float width = getTextWidth(text, getPaint()); if (width <= maxWidth) { sNoScaleXTextSet.add(text); diff --git a/java/src/org/futo/inputmethod/latin/uix/BasicThemeProvider.kt b/java/src/org/futo/inputmethod/latin/uix/BasicThemeProvider.kt index 8a9ebc16d..e4cb23e79 100644 --- a/java/src/org/futo/inputmethod/latin/uix/BasicThemeProvider.kt +++ b/java/src/org/futo/inputmethod/latin/uix/BasicThemeProvider.kt @@ -229,7 +229,6 @@ class BasicThemeProvider(val context: Context, val colorScheme: KeyboardColorSch colors[R.styleable.Keyboard_Key_keyHintLabelColor] = onKeyColorHalf colors[R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor] = onKeyColorHalf colors[R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor] = onKeyColorHalf - colors[R.styleable.Keyboard_Key_keyPreviewTextColor] = onSecondary colors[R.styleable.MainKeyboardView_languageOnSpacebarTextColor] = onKeyColorHalf colors[R.styleable.MainKeyboardView_gestureTrailColor] = primary colors[R.styleable.MainKeyboardView_slidingKeyInputPreviewColor] = primary @@ -316,11 +315,11 @@ class BasicThemeProvider(val context: Context, val colorScheme: KeyboardColorSch }, KeyVisualStyle.MoreKey to VisualStyleDescriptor( - backgroundDrawable = coloredRoundedRectangle(primaryContainer, dp(24.dp)), + backgroundDrawable = coloredRoundedRectangle(primaryContainer, dp(8.dp)), foregroundColor = onPrimaryContainer, - backgroundDrawablePressed = coloredRoundedRectangle(onPrimaryContainer, dp(24.dp)), - foregroundColorPressed = primaryContainer + backgroundDrawablePressed = coloredRoundedRectangle(primary, dp(8.dp)), + foregroundColorPressed = onPrimary ), KeyVisualStyle.Functional to if(keyBorders) { @@ -405,28 +404,17 @@ class BasicThemeProvider(val context: Context, val colorScheme: KeyboardColorSch ) } - keyFeedback = ShapeDrawable().apply { - paint.color = secondary - shape = RoundRectShape( - floatArrayOf( - dp(8.dp), dp(8.dp), dp(8.dp), dp(8.dp), - dp(8.dp), dp(8.dp), dp(8.dp), dp(8.dp), - ), null, null - ) - - intrinsicWidth = dp(48.dp).roundToInt() - intrinsicHeight = dp(24.dp).roundToInt() - - setPadding(0, 0, 0, dp(50.dp).roundToInt()) + keyFeedback = GradientDrawable( + GradientDrawable.Orientation.TOP_BOTTOM, + intArrayOf(primaryContainer, primaryContainer), + ).apply { + cornerRadius = dp(8.dp) } + colors[R.styleable.Keyboard_Key_keyPreviewTextColor] = onPrimaryContainer + moreKeysTextColor = onPrimaryContainer - moreKeysKeyboardBackground = coloredRoundedRectangle(primaryContainer, dp(28.dp)).apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val padding = dp(4.dp).roundToInt() - setPadding(padding, padding, padding, padding) - } - } + moreKeysKeyboardBackground = coloredRoundedRectangle(primaryContainer, dp(8.dp)) assert(icons.keys == KeyboardIconsSet.validIcons) { "Icons differ. Missing: ${KeyboardIconsSet.validIcons - icons.keys}, extraneous: ${icons.keys - KeyboardIconsSet.validIcons}"