Support the feature of Drag to remove for the Accessibility Floating Menu(3/n).
Action: For Talkback users, support the accessibility action of the message view with the undo action. Bug: 237716018 Bug: 251688823 Test: atest MenuItemAccessibilityDelegateTest Change-Id: Ie2f602729f5c3322decee4a09894b4df78cda4ea
This commit is contained in:
@@ -177,6 +177,7 @@
|
||||
<item type="id" name="action_move_bottom_right"/>
|
||||
<item type="id" name="action_move_to_edge_and_hide"/>
|
||||
<item type="id" name="action_move_out_edge_and_show"/>
|
||||
<item type="id" name="action_remove_menu"/>
|
||||
|
||||
<!-- rounded corner view id -->
|
||||
<item type="id" name="rounded_corner_top_left"/>
|
||||
|
||||
@@ -2218,6 +2218,8 @@
|
||||
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half">Move to edge and hide</string>
|
||||
<!-- Action in accessibility menu to move the accessibility floating button out the edge and show. [CHAR LIMIT=36]-->
|
||||
<string name="accessibility_floating_button_action_move_out_edge_and_show">Move out edge and show</string>
|
||||
<!-- Action in accessibility menu to remove the accessibility floating menu view on the screen. [CHAR LIMIT=36]-->
|
||||
<string name="accessibility_floating_button_action_remove_menu">Remove</string>
|
||||
<!-- Action in accessibility menu to toggle on/off the accessibility feature. [CHAR LIMIT=30]-->
|
||||
<string name="accessibility_floating_button_action_double_tap_to_toggle">toggle</string>
|
||||
|
||||
|
||||
@@ -172,4 +172,8 @@ class DismissAnimationController implements ComponentCallbacks {
|
||||
R.dimen.dismiss_circle_small);
|
||||
mSizePercent = mMinDismissSize / maxDismissSize;
|
||||
}
|
||||
|
||||
interface DismissCallback {
|
||||
void onDismiss();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user