From 56e44e4583444c091881de8ac11bb9d2c8773932 Mon Sep 17 00:00:00 2001 From: Andrei Stingaceanu Date: Fri, 8 Apr 2016 15:07:15 +0100 Subject: [PATCH] Keyboard shortcuts: sort application items Sorts entries for application shortcuts by label, case insensitive with nulls and/or empty labels last. Bug: 28014459 Change-Id: I405a72bc312e4a81a3013b816385dc8c23f9feec --- .../systemui/statusbar/KeyboardShortcuts.java | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java index fff14914baf2d..3d36aa4473304 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java @@ -58,11 +58,15 @@ import com.android.systemui.R; import com.android.systemui.recents.Recents; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import static android.content.Context.LAYOUT_INFLATER_SERVICE; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; +import com.google.android.collect.Lists; + /** * Contains functionality for handling keyboard shortcuts. */ @@ -76,11 +80,32 @@ public final class KeyboardShortcuts { private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Context mContext; private final IPackageManager mPackageManager; - private final OnClickListener dialogCloseListener = new DialogInterface.OnClickListener() { + private final OnClickListener mDialogCloseListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dismissKeyboardShortcutsDialog(); } }; + private final Comparator mApplicationItemsComparator = + new Comparator() { + @Override + public int compare(KeyboardShortcutInfo ksh1, KeyboardShortcutInfo ksh2) { + boolean ksh1ShouldBeLast = ksh1.getLabel() == null + || ksh1.getLabel().toString().isEmpty(); + boolean ksh2ShouldBeLast = ksh2.getLabel() == null + || ksh2.getLabel().toString().isEmpty(); + if (ksh1ShouldBeLast && ksh2ShouldBeLast) { + return 0; + } + if (ksh1ShouldBeLast) { + return 1; + } + if (ksh2ShouldBeLast) { + return -1; + } + return (ksh1.getLabel().toString()).compareToIgnoreCase( + ksh2.getLabel().toString()); + } + }; private Dialog mKeyboardShortcutsDialog; private KeyCharacterMap mKeyCharacterMap; @@ -320,9 +345,7 @@ public final class KeyboardShortcuts { private KeyboardShortcutGroup getDefaultApplicationShortcuts() { final int userId = mContext.getUserId(); - final KeyboardShortcutGroup applicationGroup = new KeyboardShortcutGroup( - mContext.getString(R.string.keyboard_shortcut_group_applications), - true); + List keyboardShortcutInfoAppItems = Lists.newArrayList(); // Assist. final AssistUtils assistUtils = new AssistUtils(mContext); @@ -340,7 +363,7 @@ public final class KeyboardShortcuts { assistPackageInfo.applicationInfo.packageName, assistPackageInfo.applicationInfo.icon); - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_assist), assistIcon, KeyEvent.KEYCODE_UNKNOWN, @@ -350,7 +373,7 @@ public final class KeyboardShortcuts { // Browser. final Icon browserIcon = getIconForIntentCategory(Intent.CATEGORY_APP_BROWSER, userId); if (browserIcon != null) { - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_browser), browserIcon, KeyEvent.KEYCODE_B, @@ -361,7 +384,7 @@ public final class KeyboardShortcuts { // Contacts. final Icon contactsIcon = getIconForIntentCategory(Intent.CATEGORY_APP_CONTACTS, userId); if (contactsIcon != null) { - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_contacts), contactsIcon, KeyEvent.KEYCODE_C, @@ -371,7 +394,7 @@ public final class KeyboardShortcuts { // Email. final Icon emailIcon = getIconForIntentCategory(Intent.CATEGORY_APP_EMAIL, userId); if (emailIcon != null) { - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_email), emailIcon, KeyEvent.KEYCODE_E, @@ -381,7 +404,7 @@ public final class KeyboardShortcuts { // Messaging. final Icon messagingIcon = getIconForIntentCategory(Intent.CATEGORY_APP_MESSAGING, userId); if (messagingIcon != null) { - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_im), messagingIcon, KeyEvent.KEYCODE_T, @@ -391,7 +414,7 @@ public final class KeyboardShortcuts { // Music. final Icon musicIcon = getIconForIntentCategory(Intent.CATEGORY_APP_MUSIC, userId); if (musicIcon != null) { - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_music), musicIcon, KeyEvent.KEYCODE_P, @@ -401,14 +424,24 @@ public final class KeyboardShortcuts { // Calendar. final Icon calendarIcon = getIconForIntentCategory(Intent.CATEGORY_APP_CALENDAR, userId); if (calendarIcon != null) { - applicationGroup.addItem(new KeyboardShortcutInfo( + keyboardShortcutInfoAppItems.add(new KeyboardShortcutInfo( mContext.getString(R.string.keyboard_shortcut_group_applications_calendar), calendarIcon, KeyEvent.KEYCODE_L, KeyEvent.META_META_ON)); } - return applicationGroup.getItems().size() == 0 ? null : applicationGroup; + final int itemsSize = keyboardShortcutInfoAppItems.size(); + if (itemsSize == 0) { + return null; + } + + // Sorts by label, case insensitive with nulls and/or empty labels last. + Collections.sort(keyboardShortcutInfoAppItems, mApplicationItemsComparator); + return new KeyboardShortcutGroup( + mContext.getString(R.string.keyboard_shortcut_group_applications), + keyboardShortcutInfoAppItems, + true); } private Icon getIconForIntentCategory(String intentCategory, int userId) { @@ -459,7 +492,7 @@ public final class KeyboardShortcuts { populateKeyboardShortcuts((LinearLayout) keyboardShortcutsView.findViewById( R.id.keyboard_shortcuts_container), keyboardShortcutGroups); dialogBuilder.setView(keyboardShortcutsView); - dialogBuilder.setPositiveButton(R.string.quick_settings_done, dialogCloseListener); + dialogBuilder.setPositiveButton(R.string.quick_settings_done, mDialogCloseListener); mKeyboardShortcutsDialog = dialogBuilder.create(); mKeyboardShortcutsDialog.setCanceledOnTouchOutside(true); Window keyboardShortcutsWindow = mKeyboardShortcutsDialog.getWindow();