Merge "Fix down arrow in AutoCompleteTextView." into honeycomb

This commit is contained in:
Jeff Brown
2011-01-26 23:45:59 -08:00
committed by Android (Google) Code Review
4 changed files with 96 additions and 80 deletions

View File

@@ -4467,15 +4467,14 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
} }
/** /**
* If there is a selection returns true. * If there is a selection returns false.
* Otherwise resurrects the selection and returns false. * Otherwise resurrects the selection and returns true if resurrected.
*/ */
boolean ensureSelectionOnMovementKey() { boolean resurrectSelectionIfNeeded() {
if (mSelectedPosition < 0) { if (mSelectedPosition < 0) {
resurrectSelection(); return resurrectSelection();
return false;
} }
return true; return false;
} }
/** /**

View File

@@ -1486,77 +1486,79 @@ public class GridView extends AbsListView {
switch (keyCode) { switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_LEFT:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_LEFT); handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_LEFT);
} }
break; break;
case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_RIGHT:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_RIGHT); handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_RIGHT);
} }
break; break;
case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_UP:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_UP);
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP);
} }
break; break;
case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_DPAD_DOWN:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_DOWN);
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN);
} }
break; break;
case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER: { case KeyEvent.KEYCODE_ENTER:
if (event.hasNoModifiers() if (event.hasNoModifiers()) {
&& event.getRepeatCount() == 0 && getChildCount() > 0) { handled = resurrectSelectionIfNeeded();
ensureSelectionOnMovementKey(); if (!handled
keyPressed(); && event.getRepeatCount() == 0 && getChildCount() > 0) {
keyPressed();
handled = true;
}
} }
return true; break;
}
case KeyEvent.KEYCODE_SPACE: case KeyEvent.KEYCODE_SPACE:
if (mPopup == null || !mPopup.isShowing()) { if (mPopup == null || !mPopup.isShowing()) {
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN);
} else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP);
} }
} }
break; break;
case KeyEvent.KEYCODE_PAGE_UP: case KeyEvent.KEYCODE_PAGE_UP:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP);
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP);
} }
break; break;
case KeyEvent.KEYCODE_PAGE_DOWN: case KeyEvent.KEYCODE_PAGE_DOWN:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN);
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN);
} }
break; break;
case KeyEvent.KEYCODE_MOVE_HOME: case KeyEvent.KEYCODE_MOVE_HOME:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP);
} }
break; break;
case KeyEvent.KEYCODE_MOVE_END: case KeyEvent.KEYCODE_MOVE_END:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN);
} }
break; break;
@@ -1569,32 +1571,34 @@ public class GridView extends AbsListView {
// perhaps it should be configurable (and more comprehensive). // perhaps it should be configurable (and more comprehensive).
if (false) { if (false) {
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_FORWARD); handled = resurrectSelectionIfNeeded()
|| sequenceScroll(FOCUS_FORWARD);
} else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_BACKWARD); handled = resurrectSelectionIfNeeded()
|| sequenceScroll(FOCUS_BACKWARD);
} }
} }
break; break;
} }
} }
if (!handled) {
handled = sendToTextFilter(keyCode, count, event);
}
if (handled) { if (handled) {
return true; return true;
} else { }
switch (action) {
case KeyEvent.ACTION_DOWN: if (sendToTextFilter(keyCode, count, event)) {
return super.onKeyDown(keyCode, event); return true;
case KeyEvent.ACTION_UP: }
return super.onKeyUp(keyCode, event);
case KeyEvent.ACTION_MULTIPLE: switch (action) {
return super.onKeyMultiple(keyCode, count, event); case KeyEvent.ACTION_DOWN:
default: return super.onKeyDown(keyCode, event);
return false; case KeyEvent.ACTION_UP:
} return super.onKeyUp(keyCode, event);
case KeyEvent.ACTION_MULTIPLE:
return super.onKeyMultiple(keyCode, count, event);
default:
return false;
} }
} }

View File

@@ -774,7 +774,7 @@ public class ListPopupWindow {
} }
/** /**
* Filter key down events. By forwarding key up events to this function, * Filter key down events. By forwarding key down events to this function,
* views using non-modal ListPopupWindow can have it handle key selection of items. * views using non-modal ListPopupWindow can have it handle key selection of items.
* *
* @param keyCode keyCode param passed to the host view's onKeyDown * @param keyCode keyCode param passed to the host view's onKeyDown

View File

@@ -2081,25 +2081,35 @@ public class ListView extends AbsListView {
switch (keyCode) { switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_UP:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
if (ensureSelectionOnMovementKey()) { handled = resurrectSelectionIfNeeded();
if (!handled) {
while (count-- > 0) { while (count-- > 0) {
handled |= arrowScroll(FOCUS_UP); if (arrowScroll(FOCUS_UP)) {
handled = true;
} else {
break;
}
} }
} }
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP);
} }
break; break;
case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_DPAD_DOWN:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
if (ensureSelectionOnMovementKey()) { handled = resurrectSelectionIfNeeded();
if (!handled) {
while (count-- > 0) { while (count-- > 0) {
handled |= arrowScroll(FOCUS_DOWN); if (arrowScroll(FOCUS_DOWN)) {
handled = true;
} else {
break;
}
} }
} }
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN);
} }
break; break;
@@ -2117,19 +2127,22 @@ public class ListView extends AbsListView {
case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER: case KeyEvent.KEYCODE_ENTER:
if (mItemCount > 0 && event.getRepeatCount() == 0) { if (event.hasNoModifiers()) {
ensureSelectionOnMovementKey(); handled = resurrectSelectionIfNeeded();
keyPressed(); if (!handled
&& event.getRepeatCount() == 0 && getChildCount() > 0) {
keyPressed();
handled = true;
}
} }
handled = true;
break; break;
case KeyEvent.KEYCODE_SPACE: case KeyEvent.KEYCODE_SPACE:
if (mPopup == null || !mPopup.isShowing()) { if (mPopup == null || !mPopup.isShowing()) {
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN);
} else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP);
} }
handled = true; handled = true;
} }
@@ -2137,29 +2150,29 @@ public class ListView extends AbsListView {
case KeyEvent.KEYCODE_PAGE_UP: case KeyEvent.KEYCODE_PAGE_UP:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP);
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP);
} }
break; break;
case KeyEvent.KEYCODE_PAGE_DOWN: case KeyEvent.KEYCODE_PAGE_DOWN:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN);
} else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN);
} }
break; break;
case KeyEvent.KEYCODE_MOVE_HOME: case KeyEvent.KEYCODE_MOVE_HOME:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP);
} }
break; break;
case KeyEvent.KEYCODE_MOVE_END: case KeyEvent.KEYCODE_MOVE_END:
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN);
} }
break; break;
@@ -2172,35 +2185,35 @@ public class ListView extends AbsListView {
// perhaps it should be configurable (and more comprehensive). // perhaps it should be configurable (and more comprehensive).
if (false) { if (false) {
if (event.hasNoModifiers()) { if (event.hasNoModifiers()) {
handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN); handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_DOWN);
} else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP); handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_UP);
} }
} }
break; break;
} }
} }
if (!handled) {
handled = sendToTextFilter(keyCode, count, event);
}
if (handled) { if (handled) {
return true; return true;
} else { }
switch (action) {
case KeyEvent.ACTION_DOWN:
return super.onKeyDown(keyCode, event);
case KeyEvent.ACTION_UP: if (sendToTextFilter(keyCode, count, event)) {
return super.onKeyUp(keyCode, event); return true;
}
case KeyEvent.ACTION_MULTIPLE: switch (action) {
return super.onKeyMultiple(keyCode, count, event); case KeyEvent.ACTION_DOWN:
return super.onKeyDown(keyCode, event);
default: // shouldn't happen case KeyEvent.ACTION_UP:
return false; return super.onKeyUp(keyCode, event);
}
case KeyEvent.ACTION_MULTIPLE:
return super.onKeyMultiple(keyCode, count, event);
default: // shouldn't happen
return false;
} }
} }