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);
+        }
+    }
 }