Adding blocking to DirectoryLoader when Band Selection is active.
Bug: 29538016
Change-Id: Ib297afaf8b28d030ce10337efc7965717d2fa375
diff --git a/src/com/android/documentsui/DirectoryLoader.java b/src/com/android/documentsui/DirectoryLoader.java
index d2c7d10..56e76bb 100644
--- a/src/com/android/documentsui/DirectoryLoader.java
+++ b/src/com/android/documentsui/DirectoryLoader.java
@@ -20,9 +20,11 @@
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
+import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.CancellationSignal;
+import android.os.Handler;
import android.os.OperationCanceledException;
import android.os.RemoteException;
import android.provider.DocumentsContract.Document;
@@ -42,8 +44,7 @@
private static final String[] SEARCH_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR };
- private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
-
+ private final LockingContentObserver mObserver;
private final RootInfo mRoot;
private final Uri mUri;
private final SortModel mModel;
@@ -59,6 +60,7 @@
DocumentInfo doc,
Uri uri,
SortModel model,
+ DirectoryReloadLock lock,
boolean inSearchMode) {
super(context, ProviderExecutor.forAuthority(root.authority));
@@ -67,6 +69,7 @@
mModel = model;
mDoc = doc;
mSearchMode = inSearchMode;
+ mObserver = new LockingContentObserver(lock, this::onContentChanged);
}
@Override
@@ -181,4 +184,25 @@
getContext().getContentResolver().unregisterContentObserver(mObserver);
}
+
+ private static final class LockingContentObserver extends ContentObserver {
+ private final DirectoryReloadLock mLock;
+ private final Runnable mContentChangedCallback;
+
+ public LockingContentObserver(DirectoryReloadLock lock, Runnable contentChangedCallback) {
+ super(new Handler());
+ mLock = lock;
+ mContentChangedCallback = contentChangedCallback;
+ }
+
+ @Override
+ public boolean deliverSelfNotifications() {
+ return true;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mLock.tryUpdate(mContentChangedCallback);
+ }
+ }
}