diff options
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 64 | ||||
-rw-r--r-- | src/com/android/calculator2/CalculatorEditText.java | 58 |
3 files changed, 123 insertions, 1 deletions
@@ -19,7 +19,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional -LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 +LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 guava LOCAL_SRC_FILES := $(call all-java-files-under, src) diff --git a/res/values/strings.xml b/res/values/strings.xml index 297a244..958a6c4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -114,4 +114,68 @@ <string name="eDesc">Euler\'s number</string> <string name="piDesc">pi</string> <string name="equalDesc">equals</string> + + <!--Content descriptions for accessibility used as keys when determining which mathematical + concept description to speak when accessibility features are enabled. Order of the array is + important. --> + <string-array name="operators" translatable="false"> + <item>(</item> + <item>)</item> + <item>!</item> + <item>ln</item> + <item>log</item> + <item>\u221a</item> + <item>\u00f7</item> + <item>\u00d7</item> + <item>+</item> + <item>\u2212</item> + <item>.</item> + <item>^</item> + <item>tan</item> + <item>sin</item> + <item>cos</item> + <item>\u03c0</item> + <item>=</item> + </string-array> + + <!--Content descriptions for accessibility. These strings will be read aloud to users who + are using the calculator with accessibility features enabled and hover over the edit text + field. These should reflect the mathematical concept instead of a direct representation of + what is shown in the text field. Order of the array is important.--> + <string-array name="operatorDescs"> + <!-- Description for mathematical ( [CHAR LIMIT=200]--> + <item>left parenthesis</item> + <!-- Description for mathematical ) [CHAR LIMIT=200]--> + <item>right parenthesis</item> + <!-- Description for mathematical ! (factorial) function [CHAR LIMIT=200]--> + <item>factorial</item> + <!-- Description for mathematical ln [CHAR LIMIT=200]--> + <item>natural logarithm</item> + <!-- Description for mathematical log [CHAR LIMIT=200]--> + <item>logarithm</item> + <!-- Description for mathematical square root [CHAR LIMIT=200]--> + <item>square root</item> + <!-- Description for mathematical / [CHAR LIMIT=200]--> + <item>divided by</item> + <!-- Description for mathematical x [CHAR LIMIT=200]--> + <item>multiplied by</item> + <!-- Description for mathematical + [CHAR LIMIT=200]--> + <item>plus</item> + <!-- Description for mathematical - [CHAR LIMIT=200]--> + <item>minus</item> + <!-- Description for mathematical . [CHAR LIMIT=200]--> + <item>point</item> + <!-- Description for mathematical ^ [CHAR LIMIT=200]--> + <item>power</item> + <!-- Description for mathematical TAN [CHAR LIMIT=200]--> + <item>tangent</item> + <!-- Description for mathematical SIN [CHAR LIMIT=200]--> + <item>sine</item> + <!-- Description for mathematical COS [CHAR LIMIT=200]--> + <item>cosine</item> + <!-- Description for mathematical PI [CHAR LIMIT=200]--> + <item>pi</item> + <!-- Description for mathematical = [CHAR LIMIT=200]--> + <item>equals</item> + </string-array> </resources> diff --git a/src/com/android/calculator2/CalculatorEditText.java b/src/com/android/calculator2/CalculatorEditText.java index 170e116..2135b38 100644 --- a/src/com/android/calculator2/CalculatorEditText.java +++ b/src/com/android/calculator2/CalculatorEditText.java @@ -30,9 +30,13 @@ import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.EditText; import android.widget.Toast; +import com.google.common.collect.ImmutableMap; + public class CalculatorEditText extends EditText { private static final String LOG_TAG = "Calculator2"; @@ -40,6 +44,8 @@ public class CalculatorEditText extends EditText { private static final int COPY = 1; private static final int PASTE = 2; private String[] mMenuItemsStrings; + private ImmutableMap<String, String> sReplacementTable; + private String[] sOperators; public CalculatorEditText(Context context, AttributeSet attrs) { super(context, attrs); @@ -62,6 +68,58 @@ public class CalculatorEditText extends EditText { return true; } + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + String mathText = mathParse(getText().toString()); + // Parse the string into something more "mathematical" sounding. + if (!TextUtils.isEmpty(mathText)) { + event.getText().clear(); + event.getText().add(mathText); + setContentDescription(mathText); + } + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setText(mathParse(getText().toString())); + } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + // Do nothing. + } + + private String mathParse(String plainText) { + String parsedText = plainText; + if (!TextUtils.isEmpty(parsedText)) { + // Initialize replacement table. + initializeReplacementTable(); + for (String operator : sOperators) { + if (sReplacementTable.containsKey(operator)) { + parsedText = parsedText.replace(operator, sReplacementTable.get(operator)); + } + } + } + return parsedText; + } + + private synchronized void initializeReplacementTable() { + if (sReplacementTable == null) { + ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); + Resources res = getContext().getResources(); + sOperators = res.getStringArray(R.array.operators); + String[] descs = res.getStringArray(R.array.operatorDescs); + int pos = 0; + for (String key : sOperators) { + builder.put(key, descs[pos]); + pos++; + } + sReplacementTable = builder.build(); + } + } + private class MenuHandler implements MenuItem.OnMenuItemClickListener { public boolean onMenuItemClick(MenuItem item) { return onTextContextMenuItem(item.getTitle()); |