Merge "Increase timeout for loading archives in tests." into arc-apps
diff --git a/src/com/android/documentsui/services/Job.java b/src/com/android/documentsui/services/Job.java
index 61f1c38..a72b528 100644
--- a/src/com/android/documentsui/services/Job.java
+++ b/src/com/android/documentsui/services/Job.java
@@ -181,21 +181,25 @@
         return Uri.parse(String.format("data,%s-%s", tag, id));
     }
 
-    ContentProviderClient getClient(DocumentInfo doc) throws RemoteException {
-        ContentProviderClient client = mClients.get(doc.authority);
+    ContentProviderClient getClient(Uri uri) throws RemoteException {
+        ContentProviderClient client = mClients.get(uri.getAuthority());
         if (client == null) {
             // Acquire content providers.
             client = acquireUnstableProviderOrThrow(
                     getContentResolver(),
-                    doc.authority);
+                    uri.getAuthority());
 
-            mClients.put(doc.authority, client);
+            mClients.put(uri.getAuthority(), client);
         }
 
         assert(client != null);
         return client;
     }
 
+    ContentProviderClient getClient(DocumentInfo doc) throws RemoteException {
+        return getClient(doc.derivedUri);
+    }
+
     final void cleanup() {
         for (ContentProviderClient client : mClients.values()) {
             ContentProviderClient.releaseQuietly(client);
diff --git a/src/com/android/documentsui/services/ResolvedResourcesJob.java b/src/com/android/documentsui/services/ResolvedResourcesJob.java
index b4934b0..b67316b 100644
--- a/src/com/android/documentsui/services/ResolvedResourcesJob.java
+++ b/src/com/android/documentsui/services/ResolvedResourcesJob.java
@@ -44,7 +44,7 @@
     private static final String TAG = "ResolvedResourcesJob";
 
     final List<DocumentInfo> mResolvedDocs;
-    final List<DocumentInfo> mAcquiredArchivedDocs = new ArrayList<>();
+    final List<Uri> mAcquiredArchivedUris = new ArrayList<>();
 
     ResolvedResourcesJob(Context service, Listener listener, String id, @OpType int opType,
             DocumentStack destination, UrisSupplier srcs) {
@@ -61,6 +61,25 @@
             return false;
         }
 
+        // Acquire all source archived documents, so they are not gone while copying from.
+        try {
+            Iterable<Uri> uris = mResourceUris.getUris(appContext);
+            for (Uri uri : uris) {
+                try {
+                    if (ArchivesProvider.AUTHORITY.equals(uri.getAuthority())) {
+                        ArchivesProvider.acquireArchive(getClient(uri), uri);
+                        mAcquiredArchivedUris.add(uri);
+                    }
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Failed to acquire an archive.");
+                    return false;
+                }
+            }
+        } catch (IOException e) {
+            Log.e(TAG, "Failed to read list of target resource Uris. Cannot continue.", e);
+            return false;
+        }
+
         int docsResolved = buildDocumentList();
         if (!isCanceled() && docsResolved < mResourceUris.getItemCount()) {
             if (docsResolved == 0) {
@@ -71,29 +90,15 @@
             }
         }
 
-        // Acquire all source archived documents, so they are not gone while copying from.
-        try {
-            for (DocumentInfo doc : mResolvedDocs) {
-                if (doc.isInArchive()) {
-                    final ContentProviderClient client = getClient(doc);
-                    ArchivesProvider.acquireArchive(client, doc.derivedUri);
-                    mAcquiredArchivedDocs.add(doc);
-                }
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to acquire an archive.");
-            return false;
-        }
-
         return true;
     }
 
     @Override
     void finish() {
         // Release all archived documents.
-        for (DocumentInfo doc : mAcquiredArchivedDocs) {
+        for (Uri uri : mAcquiredArchivedUris) {
             try {
-                ArchivesProvider.releaseArchive(getClient(doc), doc.derivedUri);
+                ArchivesProvider.releaseArchive(getClient(uri), uri);
             } catch (RemoteException e) {
                 Log.e(TAG, "Failed to release an archived document.");
             }