Search in sources :

Example 81 with MatrixCursor

use of android.database.MatrixCursor in project android_frameworks_base by AOSPA.

the class ExternalStorageProvider method queryDocument.

@Override
public Cursor queryDocument(String documentId, String[] projection) throws FileNotFoundException {
    if (mArchiveHelper.isArchivedDocument(documentId)) {
        return mArchiveHelper.queryDocument(documentId, projection);
    }
    final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
    includeFile(result, documentId, null);
    return result;
}
Also used : MatrixCursor(android.database.MatrixCursor)

Example 82 with MatrixCursor

use of android.database.MatrixCursor in project android_frameworks_base by AOSPA.

the class MtpDatabase method queryRoots.

/**
     * Queries roots information.
     * @param columnNames Column names defined in {@link android.provider.DocumentsContract.Root}.
     * @return Database cursor.
     */
Cursor queryRoots(Resources resources, String[] columnNames) {
    final String selection = COLUMN_ROW_STATE + " IN (?, ?) AND " + COLUMN_DOCUMENT_TYPE + " = ?";
    final Cursor deviceCursor = mDatabase.query(TABLE_DOCUMENTS, strings(COLUMN_DEVICE_ID), selection, strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_DEVICE), COLUMN_DEVICE_ID, null, null, null);
    try {
        final SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables(JOIN_ROOTS);
        builder.setProjectionMap(COLUMN_MAP_ROOTS);
        final MatrixCursor result = new MatrixCursor(columnNames);
        final ContentValues values = new ContentValues();
        while (deviceCursor.moveToNext()) {
            final int deviceId = deviceCursor.getInt(0);
            final Cursor storageCursor = builder.query(mDatabase, columnNames, selection + " AND " + COLUMN_DEVICE_ID + " = ?", strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_STORAGE, deviceId), null, null, null);
            try {
                values.clear();
                try (final Cursor deviceRoot = builder.query(mDatabase, columnNames, selection + " AND " + COLUMN_DEVICE_ID + " = ?", strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_DEVICE, deviceId), null, null, null)) {
                    deviceRoot.moveToNext();
                    DatabaseUtils.cursorRowToContentValues(deviceRoot, values);
                }
                if (storageCursor.getCount() != 0) {
                    long capacityBytes = 0;
                    long availableBytes = 0;
                    final int capacityIndex = storageCursor.getColumnIndex(Root.COLUMN_CAPACITY_BYTES);
                    final int availableIndex = storageCursor.getColumnIndex(Root.COLUMN_AVAILABLE_BYTES);
                    while (storageCursor.moveToNext()) {
                        // don't calculate corresponding values.
                        if (capacityIndex != -1) {
                            capacityBytes += storageCursor.getLong(capacityIndex);
                        }
                        if (availableIndex != -1) {
                            availableBytes += storageCursor.getLong(availableIndex);
                        }
                    }
                    values.put(Root.COLUMN_CAPACITY_BYTES, capacityBytes);
                    values.put(Root.COLUMN_AVAILABLE_BYTES, availableBytes);
                } else {
                    values.putNull(Root.COLUMN_CAPACITY_BYTES);
                    values.putNull(Root.COLUMN_AVAILABLE_BYTES);
                }
                if (storageCursor.getCount() == 1 && values.containsKey(Root.COLUMN_TITLE)) {
                    storageCursor.moveToFirst();
                    // Add storage name to device name if we have only 1 storage.
                    values.put(Root.COLUMN_TITLE, resources.getString(R.string.root_name, values.getAsString(Root.COLUMN_TITLE), storageCursor.getString(storageCursor.getColumnIndex(Root.COLUMN_TITLE))));
                }
            } finally {
                storageCursor.close();
            }
            final RowBuilder row = result.newRow();
            for (final String key : values.keySet()) {
                row.add(key, values.get(key));
            }
        }
        return result;
    } finally {
        deviceCursor.close();
    }
}
Also used : ContentValues(android.content.ContentValues) RowBuilder(android.database.MatrixCursor.RowBuilder) Cursor(android.database.Cursor) MatrixCursor(android.database.MatrixCursor) SQLiteQueryBuilder(android.database.sqlite.SQLiteQueryBuilder) MatrixCursor(android.database.MatrixCursor)

Example 83 with MatrixCursor

use of android.database.MatrixCursor in project android_frameworks_base by AOSPA.

the class ModelTest method testSort_sizesWithBucketing.

// Tests that directories and files are properly bucketed when sorting by size
public void testSort_sizesWithBucketing() {
    MatrixCursor c = new MatrixCursor(COLUMNS);
    for (int i = 0; i < ITEM_COUNT; ++i) {
        MatrixCursor.RowBuilder row = c.newRow();
        row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY);
        row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i));
        row.add(Document.COLUMN_SIZE, i);
        // Interleave directories and text files.
        String mimeType = (i % 2 == 0) ? Document.MIME_TYPE_DIR : "text/*";
        row.add(Document.COLUMN_MIME_TYPE, mimeType);
    }
    DirectoryResult r = new DirectoryResult();
    r.cursor = c;
    r.sortOrder = State.SORT_ORDER_SIZE;
    model.update(r);
    boolean seenAllDirs = false;
    int previousSize = Integer.MAX_VALUE;
    BitSet seen = new BitSet(ITEM_COUNT);
    // bucketed at the front of the list, sorted by size, followed by documents, sorted by size.
    for (String id : model.getModelIds()) {
        Cursor cOut = model.getItem(id);
        seen.set(cOut.getPosition());
        String mimeType = DocumentInfo.getCursorString(cOut, Document.COLUMN_MIME_TYPE);
        if (seenAllDirs) {
            assertFalse(Document.MIME_TYPE_DIR.equals(mimeType));
        } else {
            if (!Document.MIME_TYPE_DIR.equals(mimeType)) {
                seenAllDirs = true;
                // Reset the previous size seen, because documents are bucketed separately by
                // the sort.
                previousSize = Integer.MAX_VALUE;
            }
        }
        // Check sort order - descending numerical
        int size = DocumentInfo.getCursorInt(c, Document.COLUMN_SIZE);
        assertTrue(previousSize >= size);
        previousSize = size;
    }
    // Check that all items were accounted for.
    assertEquals(ITEM_COUNT, seen.cardinality());
}
Also used : DirectoryResult(com.android.documentsui.DirectoryResult) BitSet(java.util.BitSet) MergeCursor(android.database.MergeCursor) MatrixCursor(android.database.MatrixCursor) Cursor(android.database.Cursor) MatrixCursor(android.database.MatrixCursor)

Example 84 with MatrixCursor

use of android.database.MatrixCursor in project android_frameworks_base by AOSPA.

the class StubProvider method queryChildDocuments.

@Override
public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) throws FileNotFoundException {
    final StubDocument parentDocument = mStorage.get(parentDocumentId);
    if (parentDocument == null || parentDocument.file.isFile()) {
        throw new FileNotFoundException();
    }
    final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION);
    result.setNotificationUri(getContext().getContentResolver(), DocumentsContract.buildChildDocumentsUri(mAuthority, parentDocumentId));
    StubDocument document;
    for (File file : parentDocument.file.listFiles()) {
        document = mStorage.get(getDocumentIdForFile(file));
        if (document != null) {
            includeDocument(result, document);
        }
    }
    return result;
}
Also used : FileNotFoundException(java.io.FileNotFoundException) File(java.io.File) MatrixCursor(android.database.MatrixCursor)

Example 85 with MatrixCursor

use of android.database.MatrixCursor in project android_frameworks_base by AOSPA.

the class StubProvider method queryDocument.

@Override
public Cursor queryDocument(String documentId, String[] projection) throws FileNotFoundException {
    final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION);
    final StubDocument file = mStorage.get(documentId);
    if (file == null) {
        throw new FileNotFoundException();
    }
    includeDocument(result, file);
    return result;
}
Also used : FileNotFoundException(java.io.FileNotFoundException) MatrixCursor(android.database.MatrixCursor)

Aggregations

MatrixCursor (android.database.MatrixCursor)258 Cursor (android.database.Cursor)37 DirectoryResult (com.android.documentsui.DirectoryResult)35 RowBuilder (android.database.MatrixCursor.RowBuilder)30 File (java.io.File)30 MergeCursor (android.database.MergeCursor)18 Uri (android.net.Uri)18 Test (org.junit.Test)17 Setting (com.android.providers.settings.SettingsState.Setting)15 FileNotFoundException (java.io.FileNotFoundException)15 ArrayList (java.util.ArrayList)13 Bundle (android.os.Bundle)10 BitSet (java.util.BitSet)10 Random (java.util.Random)10 IOException (java.io.IOException)7 LinkedList (java.util.LinkedList)7 ContentValues (android.content.ContentValues)6 HashSet (java.util.HashSet)6 SQLiteQueryBuilder (android.database.sqlite.SQLiteQueryBuilder)5 RootInfo (com.android.documentsui.model.RootInfo)5