diff options
| author | 2020-05-20 12:19:27 -0400 | |
|---|---|---|
| committer | 2020-05-20 16:40:22 -0400 | |
| commit | 21e199517ab93b463d5495606d99678e0c21e663 (patch) | |
| tree | dc343c56b0fd306e82c46265392192b8741ea210 | |
| parent | ec4e1edb6db0720feae7eedd27384885184972bd (diff) | |
A11y Scroll Forward/Up Now Unlock or Show Bouncer
Fixes: 154875595
Test: atest SystemUITests && manual
Change-Id: Ic5060fd978d5de8a2a853ba1a32ce377a3c8d996
2 files changed, 75 insertions, 2 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 35c33aec8d0f..999e636b4bae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -38,6 +38,7 @@ import android.graphics.Rect; import android.graphics.Region; import android.graphics.drawable.Drawable; import android.hardware.biometrics.BiometricSourceType; +import android.os.Bundle; import android.os.PowerManager; import android.os.SystemClock; import android.util.Log; @@ -51,6 +52,7 @@ import android.view.ViewPropertyAnimator; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.TextView; @@ -244,6 +246,7 @@ public class NotificationPanelViewController extends PanelViewController { private final KeyguardUpdateMonitor mUpdateMonitor; private final ConversationNotificationManager mConversationNotificationManager; private final MediaHierarchyManager mMediaHierarchyManager; + private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private KeyguardAffordanceHelper mAffordanceHelper; private KeyguardUserSwitcher mKeyguardUserSwitcher; @@ -439,6 +442,26 @@ public class NotificationPanelViewController extends PanelViewController { private int mOldLayoutDirection; + private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD); + info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP); + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD.getId() + || action + == AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP.getId()) { + mStatusBarKeyguardViewManager.showBouncer(true); + return true; + } + return super.performAccessibilityAction(host, action, args); + } + }; + @Inject public NotificationPanelViewController(NotificationPanelView view, InjectionInflationController injectionInflationController, @@ -459,7 +482,8 @@ public class NotificationPanelViewController extends PanelViewController { FlingAnimationUtils.Builder flingAnimationUtilsBuilder, StatusBarTouchableRegionManager statusBarTouchableRegionManager, ConversationNotificationManager conversationNotificationManager, - MediaHierarchyManager mediaHierarchyManager) { + MediaHierarchyManager mediaHierarchyManager, + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { super(view, falsingManager, dozeLog, keyguardStateController, (SysuiStatusBarStateController) statusBarStateController, vibratorHelper, latencyTracker, flingAnimationUtilsBuilder, statusBarTouchableRegionManager); @@ -470,6 +494,7 @@ public class NotificationPanelViewController extends PanelViewController { mConfigurationController = configurationController; mFlingAnimationUtilsBuilder = flingAnimationUtilsBuilder; mMediaHierarchyManager = mediaHierarchyManager; + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mView.setWillNotDraw(!DEBUG); mInjectionInflationController = injectionInflationController; mFalsingManager = falsingManager; @@ -583,6 +608,8 @@ public class NotificationPanelViewController extends PanelViewController { mOldLayoutDirection = layoutDirection; } }); + + mView.setAccessibilityDelegate(mAccessibilityDelegate); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index b5663d5dd19e..c2d218140803 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -43,6 +43,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; import androidx.test.filters.SmallTest; @@ -80,11 +81,13 @@ import com.android.systemui.util.InjectionInflationController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; +import java.util.List; import java.util.function.Consumer; @SmallTest @@ -176,9 +179,12 @@ public class NotificationPanelViewTest extends SysuiTestCase { private MediaHierarchyManager mMediaHiearchyManager; @Mock private ConversationNotificationManager mConversationNotificationManager; + @Mock + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder; private NotificationPanelViewController mNotificationPanelViewController; + private View.AccessibilityDelegate mAccessibiltyDelegate; @Before public void setup() { @@ -231,11 +237,18 @@ public class NotificationPanelViewTest extends SysuiTestCase { mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor, mMetricsLogger, mActivityManager, mZenModeController, mConfigurationController, mFlingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, - mConversationNotificationManager, mMediaHiearchyManager); + mConversationNotificationManager, mMediaHiearchyManager, + mStatusBarKeyguardViewManager); mNotificationPanelViewController.initDependencies(mStatusBar, mGroupManager, mNotificationShelf, mNotificationAreaController, mScrimController); mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager); mNotificationPanelViewController.setBar(mPanelBar); + + ArgumentCaptor<View.AccessibilityDelegate> accessibilityDelegateArgumentCaptor = + ArgumentCaptor.forClass(View.AccessibilityDelegate.class); + verify(mView) + .setAccessibilityDelegate(accessibilityDelegateArgumentCaptor.capture()); + mAccessibiltyDelegate = accessibilityDelegateArgumentCaptor.getValue(); } @Test @@ -305,6 +318,39 @@ public class NotificationPanelViewTest extends SysuiTestCase { verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); } + @Test + public void testA11y_initializeNode() { + AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo(); + mAccessibiltyDelegate.onInitializeAccessibilityNodeInfo(mView, nodeInfo); + + List<AccessibilityNodeInfo.AccessibilityAction> actionList = nodeInfo.getActionList(); + assertThat(actionList).containsAllIn( + new AccessibilityNodeInfo.AccessibilityAction[] { + AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD, + AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP} + ); + } + + @Test + public void testA11y_scrollForward() { + mAccessibiltyDelegate.performAccessibilityAction( + mView, + AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD.getId(), + null); + + verify(mStatusBarKeyguardViewManager).showBouncer(true); + } + + @Test + public void testA11y_scrollUp() { + mAccessibiltyDelegate.performAccessibilityAction( + mView, + AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP.getId(), + null); + + verify(mStatusBarKeyguardViewManager).showBouncer(true); + } + private void onTouchEvent(MotionEvent ev) { mTouchHandler.onTouch(mView, ev); } |