diff options
author | Tony Wickham <twickham@google.com> | 2015-11-17 10:46:48 -0800 |
---|---|---|
committer | Tony Wickham <twickham@google.com> | 2015-11-20 15:08:55 -0800 |
commit | feec2171f84f465feab96631c9d067d032aa8f88 (patch) | |
tree | fb38c5602f99c731ea938bbf08b64313998b95aa | |
parent | a43f78fc4b70bf54b9c90758660b6155ef0257aa (diff) | |
download | android_packages_apps_Trebuchet-feec2171f84f465feab96631c9d067d032aa8f88.tar.gz android_packages_apps_Trebuchet-feec2171f84f465feab96631c9d067d032aa8f88.tar.bz2 android_packages_apps_Trebuchet-feec2171f84f465feab96631c9d067d032aa8f88.zip |
Focus doesn't leave folders without also closing them.
- Pressing Tab wraps around to the first item from the folder name,
and vice versa when pressing Shift+Tab.
- When tapping off the folder while editing the text, the folder
requests focus. We handle the following cases from that state:
- Pressing an arrow key or Tab gives focus to the first item.
- Pressing Shift+Tab gives focus to the last item.
- Fix slight corner case where moving from folder name to an item
didn't update mIsEditingName to false. So when clicking off of
the folder, it gave focus to the folder (as mentioned above)
instead of closing the folder like it usually does when icons are
focused. Not a huge deal, but still worth fixing.
Bug: 25687579
Change-Id: I1bec844c8ccd09529a11b9e3a1d92b3bdf7b2eb3
-rw-r--r-- | src/com/android/launcher3/Folder.java | 37 | ||||
-rw-r--r-- | src/com/android/launcher3/FolderPagedView.java | 20 |
2 files changed, 47 insertions, 10 deletions
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java index 9377bad6d..f50c07e81 100644 --- a/src/com/android/launcher3/Folder.java +++ b/src/com/android/launcher3/Folder.java @@ -318,9 +318,10 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList sendCustomAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, String.format(getContext().getString(R.string.folder_renamed), newTitle)); } - // In order to clear the focus from the text field, we set the focus on ourself. This - // ensures that every time the field is clicked, focus is gained, giving reliable behavior. - requestFocus(); + + // This ensures that focus is gained every time the field is clicked, which selects all + // the text and brings up the soft keyboard if necessary. + mFolderName.clearFocus(); Selection.setSelection((Spannable) mFolderName.getText(), 0, 0); mIsEditingName = false; @@ -1164,15 +1165,37 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList return mDestroyed; } - // This method keeps track of the last item in the folder for the purposes + // This method keeps track of the first and last item in the folder for the purposes // of keyboard focus public void updateTextViewFocus() { - View lastChild = mContent.getLastItem(); - if (lastChild != null) { + final View firstChild = mContent.getFirstItem(); + final View lastChild = mContent.getLastItem(); + if (firstChild != null && lastChild != null) { mFolderName.setNextFocusDownId(lastChild.getId()); mFolderName.setNextFocusRightId(lastChild.getId()); mFolderName.setNextFocusLeftId(lastChild.getId()); mFolderName.setNextFocusUpId(lastChild.getId()); + // Hitting TAB from the folder name wraps around to the first item on the current + // folder page, and hitting SHIFT+TAB from that item wraps back to the folder name. + mFolderName.setNextFocusForwardId(firstChild.getId()); + // When clicking off the folder when editing the name, this Folder gains focus. When + // pressing an arrow key from that state, give the focus to the first item. + this.setNextFocusDownId(firstChild.getId()); + this.setNextFocusRightId(firstChild.getId()); + this.setNextFocusLeftId(firstChild.getId()); + this.setNextFocusUpId(firstChild.getId()); + // When pressing shift+tab in the above state, give the focus to the last item. + setOnKeyListener(new OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + boolean isShiftPlusTab = keyCode == KeyEvent.KEYCODE_TAB && + event.hasModifiers(KeyEvent.META_SHIFT_ON); + if (isShiftPlusTab && Folder.this.isFocused()) { + return lastChild.requestFocus(); + } + return false; + } + }); } } @@ -1337,6 +1360,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList public void onFocusChange(View v, boolean hasFocus) { if (v == mFolderName && hasFocus) { startEditingFolderName(); + } else if (v == mFolderName && !hasFocus) { + dismissEditingName(); } } diff --git a/src/com/android/launcher3/FolderPagedView.java b/src/com/android/launcher3/FolderPagedView.java index cc9c5738a..d503d2cf5 100644 --- a/src/com/android/launcher3/FolderPagedView.java +++ b/src/com/android/launcher3/FolderPagedView.java @@ -402,16 +402,28 @@ public class FolderPagedView extends PagedView { return !ALLOW_FOLDER_SCROLL && getItemCount() >= mMaxItemsPerPage; } + public View getFirstItem() { + if (getChildCount() < 1) { + return null; + } + ShortcutAndWidgetContainer currContainer = getCurrentCellLayout().getShortcutsAndWidgets(); + if (mGridCountX > 0) { + return currContainer.getChildAt(0, 0); + } else { + return currContainer.getChildAt(0); + } + } + public View getLastItem() { if (getChildCount() < 1) { return null; } - ShortcutAndWidgetContainer lastContainer = getCurrentCellLayout().getShortcutsAndWidgets(); - int lastRank = lastContainer.getChildCount() - 1; + ShortcutAndWidgetContainer currContainer = getCurrentCellLayout().getShortcutsAndWidgets(); + int lastRank = currContainer.getChildCount() - 1; if (mGridCountX > 0) { - return lastContainer.getChildAt(lastRank % mGridCountX, lastRank / mGridCountX); + return currContainer.getChildAt(lastRank % mGridCountX, lastRank / mGridCountX); } else { - return lastContainer.getChildAt(lastRank); + return currContainer.getChildAt(lastRank); } } |