diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java index cb9b1d83a..6d9b0624f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -2378,7 +2378,7 @@ public class RecipientDatabase extends Database { .excludeId(includeSelf ? null : Recipient.self().getId()) .build(); - String orderBy = SORT_NAME + ", " + SYSTEM_JOINED_NAME + ", " + SEARCH_PROFILE_NAME + ", " + USERNAME + ", " + PHONE; + String orderBy = orderByPreferringAlphaOverNumeric(SORT_NAME) + ", " + PHONE; return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, searchSelection.where, searchSelection.args, null, null, orderBy); } @@ -2395,7 +2395,7 @@ public class RecipientDatabase extends Database { String selection = searchSelection.getWhere(); String[] args = searchSelection.getArgs(); - String orderBy = SORT_NAME + ", " + SYSTEM_JOINED_NAME + ", " + SEARCH_PROFILE_NAME + ", " + PHONE; + String orderBy = orderByPreferringAlphaOverNumeric(SORT_NAME) + ", " + PHONE; return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); } @@ -3091,6 +3091,16 @@ public class RecipientDatabase extends Database { return "NULLIF(" + column + ", '')"; } + /** + * By default, SQLite will prefer numbers over letters when sorting. e.g. (b, a, 1) is sorted as (1, a, b). + * This order by will using a GLOB pattern to instead sort it as (a, b, 1). + * + * @param column The name of the column to sort by + */ + private static @NonNull String orderByPreferringAlphaOverNumeric(@NonNull String column) { + return "CASE WHEN " + column + " GLOB '[0-9]*' THEN 1 ELSE 0 END, " + column; + } + private static @NonNull String removeWhitespace(@NonNull String column) { return "REPLACE(" + column + ", ' ', '')"; }