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