From d157834345f2817cb80db3fdb7e6f22efa92f70c Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Thu, 12 May 2011 23:49:19 +0900
Subject: [PATCH] Auto text sizing using fraction of key height

Bug: 4411676
Change-Id: I8f289dcebe577d277fe2ad6a8331d59f735cbada
---
 java/res/values-land/dimens.xml               |  3 ++
 java/res/values-xlarge-land/dimens.xml        |  4 +--
 java/res/values-xlarge/dimens.xml             |  6 ++--
 java/res/values/attrs.xml                     | 10 +++---
 java/res/values/dimens.xml                    |  7 ++---
 java/res/values/styles.xml                    |  4 +--
 .../inputmethod/keyboard/KeyboardView.java    | 31 ++++++++++++++-----
 7 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index 496da3de11..a541287f0f 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -29,6 +29,9 @@
     <dimen name="keyboard_top_padding">0.0in</dimen>
     <dimen name="keyboard_bottom_padding">0.0in</dimen>
     <dimen name="keyboard_horizontal_edges_padding">0.0in</dimen>
+    <fraction name="key_letter_ratio">55%</fraction>
+    <fraction name="key_label_text_ratio">35%</fraction>
+    <fraction name="key_preview_text_ratio">90%</fraction>
     <dimen name="candidate_strip_height">38dip</dimen>
     <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
     <dimen name="spacebar_vertical_correction">2dip</dimen>
diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-xlarge-land/dimens.xml
index fd6b1f386b..ade1256392 100644
--- a/java/res/values-xlarge-land/dimens.xml
+++ b/java/res/values-xlarge-land/dimens.xml
@@ -30,8 +30,8 @@
     <dimen name="keyboard_bottom_padding">0.0mm</dimen>
     <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen>
 
-    <dimen name="key_letter_size">28dip</dimen>
-    <dimen name="key_label_text_size">20dip</dimen>
+    <fraction name="key_letter_ratio">30.7%</fraction>
+    <fraction name="key_label_text_ratio">21.9%</fraction>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
     <dimen name="key_preview_height_holo">26.5mm</dimen>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml
index 4f78bea4fb..2796b6fcb5 100644
--- a/java/res/values-xlarge/dimens.xml
+++ b/java/res/values-xlarge/dimens.xml
@@ -37,11 +37,11 @@
     <!-- popup_key_height x -1.0 -->
     <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
 
-    <dimen name="key_letter_size">26dip</dimen>
-    <dimen name="key_label_text_size">16dip</dimen>
+    <fraction name="key_letter_ratio">34.4%</fraction>
+    <fraction name="key_label_text_ratio">21.2%</fraction>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
-    <dimen name="key_preview_text_size_large">24dip</dimen>
+    <fraction name="key_preview_text_ratio">26.3%</fraction>
     <dimen name="key_preview_height_holo">23.0mm</dimen>
     <dimen name="key_preview_offset_holo">8.0mm</dimen>
 
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 7f2a400dff..f03da4f8f7 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -25,11 +25,13 @@
              checkable+checked+pressed. -->
         <attr name="keyBackground" format="reference" />
 
-        <!-- Size of the text for one letter character keys. -->
-        <attr name="keyLetterSize" format="dimension" />
+        <!-- Size of the text for one letter character keys, in the proportion of key height.
+             -->
+        <attr name="keyLetterRatio" format="float" />
 
-        <!-- Size of the text for custom keys with some text and no icon. -->
-        <attr name="labelTextSize" format="dimension" />
+        <!-- Size of the text for custom keys with some text and no icon, in the proportion of key
+             height. -->
+        <attr name="labelTextRatio" format="float" />
 
         <!-- Color to use for the label in a key. -->
         <attr name="keyTextColor" format="color" />
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 82abf3b05b..8f719541e9 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -43,14 +43,13 @@
          to user's finger. -->
     <dimen name="keyboard_vertical_correction">-0.05in</dimen>
 
-    <!-- TODO: use fraction for key letter size and etc. -->
-    <dimen name="key_letter_size">21dip</dimen>
-    <dimen name="key_label_text_size">13dip</dimen>
+    <fraction name="key_letter_ratio">45%</fraction>
+    <fraction name="key_label_text_ratio">29%</fraction>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">21dip</dimen>
     <dimen name="key_preview_height">80sp</dimen>
     <dimen name="key_preview_offset">0.000in</dimen>
-    <dimen name="key_preview_text_size_large">36sp</dimen>
+    <fraction name="key_preview_text_ratio">82%</fraction>
     <dimen name="key_preview_height_holo">130sp</dimen>
     <dimen name="key_preview_offset_holo">0.193in</dimen>
 
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 8a4b16d7af..3a389e57b1 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -19,14 +19,14 @@
         <item name="android:background">@drawable/keyboard_background</item>
 
         <item name="keyBackground">@drawable/btn_keyboard_key</item>
-        <item name="keyLetterSize">@dimen/key_letter_size</item>
+        <item name="keyLetterRatio">@fraction/key_letter_ratio</item>
         <item name="keyLetterStyle">normal</item>
         <item name="keyTextColor">#FFFFFFFF</item>
         <item name="keyTextColorDisabled">#FFFFFFFF</item>
         <item name="keyPreviewLayout">@layout/key_preview</item>
         <item name="keyPreviewOffset">@dimen/key_preview_offset</item>
         <item name="keyPreviewHeight">@dimen/key_preview_height</item>
-        <item name="labelTextSize">@dimen/key_label_text_size</item>
+        <item name="labelTextRatio">@fraction/key_label_text_ratio</item>
         <item name="popupLayout">@layout/keyboard_popup</item>
         <item name="keyHysteresisDistance">@dimen/key_hysteresis_distance</item>
         <item name="verticalCorrection">@dimen/keyboard_vertical_correction</item>
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index bbda4009fa..1ea1436d37 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -86,10 +86,12 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
     private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1;
 
     // XML attribute
+    private float mKeyLetterRatio;
     private int mKeyLetterSize;
     private int mKeyTextColor;
     private int mKeyTextColorDisabled;
     private Typeface mKeyLetterStyle = Typeface.DEFAULT;
+    private float mLabelTextRatio;
     private int mLabelTextSize;
     private int mColorScheme = COLOR_SCHEME_WHITE;
     private int mShadowColor;
@@ -108,7 +110,8 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
     // Key preview
     private boolean mInForeground;
     private TextView mPreviewText;
-    private int mPreviewTextSizeLarge;
+    private float mPreviewTextRatio;
+    private int mPreviewTextSize;
     private boolean mShowKeyPreview = true;
     private int mKeyPreviewDisplayedY;
     private final int mDelayBeforePreview;
@@ -327,8 +330,8 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
             case R.styleable.KeyboardView_keyPreviewHeight:
                 mPreviewHeight = a.getDimensionPixelSize(attr, 80);
                 break;
-            case R.styleable.KeyboardView_keyLetterSize:
-                mKeyLetterSize = a.getDimensionPixelSize(attr, 18);
+            case R.styleable.KeyboardView_keyLetterRatio:
+                mKeyLetterRatio = getRatio(a, attr);
                 break;
             case R.styleable.KeyboardView_keyTextColor:
                 mKeyTextColor = a.getColor(attr, 0xFF000000);
@@ -336,8 +339,8 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
             case R.styleable.KeyboardView_keyTextColorDisabled:
                 mKeyTextColorDisabled = a.getColor(attr, 0xFF000000);
                 break;
-            case R.styleable.KeyboardView_labelTextSize:
-                mLabelTextSize = a.getDimensionPixelSize(attr, 14);
+            case R.styleable.KeyboardView_labelTextRatio:
+                mLabelTextRatio = getRatio(a, attr);
                 break;
             case R.styleable.KeyboardView_popupLayout:
                 mPopupLayout = a.getResourceId(attr, 0);
@@ -365,7 +368,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
 
         if (previewLayout != 0) {
             mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null);
-            mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large);
+            mPreviewTextRatio = getRatio(res, R.fraction.key_preview_text_ratio);
         } else {
             mShowKeyPreview = false;
         }
@@ -460,6 +463,16 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
         mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
     }
 
+    // Read fraction value in TypedArray as float.
+    private static float getRatio(TypedArray a, int index) {
+        return a.getFraction(index, 1000, 1000, 1) / 1000.0f;
+    }
+
+    // Read fraction value in resource as float.
+    private static float getRatio(Resources res, int id) {
+        return res.getFraction(id, 1000, 1000) / 1000.0f;
+    }
+
     public void startIgnoringDoubleTap() {
         if (ENABLE_CAPSLOCK_BY_DOUBLETAP)
             mHandler.startIgnoringDoubleTap();
@@ -506,6 +519,10 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
         invalidateAllKeys();
         mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth());
         mPopupPanelCache.clear();
+        final int keyHeight = keyboard.getRowHeight() - keyboard.getVerticalGap();
+        mKeyLetterSize = (int)(keyHeight * mKeyLetterRatio);
+        mLabelTextSize = (int)(keyHeight * mLabelTextRatio);
+        mPreviewTextSize = (int)(keyHeight * mPreviewTextRatio);
     }
 
     /**
@@ -938,7 +955,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
                 previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize);
                 previewText.setTypeface(Typeface.DEFAULT_BOLD);
             } else {
-                previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge);
+                previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSize);
                 previewText.setTypeface(mKeyLetterStyle);
             }
         } else {
-- 
GitLab