Add test for loading init location from rootUri.

Bug: 31858715
Change-Id: I51130d15a545526d6ba5101edaa4fbeb58f3e229
diff --git a/tests/common/com/android/documentsui/TestActivity.java b/tests/common/com/android/documentsui/TestActivity.java
index 54ebf3e..4cca190 100644
--- a/tests/common/com/android/documentsui/TestActivity.java
+++ b/tests/common/com/android/documentsui/TestActivity.java
@@ -19,11 +19,13 @@
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
 
 import com.android.documentsui.AbstractActionHandler.CommonAddons;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.testing.TestEventListener;
+import com.android.documentsui.testing.android.TestPackageManager;
 import com.android.documentsui.testing.android.TestResources;
 
 import org.mockito.Mockito;
@@ -35,6 +37,7 @@
 public abstract class TestActivity extends AbstractBase {
 
     public TestResources resources;
+    public TestPackageManager packageMgr;
     public Intent intent;
 
     public TestEventListener<Intent> startActivity;
@@ -49,6 +52,7 @@
 
    public void init() {
        resources = TestResources.create();
+       packageMgr = TestPackageManager.create();
        intent = new Intent();
 
        startActivity = new TestEventListener<>();
@@ -83,6 +87,11 @@
     }
 
     @Override
+    public PackageManager getPackageManager() {
+        return packageMgr;
+    }
+
+    @Override
     public final void onRootPicked(RootInfo root) {
         rootPicked.accept(root);
     }
diff --git a/tests/common/com/android/documentsui/testing/TestRootsAccess.java b/tests/common/com/android/documentsui/testing/TestRootsAccess.java
index 641753f..5678cf3 100644
--- a/tests/common/com/android/documentsui/testing/TestRootsAccess.java
+++ b/tests/common/com/android/documentsui/testing/TestRootsAccess.java
@@ -18,6 +18,7 @@
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.base.State;
 import com.android.documentsui.roots.RootsAccess;
+import com.android.documentsui.testing.android.TestPackageManager;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -31,6 +32,8 @@
 
     public static final RootInfo DOWNLOADS;
     public static final RootInfo HOME;
+    public static final RootInfo HAMMY;
+    public static final RootInfo PICKLES;
 
     static {
         DOWNLOADS = new RootInfo();
@@ -40,6 +43,14 @@
         HOME = new RootInfo();
         HOME.authority = "com.android.externalstorage.documents";
         HOME.rootId = "home";
+
+        HAMMY = new RootInfo();
+        HAMMY.authority = "yummies";
+        HAMMY.rootId = "hamsandwich";
+
+        PICKLES = new RootInfo();
+        PICKLES.authority = "yummies";
+        PICKLES.rootId = "pickles";
     }
 
     public final Map<String, Collection<RootInfo>> roots = new HashMap<>();
@@ -48,15 +59,24 @@
     public TestRootsAccess() {
         add(DOWNLOADS);
         add(HOME);
+        add(HAMMY);
+        add(PICKLES);
     }
 
-    public void add(RootInfo root) {
+    private void add(RootInfo root) {
         if (!roots.containsKey(root.authority)) {
             roots.put(root.authority, new ArrayList<>());
         }
         roots.get(root.authority).add(root);
     }
 
+    public void configurePm(TestPackageManager pm) {
+        pm.addStubContentProviderForRoot(TestRootsAccess.DOWNLOADS);
+        pm.addStubContentProviderForRoot(TestRootsAccess.HOME);
+        pm.addStubContentProviderForRoot(TestRootsAccess.HAMMY);
+        pm.addStubContentProviderForRoot(TestRootsAccess.PICKLES);
+    }
+
     @Override
     public RootInfo getRootOneshot(String authority, String rootId) {
         if (roots.containsKey(authority)) {
diff --git a/tests/common/com/android/documentsui/testing/android/TestPackageManager.java b/tests/common/com/android/documentsui/testing/android/TestPackageManager.java
new file mode 100644
index 0000000..a078c6c
--- /dev/null
+++ b/tests/common/com/android/documentsui/testing/android/TestPackageManager.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui.testing.android;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+
+import com.android.documentsui.base.RootInfo;
+
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Abstract to avoid having to implement unnecessary Activity stuff.
+ * Instances are created using {@link #create()}.
+ */
+public abstract class TestPackageManager extends PackageManager {
+
+    public Map<String, ResolveInfo> contentProviders;
+
+    private TestPackageManager() {}
+
+    public void addStubContentProviderForRoot(RootInfo... roots) {
+        for (RootInfo root : roots) {
+            // only one entry per authority is required.
+            if (!contentProviders.containsKey(root.authority)) {
+                ResolveInfo info = new ResolveInfo();
+                contentProviders.put(root.authority, info);
+                info.providerInfo = new ProviderInfo();
+                info.providerInfo.authority = root.authority;
+            }
+        }
+    }
+
+    public static TestPackageManager create() {
+        TestPackageManager pm = Mockito.mock(
+                TestPackageManager.class, Mockito.CALLS_REAL_METHODS);
+        pm.contentProviders = new HashMap<>();
+        return pm;
+    }
+
+    @Override
+    public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
+        List<ResolveInfo> result = new ArrayList<>();
+        result.addAll(contentProviders.values());
+        return result;
+    }
+}
diff --git a/tests/functional/com/android/documentsui/ActivityTest.java b/tests/functional/com/android/documentsui/ActivityTest.java
index f68b708..026aab4 100644
--- a/tests/functional/com/android/documentsui/ActivityTest.java
+++ b/tests/functional/com/android/documentsui/ActivityTest.java
@@ -23,14 +23,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.RemoteException;
+import android.provider.DocumentsContract;
 import android.provider.DocumentsContract.Document;
 import android.support.test.uiautomator.Configurator;
 import android.support.test.uiautomator.UiDevice;
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.test.ActivityInstrumentationTestCase2;
 import android.view.MotionEvent;
-import com.android.documentsui.DocumentsProviderHelper;
-import com.android.documentsui.StubProvider;
+
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.bots.Bots;
 import com.android.documentsui.bots.UiBot;
@@ -138,6 +138,7 @@
                 UiBot.TARGET_PKG);
         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
         if (getInitialRoot() != null) {
+            intent.setAction(DocumentsContract.ACTION_BROWSE);
             intent.setData(getInitialRoot().getUri());
         }
         setActivityIntent(intent);
diff --git a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
index aec2f19..ada1b5f 100644
--- a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
@@ -19,17 +19,18 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import android.content.Intent;
 import android.net.Uri;
+import android.provider.DocumentsContract;
 import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
 
 import com.android.documentsui.R;
 import com.android.documentsui.base.RootInfo;
-import com.android.documentsui.base.Shared;
 import com.android.documentsui.dirlist.MultiSelectManager.Selection;
-import com.android.documentsui.files.ActionHandler;
 import com.android.documentsui.testing.TestConfirmationCallback;
 import com.android.documentsui.testing.TestEnv;
+import com.android.documentsui.testing.TestRootsAccess;
 import com.android.documentsui.ui.TestDialogController;
 
 import org.junit.Before;
@@ -53,6 +54,7 @@
         mActivity = TestActivity.create();
         mDialogs = new TestDialogController();
         mCallback = new TestConfirmationCallback();
+        mEnv.roots.configurePm(mActivity.packageMgr);
 
         mHandler = new ActionHandler<>(
                 mActivity,
@@ -89,11 +91,35 @@
     }
 
     @Test
-    public void testInitLocation_DefaultsToHome() throws Exception {
+    public void testInitLocation_DefaultsToDownloads() throws Exception {
+        mActivity.resources.bools.put(R.bool.productivity_device, false);
+
+        mHandler.initLocation(mActivity.getIntent());
+        assertRootPicked(TestRootsAccess.DOWNLOADS.getUri());
+    }
+
+    @Test
+    public void testInitLocation_ProductivityDefaultsToHome() throws Exception {
         mActivity.resources.bools.put(R.bool.productivity_device, true);
 
         mHandler.initLocation(mActivity.getIntent());
-        assertRootPicked(Shared.getDefaultRootUri(mActivity));
+        assertRootPicked(TestRootsAccess.HOME.getUri());
+    }
+
+    @Test
+    public void testInitLocation_LoadsFromRootUri() throws Exception {
+        mActivity.resources.bools.put(R.bool.productivity_device, true);
+
+        Intent intent = mActivity.getIntent();
+        intent.setAction(DocumentsContract.ACTION_BROWSE);
+        intent.setData(TestRootsAccess.PICKLES.getUri());
+
+        mHandler.initLocation(intent);
+        assertRootPicked(TestRootsAccess.PICKLES);
+    }
+
+    private void assertRootPicked(RootInfo root) throws Exception {
+        assertRootPicked(root.getUri());
     }
 
     private void assertRootPicked(Uri expectedUri) throws Exception {