1988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay/* 2988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * Copyright (C) 2016 The Android Open Source Project 3988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * 4988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 5988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * you may not use this file except in compliance with the License. 6988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * You may obtain a copy of the License at 7988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * 8988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * http://www.apache.org/licenses/LICENSE-2.0 9988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * 10988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * Unless required by applicable law or agreed to in writing, software 11988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * distributed under the License is distributed on an "AS IS" BASIS, 12988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * See the License for the specific language governing permissions and 14988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * limitations under the License. 15988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay */ 16988d8a354b00dce7e24deee187c08a4591956ac9Steve McKaypackage com.android.documentsui.testing; 17988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 18eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKayimport android.provider.DocumentsContract.Document; 197a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Linimport android.support.test.InstrumentationRegistry; 20e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tanimport android.test.mock.MockContentResolver; 21988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 2230d8c7988e15336d995e4b5033ba533a8333446fJon Mannimport com.android.documentsui.FocusManager; 2330d8c7988e15336d995e4b5033ba533a8333446fJon Mannimport com.android.documentsui.Injector; 24179f0695a8d4a0d87d28303f8d6e5e9c7194d981Tomasz Mikolajewskiimport com.android.documentsui.archives.ArchivesProvider; 25def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKayimport com.android.documentsui.base.DocumentInfo; 267a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Linimport com.android.documentsui.base.Features; 27e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tanimport com.android.documentsui.base.RootInfo; 28988d8a354b00dce7e24deee187c08a4591956ac9Steve McKayimport com.android.documentsui.base.State; 29d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Linimport com.android.documentsui.dirlist.TestFocusHandler; 305b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.selection.SelectionManager; 31e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tanimport com.android.documentsui.sorting.SortModel; 3230d8c7988e15336d995e4b5033ba533a8333446fJon Mannimport com.android.documentsui.ui.TestDialogController; 33988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 34def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKayimport junit.framework.Assert; 35def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay 36d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKayimport java.util.ArrayList; 37e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tanimport java.util.HashMap; 38d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKayimport java.util.List; 39e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tanimport java.util.Map; 40988d8a354b00dce7e24deee187c08a4591956ac9Steve McKayimport java.util.concurrent.Executor; 41988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 42988d8a354b00dce7e24deee187c08a4591956ac9Steve McKaypublic class TestEnv { 43988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 44eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FOLDER_0; 45eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FOLDER_1; 46eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FOLDER_2; 47eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_TXT; 48eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_PNG; 49eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_JPG; 50eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_GIF; 51eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_PDF; 52eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_APK; 53eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_PARTIAL; 54eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_ARCHIVE; 55179f0695a8d4a0d87d28303f8d6e5e9c7194d981Tomasz Mikolajewski public static DocumentInfo FILE_IN_ARCHIVE; 56eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public static DocumentInfo FILE_VIRTUAL; 57c1a32aea59f47b06f3157a7f87ef5b9bf45f7627Ben Lin public static DocumentInfo FILE_READ_ONLY; 58988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 59988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay public final TestScheduledExecutorService mExecutor; 60988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay public final State state = new State(); 612e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan public final TestProvidersAccess providers = new TestProvidersAccess(); 62def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay public final TestDocumentsAccess docs = new TestDocumentsAccess(); 63d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin public final TestFocusHandler focusHandler = new TestFocusHandler(); 64894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan public final TestDialogController dialogs = new TestDialogController(); 65def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay public final TestModel model; 66179f0695a8d4a0d87d28303f8d6e5e9c7194d981Tomasz Mikolajewski public final TestModel archiveModel; 675b0a2c187a9e446b683687817d22cbe443585223Steve McKay public final SelectionManager selectionMgr; 681686883a8d049b399e34954a4feaa98490277ae8Garfield Tan public final TestSearchViewManager searchViewManager; 6930d8c7988e15336d995e4b5033ba533a8333446fJon Mann public final Injector injector; 707a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin public final Features features; 71988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 72e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan public final MockContentResolver contentResolver; 732e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan public final Map<String, TestDocumentsProvider> mockProviders; 74e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan 75def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay private TestEnv(String authority) { 76e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan state.sortModel = SortModel.createModel(); 77988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay mExecutor = new TestScheduledExecutorService(); 787a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin features = new Features.RuntimeFeatures( 797a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin InstrumentationRegistry.getInstrumentation().getTargetContext().getResources(), 807a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin null); 8198f8c5f502e049a6b85439d773949cdbaa0f78aeSteve McKay model = new TestModel(authority, features); 82179f0695a8d4a0d87d28303f8d6e5e9c7194d981Tomasz Mikolajewski archiveModel = new TestModel(ArchivesProvider.AUTHORITY, features); 835b0a2c187a9e446b683687817d22cbe443585223Steve McKay selectionMgr = SelectionManagers.createTestInstance(); 8463bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan searchViewManager = new TestSearchViewManager(); 8530d8c7988e15336d995e4b5033ba533a8333446fJon Mann injector = new Injector( 8698f8c5f502e049a6b85439d773949cdbaa0f78aeSteve McKay features, 87e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan new TestActivityConfig(), 88e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan null, //ScopedPreferences are not required for tests 89e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan null, //a MessageBuilder is not required for tests 90894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan dialogs, 91b47b4b560c46336a0e6ba3e86db3f2d76b4b2bc3Garfield Tan new TestFileTypeLookup(), 920ce04b7a3f2c76452f855d082cd57d5e4cab9d69Steve McKay (roots) -> {}, // not sure why, but java gets angry when I declare roots type. 93e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan model); 940ce04b7a3f2c76452f855d082cd57d5e4cab9d69Steve McKay 9530d8c7988e15336d995e4b5033ba533a8333446fJon Mann injector.selectionMgr = selectionMgr; 9698f8c5f502e049a6b85439d773949cdbaa0f78aeSteve McKay injector.focusManager = new FocusManager(features, selectionMgr, null, null, 0); 97e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan injector.searchManager = searchViewManager; 98e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan 99e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan contentResolver = new MockContentResolver(); 1002e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan mockProviders = new HashMap<>(providers.getRootsBlocking().size()); 101e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan registerProviders(); 102e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan } 103e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan 104e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan private void registerProviders() { 1052e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan for (RootInfo root : providers.getRootsBlocking()) { 1062e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan if (!mockProviders.containsKey(root.authority)) { 107e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan TestDocumentsProvider provider = new TestDocumentsProvider(root.authority); 108e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan contentResolver.addProvider(root.authority, provider); 1092e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan mockProviders.put(root.authority, provider); 110e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan } 111e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan } 112988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay } 113988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 114988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay public static TestEnv create() { 1159bd4099ee27f8302a06fc66980079f29127318f8Jon Mann return create(TestProvidersAccess.HOME.authority); 116def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay } 117def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay 118def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay public static TestEnv create(String authority) { 119def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay TestEnv env = new TestEnv(authority); 120988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay env.reset(); 121988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay return env; 122988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay } 123988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 124def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay public void clear() { 125def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay model.reset(); 126def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay model.update(); 127def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay } 128def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay 129988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay public void reset() { 130def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay model.reset(); 131eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FOLDER_0 = model.createFolder("folder 0"); 132eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FOLDER_1 = model.createFolder("folder 1"); 133eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FOLDER_2 = model.createFolder("folder 2"); 134eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_TXT = model.createFile("woowoo.txt"); 135eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_PNG = model.createFile("peppey.png"); 136eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_JPG = model.createFile("jiffy.jpg"); 137eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_GIF = model.createFile("glibby.gif"); 138eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_PDF = model.createFile("busy.pdf"); 139eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_APK = model.createFile("becareful.apk"); 140eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_PARTIAL = model.createFile( 141eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay "UbuntuFlappyBird.iso", 142eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay Document.FLAG_SUPPORTS_DELETE 143eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay | Document.FLAG_PARTIAL); 144c1a32aea59f47b06f3157a7f87ef5b9bf45f7627Ben Lin FILE_READ_ONLY = model.createFile("topsecretsystemfile.bin", 0); 145179f0695a8d4a0d87d28303f8d6e5e9c7194d981Tomasz Mikolajewski FILE_ARCHIVE = model.createFile("whatsinthere.zip"); 146c1a32aea59f47b06f3157a7f87ef5b9bf45f7627Ben Lin FILE_IN_ARCHIVE = archiveModel.createFile("whatsinthere.png", 0); 147eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay FILE_VIRTUAL = model.createDocument( 148eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay "virtualdoc.vnd", 149eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay "application/vnd.google-apps.document", 150eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay Document.FLAG_VIRTUAL_DOCUMENT 151eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay | Document.FLAG_SUPPORTS_DELETE 152eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay | Document.FLAG_SUPPORTS_RENAME); 153def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay 154179f0695a8d4a0d87d28303f8d6e5e9c7194d981Tomasz Mikolajewski archiveModel.update(); 155def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay model.update(); 156eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay } 157def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay 158eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay public void populateStack() { 159def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay DocumentInfo rootDoc = model.getDocument("1"); 160def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay Assert.assertNotNull(rootDoc); 161eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay Assert.assertEquals(rootDoc.displayName, FOLDER_0.displayName); 162eed2f4ec78227b5e173ff667a5517637a91b9a30Steve McKay 1639bd4099ee27f8302a06fc66980079f29127318f8Jon Mann state.stack.changeRoot(TestProvidersAccess.HOME); 164def4868b1e9ef8a5718c6bc2e165026cbe52b5daSteve McKay state.stack.push(rootDoc); 165988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay } 166988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 167988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay public void beforeAsserts() throws Exception { 168894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan mExecutor.waitForTasks(30000); // 30 secs 169988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay } 170988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 171988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay public Executor lookupExecutor(String authority) { 172988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay return mExecutor; 173988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay } 174d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay 175d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay public void selectDocument(DocumentInfo info) { 176d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay List<String> ids = new ArrayList<>(1); 177d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay ids.add(info.documentId); 178d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay selectionMgr.setItemsSelected(ids, true); 179d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay } 180988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay} 181