summaryrefslogtreecommitdiffstats
path: root/src/com/android/documentsui/MultiRootDocumentsLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/documentsui/MultiRootDocumentsLoader.java')
-rw-r--r--src/com/android/documentsui/MultiRootDocumentsLoader.java47
1 files changed, 29 insertions, 18 deletions
diff --git a/src/com/android/documentsui/MultiRootDocumentsLoader.java b/src/com/android/documentsui/MultiRootDocumentsLoader.java
index e7d09bfd3..7668b0693 100644
--- a/src/com/android/documentsui/MultiRootDocumentsLoader.java
+++ b/src/com/android/documentsui/MultiRootDocumentsLoader.java
@@ -104,8 +104,6 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
* @param state current state
* @param executors the executors of authorities
* @param fileTypeMap the map of mime types and file types.
- * @param lock the selection lock
- * @param contentChangedCallback callback when content changed
*/
public MultiRootDocumentsLoader(Context context, ProvidersAccess providers, State state,
Lookup<String, Executor> executors, Lookup<String, String> fileTypeMap) {
@@ -126,8 +124,13 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
@Override
public DirectoryResult loadInBackground() {
- synchronized (mTasks) {
- return loadInBackgroundLocked();
+ try {
+ synchronized (mTasks) {
+ return loadInBackgroundLocked();
+ }
+ } catch (InterruptedException e) {
+ Log.w(TAG, "loadInBackground is interrupted: ", e);
+ return null;
}
}
@@ -135,7 +138,7 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
mObserver = observer;
}
- private DirectoryResult loadInBackgroundLocked() {
+ private DirectoryResult loadInBackgroundLocked() throws InterruptedException {
if (mFirstPassLatch == null) {
// First time through we kick off all the recent tasks, and wait
// around to see if everyone finishes quickly.
@@ -146,6 +149,11 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
getQueryTask(rootEntry.getKey(), rootEntry.getValue()));
}
+ if (isLoadInBackgroundCanceled()) {
+ // Loader is cancelled (e.g. about to be reset), preempt loading.
+ throw new InterruptedException("Loading is cancelled!");
+ }
+
mFirstPassLatch = new CountDownLatch(mTasks.size());
for (QueryTask task : mTasks.values()) {
mExecutors.lookup(task.authority).execute(task);
@@ -166,6 +174,11 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
int totalQuerySize = 0;
List<Cursor> cursors = new ArrayList<>(mTasks.size());
for (QueryTask task : mTasks.values()) {
+ if (isLoadInBackgroundCanceled()) {
+ // Loader is cancelled (e.g. about to be reset), preempt loading.
+ throw new InterruptedException("Loading is cancelled!");
+ }
+
if (task.isDone()) {
try {
final Cursor[] taskCursors = task.get();
@@ -181,17 +194,18 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
continue;
}
- // Filter hidden files.
- cursor = new FilteringCursorWrapper(cursor, mState.showHiddenFiles);
-
- final FilteringCursorWrapper filtered = new FilteringCursorWrapper(
- cursor, mState.acceptMimes, getRejectMimes(), rejectBefore) {
+ final FilteringCursorWrapper filteredCursor =
+ new FilteringCursorWrapper(cursor) {
@Override
public void close() {
// Ignored, since we manage cursor lifecycle internally
}
};
- cursors.add(filtered);
+ filteredCursor.filterHiddenFiles(mState.showHiddenFiles);
+ filteredCursor.filterMimes(mState.acceptMimes, getRejectMimes());
+ filteredCursor.filterLastModified(rejectBefore);
+
+ cursors.add(filteredCursor);
}
} catch (InterruptedException e) {
@@ -238,7 +252,7 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
extras.putBoolean(DocumentsContract.EXTRA_LOADING, !allDone);
sorted.setExtras(extras);
- result.cursor = sorted;
+ result.setCursor(sorted);
return result;
}
@@ -292,7 +306,7 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
DirectoryResult oldResult = mResult;
mResult = result;
- if (isStarted()) {
+ if (isStarted() && !isAbandoned() && !isLoadInBackgroundCanceled()) {
super.deliverResult(result);
}
@@ -326,9 +340,6 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
protected void onReset() {
super.onReset();
- // Ensure the loader is stopped
- onStopLoading();
-
synchronized (mTasks) {
for (QueryTask task : mTasks.values()) {
mExecutors.lookup(task.authority).execute(() -> FileUtils.closeQuietly(task));
@@ -459,10 +470,10 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory
}
private boolean checkIfCursorStale(DirectoryResult result) {
- if (result == null || result.cursor == null || result.cursor.isClosed()) {
+ if (result == null || result.getCursor() == null || result.getCursor().isClosed()) {
return true;
}
- Cursor cursor = result.cursor;
+ Cursor cursor = result.getCursor();
try {
cursor.moveToPosition(-1);
for (int pos = 0; pos < cursor.getCount(); ++pos) {