summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java24
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java27
2 files changed, 49 insertions, 2 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
index d89dff5027a7..5502a20ce398 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
@@ -371,6 +371,7 @@ public class AccessibilityFloatingMenuView extends FrameLayout
mAdapter.notifyDataSetChanged();
updateRadiusWith(mSizeType, mRadiusType, mTargets.size());
+ updateScrollModeWith(hasExceededMaxLayoutHeight());
setSystemGestureExclusion();
fadeOut();
@@ -614,6 +615,7 @@ public class AccessibilityFloatingMenuView extends FrameLayout
updateColor();
updateStrokeWith(newConfig.uiMode, mAlignment);
updateLocationWith(mAlignment, mPercentageY);
+ updateScrollModeWith(hasExceededMaxLayoutHeight());
}
@VisibleForTesting
@@ -679,6 +681,12 @@ public class AccessibilityFloatingMenuView extends FrameLayout
mListView.setLayoutParams(layoutParams);
}
+ private void updateScrollModeWith(boolean hasExceededMaxLayoutHeight) {
+ mListView.setOverScrollMode(hasExceededMaxLayoutHeight
+ ? OVER_SCROLL_ALWAYS
+ : OVER_SCROLL_NEVER);
+ }
+
private void updateColor() {
final int menuColorResId = R.color.accessibility_floating_menu_background;
getMenuGradientDrawable().setColor(getResources().getColor(menuColorResId));
@@ -726,6 +734,11 @@ public class AccessibilityFloatingMenuView extends FrameLayout
layerDrawable.setLayerInset(INDEX_MENU_ITEM, left, 0, right, 0);
}
+ @VisibleForTesting
+ boolean hasExceededMaxLayoutHeight() {
+ return calculateActualLayoutHeight() > getMaxLayoutHeight();
+ }
+
@Alignment
private int calculateCurrentAlignment() {
return mCurrentLayoutParams.x >= ((MIN_WINDOW_X + getMaxWindowX()) / 2)
@@ -737,6 +750,10 @@ public class AccessibilityFloatingMenuView extends FrameLayout
return mCurrentLayoutParams.y / (float) getMaxWindowY();
}
+ private int calculateActualLayoutHeight() {
+ return (mPadding + mIconHeight) * mTargets.size() + mPadding;
+ }
+
private @DimenRes int getRadiusResId(@SizeType int sizeType, int itemCount) {
return sizeType == SizeType.SMALL
? getSmallSizeResIdWith(itemCount)
@@ -760,13 +777,16 @@ public class AccessibilityFloatingMenuView extends FrameLayout
return new Rect(0, 0, mScreenWidth - getWindowWidth(), mScreenHeight - getWindowHeight());
}
+ private int getMaxLayoutHeight() {
+ return mScreenHeight - mMargin * 2;
+ }
+
private int getLayoutWidth() {
return mPadding * 2 + mIconWidth;
}
private int getLayoutHeight() {
- return Math.min(mScreenHeight - mMargin * 2,
- (mPadding + mIconHeight) * mTargets.size() + mPadding);
+ return Math.min(getMaxLayoutHeight(), calculateActualLayoutHeight());
}
private int getWindowWidth() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
index 28cc580546be..0de257ad424b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
@@ -16,6 +16,9 @@
package com.android.systemui.accessibility.floatingmenu;
+import static android.view.View.OVER_SCROLL_ALWAYS;
+import static android.view.View.OVER_SCROLL_NEVER;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -437,6 +440,30 @@ public class AccessibilityFloatingMenuViewTest extends SysuiTestCase {
action -> action.getId() == R.id.action_move_to_edge_and_hide)).isTrue();
}
+ @Test
+ public void onTargetsChanged_exceedAvailableHeight_overScrollAlways() {
+ final RecyclerView listView = new RecyclerView(mContext);
+ final AccessibilityFloatingMenuView menuView =
+ spy(new AccessibilityFloatingMenuView(mContext, listView));
+ doReturn(true).when(menuView).hasExceededMaxLayoutHeight();
+
+ menuView.onTargetsChanged(mTargets);
+
+ assertThat(listView.getOverScrollMode()).isEqualTo(OVER_SCROLL_ALWAYS);
+ }
+
+ @Test
+ public void onTargetsChanged_notExceedAvailableHeight_overScrollNever() {
+ final RecyclerView listView = new RecyclerView(mContext);
+ final AccessibilityFloatingMenuView menuView =
+ spy(new AccessibilityFloatingMenuView(mContext, listView));
+ doReturn(false).when(menuView).hasExceededMaxLayoutHeight();
+
+ mMenuView.onTargetsChanged(mTargets);
+
+ assertThat(mListView.getOverScrollMode()).isEqualTo(OVER_SCROLL_NEVER);
+ }
+
@After
public void tearDown() {
mInterceptMotionEvent = null;