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

Commit b2c3e440 authored by Justin Klaassen's avatar Justin Klaassen
Browse files

Always use "H" for formula text alignment

Bug: 22208425

Most of the mathematical operators/symbols (e.g. "π") cannot be encoded
using "ISO-8859-1" however they still should be aligned using the
default capital letter height ("H").

Change-Id: I4ca6674de6e6a96b0ce513ecd8acea775f2e7081
parent 6a83e391
Loading
Loading
Loading
Loading
+7 −17
Original line number Diff line number Diff line
@@ -19,21 +19,15 @@ package com.android.calculator2;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

/**
 * Extended {@link TextView} that supports ascent/baseline alignment.
 */
public class AlignedTextView extends TextView {

    private static final String LATIN_CAPITAL_LETTER = "H";
    private static final CharsetEncoder LATIN_CHARSET_ENCODER =
            Charset.forName("ISO-8859-1").newEncoder();

    // temporary rect for use during layout
    private final Rect mTempRect = new Rect();
@@ -58,18 +52,14 @@ public class AlignedTextView extends TextView {

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        CharSequence text = getText();
        if (TextUtils.isEmpty(text) || LATIN_CHARSET_ENCODER.canEncode(text)) {
            // For latin text align to the default capital letter height.
            text = LATIN_CAPITAL_LETTER;
        }
        getPaint().getTextBounds(text.toString(), 0, text.length(), mTempRect);
        final Paint paint = getPaint();

        // Always align text to the default capital letter height.
        paint.getTextBounds(LATIN_CAPITAL_LETTER, 0, 1, mTempRect);

        final Paint textPaint = getPaint();
        mTopPaddingOffset = Math.min(getPaddingTop(),
                (int) Math.floor(mTempRect.top - textPaint.ascent()));
        mBottomPaddingOffset = Math.min(getPaddingBottom(),
                (int) Math.floor(textPaint.descent()));
                (int) Math.ceil(mTempRect.top - paint.ascent()));
        mBottomPaddingOffset = Math.min(getPaddingBottom(), (int) Math.ceil(paint.descent()));

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }