diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 7ca42f7d70159..4fd25a98a71c0 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -177,6 +177,7 @@ + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index d5d99ccc99171..b325c56adefc5 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2218,6 +2218,8 @@ Move to edge and hide Move out edge and show + + Remove toggle diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java index f56a15427452a..ee048e1a02d3e 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java @@ -172,4 +172,8 @@ class DismissAnimationController implements ComponentCallbacks { R.dimen.dismiss_circle_small); mSizePercent = mMinDismissSize / maxDismissSize; } + + interface DismissCallback { + void onDismiss(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java index eb252323907d4..396f584d76a6b 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java @@ -35,6 +35,8 @@ import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; import androidx.recyclerview.widget.RecyclerView; +import com.android.internal.util.Preconditions; + import java.util.HashMap; /** @@ -64,6 +66,7 @@ class MenuAnimationController { private final Handler mHandler; private boolean mIsMovedToEdge; private boolean mIsFadeEffectEnabled; + private DismissAnimationController.DismissCallback mDismissCallback; // Cache the animations state of {@link DynamicAnimation.TRANSLATION_X} and {@link // DynamicAnimation.TRANSLATION_Y} to be well controlled by the touch handler @@ -102,6 +105,11 @@ class MenuAnimationController { } } + void setDismissCallback( + DismissAnimationController.DismissCallback dismissCallback) { + mDismissCallback = dismissCallback; + } + void moveToTopLeftPosition() { mIsMovedToEdge = false; final Rect draggableBounds = mMenuView.getMenuDraggableBounds(); @@ -132,6 +140,13 @@ class MenuAnimationController { constrainPositionAndUpdate(position); } + void removeMenu() { + Preconditions.checkArgument(mDismissCallback != null, + "The dismiss callback should be initialized first."); + + mDismissCallback.onDismiss(); + } + void flingMenuThenSpringToEdge(float x, float velocityX, float velocityY) { final boolean shouldMenuFlingLeft = isOnLeftSide() ? velocityX < ESCAPE_VELOCITY diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegate.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegate.java index e69a24810fdc0..ac5736b0c26d7 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegate.java @@ -84,6 +84,12 @@ class MenuItemAccessibilityDelegate extends RecyclerViewAccessibilityDelegate.It new AccessibilityNodeInfoCompat.AccessibilityActionCompat(moveEdgeId, res.getString(moveEdgeTextResId)); info.addAction(moveToOrOutEdge); + + final AccessibilityNodeInfoCompat.AccessibilityActionCompat removeMenu = + new AccessibilityNodeInfoCompat.AccessibilityActionCompat( + R.id.action_remove_menu, + res.getString(R.string.accessibility_floating_button_action_remove_menu)); + info.addAction(removeMenu); } @Override @@ -126,6 +132,11 @@ class MenuItemAccessibilityDelegate extends RecyclerViewAccessibilityDelegate.It return true; } + if (action == R.id.action_remove_menu) { + mAnimationController.removeMenu(); + return true; + } + return super.performAccessibilityAction(host, action, args); } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java index 3e620a26f42c5..33e155df80e32 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java @@ -100,6 +100,7 @@ class MenuViewLayer extends FrameLayout { windowManager); mMenuView = new MenuView(context, menuViewModel, menuViewAppearance); mMenuAnimationController = mMenuView.getMenuAnimationController(); + mMenuAnimationController.setDismissCallback(this::hideMenuAndShowMessage); mDismissView = new DismissView(context); mDismissAnimationController = new DismissAnimationController(mDismissView, mMenuView); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java index bf6d574a0f677..78ee627a9a2f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java @@ -43,6 +43,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -54,6 +55,9 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private DismissAnimationController.DismissCallback mStubDismissCallback; + private RecyclerView mStubListView; private MenuView mMenuView; private MenuItemAccessibilityDelegate mMenuItemAccessibilityDelegate; @@ -87,7 +91,7 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { mMenuItemAccessibilityDelegate.onInitializeAccessibilityNodeInfo(mStubListView, info); - assertThat(info.getActionList().size()).isEqualTo(5); + assertThat(info.getActionList().size()).isEqualTo(6); } @Test @@ -155,6 +159,17 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { verify(mMenuAnimationController).moveOutEdgeAndShow(); } + @Test + public void performRemoveMenuAction_success() { + mMenuAnimationController.setDismissCallback(mStubDismissCallback); + final boolean removeMenuAction = + mMenuItemAccessibilityDelegate.performAccessibilityAction(mStubListView, + R.id.action_remove_menu, null); + + assertThat(removeMenuAction).isTrue(); + verify(mMenuAnimationController).removeMenu(); + } + @Test public void performFocusAction_fadeIn() { mMenuItemAccessibilityDelegate.performAccessibilityAction(mStubListView,