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,