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) {