From a5af24015d0a58ef4016da1e1a88a58f50dd8b6b Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Mon, 15 Jun 2020 23:16:09 -0400 Subject: [PATCH] Set screenrecord a11y live region mode For a11y the countdown displayed by the status bar icon should be announced by talkback. ASSERTIVE will notify the user ASAP, since the countdown only lasts 3 seconds. Fixes: 153518579 Test: manual Change-Id: I59eae4a2f92d478118ebe4832b32642411db3a07 --- .../statusbar/phone/PhoneStatusBarPolicy.java | 7 +++++++ .../statusbar/phone/StatusBarIconController.java | 9 +++++++++ .../phone/StatusBarIconControllerImpl.java | 16 ++++++++++++++++ .../utils/leaks/FakeStatusBarIconController.java | 5 +++++ 4 files changed, 37 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index a065b74bda997..06d35a36e3c40 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -38,6 +38,7 @@ import android.service.notification.ZenModeConfig; import android.telecom.TelecomManager; import android.text.format.DateFormat; import android.util.Log; +import android.view.View; import androidx.lifecycle.Observer; @@ -677,12 +678,18 @@ public class PhoneStatusBarPolicy } mIconController.setIcon(mSlotScreenRecord, resourceId, description); mIconController.setIconVisibility(mSlotScreenRecord, true); + // Set as assertive so talkback will announce the countdown + mIconController.setIconAccessibilityLiveRegion(mSlotScreenRecord, + View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE); } @Override public void onCountdownEnd() { if (DEBUG) Log.d(TAG, "screenrecord: hiding icon during countdown"); mHandler.post(() -> mIconController.setIconVisibility(mSlotScreenRecord, false)); + // Reset talkback priority + mIconController.setIconAccessibilityLiveRegion(mSlotScreenRecord, + View.ACCESSIBILITY_LIVE_REGION_NONE); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 75da5d123972e..93df14f18fda8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -67,6 +67,15 @@ public interface StatusBarIconController { public void setSignalIcon(String slot, WifiIconState state); public void setMobileIcons(String slot, List states); public void setIconVisibility(String slot, boolean b); + + /** + * Sets the live region mode for the icon + * @see android.view.View#setAccessibilityLiveRegion(int) + * @param slot Icon slot to set region for + * @param accessibilityLiveRegion live region mode for the icon + */ + void setIconAccessibilityLiveRegion(String slot, int accessibilityLiveRegion); + /** * If you don't know what to pass for `tag`, either remove all icons for slot, or use * TAG_PRIMARY to refer to the first icon at a given slot. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java index bfcbceaef9af4..d0e806769f142 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java @@ -265,6 +265,22 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu handleSet(index, holder); } + @Override + public void setIconAccessibilityLiveRegion(String slotName, int accessibilityLiveRegion) { + Slot slot = getSlot(slotName); + if (!slot.hasIconsInSlot()) { + return; + } + + int slotIndex = getSlotIndex(slotName); + List iconsToUpdate = slot.getHolderListInViewOrder(); + for (StatusBarIconHolder holder : iconsToUpdate) { + int viewIndex = getViewIndex(slotIndex, holder.getTag()); + mIconGroups.forEach(l -> l.mGroup.getChildAt(viewIndex) + .setAccessibilityLiveRegion(accessibilityLiveRegion)); + } + } + public void removeIcon(String slot) { removeAllIconsForSlot(slot); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java index 8e34685cceece..2e874a6c21401 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java @@ -21,6 +21,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; + import java.util.List; public class FakeStatusBarIconController extends BaseLeakChecker @@ -75,4 +76,8 @@ public class FakeStatusBarIconController extends BaseLeakChecker public void removeAllIconsForSlot(String slot) { } + @Override + public void setIconAccessibilityLiveRegion(String slot, int mode) { + } + }