Search in sources :

Example 81 with RootInfo

use of com.android.documentsui.model.RootInfo in project android_frameworks_base by crdroidandroid.

the class RootsCache method getMatchingRoots.

@VisibleForTesting
static List<RootInfo> getMatchingRoots(Collection<RootInfo> roots, State state) {
    final List<RootInfo> matching = new ArrayList<>();
    for (RootInfo root : roots) {
        if (DEBUG)
            Log.d(TAG, "Evaluating " + root);
        if (state.action == State.ACTION_CREATE && !root.supportsCreate()) {
            if (DEBUG)
                Log.d(TAG, "Excluding read-only root because: ACTION_CREATE.");
            continue;
        }
        if (state.action == State.ACTION_PICK_COPY_DESTINATION && !root.supportsCreate()) {
            if (DEBUG)
                Log.d(TAG, "Excluding read-only root because: ACTION_PICK_COPY_DESTINATION.");
            continue;
        }
        if (state.action == State.ACTION_OPEN_TREE && !root.supportsChildren()) {
            if (DEBUG)
                Log.d(TAG, "Excluding root !supportsChildren because: ACTION_OPEN_TREE.");
            continue;
        }
        if (!state.showAdvanced && root.isAdvanced()) {
            if (DEBUG)
                Log.d(TAG, "Excluding root because: unwanted advanced device.");
            continue;
        }
        if (state.localOnly && !root.isLocalOnly()) {
            if (DEBUG)
                Log.d(TAG, "Excluding root because: unwanted non-local device.");
            continue;
        }
        if (state.directoryCopy && root.isDownloads()) {
            if (DEBUG)
                Log.d(TAG, "Excluding downloads root because: unsupported directory copy.");
            continue;
        }
        if (state.action == State.ACTION_OPEN && root.isEmpty()) {
            if (DEBUG)
                Log.d(TAG, "Excluding empty root because: ACTION_OPEN.");
            continue;
        }
        if (state.action == State.ACTION_GET_CONTENT && root.isEmpty()) {
            if (DEBUG)
                Log.d(TAG, "Excluding empty root because: ACTION_GET_CONTENT.");
            continue;
        }
        final boolean overlap = MimePredicate.mimeMatches(root.derivedMimeTypes, state.acceptMimes) || MimePredicate.mimeMatches(state.acceptMimes, root.derivedMimeTypes);
        if (!overlap) {
            if (DEBUG)
                Log.d(TAG, "Excluding root because: unsupported content types > " + state.acceptMimes);
            continue;
        }
        if (state.excludedAuthorities.contains(root.authority)) {
            if (DEBUG)
                Log.d(TAG, "Excluding root because: owned by calling package.");
            continue;
        }
        if (DEBUG)
            Log.d(TAG, "Including " + root);
        matching.add(root);
    }
    return matching;
}
Also used : RootInfo(com.android.documentsui.model.RootInfo) ArrayList(java.util.ArrayList) VisibleForTesting(android.support.annotation.VisibleForTesting)

Example 82 with RootInfo

use of com.android.documentsui.model.RootInfo in project android_frameworks_base by crdroidandroid.

the class RecentsLoader method loadInBackgroundLocked.

private DirectoryResult loadInBackgroundLocked() {
    if (mFirstPassLatch == null) {
        // First time through we kick off all the recent tasks, and wait
        // around to see if everyone finishes quickly.
        final Collection<RootInfo> roots = mRoots.getMatchingRootsBlocking(mState);
        for (RootInfo root : roots) {
            if (root.supportsRecents()) {
                mTasks.put(root, new RecentsTask(root.authority, root.rootId));
            }
        }
        mFirstPassLatch = new CountDownLatch(mTasks.size());
        for (RecentsTask task : mTasks.values()) {
            ProviderExecutor.forAuthority(task.authority).execute(task);
        }
        try {
            mFirstPassLatch.await(MAX_FIRST_PASS_WAIT_MILLIS, TimeUnit.MILLISECONDS);
            mFirstPassDone = true;
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    final long rejectBefore = System.currentTimeMillis() - REJECT_OLDER_THAN;
    // Collect all finished tasks
    boolean allDone = true;
    List<Cursor> cursors = new ArrayList<>();
    for (RecentsTask task : mTasks.values()) {
        if (task.isDone()) {
            try {
                final Cursor cursor = task.get();
                if (cursor == null)
                    continue;
                final FilteringCursorWrapper filtered = new FilteringCursorWrapper(cursor, mState.acceptMimes, RECENT_REJECT_MIMES, rejectBefore) {

                    @Override
                    public void close() {
                    // Ignored, since we manage cursor lifecycle internally
                    }
                };
                cursors.add(filtered);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } catch (ExecutionException e) {
            // We already logged on other side
            } catch (Exception e) {
                Log.e(TAG, "Failed to query Recents for authority: " + task.authority + ". Skip this authority in Recents.", e);
            }
        } else {
            allDone = false;
        }
    }
    if (DEBUG) {
        Log.d(TAG, "Found " + cursors.size() + " of " + mTasks.size() + " recent queries done");
    }
    final DirectoryResult result = new DirectoryResult();
    result.sortOrder = SORT_ORDER_LAST_MODIFIED;
    final Cursor merged;
    if (cursors.size() > 0) {
        merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()]));
    } else {
        // Return something when nobody is ready
        merged = new MatrixCursor(new String[0]);
    }
    // Tell the UI if this is an in-progress result. When loading is complete, another update is
    // sent with EXTRA_LOADING set to false.
    Bundle extras = new Bundle();
    extras.putBoolean(DocumentsContract.EXTRA_LOADING, !allDone);
    merged.setExtras(extras);
    result.cursor = merged;
    return result;
}
Also used : Bundle(android.os.Bundle) ArrayList(java.util.ArrayList) MergeCursor(android.database.MergeCursor) CountDownLatch(java.util.concurrent.CountDownLatch) Cursor(android.database.Cursor) MergeCursor(android.database.MergeCursor) MatrixCursor(android.database.MatrixCursor) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) MatrixCursor(android.database.MatrixCursor) RootInfo(com.android.documentsui.model.RootInfo) ExecutionException(java.util.concurrent.ExecutionException)

Example 83 with RootInfo

use of com.android.documentsui.model.RootInfo in project android_frameworks_base by crdroidandroid.

the class DocumentsActivity method refreshDirectory.

@Override
void refreshDirectory(int anim) {
    final FragmentManager fm = getFragmentManager();
    final RootInfo root = getCurrentRoot();
    final DocumentInfo cwd = getCurrentDirectory();
    if (cwd == null) {
        // No directory means recents
        if (mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE || mState.action == ACTION_PICK_COPY_DESTINATION) {
            RecentsCreateFragment.show(fm);
        } else {
            DirectoryFragment.showRecentsOpen(fm, anim);
            // In recents we pick layout mode based on the mimetype,
            // picking GRID for visual types. We intentionally don't
            // consult a user's saved preferences here since they are
            // set per root (not per root and per mimetype).
            boolean visualMimes = MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mState.acceptMimes);
            mState.derivedMode = visualMimes ? State.MODE_GRID : State.MODE_LIST;
        }
    } else {
        // Normal boring directory
        DirectoryFragment.showDirectory(fm, root, cwd, anim);
    }
    // Forget any replacement target
    if (mState.action == ACTION_CREATE) {
        final SaveFragment save = SaveFragment.get(fm);
        if (save != null) {
            save.setReplaceTarget(null);
        }
    }
    if (mState.action == ACTION_OPEN_TREE || mState.action == ACTION_PICK_COPY_DESTINATION) {
        final PickFragment pick = PickFragment.get(fm);
        if (pick != null) {
            pick.setPickTarget(mState.action, mState.copyOperationSubType, cwd);
        }
    }
}
Also used : FragmentManager(android.app.FragmentManager) RootInfo(com.android.documentsui.model.RootInfo) DocumentInfo(com.android.documentsui.model.DocumentInfo)

Example 84 with RootInfo

use of com.android.documentsui.model.RootInfo in project android_frameworks_base by crdroidandroid.

the class RootsFragment method onCurrentRootChanged.

public void onCurrentRootChanged() {
    if (mAdapter == null) {
        return;
    }
    final RootInfo root = ((BaseActivity) getActivity()).getCurrentRoot();
    for (int i = 0; i < mAdapter.getCount(); i++) {
        final Object item = mAdapter.getItem(i);
        if (item instanceof RootItem) {
            final RootInfo testRoot = ((RootItem) item).root;
            if (Objects.equals(testRoot, root)) {
                mList.setItemChecked(i, true);
                mList.setSelection(i);
                return;
            }
        }
    }
}
Also used : RootInfo(com.android.documentsui.model.RootInfo)

Example 85 with RootInfo

use of com.android.documentsui.model.RootInfo in project android_frameworks_base by crdroidandroid.

the class RootsCacheTest method testExcludedAuthorities.

public void testExcludedAuthorities() throws Exception {
    final List<RootInfo> roots = newArrayList();
    // Set up some roots
    for (int i = 0; i < 5; ++i) {
        RootInfo root = new RootInfo();
        root.authority = "authority" + i;
        roots.add(root);
    }
    // Make some allowed authorities
    List<RootInfo> allowedRoots = newArrayList(roots.get(0), roots.get(2), roots.get(4));
    // Set up the excluded authority list
    for (RootInfo root : roots) {
        if (!allowedRoots.contains(root)) {
            mState.excludedAuthorities.add(root.authority);
        }
    }
    mState.acceptMimes = new String[] { "*/*" };
    assertContainsExactly(allowedRoots, getMatchingRoots(roots, mState));
}
Also used : RootInfo(com.android.documentsui.model.RootInfo)

Aggregations

RootInfo (com.android.documentsui.model.RootInfo)85 DocumentInfo (com.android.documentsui.model.DocumentInfo)20 FragmentManager (android.app.FragmentManager)15 Bundle (android.os.Bundle)15 ArrayList (java.util.ArrayList)15 Intent (android.content.Intent)10 Cursor (android.database.Cursor)10 ContentProviderClient (android.content.ContentProviderClient)5 Context (android.content.Context)5 Loader (android.content.Loader)5 MatrixCursor (android.database.MatrixCursor)5 MergeCursor (android.database.MergeCursor)5 Uri (android.net.Uri)5 VisibleForTesting (android.support.annotation.VisibleForTesting)5 MenuItem (android.view.MenuItem)5 DirectoryFragment (com.android.documentsui.dirlist.DirectoryFragment)5 IOException (java.io.IOException)5 Collection (java.util.Collection)5 CountDownLatch (java.util.concurrent.CountDownLatch)5 ExecutionException (java.util.concurrent.ExecutionException)5