Merge "Fix unstable unittest due to RejectedExcecutionException"
diff --git a/src/com/android/documentsui/roots/ProvidersCache.java b/src/com/android/documentsui/roots/ProvidersCache.java
index 76178d0..ffb01e8 100644
--- a/src/com/android/documentsui/roots/ProvidersCache.java
+++ b/src/com/android/documentsui/roots/ProvidersCache.java
@@ -240,10 +240,27 @@
             ContentResolver resolver, String authority, boolean forceRefresh) {
         if (VERBOSE) Log.v(TAG, "Loading roots for " + authority);
 
+        final ArrayList<RootInfo> roots = new ArrayList<>();
+        ProviderInfo provider = mContext.getPackageManager().resolveContentProvider(
+                authority, PackageManager.GET_META_DATA);
+        if (!provider.exported) {
+            Log.w(TAG, "Provider is not exported. Failed to load roots for " + authority);
+            return roots;
+        }
+        if (!provider.grantUriPermissions) {
+            Log.w(TAG, "Provider doesn't grantUriPermissions. Failed to load roots for "
+                    + authority);
+            return roots;
+        }
+        if (!android.Manifest.permission.MANAGE_DOCUMENTS.equals(provider.readPermission)
+                || !android.Manifest.permission.MANAGE_DOCUMENTS.equals(provider.writePermission)) {
+            Log.w(TAG, "Provider is not protected by MANAGE_DOCUMENTS. Failed to load roots for "
+                    + authority);
+            return roots;
+        }
+
         synchronized (mObservedAuthoritiesDetails) {
             if (!mObservedAuthoritiesDetails.containsKey(authority)) {
-                ProviderInfo provider = mContext.getPackageManager().resolveContentProvider(
-                        authority, PackageManager.GET_META_DATA);
                 PackageManager pm = mContext.getPackageManager();
                 CharSequence appName = pm.getApplicationLabel(provider.applicationInfo);
                 String packageName = provider.applicationInfo.packageName;
@@ -274,7 +291,6 @@
             }
         }
 
-        final ArrayList<RootInfo> roots = new ArrayList<>();
         ContentProviderClient client = null;
         Cursor cursor = null;
         try {