diff options
author | Yorke Lee <yorkelee@google.com> | 2015-06-26 18:48:14 -0700 |
---|---|---|
committer | Yorke Lee <yorkelee@google.com> | 2015-06-26 18:54:03 -0700 |
commit | 0dbdccd2aa0e6828e1332adf83e630a74527a248 (patch) | |
tree | 60bf03ab2edbe1eaa6b02df90accf377d76f38c3 /InCallUI | |
parent | 1e0585f3f789e4ea28f31352eced59c73cf8b373 (diff) |
Correctly handle accessibility for incoming/outgoing calls
The previous behavior relied on WINDOW_STATE_CHANGED events to
announce outgoing/incoming calls, at which point in time
the CallCardFragment was not guaranteed to be non-null.
Bug: 20172391
Change-Id: I65bf86bc1a5edf5430ae5aabcb3535f42d1ccb08
Diffstat (limited to 'InCallUI')
-rw-r--r-- | InCallUI/src/com/android/incallui/CallCardFragment.java | 35 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/CallCardPresenter.java | 21 |
2 files changed, 46 insertions, 10 deletions
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java index 02a1802cf..d58310cfc 100644 --- a/InCallUI/src/com/android/incallui/CallCardFragment.java +++ b/InCallUI/src/com/android/incallui/CallCardFragment.java @@ -42,6 +42,7 @@ import android.view.ViewPropertyAnimator; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageButton; @@ -92,6 +93,13 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr * resetting to its previous value. */ private static final long CALL_STATE_LABEL_RESET_DELAY_MS = 3000; + /** + * Amount of time to wait before sending an announcement via the accessibility manager. + * When the call state changes to an outgoing or incoming state for the first time, the + * UI can often be changing due to call updates or contact lookup. This allows the UI + * to settle to a stable state to ensure that the correct information is announced. + */ + private static final long ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS = 500; private AnimatorSet mAnimatorSet; private int mShrinkAnimationDuration; @@ -604,15 +612,6 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr } else { mCallStateVideoCallIcon.setVisibility(View.GONE); } - - if (state == Call.State.INCOMING) { - if (callStateLabel != null) { - getView().announceForAccessibility(callStateLabel.getCallStateLabel()); - } - if (mPrimaryName.getText() != null) { - getView().announceForAccessibility(mPrimaryName.getText()); - } - } } private void setCallStateLabel(CallStateLabel callStateLabel) { @@ -861,9 +860,10 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr } public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + if (event.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) { dispatchPopulateAccessibilityEvent(event, mCallStateLabel); dispatchPopulateAccessibilityEvent(event, mPrimaryName); + dispatchPopulateAccessibilityEvent(event, mCallTypeLabel); dispatchPopulateAccessibilityEvent(event, mPhoneNumber); return; } @@ -878,6 +878,21 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr } @Override + public void sendAccessibilityAnnouncement() { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + if (getView() != null && getView().getParent() != null) { + AccessibilityEvent event = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_ANNOUNCEMENT); + dispatchPopulateAccessibilityEvent(event); + getView().getParent().requestSendAccessibilityEvent(getView(), event); + } + } + }, ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS); + } + + @Override public void setEndCallButtonEnabled(boolean enabled, boolean animate) { if (enabled != mFloatingActionButton.isEnabled()) { if (animate) { diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java index cef0cd5c3..3f9c567d6 100644 --- a/InCallUI/src/com/android/incallui/CallCardPresenter.java +++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java @@ -35,6 +35,7 @@ import android.telecom.TelecomManager; import android.telecom.VideoProfile; import android.telephony.PhoneNumberUtils; import android.text.TextUtils; +import android.view.accessibility.AccessibilityManager; import com.android.incallui.ContactInfoCache.ContactCacheEntry; import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback; @@ -279,6 +280,8 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> // Hide the end call button instantly if we're receiving an incoming call. getUi().setEndCallButtonEnabled(shouldShowEndCallButton(mPrimary, callState), callState != Call.State.INCOMING /* animate */); + + maybeSendAccessibilityEvent(oldState, newState); } @Override @@ -828,6 +831,23 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> return true; } + private void maybeSendAccessibilityEvent(InCallState oldState, InCallState newState) { + if (mContext == null) { + return; + } + final AccessibilityManager am = (AccessibilityManager) mContext.getSystemService( + Context.ACCESSIBILITY_SERVICE); + if (!am.isEnabled()) { + return; + } + if ((oldState != InCallState.OUTGOING && newState == InCallState.OUTGOING) + || (oldState != InCallState.INCOMING && newState == InCallState.INCOMING)) { + if (getUi() != null) { + getUi().sendAccessibilityAnnouncement(); + } + } + } + public interface CallCardUi extends Ui { void setVisible(boolean on); void setCallCardVisible(boolean visible); @@ -851,5 +871,6 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> void showManageConferenceCallButton(boolean visible); boolean isManageConferenceVisible(); void animateForNewOutgoingCall(); + void sendAccessibilityAnnouncement(); } } |