summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/com/android/documentsui/SortingCursorWrapper.java13
-rw-r--r--src/com/android/documentsui/model/DocumentInfo.java36
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);
}
}