Accessibility: announce the active call after switching calls.

Bug: 24200862
Change-Id: I102a9c8406984a9dd4cfd8b91ec77254aa984dd5
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index 9ba4a2b..785d3d3 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -1124,10 +1124,19 @@
 
     public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
         if (event.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) {
-            dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
-            dispatchPopulateAccessibilityEvent(event, mPrimaryName);
-            dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
-            dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+            // Indicate this call is in active if no label is provided. The label is empty when
+            // the call is in active, not in other status such as onhold or dialing etc.
+            if (!mCallStateLabel.isShown() || TextUtils.isEmpty(mCallStateLabel.getText())) {
+                event.getText().add(
+                        TextUtils.expandTemplate(
+                                getResources().getText(R.string.accessibility_call_is_active),
+                                mPrimaryName.getText()));
+            } else {
+                dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+                dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+                dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+                dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+            }
             return;
         }
         dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index dd255e0..bf7b476 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -337,7 +337,7 @@
         getUi().setEndCallButtonEnabled(shouldShowEndCallButton(mPrimary, callState),
                 callState != Call.State.INCOMING /* animate */);
 
-        maybeSendAccessibilityEvent(oldState, newState);
+        maybeSendAccessibilityEvent(oldState, newState, primaryChanged);
     }
 
     @Override
@@ -1062,7 +1062,8 @@
         return true;
     }
 
-    private void maybeSendAccessibilityEvent(InCallState oldState, InCallState newState) {
+    private void maybeSendAccessibilityEvent(InCallState oldState, InCallState newState,
+                                             boolean primaryChanged) {
         if (mContext == null) {
             return;
         }
@@ -1071,8 +1072,11 @@
         if (!am.isEnabled()) {
             return;
         }
+        // Announce the current call if it's new incoming/outgoing call or primary call is changed
+        // due to switching calls between two ongoing calls (one is on hold).
         if ((oldState != InCallState.OUTGOING && newState == InCallState.OUTGOING)
-                || (oldState != InCallState.INCOMING && newState == InCallState.INCOMING)) {
+                || (oldState != InCallState.INCOMING && newState == InCallState.INCOMING)
+                || primaryChanged) {
             if (getUi() != null) {
                 getUi().sendAccessibilityAnnouncement();
             }
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 734dde8..830af65 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1025,4 +1025,7 @@
 
     <!-- Label under the name of a blocked number in the call log. [CHAR LIMIT=15] -->
     <string name="blocked_number_call_log_label">Blocked</string>
+
+    <!-- Accessibility announcement to indicate which call is active -->
+    <string name="accessibility_call_is_active"><xliff:g id="nameOrNumber">^1</xliff:g> is active</string>
 </resources>