Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae56d5c3 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Use different reference character for hit label"

parents 25047fca 2ed13003
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@
    <dimen name="key_preview_offset">0.1in</dimen>

    <dimen name="key_label_horizontal_padding">4dip</dimen>
    <dimen name="key_hint_letter_padding">2dp</dimen>
    <dimen name="key_hint_letter_padding">1dp</dimen>
    <dimen name="key_uppercase_letter_padding">2dp</dimen>

    <dimen name="key_preview_height_ics">80sp</dimen>
+43 −33
Original line number Diff line number Diff line
@@ -124,7 +124,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
    // This map caches key label text width in pixel as value and key label text size as map key.
    private static final HashMap<Integer, Float> sTextWidthCache =
            new HashMap<Integer, Float>();
    private static final String KEY_LABEL_REFERENCE_CHAR = "M";
    private static final char[] KEY_LABEL_REFERENCE_CHAR = { 'M' };
    private static final char[] KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR = { '8' };

    private final DrawingHandler mDrawingHandler = new DrawingHandler(this);

@@ -545,8 +546,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
            final int labelSize = key.selectTextSize(params.mKeyLetterSize,
                    params.mKeyLargeLetterSize, params.mKeyLabelSize, params.mKeyHintLabelSize);
            paint.setTextSize(labelSize);
            final float labelCharHeight = getCharHeight(paint);
            final float labelCharWidth = getCharWidth(paint);
            final float labelCharHeight = getCharHeight(KEY_LABEL_REFERENCE_CHAR, paint);
            final float labelCharWidth = getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint);

            // Vertical label text alignment.
            final float baseline = centerY + labelCharHeight / 2;
@@ -634,20 +635,25 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
            }
            paint.setColor(hintColor);
            paint.setTextSize(hintSize);
            final float hintCharWidth = getCharWidth(paint);
            final float hintX, hintY;
            if (key.hasHintLabel()) {
                // The hint label is placed just right of the key label. Used mainly on
                // "phone number" layout.
                // TODO: Generalize the following calculations.
                hintX = positionX + hintCharWidth * 2;
                hintY = centerY + getCharHeight(paint) / 2;
                hintX = positionX + getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) * 2;
                hintY = centerY + getCharHeight(KEY_LABEL_REFERENCE_CHAR, paint) / 2;
                paint.setTextAlign(Align.LEFT);
            } else if (key.hasUppercaseLetter()) {
                hintX = keyWidth - params.mKeyUppercaseLetterPadding - hintCharWidth / 2;
                hintY = -paint.ascent() + params.mKeyUppercaseLetterPadding;
                // The hint label is placed at top-right corner of the key. Used mainly on tablet.
                hintX = keyWidth - params.mKeyUppercaseLetterPadding
                        - getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) / 2;
                hintY = -paint.ascent();
                paint.setTextAlign(Align.CENTER);
            } else { // key.hasHintLetter()
                hintX = keyWidth - params.mKeyHintLetterPadding - hintCharWidth / 2;
                hintY = -paint.ascent() + params.mKeyHintLetterPadding;
                // The hint label is placed at top-right corner of the key. Used mainly on phone.
                hintX = keyWidth - params.mKeyHintLetterPadding
                        - getCharWidth(KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR, paint) / 2;
                hintY = -paint.ascent();
                paint.setTextAlign(Align.CENTER);
            }
            canvas.drawText(hint, 0, hint.length(), hintX, hintY, paint);
@@ -690,7 +696,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
            paint.setTextSize(params.mKeyHintLetterSize);
            paint.setColor(params.mKeyHintLabelColor);
            paint.setTextAlign(Align.CENTER);
            final float hintX = keyWidth - params.mKeyHintLetterPadding - getCharWidth(paint) / 2;
            final float hintX = keyWidth - params.mKeyHintLetterPadding
                    - getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) / 2;
            final float hintY = keyHeight - params.mKeyHintLetterPadding;
            canvas.drawText(POPUP_HINT_CHAR, hintX, hintY, paint);

@@ -704,37 +711,40 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {

    private static final Rect sTextBounds = new Rect();

    private static float getCharHeight(Paint paint) {
        final int labelSize = (int)paint.getTextSize();
        final Float cachedValue = sTextHeightCache.get(labelSize);
        if (cachedValue != null)
            return cachedValue;

        paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, sTextBounds);
        final float height = sTextBounds.height();
        sTextHeightCache.put(labelSize, height);
        return height;
    }

    private static float getCharWidth(Paint paint) {
    private static int getCharGeometryCacheKey(char reference, Paint paint) {
        final int labelSize = (int)paint.getTextSize();
        final Typeface face = paint.getTypeface();
        final Integer key;
        final int codePointOffset = reference << 15;
        if (face == Typeface.DEFAULT) {
            key = labelSize;
            return codePointOffset + labelSize;
        } else if (face == Typeface.DEFAULT_BOLD) {
            key = labelSize + 1000;
            return codePointOffset + labelSize + 0x1000;
        } else if (face == Typeface.MONOSPACE) {
            key = labelSize + 2000;
            return codePointOffset + labelSize + 0x2000;
        } else {
            key = labelSize;
            return codePointOffset + labelSize;
        }
    }

        final Float cached = sTextWidthCache.get(key);
        if (cached != null)
            return cached;
    private static float getCharHeight(char[] character, Paint paint) {
        final Integer key = getCharGeometryCacheKey(character[0], paint);
        final Float cachedValue = sTextHeightCache.get(key);
        if (cachedValue != null)
            return cachedValue;

        paint.getTextBounds(character, 0, 1, sTextBounds);
        final float height = sTextBounds.height();
        sTextHeightCache.put(key, height);
        return height;
    }

    private static float getCharWidth(char[] character, Paint paint) {
        final Integer key = getCharGeometryCacheKey(character[0], paint);
        final Float cachedValue = sTextWidthCache.get(key);
        if (cachedValue != null)
            return cachedValue;

        paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, sTextBounds);
        paint.getTextBounds(character, 0, 1, sTextBounds);
        final float width = sTextBounds.width();
        sTextWidthCache.put(key, width);
        return width;