Revert "Precompute cursor indexes in DocumentsUI and improve perf by 2.7%."
This reverts commit 2e4e14789ecf923b16ea4e79b5605952ddc56e5b.
Bug: 28371571
Change-Id: I7aad5eb483c17cccb3485eb22effb677e1ba2160
diff --git a/src/com/android/documentsui/dirlist/Model.java b/src/com/android/documentsui/dirlist/Model.java
index e2a28ad..37daca0 100644
--- a/src/com/android/documentsui/dirlist/Model.java
+++ b/src/com/android/documentsui/dirlist/Model.java
@@ -20,6 +20,8 @@
import static com.android.documentsui.State.SORT_ORDER_DISPLAY_NAME;
import static com.android.documentsui.State.SORT_ORDER_LAST_MODIFIED;
import static com.android.documentsui.State.SORT_ORDER_SIZE;
+import static com.android.documentsui.model.DocumentInfo.getCursorLong;
+import static com.android.documentsui.model.DocumentInfo.getCursorString;
import android.database.Cursor;
import android.database.MergeCursor;
@@ -48,7 +50,6 @@
@VisibleForTesting
public class Model {
private static final String TAG = "Model";
- private static final String EMPTY = "";
private boolean mIsLoading;
private List<UpdateListener> mUpdateListeners = new ArrayList<>();
@@ -63,13 +64,6 @@
private String mIds[] = new String[0];
private int mSortOrder = SORT_ORDER_DISPLAY_NAME;
- private int mAuthorityIndex = -1;
- private int mDocIdIndex = -1;
- private int mMimeTypeIndex = -1;
- private int mDisplayNameIndex = -1;
- private int mSizeIndex = -1;
- private int mLastModifiedIndex = -1;
-
@Nullable String info;
@Nullable String error;
@Nullable DocumentInfo doc;
@@ -111,14 +105,6 @@
mCursor = result.cursor;
mCursorCount = mCursor.getCount();
mSortOrder = result.sortOrder;
- mAuthorityIndex = mCursor.getColumnIndex(RootCursorWrapper.COLUMN_AUTHORITY);
- assert(mAuthorityIndex != -1);
- mDocIdIndex = mCursor.getColumnIndex(Document.COLUMN_DOCUMENT_ID);
- mMimeTypeIndex = mCursor.getColumnIndex(Document.COLUMN_MIME_TYPE);
- mDisplayNameIndex = mCursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME);
- mLastModifiedIndex = mCursor.getColumnIndex(Document.COLUMN_LAST_MODIFIED);
- mSizeIndex = mCursor.getColumnIndex(Document.COLUMN_SIZE);
-
doc = result.doc;
updateModelData();
@@ -171,23 +157,26 @@
// If the cursor is a merged cursor over multiple authorities, then prefix the ids
// with the authority to avoid collisions.
if (mCursor instanceof MergeCursor) {
- mIds[pos] = getStringOrEmpty(mAuthorityIndex) + "|" + getStringOrEmpty(mDocIdIndex);
+ mIds[pos] = getCursorString(mCursor, RootCursorWrapper.COLUMN_AUTHORITY) + "|" +
+ getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID);
} else {
- mIds[pos] = getStringOrEmpty(mDocIdIndex);
+ mIds[pos] = getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID);
}
- mimeType = getStringOrEmpty(mMimeTypeIndex);
+ mimeType = getCursorString(mCursor, Document.COLUMN_MIME_TYPE);
isDirs[pos] = Document.MIME_TYPE_DIR.equals(mimeType);
- switch (mSortOrder) {
+ switch(mSortOrder) {
case SORT_ORDER_DISPLAY_NAME:
- displayNames[pos] = getStringOrEmpty(mDisplayNameIndex);
+ final String displayName = getCursorString(
+ mCursor, Document.COLUMN_DISPLAY_NAME);
+ displayNames[pos] = displayName;
break;
case SORT_ORDER_LAST_MODIFIED:
- longValues[pos] = getLastModified();
+ longValues[pos] = getLastModified(mCursor);
break;
case SORT_ORDER_SIZE:
- longValues[pos] = getDocSize();
+ longValues[pos] = getCursorLong(mCursor, Document.COLUMN_SIZE);
break;
}
}
@@ -243,7 +232,7 @@
} else {
final String lhs = pivotValue;
final String rhs = sortKey[mid];
- compare = Shared.compareToIgnoreCase(lhs, rhs);
+ compare = Shared.compareToIgnoreCaseNullable(lhs, rhs);
}
if (compare < 0) {
@@ -364,42 +353,13 @@
}
/**
- * @return Value of the string column, or an empty string if no value, or empty value.
- */
- private String getStringOrEmpty(int columnIndex) {
- if (columnIndex == -1)
- return EMPTY;
- final String result = mCursor.getString(columnIndex);
- return result != null ? result : EMPTY;
- }
-
- /**
* @return Timestamp for the given document. Some docs (e.g. active downloads) have a null
- * or missing timestamp - these will be replaced with MAX_LONG so that such files get sorted to
- * the top when sorting by date.
+ * timestamp - these will be replaced with MAX_LONG so that such files get sorted to the top
+ * when sorting by date.
*/
- private long getLastModified() {
- if (mLastModifiedIndex == -1)
- return Long.MAX_VALUE;
- try {
- final long result = mCursor.getLong(mLastModifiedIndex);
- return result > 0 ? result : Long.MAX_VALUE;
- } catch (NumberFormatException e) {
- return Long.MAX_VALUE;
- }
- }
-
- /**
- * @return Size for the given document. If the size is unknown or invalid, returns 0.
- */
- private long getDocSize() {
- if (mSizeIndex == -1)
- return 0;
- try {
- return mCursor.getLong(mSizeIndex);
- } catch (NumberFormatException e) {
- return 0;
- }
+ long getLastModified(Cursor cursor) {
+ long l = getCursorLong(mCursor, Document.COLUMN_LAST_MODIFIED);
+ return (l == -1) ? Long.MAX_VALUE : l;
}
public @Nullable Cursor getItem(String modelId) {