Merge "Check for droppability when dropping onto Roots." into arc-apps
diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java
index 3a61a26..921a3ed 100644
--- a/src/com/android/documentsui/files/ActionHandler.java
+++ b/src/com/android/documentsui/files/ActionHandler.java
@@ -17,6 +17,7 @@
 package com.android.documentsui.files;
 
 import static com.android.documentsui.base.Shared.DEBUG;
+import static com.android.documentsui.base.Shared.ENABLE_OMC_API_FEATURES;
 
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
@@ -424,7 +425,8 @@
 
     private boolean launchToRoot(Intent intent) {
         String action = intent.getAction();
-        if (Intent.ACTION_VIEW.equals(action) || DocumentsContract.ACTION_BROWSE.equals(action)) {
+        if (Intent.ACTION_VIEW.equals(action)
+                || (!ENABLE_OMC_API_FEATURES && "android.provider.action.BROWSE".equals(action))) {
             Uri uri = intent.getData();
             if (DocumentsContract.isRootUri(mActivity, uri)) {
                 if (DEBUG) Log.d(TAG, "Launching with root URI.");
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.");
             }
diff --git a/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java b/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java
index 4bbb896..db9e868 100644
--- a/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java
+++ b/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java
@@ -48,7 +48,8 @@
 @MediumTest
 public class ArchivesProviderTest extends AndroidTestCase {
     private static final Uri ARCHIVE_URI = Uri.parse("content://i/love/strawberries");
-    private static final String NOTIFICATION_URI = "content://notification-uri";
+    private static final String NOTIFICATION_URI =
+            "content://com.android.documentsui.archives/notification-uri";
     private ExecutorService mExecutor = null;
     private Archive mArchive = null;
     private TestUtils mTestUtils = null;
@@ -115,7 +116,7 @@
             });
         }
 
-        latch.await(3, TimeUnit.SECONDS);
+        latch.await(30, TimeUnit.SECONDS);
         {
             final Cursor cursor = resolver.query(childrenUri, null, null, null, null, null);
             assertNotNull("Cursor must not be null. File not found?", cursor);
@@ -167,7 +168,7 @@
             });
         }
 
-        latch.await(3, TimeUnit.SECONDS);
+        latch.await(30, TimeUnit.SECONDS);
         {
             final Cursor cursor = resolver.query(childrenUri, null, null, null, null, null);
             assertNotNull("Cursor must not be null. File not found?", cursor);
diff --git a/tests/unit/com/android/documentsui/archives/ReadableArchiveTest.java b/tests/unit/com/android/documentsui/archives/ReadableArchiveTest.java
index 9f12186..3bb6395 100644
--- a/tests/unit/com/android/documentsui/archives/ReadableArchiveTest.java
+++ b/tests/unit/com/android/documentsui/archives/ReadableArchiveTest.java
@@ -40,7 +40,8 @@
 @MediumTest
 public class ReadableArchiveTest extends AndroidTestCase {
     private static final Uri ARCHIVE_URI = Uri.parse("content://i/love/strawberries");
-    private static final String NOTIFICATION_URI = "content://notification-uri";
+    private static final String NOTIFICATION_URI =
+            "content://com.android.documentsui.archives/notification-uri";
     private ExecutorService mExecutor = null;
     private Archive mArchive = null;
     private TestUtils mTestUtils = null;
diff --git a/tests/unit/com/android/documentsui/archives/WriteableArchiveTest.java b/tests/unit/com/android/documentsui/archives/WriteableArchiveTest.java
index 28f5e3c..93383c0 100644
--- a/tests/unit/com/android/documentsui/archives/WriteableArchiveTest.java
+++ b/tests/unit/com/android/documentsui/archives/WriteableArchiveTest.java
@@ -43,7 +43,8 @@
 @MediumTest
 public class WriteableArchiveTest extends AndroidTestCase {
     private static final Uri ARCHIVE_URI = Uri.parse("content://i/love/strawberries");
-    private static final String NOTIFICATION_URI = "content://notification-uri";
+    private static final String NOTIFICATION_URI =
+            "content://com.android.documentsui.archives/notification-uri";
     private ExecutorService mExecutor = null;
     private Archive mArchive = null;
     private TestUtils mTestUtils = null;