Merge "Add tests for rename documents feature - Add helper class for the Ui tests. It creates basic test environment. It is intermediate layer between UiBot/DocumentsProviderHelper and UiTest classes. - Refactor SearchView tests - Add renaming support in the test DocumentsProvider - Add renaming tests"
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java
index 467d97e..5df4dca 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java
@@ -105,6 +105,19 @@
return createDocument(root.documentId, mimeType, name);
}
+ public Uri createDocumentWithFlags(String documentId, String mimeType, String name, int flags)
+ throws RemoteException {
+ Bundle in = new Bundle();
+ in.putInt(StubProvider.EXTRA_FLAGS, flags);
+ in.putString(StubProvider.EXTRA_PARENT_ID, documentId);
+ in.putString(Document.COLUMN_MIME_TYPE, mimeType);
+ in.putString(Document.COLUMN_DISPLAY_NAME, name);
+
+ Bundle out = mClient.call("createDocumentWithFlags", null, in);
+ Uri uri = out.getParcelable(DocumentsContract.EXTRA_URI);
+ return uri;
+ }
+
public Uri createFolder(Uri parentUri, String name) {
return createDocument(parentUri, Document.MIME_TYPE_DIR, name);
}
@@ -286,4 +299,5 @@
return DocumentsContract.buildDocumentUri(mAuthority, documentId);
}
+
}
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java
index 737a8b6..0a91427 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java
@@ -85,7 +85,7 @@
mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT);
mDevice.waitForIdle();
- mBot = new UiBot(mDevice, TIMEOUT);
+ mBot = new UiBot(mDevice, mContext, TIMEOUT);
resetStorage(); // Just in case a test failed and tearDown didn't happen.
}
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java
index f0dbfe9..379300b 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java
@@ -82,7 +82,7 @@
mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT);
mDevice.waitForIdle();
- mBot = new UiBot(mDevice, TIMEOUT);
+ mBot = new UiBot(mDevice, mContext, TIMEOUT);
resetStorage(); // Just incase a test failed and tearDown didn't happen.
}
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java
new file mode 100644
index 0000000..5c6254f
--- /dev/null
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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;
+
+import static com.android.documentsui.StubProvider.ROOT_0_ID;
+import static com.android.documentsui.UiTestEnvironment.TIMEOUT;
+
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiObjectNotFoundException;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
+
+@LargeTest
+public class RenameDocumentUiTest extends InstrumentationTestCase {
+
+ private static final String TAG = "RenamDocumentUiTest";
+
+ private final String newName = "kitties.log";
+
+ private UiTestEnvironment mHelper;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mHelper = new UiTestEnvironment(getInstrumentation());
+ mHelper.launch();
+ mHelper.initTestFiles();
+ mHelper.bot().openRoot(ROOT_0_ID);
+ }
+
+ public void testRenameEnabled_SingleSelection() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().assertMenuEnabled(R.string.menu_rename, true);
+
+ // Dismiss more options window
+ mHelper.device().pressBack();
+ }
+
+ public void testNoRenameSupport_SingleSelection() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileNameNoRename);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().assertMenuEnabled(R.string.menu_rename, false);
+
+ // Dismiss more options window
+ mHelper.device().pressBack();
+ }
+
+ public void testOneHasRenameSupport_MultipleSelection() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().selectDocument(UiTestEnvironment.fileNameNoRename);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().assertMenuEnabled(R.string.menu_rename, false);
+
+ // Dismiss more options window
+ mHelper.device().pressBack();
+ }
+
+ public void testRenameDisabled_MultipleSelection() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName2);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().assertMenuEnabled(R.string.menu_rename, false);
+
+ // Dismiss more options window
+ mHelper.device().pressBack();
+ }
+
+ public void testRenameFile_OkButton() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().openDialog(R.string.menu_rename);
+ mHelper.bot().setDialogText(newName);
+ mHelper.bot().dismissKeyboardIfPresent();
+
+ mHelper.device().waitForIdle(TIMEOUT);
+ mHelper.bot().findRenameDialogOkButton().click();
+ mHelper.device().waitForIdle(TIMEOUT);
+
+ mHelper.bot().assertDocument(UiTestEnvironment.fileName1, false);
+ mHelper.bot().assertDocument(newName, true);
+ mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0());
+ }
+
+ public void testRenameFile_Enter() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().openDialog(R.string.menu_rename);
+ mHelper.bot().setDialogText(newName);
+
+ pressEnter();
+
+ mHelper.bot().assertDocument(UiTestEnvironment.fileName1, false);
+ mHelper.bot().assertDocument(newName, true);
+ mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0());
+ }
+
+ public void testRenameFile_Cancel() throws Exception {
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().openDialog(R.string.menu_rename);
+ mHelper.bot().setDialogText(newName);
+ mHelper.bot().dismissKeyboardIfPresent();
+
+ mHelper.device().waitForIdle(TIMEOUT);
+ mHelper.bot().findRenameDialogCancelButton().click();
+ mHelper.device().waitForIdle(TIMEOUT);
+
+ mHelper.bot().assertDocument(UiTestEnvironment.fileName1, true);
+ mHelper.bot().assertDocument(newName, false);
+ mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0());
+ }
+
+ public void testRenameDir() throws Exception {
+ String oldName = "Dir1";
+ String newName = "Dir123";
+
+ mHelper.bot().selectDocument(oldName);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().openDialog(R.string.menu_rename);
+ mHelper.bot().setDialogText(newName);
+
+ pressEnter();
+
+ mHelper.bot().assertDocument(oldName, false);
+ mHelper.bot().assertDocument(newName, true);
+ mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0());
+ }
+
+ public void testRename_NameExists() throws Exception {
+ // Check that document with the new name exists
+ mHelper.bot().assertDocument(UiTestEnvironment.fileName2, true);
+ mHelper.bot().selectDocument(UiTestEnvironment.fileName1);
+ mHelper.bot().openOverflowMenu();
+ mHelper.bot().openDialog(R.string.menu_rename);
+ mHelper.bot().setDialogText(UiTestEnvironment.fileName2);
+
+ pressEnter();
+
+ mHelper.bot().assertSnackbar(R.string.rename_error);
+ mHelper.bot().assertDocument(UiTestEnvironment.fileName1, true);
+ mHelper.bot().assertDocument(UiTestEnvironment.fileName2, true);
+ mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0());
+ }
+
+ private void pressEnter() {
+ mHelper.device().waitForIdle(TIMEOUT);
+ mHelper.device().pressEnter();
+ mHelper.device().waitForIdle(TIMEOUT);
+ }
+
+}
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java
index 6c9c5d9..ce54725 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java
@@ -16,278 +16,139 @@
package com.android.documentsui;
-import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY;
import static com.android.documentsui.StubProvider.ROOT_0_ID;
import static com.android.documentsui.StubProvider.ROOT_1_ID;
-import android.app.Instrumentation;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.RemoteException;
-import android.support.test.uiautomator.By;
-import android.support.test.uiautomator.Configurator;
-import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObjectNotFoundException;
-import android.support.test.uiautomator.Until;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
-import android.view.MotionEvent;
-
-import com.android.documentsui.model.RootInfo;
@LargeTest
public class SearchViewUiTest extends InstrumentationTestCase {
- private static final int TIMEOUT = 5000;
private static final String TAG = "SearchViewUiTest";
- private static final String TARGET_PKG = "com.android.documentsui";
- private static final String LAUNCHER_PKG = "com.android.launcher";
- private UiBot mBot;
- private UiDevice mDevice;
- private Context mContext;
- private ContentResolver mResolver;
- private DocumentsProviderHelper mDocsHelper;
- private ContentProviderClient mClient;
- private RootInfo mRoot_0;
- private RootInfo mRoot_1;
+ private UiTestEnvironment mEnv;
- private UiObject mSearchView;
- private UiObject mSearchTextField;
private UiObject mDocsList;
private UiObject mMessageTextView;
- private UiObject mSearchIcon;
+ @Override
public void setUp() throws Exception {
- // Initialize UiDevice instance.
- Instrumentation instrumentation = getInstrumentation();
+ super.setUp();
+ mEnv = new UiTestEnvironment(getInstrumentation());
+ mEnv.launch();
- mDevice = UiDevice.getInstance(instrumentation);
-
- Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE);
-
- // Start from the home screen.
- mDevice.pressHome();
- mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT);
-
- // NOTE: Must be the "target" context, else security checks in content provider will fail.
- mContext = instrumentation.getTargetContext();
- mResolver = mContext.getContentResolver();
-
- mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY);
- mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient);
-
- // Launch app.
- Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- mContext.startActivity(intent);
- // Wait for the app to appear.
- mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT);
- mDevice.waitForIdle();
-
- mBot = new UiBot(mDevice, TIMEOUT);
-
- resetStorage(); // Just incase a test failed and tearDown didn't happen.
-
- initUiObjects();
}
@Override
protected void tearDown() throws Exception {
+ mEnv.device().pressBack();
super.tearDown();
- mDevice.pressBack();
- resetStorage();
- mClient.release();
}
- private void resetStorage() throws RemoteException {
- mClient.call("clear", null, null);
- // TODO: Would be nice to have an event to wait on here.
- mDevice.waitForIdle();
+ public void testSearchView_ExpandsOnClick() throws Exception {
+ mEnv.bot().openSearchView();
+ mEnv.bot().assertSearchTextFiledAndIcon(true, false);
}
- private void initTestFiles() throws RemoteException {
- mRoot_0 = mDocsHelper.getRoot(ROOT_0_ID);
- mRoot_1 = mDocsHelper.getRoot(ROOT_1_ID);
+ public void testSearchView_CollapsesOnBack() throws Exception {
+ mEnv.bot().openSearchView();
- mDocsHelper.createDocument(mRoot_0, "text/plain", "file10.log");
- mDocsHelper.createDocument(mRoot_0, "image/png", "file1.png");
- mDocsHelper.createDocument(mRoot_0, "text/csv", "file2.csv");
+ mEnv.device().pressBack();
- mDocsHelper.createDocument(mRoot_1, "text/plain", "anotherFile0.log");
- mDocsHelper.createDocument(mRoot_1, "text/plain", "poodles.text");
+ mEnv.bot().assertSearchTextFiledAndIcon(false, true);
}
- private void initUiObjects() {
- mSearchView = mBot.findSearchView();
- mSearchTextField = mBot.findSearchViewTextField();
- mDocsList = mBot.findDocumentsList();
- mMessageTextView = mBot.findMessageTextView();
- mSearchIcon = mBot.findSearchViewIcon();
- }
-
- public void testSearchViewExpandsOnClick() throws Exception {
- assertTrue(mSearchIcon.exists());
- assertFalse(mSearchTextField.exists());
-
- mSearchView.click();
-
- assertTrue(mSearchTextField.exists());
- assertTrue(mSearchTextField.isFocused());
- assertFalse(mSearchIcon.exists());
- }
-
- public void testSearchViewCollapsesOnBack() throws Exception {
- assertTrue(mSearchIcon.exists());
- assertFalse(mSearchTextField.exists());
-
- mSearchView.click();
-
- mDevice.pressBack();
-
- assertTrue(mSearchIcon.exists());
- assertFalse(mSearchTextField.exists());
- }
-
- public void testSearchViewClearsTextOnBack() throws Exception {
- assertTrue(mSearchIcon.exists());
- assertFalse(mSearchTextField.exists());
-
+ public void testSearchView_ClearsTextOnBack() throws Exception {
String query = "file2";
- mSearchView.click();
- mSearchTextField.setText(query);
+ mEnv.bot().openSearchView();
+ mEnv.bot().setSearchQuery(query);
- assertSearchTextField(true, query);
+ mEnv.device().pressBack();
- mDevice.pressBack();
-
- assertTrue(mSearchIcon.exists());
- assertFalse(mSearchTextField.exists());
+ mEnv.bot().assertSearchTextFiledAndIcon(false, true);
}
- public void testSearchFound() throws Exception {
- initTestFiles();
-
- mBot.openRoot(ROOT_0_ID);
-
- assertDefaultTestDir0();
+ public void testSearch_ResultsFound() throws Exception {
+ mEnv.initTestFiles();
+ mEnv.bot().openRoot(ROOT_0_ID);
+ mEnv.assertDefaultContentOfTestDir0();
String query = "file1";
- mSearchView.click();
- mSearchTextField.setText(query);
+ mEnv.bot().openSearchView();
+ mEnv.bot().setSearchQuery(query);
+ mEnv.bot().assertSearchTextField(true, query);
- assertTrue(mDocsList.exists());
- assertSearchTextField(true, query);
+ mEnv.device().pressEnter();
- mDevice.pressEnter();
-
- assertTrue(mDocsList.exists());
- assertEquals(2, mDocsList.getChildCount());
- mBot.assertHasDocuments("file1.png", "file10.log");
- assertSearchTextField(false, query);
+ mEnv.bot().assertDocumentsCountOnList(true, 2);
+ mEnv.bot().assertHasDocuments(UiTestEnvironment.fileName1, UiTestEnvironment.fileName2);
+ mEnv.bot().assertSearchTextField(false, query);
}
- public void testSearchFoundClearsOnBack() throws Exception {
- initTestFiles();
+ public void testSearchResultsFound_ClearsOnBack() throws Exception {
+ mEnv.initTestFiles();
+ mEnv.bot().openRoot(ROOT_0_ID);
+ mEnv.assertDefaultContentOfTestDir0();
- mBot.openRoot(ROOT_0_ID);
+ String query = UiTestEnvironment.fileName1;
+ mEnv.bot().openSearchView();
+ mEnv.bot().setSearchQuery(query);
- assertDefaultTestDir0();
-
- String query = "file1";
- mSearchView.click();
- mSearchTextField.setText(query);
-
- mDevice.pressEnter();
- mDevice.pressBack();
-
- assertDefaultTestDir0();
+ mEnv.device().pressEnter();
+ mEnv.device().pressBack();
+ mEnv.assertDefaultContentOfTestDir0();
}
- public void testSearchNoResults() throws Exception {
- initTestFiles();
-
- mBot.openRoot(ROOT_0_ID);
-
- assertDefaultTestDir0();
+ public void testSearch_NoResults() throws Exception {
+ mEnv.initTestFiles();
+ mEnv.bot().openRoot(ROOT_0_ID);
+ mEnv.assertDefaultContentOfTestDir0();
String query = "chocolate";
- mSearchView.click();
- mSearchTextField.setText(query);
+ mEnv.bot().openSearchView();
+ mEnv.bot().setSearchQuery(query);
- mDevice.pressEnter();
+ mEnv.device().pressEnter();
- assertFalse(mDocsList.exists());
- assertTrue(mMessageTextView.exists());
- String msg = String.valueOf(mContext.getString(R.string.no_results));
- assertEquals(String.format(msg, "TEST_ROOT_0"), mMessageTextView.getText());
- assertSearchTextField(false, query);
+ mEnv.bot().assertDocumentsCountOnList(false, 0);
+
+ String msg = String.valueOf(mEnv.context().getString(R.string.no_results));
+ mEnv.bot().assertMessageTextView(String.format(msg, "TEST_ROOT_0"));
+ mEnv.bot().assertSearchTextField(false, query);
}
- public void testSearchNoResultsClearsOnBack() throws Exception {
- initTestFiles();
-
- mBot.openRoot(ROOT_0_ID);
-
- assertDefaultTestDir0();
+ public void testSearchNoResults_ClearsOnBack() throws Exception {
+ mEnv.initTestFiles();
+ mEnv.bot().openRoot(ROOT_0_ID);
+ mEnv.assertDefaultContentOfTestDir0();
String query = "chocolate";
- mSearchView.click();
- mSearchTextField.setText(query);
+ mEnv.bot().openSearchView();
+ mEnv.bot().setSearchQuery(query);
- mDevice.pressEnter();
- mDevice.pressBack();
-
- assertDefaultTestDir0();
+ mEnv.device().pressEnter();
+ mEnv.device().pressBack();
+ mEnv.assertDefaultContentOfTestDir0();
}
- public void testSearchFoundClearsDirectoryChange() throws Exception {
- initTestFiles();
+ public void testSearchResultsFound_ClearsOnDirectoryChange() throws Exception {
+ mEnv.initTestFiles();
+ mEnv.bot().openRoot(ROOT_0_ID);
+ mEnv.assertDefaultContentOfTestDir0();
- mBot.openRoot(ROOT_0_ID);
+ String query = UiTestEnvironment.fileName1;
+ mEnv.bot().openSearchView();
+ mEnv.bot().setSearchQuery(query);
- assertDefaultTestDir0();
+ mEnv.device().pressEnter();
- String query = "file1";
- mSearchView.click();
- mSearchTextField.setText(query);
+ mEnv.bot().openRoot(ROOT_1_ID);
+ mEnv.assertDefaultContentOfTestDir1();
- mDevice.pressEnter();
-
- mBot.openRoot(ROOT_1_ID);
-
- assertDefaultTestDir1();
-
- mBot.openRoot(ROOT_0_ID);
-
- assertDefaultTestDir0();
- }
-
- private void assertDefaultTestDir0() throws UiObjectNotFoundException {
- assertTrue(mSearchIcon.exists());
- assertTrue(mDocsList.exists());
- assertFalse(mSearchTextField.exists());
- assertEquals(3, mDocsList.getChildCount());
- mBot.assertHasDocuments("file2.csv", "file1.png", "file10.log");
- }
-
- private void assertDefaultTestDir1() throws UiObjectNotFoundException {
- assertTrue(mSearchIcon.exists());
- assertFalse(mSearchTextField.exists());
- assertTrue(mDocsList.exists());
- assertEquals(2, mDocsList.getChildCount());
- mBot.assertHasDocuments("anotherFile0.log", "poodles.text");
- }
-
- private void assertSearchTextField(boolean isFocused, String query)
- throws UiObjectNotFoundException {
- assertFalse(mSearchIcon.exists());
- assertTrue(mSearchTextField.exists());
- assertEquals(isFocused, mSearchTextField.isFocused());
- assertEquals(query, mSearchTextField.getText());
+ mEnv.bot().openRoot(ROOT_0_ID);
+ mEnv.assertDefaultContentOfTestDir0();
}
}
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java b/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java
index cc48786..980627b 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java
@@ -16,6 +16,10 @@
package com.android.documentsui;
+import static com.android.documentsui.Shared.TAG;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ProviderInfo;
@@ -34,6 +38,7 @@
import android.provider.DocumentsContract.Root;
import android.provider.DocumentsProvider;
import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
import android.util.Log;
import libcore.io.IoUtils;
@@ -66,10 +71,13 @@
= "com.android.documentsui.stubprovider.STREAM_TYPES";
public static final String EXTRA_CONTENT = "com.android.documentsui.stubprovider.CONTENT";
+ public static final String EXTRA_FLAGS = "com.android.documentsui.stubprovider.FLAGS";
+ public static final String EXTRA_PARENT_ID = "com.android.documentsui.stubprovider.PARENT";
+
private static final String TAG = "StubProvider";
private static final String STORAGE_SIZE_KEY = "documentsui.stubprovider.size";
- private static int DEFAULT_ROOT_SIZE = 1024 * 1024 * 100; // 100 MB.
+ private static int DEFAULT_ROOT_SIZE = 1024 * 1024 * 100; // 100 MB.
private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID,
@@ -176,44 +184,8 @@
@Override
public String createDocument(String parentId, String mimeType, String displayName)
throws FileNotFoundException {
-
- final StubDocument parent = mStorage.get(parentId);
- if (parent == null) {
- throw new IllegalArgumentException(
- "Can't create file " + displayName + " in null parent.");
- }
- if (!parent.file.isDirectory()) {
- throw new IllegalArgumentException(
- "Can't create file " + displayName + " inside non-directory parent "
- + parent.file.getName());
- }
-
- final File file = new File(parent.file, displayName);
- if (file.exists()) {
- throw new FileNotFoundException(
- "Duplicate file names not supported for " + file);
- }
-
- if (mimeType.equals(Document.MIME_TYPE_DIR)) {
- if (!file.mkdirs()) {
- throw new FileNotFoundException(
- "Failed to create directory(s): " + file);
- }
- Log.i(TAG, "Created new directory: " + file);
- } else {
- boolean created = false;
- try {
- created = file.createNewFile();
- } catch (IOException e) {
- // We'll throw an FNF exception later :)
- Log.e(TAG, "createNewFile operation failed for file: " + file, e);
- }
- if (!created) {
- throw new FileNotFoundException(
- "createNewFile operation failed for: " + file);
- }
- Log.i(TAG, "Created new file: " + file);
- }
+ StubDocument parent = mStorage.get(parentId);
+ File file = createFile(parent, mimeType, displayName);
final StubDocument document = StubDocument.createRegularDocument(file, mimeType, parent);
mStorage.put(document.documentId, document);
@@ -303,6 +275,45 @@
}
@Override
+ public String renameDocument(String documentId, String displayName)
+ throws FileNotFoundException {
+
+ StubDocument oldDoc = mStorage.get(documentId);
+
+ File before = oldDoc.file;
+ File after = new File(before.getParentFile(), displayName);
+
+ if (after.exists()) {
+ throw new IllegalStateException("Already exists " + after);
+ }
+
+ boolean result = before.renameTo(after);
+
+ if (!result) {
+ throw new IllegalStateException("Failed to rename to " + after);
+ }
+
+ StubDocument newDoc = StubDocument.createRegularDocument(after, oldDoc.mimeType,
+ mStorage.get(oldDoc.parentId));
+
+ mStorage.remove(documentId);
+ notifyParentChanged(oldDoc.parentId);
+ getContext().getContentResolver().notifyChange(
+ DocumentsContract.buildDocumentUri(mAuthority, oldDoc.documentId), null, false);
+
+ mStorage.put(newDoc.documentId, newDoc);
+ notifyParentChanged(newDoc.parentId);
+ getContext().getContentResolver().notifyChange(
+ DocumentsContract.buildDocumentUri(mAuthority, newDoc.documentId), null, false);
+
+ if (!TextUtils.equals(documentId, newDoc.documentId)) {
+ return newDoc.documentId;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal)
throws FileNotFoundException {
@@ -468,6 +479,9 @@
case "simulateReadErrorsForFile":
simulateReadErrorsForFile(arg);
return null;
+ case "createDocumentWithFlags":
+ Bundle bundle = dispatchCreateDocumentWithFlags(extras);
+ return bundle;
default:
return super.call(method, arg, extras);
}
@@ -493,6 +507,81 @@
return null;
}
+ private Bundle dispatchCreateDocumentWithFlags(Bundle extras) {
+ String rootId = extras.getString(EXTRA_PARENT_ID);
+ String mimeType = extras.getString(Document.COLUMN_MIME_TYPE);
+ String name = extras.getString(Document.COLUMN_DISPLAY_NAME);
+ int flags = extras.getInt(EXTRA_FLAGS);
+
+ Bundle out = new Bundle();
+ String documentId = null;
+ try {
+ documentId = createDocument(rootId, mimeType, name, flags);
+ Uri uri = DocumentsContract.buildDocumentUri(mAuthority, documentId);
+ out.putParcelable(DocumentsContract.EXTRA_URI, uri);
+ } catch (FileNotFoundException e) {
+ Log.d(TAG, "Cretaing document with flags failed" + name);
+ }
+ return out;
+ }
+
+ public String createDocument(String parentId, String mimeType, String displayName, int flags)
+ throws FileNotFoundException {
+
+ StubDocument parent = mStorage.get(parentId);
+ File file = createFile(parent, mimeType, displayName);
+
+ final StubDocument document = StubDocument.createDocumentWithFlags(file, mimeType, parent,
+ flags);
+ mStorage.put(document.documentId, document);
+ Log.d(TAG, "Created document " + document.documentId);
+ notifyParentChanged(document.parentId);
+ getContext().getContentResolver().notifyChange(
+ DocumentsContract.buildDocumentUri(mAuthority, document.documentId),
+ null, false);
+
+ return document.documentId;
+ }
+
+ private File createFile(StubDocument parent, String mimeType, String displayName)
+ throws FileNotFoundException {
+ if (parent == null) {
+ throw new IllegalArgumentException(
+ "Can't create file " + displayName + " in null parent.");
+ }
+ if (!parent.file.isDirectory()) {
+ throw new IllegalArgumentException(
+ "Can't create file " + displayName + " inside non-directory parent "
+ + parent.file.getName());
+ }
+
+ final File file = new File(parent.file, displayName);
+ if (file.exists()) {
+ throw new FileNotFoundException(
+ "Duplicate file names not supported for " + file);
+ }
+
+ if (mimeType.equals(Document.MIME_TYPE_DIR)) {
+ if (!file.mkdirs()) {
+ throw new FileNotFoundException("Failed to create directory(s): " + file);
+ }
+ Log.i(TAG, "Created new directory: " + file);
+ } else {
+ boolean created = false;
+ try {
+ created = file.createNewFile();
+ } catch (IOException e) {
+ // We'll throw an FNF exception later :)
+ Log.e(TAG, "createNewFile operation failed for file: " + file, e);
+ }
+ if (!created) {
+ throw new FileNotFoundException("createNewFile operation failed for: " + file);
+ }
+ Log.i(TAG, "Created new file: " + file);
+ }
+ return file;
+ }
+
private void configure(String arg, Bundle extras) {
Log.d(TAG, "Configure " + arg);
String rootName = extras.getString(EXTRA_ROOT, ROOT_0_ID);
@@ -557,7 +646,7 @@
}
final StubDocument document = StubDocument.createRegularDocument(file, mimeType, parent);
mStorage.put(document.documentId, document);
- return DocumentsContract.buildDocumentUri(mAuthority, document.documentId);
+ return DocumentsContract.buildDocumentUri(mAuthority, document.documentId);
}
@VisibleForTesting
@@ -573,7 +662,7 @@
final StubDocument document = StubDocument.createVirtualDocument(
file, mimeType, streamTypes, parent);
mStorage.put(document.documentId, document);
- return DocumentsContract.buildDocumentUri(mAuthority, document.documentId);
+ return DocumentsContract.buildDocumentUri(mAuthority, document.documentId);
}
@VisibleForTesting
@@ -643,9 +732,8 @@
public final String parentId;
public final RootInfo rootInfo;
- private StubDocument(
- File file, String mimeType, List<String> streamTypes, int flags,
- StubDocument parent) {
+ private StubDocument(File file, String mimeType, List<String> streamTypes, int flags,
+ StubDocument parent) {
this.file = file;
this.documentId = getDocumentIdForFile(file);
this.mimeType = mimeType;
@@ -671,7 +759,7 @@
public static StubDocument createRegularDocument(
File file, String mimeType, StubDocument parent) {
- int flags = Document.FLAG_SUPPORTS_DELETE;
+ int flags = Document.FLAG_SUPPORTS_DELETE | Document.FLAG_SUPPORTS_RENAME;
if (file.isDirectory()) {
flags |= Document.FLAG_DIR_SUPPORTS_CREATE;
} else {
@@ -680,6 +768,11 @@
return new StubDocument(file, mimeType, new ArrayList<String>(), flags, parent);
}
+ public static StubDocument createDocumentWithFlags(
+ File file, String mimeType, StubDocument parent, int flags) {
+ return new StubDocument(file, mimeType, new ArrayList<String>(), flags, parent);
+ }
+
public static StubDocument createVirtualDocument(
File file, String mimeType, List<String> streamTypes, StubDocument parent) {
int flags = Document.FLAG_SUPPORTS_DELETE | Document.FLAG_SUPPORTS_WRITE
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java
index c4def8f..f12ae10 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java
@@ -17,7 +17,11 @@
package com.android.documentsui;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.assertFalse;
+import android.content.Context;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.BySelector;
import android.support.test.uiautomator.UiDevice;
@@ -28,11 +32,13 @@
import android.support.test.uiautomator.UiSelector;
import android.support.test.uiautomator.Until;
import android.util.Log;
+import android.view.inputmethod.InputMethodManager;
import junit.framework.Assert;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
@@ -48,10 +54,12 @@
By.desc(Pattern.compile("^Deleting [0-9]+ file.+"));
private UiDevice mDevice;
+ private Context mContext;
private int mTimeout;
- public UiBot(UiDevice device, int timeout) {
+ public UiBot(UiDevice device, Context context, int timeout) {
mDevice = device;
+ mContext = context;
mTimeout = timeout;
}
@@ -109,25 +117,40 @@
}
}
- UiObject findDocument(String label) throws UiObjectNotFoundException {
- final UiSelector docList = new UiSelector().resourceId(
- "com.android.documentsui:id/container_directory").childSelector(
- new UiSelector().resourceId("com.android.documentsui:id/list"));
-
- // Wait for the first list item to appear
- new UiObject(docList.childSelector(new UiSelector())).waitForExists(mTimeout);
-
- // new UiScrollable(docList).scrollIntoView(new UiSelector().text(label));
- return mDevice.findObject(docList.childSelector(new UiSelector().text(label)));
+ void assertMenuEnabled(int id, boolean enabled) {
+ UiObject2 menu= findMenuWithName(mContext.getString(id));
+ assertNotNull(menu);
+ assertEquals(enabled, menu.isEnabled());
}
- boolean hasDocuments(String... labels) throws UiObjectNotFoundException {
- for (String label : labels) {
- if (!findDocument(label).exists()) {
- return false;
- }
+ void assertDocumentsCount(int count) throws UiObjectNotFoundException {
+ UiObject docsList = findDocumentsList();
+ assertEquals(count, docsList.getChildCount());
+ }
+
+ void assertDocumentsCount(String dir, int count) throws UiObjectNotFoundException {
+ openRoot(dir);
+ UiObject docsList = findDocumentsList();
+ assertEquals(count, docsList.getChildCount());
+ }
+
+ void assertSearchTextField(boolean isFocused, String query)
+ throws UiObjectNotFoundException {
+ UiObject textField = findSearchViewTextField();
+ UiObject searchIcon = findSearchViewIcon();
+
+ assertFalse(searchIcon.exists());
+ assertTrue(textField.exists());
+ assertEquals(isFocused, textField.isFocused());
+ if(query != null) {
+ assertEquals(query, textField.getText());
}
- return true;
+ }
+
+ void assertSearchTextFiledAndIcon(boolean searchTextFieldExists, boolean searchIconExists) {
+ assertEquals(searchTextFieldExists, findSearchViewTextField().exists());
+ assertEquals(searchIconExists, findSearchViewIcon().exists());
+
}
void assertHasDocuments(String... labels) throws UiObjectNotFoundException {
@@ -143,10 +166,77 @@
}
}
+ void assertDocument(String name, boolean exists) throws UiObjectNotFoundException {
+ UiObject doc = findDocument(name);
+ assertEquals(exists, doc.exists());
+ }
+
+ void assertDocumentsCountOnList(boolean exists, int count) throws UiObjectNotFoundException {
+ UiObject docsList = findDocumentsList();
+ assertEquals(exists, docsList.exists());
+ if(docsList.exists()) {
+ assertEquals(count, docsList.getChildCount());
+ }
+ }
+
+ void assertMessageTextView(String message) throws UiObjectNotFoundException {
+ UiObject messageTextView = findMessageTextView();
+ assertTrue(messageTextView.exists());
+
+ String msg = String.valueOf(message);
+ assertEquals(String.format(msg, "TEST_ROOT_0"), messageTextView.getText());
+
+ }
+ void assertSnackbar(int id) {
+ assertNotNull(getSnackbar(mContext.getString(id)));
+ }
+
void clickDocument(String label) throws UiObjectNotFoundException {
findDocument(label).click();
}
+ void openSearchView() throws UiObjectNotFoundException {
+ UiObject searchView = findSearchView();
+ searchView.click();
+ assertTrue(searchView.exists());
+ }
+
+ void setSearchQuery(String query) throws UiObjectNotFoundException {
+ UiObject searchView = findSearchView();
+ assertTrue(searchView.exists());
+ UiObject searchTextField = findSearchViewTextField();
+ searchTextField.setText(query);
+ assertSearchTextField(true, query);
+ }
+
+ UiObject openOverflowMenu() throws UiObjectNotFoundException {
+ UiObject obj = findMenuMoreOptions();
+ obj.click();
+ mDevice.waitForIdle(mTimeout);
+ return obj;
+ }
+
+ void openDialog(int id) {
+ UiObject2 menu= findMenuWithName(mContext.getString(id));
+ assertNotNull(menu);
+ assertEquals(true, menu.isEnabled());
+ menu.click();
+ }
+
+ void setDialogText(String text) throws UiObjectNotFoundException {
+ findDialogEditText().setText(text);
+ }
+
+ UiObject selectDocument(String label) throws UiObjectNotFoundException {
+ UiObject doc = findDocument(label);
+ doc.longClick();
+ return doc;
+ }
+
+ UiObject2 getSnackbar(String message) {
+ return mDevice.wait(Until.findObject(By.text(message)), mTimeout);
+ }
+
void waitForDeleteSnackbar() {
mDevice.wait(Until.findObject(SNACK_DELETE), mTimeout);
}
@@ -200,6 +290,27 @@
return mDevice.findObject(selector);
}
+ UiObject findDocument(String label) throws UiObjectNotFoundException {
+ final UiSelector docList = new UiSelector().resourceId(
+ "com.android.documentsui:id/container_directory").childSelector(
+ new UiSelector().resourceId("com.android.documentsui:id/list"));
+
+ // Wait for the first list item to appear
+ new UiObject(docList.childSelector(new UiSelector())).waitForExists(mTimeout);
+
+ // new UiScrollable(docList).scrollIntoView(new UiSelector().text(label));
+ return mDevice.findObject(docList.childSelector(new UiSelector().text(label)));
+ }
+
+ boolean hasDocuments(String... labels) throws UiObjectNotFoundException {
+ for (String label : labels) {
+ if (!findDocument(label).exists()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
UiObject findDocumentsList() {
return findObject(
"com.android.documentsui:id/container_directory",
@@ -224,4 +335,60 @@
"com.android.documentsui:id/message");
}
+ UiObject findActionModeBar() {
+ return findObject("android:id/action_mode_bar");
+ }
+
+ UiObject findDialogEditText() {
+ return findObject("android:id/content", "android:id/text1");
+ }
+
+ UiObject findRenameDialogOkButton() {
+ return findObject("android:id/content", "android:id/button1");
+ }
+
+ UiObject findRenameDialogCancelButton() {
+ return findObject("android:id/content", "android:id/button2");
+ }
+
+ UiObject findMenuLabelWithName(String label) {
+ UiSelector selector = new UiSelector().text(label);
+ return mDevice.findObject(selector);
+ }
+
+ UiObject2 findMenuWithName(String label) {
+ List<UiObject2> menuItems = mDevice.findObjects(By.clazz("android.widget.LinearLayout"));
+ Iterator<UiObject2> it = menuItems.iterator();
+
+ UiObject2 menuItem = null;
+ while(it.hasNext()) {
+ menuItem = it.next();
+ UiObject2 text = menuItem.findObject(By.text(label));
+ if(text != null) {
+ break;
+ }
+ }
+ return menuItem;
+ }
+
+ UiObject findMenuMoreOptions() {
+ UiSelector selector = new UiSelector().className("android.widget.ImageButton")
+ .descriptionContains("More options");
+ //TODO: use the system string ? android.R.string.action_menu_overflow_description
+ return mDevice.findObject(selector);
+ }
+
+ // Indirect way to detect the keyboard.
+ boolean isKeyboardPresent() {
+ InputMethodManager inputManager = (InputMethodManager) mContext
+ .getSystemService(Context.INPUT_METHOD_SERVICE);
+ return inputManager.isAcceptingText();
+ }
+
+ void dismissKeyboardIfPresent() {
+ if(isKeyboardPresent()) {
+ mDevice.pressBack();
+ }
+ }
+
}
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java
new file mode 100644
index 0000000..9e30589
--- /dev/null
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java
@@ -0,0 +1,177 @@
+/*
+ * 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;
+
+import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY;
+import static com.android.documentsui.StubProvider.ROOT_0_ID;
+import static com.android.documentsui.StubProvider.ROOT_1_ID;
+
+import android.app.Instrumentation;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.RemoteException;
+import android.provider.DocumentsContract.Document;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Configurator;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObjectNotFoundException;
+import android.support.test.uiautomator.Until;
+import android.view.MotionEvent;
+
+import com.android.documentsui.model.RootInfo;
+
+/**
+ * Provides basic test environment for UI tests:
+ * - Launches activity
+ * - Creates and gives access to test root directories and test files
+ * - Cleans up the test environment
+ */
+class UiTestEnvironment {
+
+ public static final int TIMEOUT = 5000;
+ public static final String NO_RENAME = "NO_RENAME";
+
+ public static final String dirName1 = "Dir1";
+ public static final String fileName1 = "file1.log";
+ public static final String fileName2 = "file12.png";
+ public static final String fileName3 = "anotherFile0.log";
+ public static final String fileName4 = "poodles.text";
+ public static final String fileNameNoRename = NO_RENAME + "file.txt";
+
+ private static final String TARGET_PKG = "com.android.documentsui";
+ private static final String LAUNCHER_PKG = "com.android.launcher";
+
+ private final UiBot mBot;
+ private final UiDevice mDevice;
+ private final Context mContext;
+
+ private RootInfo mRootDir0;
+ private RootInfo mRootDir1;
+ private int mDocsCountDir0;
+ private int mDocsCountDir1;
+
+ private ContentResolver mResolver;
+ private DocumentsProviderHelper mDocsHelper;
+ private ContentProviderClient mClient;
+
+ private final Instrumentation mInstrumentation;
+
+ public UiTestEnvironment(Instrumentation instrumentation) {
+ mInstrumentation = instrumentation;
+ mDevice = UiDevice.getInstance(mInstrumentation);
+ // NOTE: Must be the "target" context, else security checks in content provider will fail.
+ mContext = mInstrumentation.getTargetContext();
+ mBot = new UiBot(mDevice, mContext, TIMEOUT);
+ }
+
+/**
+ * Launches default activity and waits for the application to appear.
+ * @throws Exception
+ */
+ public void launch() throws Exception {
+ Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG);
+ launch(intent);
+ }
+
+ /**
+ * Launches activity specified by intent and waits for the application to appear.
+ * @param intent Intent describing activity to launch.
+ * @throws Exception
+ */
+ public void launch(Intent intent) throws Exception {
+ Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE);
+ // Start from the home screen.
+ mDevice.pressHome();
+ mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT);
+
+ mResolver = mContext.getContentResolver();
+ mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY);
+ mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient);
+
+ // Launch app.
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ // Wait for the app to appear.
+ mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT);
+ mDevice.waitForIdle();
+
+ resetStorage(); // Just incase a test failed and tearDown didn't happen.
+ }
+
+ public void cleanUp() throws Exception {
+ resetStorage();
+ mClient.release();
+ }
+
+ public void resetStorage() throws RemoteException {
+ mClient.call("clear", null, null);
+ mDevice.waitForIdle();
+ }
+
+ public void initTestFiles() throws RemoteException {
+ mRootDir0 = mDocsHelper.getRoot(ROOT_0_ID);
+ mRootDir1 = mDocsHelper.getRoot(ROOT_1_ID);
+
+ mDocsHelper.createFolder(mRootDir0, dirName1);
+ mDocsHelper.createDocument(mRootDir0, "text/plain", fileName1);
+ mDocsHelper.createDocument(mRootDir0, "image/png", fileName2);
+ mDocsHelper.createDocumentWithFlags(mRootDir0.documentId, "text/plain", fileNameNoRename,
+ Document.FLAG_SUPPORTS_WRITE);
+ mDocsCountDir0 = 4;
+
+ mDocsHelper.createDocument(mRootDir1, "text/plain", fileName3);
+ mDocsHelper.createDocument(mRootDir1, "text/plain", fileName4);
+ mDocsCountDir1 = 2;
+ }
+
+ public void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException {
+ bot().assertDocumentsCount(ROOT_0_ID, getDocumentsCountDir0());
+ bot().assertHasDocuments(UiTestEnvironment.fileName1, UiTestEnvironment.fileName2,
+ UiTestEnvironment.dirName1, UiTestEnvironment.fileNameNoRename);
+ }
+
+ public void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException {
+ bot().assertDocumentsCount(ROOT_1_ID, getDocumentsCountDir1());
+ bot().assertHasDocuments(UiTestEnvironment.fileName3, UiTestEnvironment.fileName4);
+ }
+
+ public UiBot bot() {
+ return mBot;
+ }
+
+ public UiDevice device() {
+ return mDevice;
+ }
+
+ public Context context() {
+ return mContext;
+ }
+
+ public RootInfo getRootDir0() {
+ return mRootDir0;
+ }
+
+ public int getDocumentsCountDir0() {
+ return mDocsCountDir0;
+ }
+
+ public int getDocumentsCountDir1() {
+ return mDocsCountDir1;
+ }
+}