summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Boehm <hboehm@google.com>2015-07-08 03:21:36 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-07-08 03:21:36 +0000
commit36fe131b66fb2f6ad1efef582f717657d62b3eb1 (patch)
treeb6bd603c72b10dced0e5c1cf2522be28682e85a8
parenta5636a98bcbb5ccb0fc5e0d7dac6494b6187f44c (diff)
parent792e83889ce52ac36f02e615edab100a65a44967 (diff)
downloadandroid_packages_apps_ExactCalculator-36fe131b66fb2f6ad1efef582f717657d62b3eb1.tar.gz
android_packages_apps_ExactCalculator-36fe131b66fb2f6ad1efef582f717657d62b3eb1.tar.bz2
android_packages_apps_ExactCalculator-36fe131b66fb2f6ad1efef582f717657d62b3eb1.zip
am 792e8388: am 63b08564: am a8f47d36: Merge "Have TalkBack announce results and formula changes" into mnc-dev
* commit '792e83889ce52ac36f02e615edab100a65a44967': Have TalkBack announce results and formula changes
-rw-r--r--src/com/android/calculator2/Calculator.java14
-rw-r--r--src/com/android/calculator2/CalculatorText.java33
2 files changed, 44 insertions, 3 deletions
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index 28d3312..5cb6685 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -444,13 +444,13 @@ public class Calculator extends Activity
// Add the given button id to input expression.
// If appropriate, clear the expression before doing so.
private void addKeyToExpr(int id) {
- // FIXME: Other states?
if (mCurrentState == CalculatorState.ERROR) {
setState(CalculatorState.INPUT);
} else if (mCurrentState == CalculatorState.RESULT) {
if (KeyMaps.isBinary(id) || KeyMaps.isSuffix(id)) {
mEvaluator.collapse();
} else {
+ announceClearForAccessibility();
mEvaluator.clear();
}
setState(CalculatorState.INPUT);
@@ -544,9 +544,9 @@ public class Calculator extends Activity
formatted.setSpan(new ForegroundColorSpan(Color.RED),
formula.length(), formatted.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- mFormulaText.setText(formatted);
+ mFormulaText.changeTextTo(formatted);
} else {
- mFormulaText.setText(formula);
+ mFormulaText.changeTextTo(formula);
}
}
@@ -711,11 +711,16 @@ public class Calculator extends Activity
animatorSet.start();
}
+ private void announceClearForAccessibility() {
+ mResultText.announceForAccessibility(getResources().getString(R.string.desc_clr));
+ }
+
private void onClear() {
if (mEvaluator.getExpr().isEmpty()) {
return;
}
cancelIfEvaluating(true);
+ announceClearForAccessibility();
reveal(mCurrentButton, R.color.calculator_accent_color, new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -732,6 +737,7 @@ public class Calculator extends Activity
void onError(final int errorResourceId) {
if (mCurrentState == CalculatorState.EVALUATE) {
setState(CalculatorState.ANIMATE);
+ mResultText.announceForAccessibility(getResources().getString(errorResourceId));
reveal(mCurrentButton, R.color.calculator_error_color,
new AnimatorListenerAdapter() {
@Override
@@ -783,6 +789,8 @@ public class Calculator extends Activity
final int formulaTextColor = mFormulaText.getCurrentTextColor();
if (animate) {
+ mResultText.announceForAccessibility(getResources().getString(R.string.desc_eq));
+ mResultText.announceForAccessibility(mResultText.getText());
setState(CalculatorState.ANIMATE);
final AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
diff --git a/src/com/android/calculator2/CalculatorText.java b/src/com/android/calculator2/CalculatorText.java
index b0bbb7c..4b0b0c9 100644
--- a/src/com/android/calculator2/CalculatorText.java
+++ b/src/com/android/calculator2/CalculatorText.java
@@ -204,6 +204,39 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
return lastFitTextSize;
}
+ private static boolean startsWith(CharSequence whole, CharSequence prefix) {
+ int wholeLen = whole.length();
+ int prefixLen = prefix.length();
+ if (prefixLen > wholeLen) {
+ return false;
+ }
+ for (int i = 0; i < prefixLen; ++i) {
+ if (prefix.charAt(i) != whole.charAt(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Functionally equivalent to setText(), but explicitly announce changes.
+ * If the new text is an extension of the old one, announce the addition.
+ * Otherwise, e.g. after deletion, announce the entire new text.
+ */
+ public void changeTextTo(CharSequence newText) {
+ CharSequence oldText = getText();
+ if (startsWith(newText, oldText)) {
+ int newLen = newText.length();
+ int oldLen = oldText.length();
+ if (oldLen != newLen) {
+ announceForAccessibility(newText.subSequence(oldLen, newLen));
+ }
+ } else {
+ announceForAccessibility(newText);
+ }
+ setText(newText);
+ }
+
public boolean stopActionMode() {
if (mActionMode != null) {
mActionMode.finish();