Merge "Support the feature of Drag to remove for the Accessibility Floating Menu(3/n)."

This commit is contained in:
PETER LIANG
2022-10-26 23:44:26 +00:00
committed by Android (Google) Code Review
7 changed files with 50 additions and 1 deletions

View File

@@ -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"/>

View File

@@ -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>

View File

@@ -172,4 +172,8 @@ class DismissAnimationController implements ComponentCallbacks {
R.dimen.dismiss_circle_small);
mSizePercent = mMinDismissSize / maxDismissSize;
}
interface DismissCallback {
void onDismiss();
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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,