summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHans Boehm <hboehm@google.com>2015-07-07 14:16:59 -0700
committerHans Boehm <hboehm@google.com>2015-07-07 18:16:29 -0700
commitccc556621d3c0fe59c4878ce9c62322ff326041e (patch)
tree38e578419d8c2ccdf60dcaf676788f52ceb9ba7a /src
parenta3723849baeec57260a83e01131e6db612a4ec44 (diff)
downloadandroid_packages_apps_ExactCalculator-ccc556621d3c0fe59c4878ce9c62322ff326041e.tar.gz
android_packages_apps_ExactCalculator-ccc556621d3c0fe59c4878ce9c62322ff326041e.tar.bz2
android_packages_apps_ExactCalculator-ccc556621d3c0fe59c4878ce9c62322ff326041e.zip
Have TalkBack announce results and formula changes
Bug: 21048155 Bug: 19189356 Incrementally announce additions to the formula. Explicitly announce result after hitting equals. Announce when display is cleared. Remove old FIXME comment after a bit more testing. Change-Id: I836ff6672de3f891888b2724470290c8721d4fcf
Diffstat (limited to 'src')
-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();