Fix QS edit accessibility.
- Announce the correct QS tile positions when moving/adding tiles. - Only insert a placeholder tile when adding tiles. - Ensure all tiles are draggable, even if they are currently unavailable. - Fix off by one error adding tiles into the last position. - Remove tile remove a11y announcement as it is unnecessary. Change-Id: Ia0bc1cb1559c2e46f9ddfe0f3ba0f50d5de56868 Fixes: 78608195 Fixes: 78611593 Fixes: 74253408 Test: manual
This commit is contained in:
@@ -67,6 +67,10 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
private static final long EDIT_ID = 10000;
|
||||
private static final long DIVIDER_ID = 20000;
|
||||
|
||||
private static final int ACTION_NONE = 0;
|
||||
private static final int ACTION_ADD = 1;
|
||||
private static final int ACTION_MOVE = 2;
|
||||
|
||||
private final Context mContext;
|
||||
|
||||
private final Handler mHandler = new Handler();
|
||||
@@ -82,7 +86,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
private List<TileInfo> mAllTiles;
|
||||
|
||||
private Holder mCurrentDrag;
|
||||
private boolean mAccessibilityMoving;
|
||||
private int mAccessibilityAction = ACTION_NONE;
|
||||
private int mAccessibilityFromIndex;
|
||||
private QSTileHost mHost;
|
||||
|
||||
@@ -172,7 +176,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (mAccessibilityMoving && position == mEditIndex - 1) {
|
||||
if (mAccessibilityAction == ACTION_ADD && position == mEditIndex - 1) {
|
||||
return TYPE_ACCESSIBLE_DROP;
|
||||
}
|
||||
if (position == mTileDividerIndex) {
|
||||
@@ -266,18 +270,18 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
if (position > mEditIndex) {
|
||||
info.state.contentDescription = mContext.getString(
|
||||
R.string.accessibility_qs_edit_add_tile_label, info.state.label);
|
||||
} else if (mAccessibilityMoving) {
|
||||
} else if (mAccessibilityAction != ACTION_NONE) {
|
||||
info.state.contentDescription = mContext.getString(
|
||||
R.string.accessibility_qs_edit_position_label, position + 1);
|
||||
} else {
|
||||
info.state.contentDescription = mContext.getString(
|
||||
R.string.accessibility_qs_edit_tile_label, position + 1, info.state.label);
|
||||
}
|
||||
holder.mTileView.onStateChanged(info.state);
|
||||
holder.mTileView.handleStateChanged(info.state);
|
||||
holder.mTileView.setShowAppLabel(position > mEditIndex && !info.isSystem);
|
||||
|
||||
if (mAccessibilityManager.isTouchExplorationEnabled()) {
|
||||
final boolean selectable = !mAccessibilityMoving || position < mEditIndex;
|
||||
final boolean selectable = mAccessibilityAction == ACTION_NONE || position < mEditIndex;
|
||||
holder.mTileView.setClickable(selectable);
|
||||
holder.mTileView.setFocusable(selectable);
|
||||
holder.mTileView.setImportantForAccessibility(selectable
|
||||
@@ -288,13 +292,13 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
int position = holder.getAdapterPosition();
|
||||
if (mAccessibilityMoving) {
|
||||
if (mAccessibilityAction != ACTION_NONE) {
|
||||
selectPosition(position, v);
|
||||
} else {
|
||||
if (position < mEditIndex && canRemoveTiles()) {
|
||||
showAccessibilityDialog(position, v);
|
||||
} else {
|
||||
startAccessibleDrag(position);
|
||||
startAccessibleAdd(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -302,21 +306,21 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private boolean canRemoveTiles() {
|
||||
return mCurrentSpecs.size() > MIN_NUM_TILES;
|
||||
}
|
||||
|
||||
private void selectPosition(int position, View v) {
|
||||
// Remove the placeholder.
|
||||
mAccessibilityMoving = false;
|
||||
mTiles.remove(mEditIndex--);
|
||||
notifyItemRemoved(mEditIndex - 1);
|
||||
// Don't remove items when the last position is selected.
|
||||
if (position == mEditIndex) position--;
|
||||
|
||||
if (mAccessibilityAction == ACTION_ADD) {
|
||||
// Remove the placeholder.
|
||||
mTiles.remove(mEditIndex--);
|
||||
notifyItemRemoved(mEditIndex);
|
||||
// Don't remove items when the last position is selected.
|
||||
if (position == mEditIndex - 1) position--;
|
||||
}
|
||||
mAccessibilityAction = ACTION_NONE;
|
||||
move(mAccessibilityFromIndex, position, v);
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@@ -331,7 +335,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (which == 0) {
|
||||
startAccessibleDrag(position);
|
||||
startAccessibleMove(position);
|
||||
} else {
|
||||
move(position, info.isSystem ? mEditIndex : mTileDividerIndex, v);
|
||||
notifyItemChanged(mTileDividerIndex);
|
||||
@@ -345,12 +349,18 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
private void startAccessibleDrag(int position) {
|
||||
mAccessibilityMoving = true;
|
||||
mNeedsFocus = true;
|
||||
private void startAccessibleAdd(int position) {
|
||||
mAccessibilityFromIndex = position;
|
||||
mAccessibilityAction = ACTION_ADD;
|
||||
// Add placeholder for last slot.
|
||||
mTiles.add(mEditIndex++, null);
|
||||
mNeedsFocus = true;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void startAccessibleMove(int position) {
|
||||
mAccessibilityFromIndex = position;
|
||||
mAccessibilityAction = ACTION_MOVE;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@@ -365,30 +375,26 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
|
||||
CharSequence fromLabel = mTiles.get(from).state.label;
|
||||
move(from, to, mTiles);
|
||||
updateDividerLocations();
|
||||
CharSequence announcement;
|
||||
if (to >= mEditIndex) {
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_QS_EDIT_REMOVE_SPEC,
|
||||
strip(mTiles.get(to)));
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_QS_EDIT_REMOVE,
|
||||
from);
|
||||
announcement = mContext.getString(R.string.accessibility_qs_edit_tile_removed,
|
||||
fromLabel);
|
||||
} else if (from >= mEditIndex) {
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_QS_EDIT_ADD_SPEC,
|
||||
strip(mTiles.get(to)));
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_QS_EDIT_ADD,
|
||||
to);
|
||||
announcement = mContext.getString(R.string.accessibility_qs_edit_tile_added,
|
||||
fromLabel, (to + 1));
|
||||
v.announceForAccessibility(mContext.getString(R.string.accessibility_qs_edit_tile_added,
|
||||
fromLabel, (to + 1)));
|
||||
} else {
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_QS_EDIT_MOVE_SPEC,
|
||||
strip(mTiles.get(to)));
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_QS_EDIT_MOVE,
|
||||
to);
|
||||
announcement = mContext.getString(R.string.accessibility_qs_edit_tile_moved,
|
||||
fromLabel, (to + 1));
|
||||
v.announceForAccessibility(mContext.getString(R.string.accessibility_qs_edit_tile_moved,
|
||||
fromLabel, (to + 1)));
|
||||
}
|
||||
v.announceForAccessibility(announcement);
|
||||
saveSpecs(mHost);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user