diff options
author | Yorke Lee <yorkelee@google.com> | 2015-06-30 00:04:31 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-06-30 00:04:31 +0000 |
commit | fc81c940e44bcc642a49eb2c3e25e4e67f5183f1 (patch) | |
tree | 1daa67e0e5ce2dca919c7172f5e120ba2d8be998 | |
parent | 3b988f78e4702d0f23cba82172128fdf1a6401dc (diff) | |
parent | 767be5452e458e95ed6944b1f48c56ead3430cee (diff) |
am 95478ee7: am 1550aa97: am 73728797: Merge "Correctly handle accessibility for incoming/outgoing calls" into mnc-dev
* commit '95478ee7a7bd2f906a86bd05af47c894f0998dc7':
Correctly handle accessibility for incoming/outgoing calls
-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 413b23304..fa049e79b 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; @@ -628,15 +636,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) { @@ -887,9 +886,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; } @@ -904,6 +904,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 69921424f..0fb5b2e7a 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 @@ -836,6 +839,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); @@ -859,5 +879,6 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> void showManageConferenceCallButton(boolean visible); boolean isManageConferenceVisible(); void animateForNewOutgoingCall(); + void sendAccessibilityAnnouncement(); } } |