summaryrefslogtreecommitdiffstats
path: root/packages/DocumentsUI
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-08-05 17:55:16 -0700
committerJeff Sharkey <jsharkey@google.com>2014-08-06 00:56:45 +0000
commitfa5ec770ec9278b471670969ca56e1bdec3d050e (patch)
tree503042ac74ae1d83eab43c5391a74a795cfadaca /packages/DocumentsUI
parent8811f3457eacf5fae9bc7c3b5b0775c5f23abb63 (diff)
downloadframeworks_base-fa5ec770ec9278b471670969ca56e1bdec3d050e.zip
frameworks_base-fa5ec770ec9278b471670969ca56e1bdec3d050e.tar.gz
frameworks_base-fa5ec770ec9278b471670969ca56e1bdec3d050e.tar.bz2
Use system collator for display names.
Continue sorting directory names first, but use system collator in case-insensitive ordering. Bug: 13545569 Change-Id: I24b314c9ef42f397bc96f474d9593bdefc0061d1
Diffstat (limited to 'packages/DocumentsUI')
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java13
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java36
2 files changed, 37 insertions, 12 deletions
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
index a23dd15..6c8ca20 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
+++ b/packages/DocumentsUI/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/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
index 91d9124..1c5ca86 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
+++ b/packages/DocumentsUI/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);
}
}