Add accessibility action menu items for divider
Allows user to resize the screen via the menu items of the divider. Bug: 204502843 Test: manual check the menu items Test: atest WMShellUnitTests Change-Id: Idc888b977e0e69c7d5c40f26a89f5af9ad5ad9cd
This commit is contained in:
@@ -24,6 +24,7 @@ import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Bundle;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Property;
|
||||
import android.view.GestureDetector;
|
||||
@@ -37,6 +38,8 @@ import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -80,7 +83,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
|
||||
private final Rect mTempRect = new Rect();
|
||||
private FrameLayout mDividerBar;
|
||||
|
||||
|
||||
static final Property<DividerView, Integer> DIVIDER_HEIGHT_PROPERTY =
|
||||
new Property<DividerView, Integer>(Integer.class, "height") {
|
||||
@Override
|
||||
@@ -109,6 +111,74 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
|
||||
}
|
||||
};
|
||||
|
||||
private final AccessibilityDelegate mHandleDelegate = new AccessibilityDelegate() {
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfo(host, info);
|
||||
final DividerSnapAlgorithm snapAlgorithm = mSplitLayout.mDividerSnapAlgorithm;
|
||||
if (isLandscape()) {
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_full,
|
||||
mContext.getString(R.string.accessibility_action_divider_left_full)));
|
||||
if (snapAlgorithm.isFirstSplitTargetAvailable()) {
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_70,
|
||||
mContext.getString(R.string.accessibility_action_divider_left_70)));
|
||||
}
|
||||
if (snapAlgorithm.showMiddleSplitTargetForAccessibility()) {
|
||||
// Only show the middle target if there are more than 1 split target
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_50,
|
||||
mContext.getString(R.string.accessibility_action_divider_left_50)));
|
||||
}
|
||||
if (snapAlgorithm.isLastSplitTargetAvailable()) {
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_30,
|
||||
mContext.getString(R.string.accessibility_action_divider_left_30)));
|
||||
}
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_rb_full,
|
||||
mContext.getString(R.string.accessibility_action_divider_right_full)));
|
||||
} else {
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_full,
|
||||
mContext.getString(R.string.accessibility_action_divider_top_full)));
|
||||
if (snapAlgorithm.isFirstSplitTargetAvailable()) {
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_70,
|
||||
mContext.getString(R.string.accessibility_action_divider_top_70)));
|
||||
}
|
||||
if (snapAlgorithm.showMiddleSplitTargetForAccessibility()) {
|
||||
// Only show the middle target if there are more than 1 split target
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_50,
|
||||
mContext.getString(R.string.accessibility_action_divider_top_50)));
|
||||
}
|
||||
if (snapAlgorithm.isLastSplitTargetAvailable()) {
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_tl_30,
|
||||
mContext.getString(R.string.accessibility_action_divider_top_30)));
|
||||
}
|
||||
info.addAction(new AccessibilityAction(R.id.action_move_rb_full,
|
||||
mContext.getString(R.string.accessibility_action_divider_bottom_full)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean performAccessibilityAction(@NonNull View host, int action,
|
||||
@Nullable Bundle args) {
|
||||
DividerSnapAlgorithm.SnapTarget nextTarget = null;
|
||||
DividerSnapAlgorithm snapAlgorithm = mSplitLayout.mDividerSnapAlgorithm;
|
||||
if (action == R.id.action_move_tl_full) {
|
||||
nextTarget = snapAlgorithm.getDismissEndTarget();
|
||||
} else if (action == R.id.action_move_tl_70) {
|
||||
nextTarget = snapAlgorithm.getLastSplitTarget();
|
||||
} else if (action == R.id.action_move_tl_50) {
|
||||
nextTarget = snapAlgorithm.getMiddleTarget();
|
||||
} else if (action == R.id.action_move_tl_30) {
|
||||
nextTarget = snapAlgorithm.getFirstSplitTarget();
|
||||
} else if (action == R.id.action_move_rb_full) {
|
||||
nextTarget = snapAlgorithm.getDismissStartTarget();
|
||||
}
|
||||
if (nextTarget != null) {
|
||||
mSplitLayout.snapToTarget(mSplitLayout.getDividePosition(), nextTarget);
|
||||
return true;
|
||||
}
|
||||
return super.performAccessibilityAction(host, action, args);
|
||||
}
|
||||
};
|
||||
|
||||
public DividerView(@NonNull Context context) {
|
||||
super(context);
|
||||
}
|
||||
@@ -179,6 +249,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
|
||||
mDoubleTapDetector = new GestureDetector(getContext(), new DoubleTapListener());
|
||||
mInteractive = true;
|
||||
setOnTouchListener(this);
|
||||
mHandle.setAccessibilityDelegate(mHandleDelegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user