1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.documentsui; 18 19 import static com.android.documentsui.StubProvider.ROOT_0_ID; 20 import static com.android.documentsui.StubProvider.ROOT_1_ID; 21 22 import android.app.DownloadManager; 23 import android.app.DownloadManager.Request; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.net.Uri; 27 import android.os.RemoteException; 28 import android.provider.DocumentsContract; 29 import android.support.test.uiautomator.Configurator; 30 import android.support.test.uiautomator.UiObject; 31 import android.test.suitebuilder.annotation.LargeTest; 32 import android.test.suitebuilder.annotation.Suppress; 33 import android.view.KeyEvent; 34 import android.view.MotionEvent; 35 36 import com.android.documentsui.model.RootInfo; 37 38 @LargeTest 39 public class FilesActivityUiTest extends ActivityTest<FilesActivity> { 40 FilesActivityUiTest()41 public FilesActivityUiTest() { 42 super(FilesActivity.class); 43 } 44 45 @Override getInitialRoot()46 protected RootInfo getInitialRoot() { 47 return null; 48 } 49 50 @Override initTestFiles()51 public void initTestFiles() throws RemoteException { 52 mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); 53 mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); 54 mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); 55 56 mDocsHelper.createDocument(rootDir1, "text/plain", "anotherFile0.log"); 57 mDocsHelper.createDocument(rootDir1, "text/plain", "poodles.text"); 58 } 59 testRootsListed()60 public void testRootsListed() throws Exception { 61 initTestFiles(); 62 63 // Should also have Drive, but that requires pre-configuration of devices 64 // We omit for now. 65 bots.roots.assertRootsPresent( 66 "Images", 67 "Videos", 68 "Audio", 69 "Downloads", 70 ROOT_0_ID, 71 ROOT_1_ID); 72 73 // Separate logic for "Documents" root, which presence depends on the config setting 74 if (Shared.shouldShowDocumentsRoot(context, new Intent(DocumentsContract.ACTION_BROWSE))) { 75 bots.roots.assertRootsPresent("Documents"); 76 } else { 77 bots.roots.assertRootsAbsent("Documents"); 78 } 79 } 80 testFilesListed()81 public void testFilesListed() throws Exception { 82 initTestFiles(); 83 84 bots.roots.openRoot(ROOT_0_ID); 85 bots.directory.assertDocumentsPresent("file0.log", "file1.png", "file2.csv"); 86 } 87 testLoadsDownloadsDirectoryByDefault()88 public void testLoadsDownloadsDirectoryByDefault() throws Exception { 89 initTestFiles(); 90 91 device.waitForIdle(); 92 bots.main.assertWindowTitle("Downloads"); 93 } 94 testRootClickSetsWindowTitle()95 public void testRootClickSetsWindowTitle() throws Exception { 96 initTestFiles(); 97 98 bots.roots.openRoot("Downloads"); 99 bots.main.assertWindowTitle("Downloads"); 100 } 101 testFilesList_LiveUpdate()102 public void testFilesList_LiveUpdate() throws Exception { 103 initTestFiles(); 104 105 bots.roots.openRoot(ROOT_0_ID); 106 mDocsHelper.createDocument(rootDir0, "yummers/sandwich", "Ham & Cheese.sandwich"); 107 108 bots.directory.waitForDocument("Ham & Cheese.sandwich"); 109 bots.directory.assertDocumentsPresent( 110 "file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); 111 } 112 testCreateDirectory()113 public void testCreateDirectory() throws Exception { 114 initTestFiles(); 115 116 bots.roots.openRoot(ROOT_0_ID); 117 118 bots.main.openOverflowMenu(); 119 bots.main.menuNewFolder().click(); 120 bots.main.setDialogText("Kung Fu Panda"); 121 122 bots.keyboard.pressEnter(); 123 124 bots.directory.assertDocumentsPresent("Kung Fu Panda"); 125 } 126 testDeleteDocument()127 public void testDeleteDocument() throws Exception { 128 initTestFiles(); 129 130 bots.roots.openRoot(ROOT_0_ID); 131 132 bots.directory.clickDocument("file1.png"); 133 device.waitForIdle(); 134 bots.main.menuDelete().click(); 135 136 bots.main.findDialogOkButton().click(); 137 138 bots.directory.assertDocumentsAbsent("file1.png"); 139 } 140 testDeleteDocument_Cancel()141 public void testDeleteDocument_Cancel() throws Exception { 142 initTestFiles(); 143 144 bots.roots.openRoot(ROOT_0_ID); 145 146 bots.directory.clickDocument("file1.png"); 147 device.waitForIdle(); 148 bots.main.menuDelete().click(); 149 150 bots.main.findDialogCancelButton().click(); 151 152 bots.directory.assertDocumentsPresent("file1.png"); 153 } 154 155 // Tests that pressing tab switches focus between the roots and directory listings. 156 @Suppress testKeyboard_tab()157 public void testKeyboard_tab() throws Exception { 158 bots.main.pressKey(KeyEvent.KEYCODE_TAB); 159 bots.roots.assertHasFocus(); 160 bots.main.pressKey(KeyEvent.KEYCODE_TAB); 161 bots.directory.assertHasFocus(); 162 } 163 164 // Tests that arrow keys do not switch focus away from the dir list. 165 @Suppress testKeyboard_arrowsDirList()166 public void testKeyboard_arrowsDirList() throws Exception { 167 for (int i = 0; i < 10; i++) { 168 bots.main.pressKey(KeyEvent.KEYCODE_DPAD_LEFT); 169 bots.directory.assertHasFocus(); 170 } 171 for (int i = 0; i < 10; i++) { 172 bots.main.pressKey(KeyEvent.KEYCODE_DPAD_RIGHT); 173 bots.directory.assertHasFocus(); 174 } 175 } 176 177 // Tests that arrow keys do not switch focus away from the roots list. testKeyboard_arrowsRootsList()178 public void testKeyboard_arrowsRootsList() throws Exception { 179 bots.main.pressKey(KeyEvent.KEYCODE_TAB); 180 for (int i = 0; i < 10; i++) { 181 bots.main.pressKey(KeyEvent.KEYCODE_DPAD_RIGHT); 182 bots.roots.assertHasFocus(); 183 } 184 for (int i = 0; i < 10; i++) { 185 bots.main.pressKey(KeyEvent.KEYCODE_DPAD_LEFT); 186 bots.roots.assertHasFocus(); 187 } 188 } 189 190 // We don't really need to test the entirety of download support 191 // since downloads is (almost) just another provider. 192 @Suppress testDownload_Queued()193 public void testDownload_Queued() throws Exception { 194 DownloadManager dm = (DownloadManager) context.getSystemService( 195 Context.DOWNLOAD_SERVICE); 196 // This downloads ends up being queued (because DNS can't be resolved). 197 // We'll still see an entry in the downloads UI with a "Queued" label. 198 dm.enqueue(new Request(Uri.parse("http://hammychamp.toodles"))); 199 200 bots.roots.openRoot("Downloads"); 201 bots.directory.assertDocumentsPresent("Queued"); 202 } 203 204 @Suppress testDownload_RetryUnsuccessful()205 public void testDownload_RetryUnsuccessful() throws Exception { 206 DownloadManager dm = (DownloadManager) context.getSystemService( 207 Context.DOWNLOAD_SERVICE); 208 // This downloads fails! But it'll still show up. 209 dm.enqueue(new Request(Uri.parse("http://www.google.com/hamfancy"))); 210 211 bots.roots.openRoot("Downloads"); 212 UiObject doc = bots.directory.findDocument("Unsuccessful"); 213 doc.waitForExists(TIMEOUT); 214 215 int toolType = Configurator.getInstance().getToolType(); 216 Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER); 217 doc.click(); 218 Configurator.getInstance().setToolType(toolType); 219 220 assertTrue(bots.main.findDownloadRetryDialog().exists()); 221 222 device.pressBack(); // to clear the dialog. 223 } 224 } 225