Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f61b0b84 authored by Tomasz Mikolajewski's avatar Tomasz Mikolajewski
Browse files

Revert "Precompute cursor indexes in DocumentsUI and improve perf by 2.7%."

This reverts commit 2e4e1478.

Bug: 28371571
Change-Id: I7aad5eb483c17cccb3485eb22effb677e1ba2160
parent d6a39495
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -156,7 +156,8 @@ public final class Shared {

    /**
     * Compare two strings against each other using system default collator in a
     * case-insensitive mode.
     * case-insensitive mode. Clusters strings prefixed with {@link DIR_PREFIX}
     * before other items.
     */
    public static int compareToIgnoreCaseNullable(String lhs, String rhs) {
        final boolean leftEmpty = TextUtils.isEmpty(lhs);
@@ -169,14 +170,6 @@ public final class Shared {
        return sCollator.compare(lhs, rhs);
    }

    /**
     * Compare two strings against each other using system default collator in a
     * case-insensitive mode.
     */
    public static int compareToIgnoreCase(String lhs, String rhs) {
        return sCollator.compare(lhs, rhs);
    }

    public static boolean isHardwareKeyboardAvailable(Context context) {
        return context.getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS;
    }
+18 −58
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static com.android.documentsui.Shared.DEBUG;
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 @@ import java.util.Map;
@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 @@ public class Model {
    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 @@ public class Model {
        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 @@ public class Model {
            // 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) {
                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 @@ public class Model {
                } else {
                    final String lhs = pivotValue;
                    final String rhs = sortKey[mid];
                    compare = Shared.compareToIgnoreCase(lhs, rhs);
                    compare = Shared.compareToIgnoreCaseNullable(lhs, rhs);
                }

                if (compare < 0) {
@@ -363,43 +352,14 @@ public class Model {
        }
    }

    /**
     * @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) {