diff options
-rw-r--r-- | src/com/android/documentsui/SortingCursorWrapper.java | 13 | ||||
-rw-r--r-- | src/com/android/documentsui/model/DocumentInfo.java | 36 |
2 files changed, 37 insertions, 12 deletions
diff --git a/src/com/android/documentsui/SortingCursorWrapper.java b/src/com/android/documentsui/SortingCursorWrapper.java index a23dd15f8..6c8ca2019 100644 --- a/src/com/android/documentsui/SortingCursorWrapper.java +++ b/src/com/android/documentsui/SortingCursorWrapper.java @@ -27,6 +27,8 @@ import android.database.Cursor; import android.os.Bundle; import android.provider.DocumentsContract.Document; +import com.android.documentsui.model.DocumentInfo; + /** * Cursor wrapper that presents a sorted view of the underlying cursor. Handles * common {@link Document} sorting modes, such as ordering directories first. @@ -68,7 +70,7 @@ public class SortingCursorWrapper extends AbstractCursor { final String displayName = getCursorString( cursor, Document.COLUMN_DISPLAY_NAME); if (Document.MIME_TYPE_DIR.equals(mimeType)) { - mValueString[i] = '\001' + displayName; + mValueString[i] = DocumentInfo.DIR_PREFIX + displayName; } else { mValueString[i] = displayName; } @@ -180,14 +182,7 @@ public class SortingCursorWrapper extends AbstractCursor { final String lhs = pivotValue; final String rhs = value[mid]; - final int compare; - if (lhs == null) { - compare = -1; - } else if (rhs == null) { - compare = 1; - } else { - compare = lhs.compareToIgnoreCase(rhs); - } + final int compare = DocumentInfo.compareToIgnoreCaseNullable(lhs, rhs); if (compare < 0) { right = mid; diff --git a/src/com/android/documentsui/model/DocumentInfo.java b/src/com/android/documentsui/model/DocumentInfo.java index 91d912415..1c5ca8644 100644 --- a/src/com/android/documentsui/model/DocumentInfo.java +++ b/src/com/android/documentsui/model/DocumentInfo.java @@ -25,6 +25,7 @@ import android.os.Parcelable; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; import android.provider.DocumentsProvider; +import android.text.TextUtils; import com.android.documentsui.DocumentsApplication; import com.android.documentsui.RootCursorWrapper; @@ -36,6 +37,7 @@ import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.ProtocolException; +import java.text.Collator; /** * Representation of a {@link Document}. @@ -44,6 +46,13 @@ public class DocumentInfo implements Durable, Parcelable { private static final int VERSION_INIT = 1; private static final int VERSION_SPLIT_URI = 2; + private static final Collator sCollator; + + static { + sCollator = Collator.getInstance(); + sCollator.setStrength(Collator.SECONDARY); + } + public String authority; public String documentId; public String mimeType; @@ -268,9 +277,30 @@ public class DocumentInfo implements Durable, Parcelable { throw fnfe; } + /** + * String prefix used to indicate the document is a directory. + */ + public static final char DIR_PREFIX = '\001'; + + /** + * Compare two strings against each other using system default collator in a + * case-insensitive mode. Clusters strings prefixed with {@link #DIR_PREFIX} + * before other items. + */ public static int compareToIgnoreCaseNullable(String lhs, String rhs) { - if (lhs == null) return -1; - if (rhs == null) return 1; - return lhs.compareToIgnoreCase(rhs); + final boolean leftEmpty = TextUtils.isEmpty(lhs); + final boolean rightEmpty = TextUtils.isEmpty(rhs); + + if (leftEmpty && rightEmpty) return 0; + if (leftEmpty) return -1; + if (rightEmpty) return 1; + + final boolean leftDir = (lhs.charAt(0) == DIR_PREFIX); + final boolean rightDir = (rhs.charAt(0) == DIR_PREFIX); + + if (leftDir && !rightDir) return -1; + if (rightDir && !leftDir) return 1; + + return sCollator.compare(lhs, rhs); } } |