10f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay/*
20f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * Copyright (C) 2016 The Android Open Source Project
30f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay *
40f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * Licensed under the Apache License, Version 2.0 (the "License");
50f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * you may not use this file except in compliance with the License.
60f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * You may obtain a copy of the License at
70f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay *
80f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay *      http://www.apache.org/licenses/LICENSE-2.0
90f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay *
100f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * Unless required by applicable law or agreed to in writing, software
110f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * distributed under the License is distributed on an "AS IS" BASIS,
120f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * See the License for the specific language governing permissions and
140f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay * limitations under the License.
150f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay */
160f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
170f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKaypackage com.android.documentsui.picker;
180f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
19894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tanimport static junit.framework.Assert.assertTrue;
20894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
210f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport static org.junit.Assert.assertEquals;
220f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport static org.junit.Assert.assertNotNull;
230f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
24894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tanimport android.app.Activity;
25894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tanimport android.content.ClipData;
260f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport android.content.Intent;
270f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport android.net.Uri;
28894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tanimport android.os.AsyncTask;
29fc72617ec69f5e63c9091c47be23097a40288e2eGarfield Tanimport android.provider.DocumentsContract;
302a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tanimport android.provider.DocumentsContract.Path;
310f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport android.support.test.filters.MediumTest;
320f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport android.support.test.runner.AndroidJUnit4;
330f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
34800300826ebb50f5a26393bc966c27fa26e9a16fBen Linimport com.android.documentsui.AbstractActionHandler;
350f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport com.android.documentsui.R;
36894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tanimport com.android.documentsui.base.DocumentStack;
370f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport com.android.documentsui.base.RootInfo;
380f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport com.android.documentsui.base.Shared;
39ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tanimport com.android.documentsui.base.State;
40ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tanimport com.android.documentsui.base.State.ActionType;
41f8969d63aa9e6d67e594997080f883ec84dfac71Garfield Tanimport com.android.documentsui.testing.DocumentStackAsserts;
420f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport com.android.documentsui.testing.TestEnv;
439bd4099ee27f8302a06fc66980079f29127318f8Jon Mannimport com.android.documentsui.testing.TestProvidersAccess;
4423ac60cd2b1beb59b6cd760b91c7e1b1f7e8fe49Garfield Tanimport com.android.documentsui.testing.TestLastAccessedStorage;
45800300826ebb50f5a26393bc966c27fa26e9a16fBen Linimport com.android.documentsui.testing.TestResolveInfo;
460f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
47894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tanimport org.junit.AfterClass;
480f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport org.junit.Before;
490f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport org.junit.Test;
500f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKayimport org.junit.runner.RunWith;
510f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
522a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tanimport java.util.Arrays;
532a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan
540f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay@RunWith(AndroidJUnit4.class)
550f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay@MediumTest
560f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKaypublic class ActionHandlerTest {
570f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
580f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    private TestEnv mEnv;
590f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    private TestActivity mActivity;
600f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    private ActionHandler<TestActivity> mHandler;
6123ac60cd2b1beb59b6cd760b91c7e1b1f7e8fe49Garfield Tan    private TestLastAccessedStorage mLastAccessed;
620f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
630f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    @Before
640f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    public void setUp() {
650f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        mEnv = TestEnv.create();
66e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan        mActivity = TestActivity.create(mEnv);
672e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan        mEnv.providers.configurePm(mActivity.packageMgr);
6823ac60cd2b1beb59b6cd760b91c7e1b1f7e8fe49Garfield Tan        mLastAccessed = new TestLastAccessedStorage();
690f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
700f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        mHandler = new ActionHandler<>(
710f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay                mActivity,
720f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay                mEnv.state,
732e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan                mEnv.providers,
740f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay                mEnv.docs,
7563bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan                mEnv.searchViewManager,
760f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay                mEnv::lookupExecutor,
7723ac60cd2b1beb59b6cd760b91c7e1b1f7e8fe49Garfield Tan                mEnv.injector,
7823ac60cd2b1beb59b6cd760b91c7e1b1f7e8fe49Garfield Tan                mLastAccessed
7923ac60cd2b1beb59b6cd760b91c7e1b1f7e8fe49Garfield Tan        );
800f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
81894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.dialogs.confirmNext();
820f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
835b0a2c187a9e446b683687817d22cbe443585223Steve McKay        mEnv.selectionMgr.toggleSelection("1");
84894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
85894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        AsyncTask.setDefaultExecutor(mEnv.mExecutor);
86894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
87894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
88894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @AfterClass
89894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public static void tearDownOnce() {
90894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
910f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    }
920f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
930f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    @Test
945f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan    public void testInitLocation_RestoresIfStackIsLoaded() throws Exception {
955f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        mEnv.state.stack.changeRoot(TestProvidersAccess.DOWNLOADS);
965f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_0);
975f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan
985f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        mHandler.initLocation(mActivity.getIntent());
995f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        mActivity.restoreRootAndDirectory.assertCalled();
1005f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan    }
1015f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan
1025f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan    @Test
1035f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan    public void testInitLocation_LoadsRootDocIfStackOnlyHasRoot() throws Exception {
1045f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        mEnv.state.stack.changeRoot(TestProvidersAccess.HAMMY);
1055f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan
1065f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        mHandler.initLocation(mActivity.getIntent());
1075f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan        assertRootPicked(TestProvidersAccess.HAMMY.getUri());
1085f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan    }
1095f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan
1105f2a9babb845129fd9595f6265cda84b30c795c5Garfield Tan    @Test
1110f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    public void testInitLocation_CopyDestination_DefaultsToDownloads() throws Exception {
112317d65f8153822981ac08b944abde72a7db20104Steve McKay        mActivity.resources.bools.put(R.bool.show_documents_root, false);
1130f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
1140f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        Intent intent = mActivity.getIntent();
1150f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        intent.setAction(Shared.ACTION_PICK_COPY_DESTINATION);
1160f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        mHandler.initLocation(mActivity.getIntent());
1179bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        assertRootPicked(TestProvidersAccess.DOWNLOADS.getUri());
1180f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    }
1190f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
1200f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    @Test
121317d65f8153822981ac08b944abde72a7db20104Steve McKay    public void testInitLocation_CopyDestination_DocumentsRootEnabled() throws Exception {
122317d65f8153822981ac08b944abde72a7db20104Steve McKay        mActivity.resources.bools.put(R.bool.show_documents_root, true);
123dbf09882377b4752fe45b1e2282fcbac4dcee60bBen Lin        mActivity.resources.strings.put(R.string.default_root_uri, TestProvidersAccess.HOME.getUri().toString());
1240f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
1250f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        Intent intent = mActivity.getIntent();
1260f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        intent.setAction(Shared.ACTION_PICK_COPY_DESTINATION);
1270f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        mHandler.initLocation(intent);
1289bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        assertRootPicked(TestProvidersAccess.HOME.getUri());
1290f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    }
1300f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
13163bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan    @Test
1322a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan    public void testInitLocation_LaunchToDocuments() throws Exception {
1337a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin        if (!mEnv.features.isLaunchToDocumentEnabled()) {
1347a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin            return;
1357a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin        }
1367a4fa239abefd05d03d2e62c651d7b08f682d8b4Ben Lin
1372a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan        mEnv.docs.nextIsDocumentsUri = true;
1382a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan        mEnv.docs.nextPath = new Path(
1399bd4099ee27f8302a06fc66980079f29127318f8Jon Mann                TestProvidersAccess.HOME.rootId,
1402a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan                Arrays.asList(
1412a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan                        TestEnv.FOLDER_0.documentId,
1422a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan                        TestEnv.FOLDER_1.documentId,
1432a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan                        TestEnv.FILE_GIF.documentId));
1442a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan        mEnv.docs.nextDocuments =
1452a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan                Arrays.asList(TestEnv.FOLDER_0, TestEnv.FOLDER_1, TestEnv.FILE_GIF);
1462a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan
147fc72617ec69f5e63c9091c47be23097a40288e2eGarfield Tan        mActivity.refreshCurrentRootAndDirectory.assertNotCalled();
1482a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan        Intent intent = mActivity.getIntent();
149f8969d63aa9e6d67e594997080f883ec84dfac71Garfield Tan        intent.setAction(Intent.ACTION_GET_CONTENT);
150fc72617ec69f5e63c9091c47be23097a40288e2eGarfield Tan        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, TestEnv.FILE_GIF.derivedUri);
1512a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan        mHandler.initLocation(intent);
1522a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan
153f8969d63aa9e6d67e594997080f883ec84dfac71Garfield Tan        mEnv.beforeAsserts();
154fc72617ec69f5e63c9091c47be23097a40288e2eGarfield Tan
1559bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        DocumentStackAsserts.assertEqualsTo(mEnv.state.stack, TestProvidersAccess.HOME,
156f8969d63aa9e6d67e594997080f883ec84dfac71Garfield Tan                Arrays.asList(TestEnv.FOLDER_0, TestEnv.FOLDER_1));
157fc72617ec69f5e63c9091c47be23097a40288e2eGarfield Tan        mActivity.refreshCurrentRootAndDirectory.assertCalled();
1582a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan    }
1592a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan
1602a837422d25b44f2847bc82e7c90b4e8fcde1518Garfield Tan    @Test
161894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testInitLocation_RestoresLastAccessedStack() throws Exception {
162894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final DocumentStack stack =
1639bd4099ee27f8302a06fc66980079f29127318f8Jon Mann                new DocumentStack(TestProvidersAccess.HAMMY, TestEnv.FOLDER_0, TestEnv.FOLDER_1);
164894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mLastAccessed.setLastAccessed(mActivity, stack);
165894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
166894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.initLocation(mActivity.getIntent());
167894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
168894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
169894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(stack, mEnv.state.stack);
170894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.refreshCurrentRootAndDirectory.assertCalled();
171ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    }
172bab25161824d80657b11ba6db6e9f0ecfc72dfbcGarfield Tan
173ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    @Test
174894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testInitLocation_DefaultToRecents_ActionGetContent() throws Exception {
175894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        testInitLocationDefaultToRecentsOnAction(State.ACTION_GET_CONTENT);
176ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    }
177bab25161824d80657b11ba6db6e9f0ecfc72dfbcGarfield Tan
178ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    @Test
179894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testInitLocation_DefaultToRecents_ActionOpen() throws Exception {
180894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        testInitLocationDefaultToRecentsOnAction(State.ACTION_OPEN);
181ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    }
182ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
183ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    @Test
184894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testInitLocation_DefaultToRecents_ActionOpenTree() throws Exception {
185894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        testInitLocationDefaultToRecentsOnAction(State.ACTION_OPEN_TREE);
186ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    }
187ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
188ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    @Test
189894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testInitLocation_DefaultsToDownloads_ActionCreate() throws Exception {
190894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_CREATE;
191894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.resources.bools.put(R.bool.show_documents_root, false);
192894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
193894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.refreshCurrentRootAndDirectory.assertNotCalled();
194894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
195894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.initLocation(mActivity.getIntent());
196894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
1979bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        assertRootPicked(TestProvidersAccess.DOWNLOADS.getUri());
198bab25161824d80657b11ba6db6e9f0ecfc72dfbcGarfield Tan    }
199bab25161824d80657b11ba6db6e9f0ecfc72dfbcGarfield Tan
200bab25161824d80657b11ba6db6e9f0ecfc72dfbcGarfield Tan    @Test
20163bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan    public void testOpenContainerDocument() {
20263bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan        mHandler.openContainerDocument(TestEnv.FOLDER_0);
20363bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan
20463bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan        assertEquals(TestEnv.FOLDER_0, mEnv.state.stack.peek());
20563bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan
20663bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan        mActivity.refreshCurrentRootAndDirectory.assertCalled();
20763bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan    }
20863bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan
209894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
210894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testPickDocument_SetsCorrectResultAndFinishes_ActionPickCopyDestination()
211894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            throws Exception {
212ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
213894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_PICK_COPY_DESTINATION;
2149bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
215894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
216894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_2);
217ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
218894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
219894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
220894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.pickDocument(TestEnv.FOLDER_2);
221894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
222894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
223894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
224894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
225894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
226894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
227894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
228894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, false);
229894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, false);
230894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, false);
231894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
232894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, TestEnv.FOLDER_2.derivedUri);
233894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
234894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
235894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
236894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
237894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
238894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testPickDocument_SetsCorrectResultAndFinishes_ActionOpenTree() throws Exception {
239894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_OPEN_TREE;
2409bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
241894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
242894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_2);
243894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
244894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
245894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
246894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.pickDocument(TestEnv.FOLDER_2);
247894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
248894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
249894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
250894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
251894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
252894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
253894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
254894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
255894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, true);
256894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
257894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, true);
258894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, DocumentsContract.buildTreeDocumentUri(
2599bd4099ee27f8302a06fc66980079f29127318f8Jon Mann                TestProvidersAccess.HOME.authority, TestEnv.FOLDER_2.documentId));
260894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
261894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
262894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
263894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
264894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
265894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testSaveDocument_SetsCorrectResultAndFinishes() throws Exception {
266894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_CREATE;
2679bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
268894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
269894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
270894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final String mimeType = "audio/aac";
271894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final String displayName = "foobar.m4a";
272894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
273894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.saveDocument(mimeType, displayName, (boolean inProgress) -> {});
274894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
275894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
276894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
277894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.docs.assertCreatedDocument(TestEnv.FOLDER_1, mimeType, displayName);
278894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Uri docUri = mEnv.docs.getLastCreatedDocumentUri();
279894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
280894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
281894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
282894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
283894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
284894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
285894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, true);
286894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
287894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
288894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, docUri);
289894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
290894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
291894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
292894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
293894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
294894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testSaveDocument_ConfirmsOverwrite() {
295b9ac9cf6d8c5f9b25436df1bb90c5bf5f929cd7fGarfield Tan        if (!mEnv.features.isOverwriteConfirmationEnabled()) {
296b9ac9cf6d8c5f9b25436df1bb90c5bf5f929cd7fGarfield Tan            return;
297b9ac9cf6d8c5f9b25436df1bb90c5bf5f929cd7fGarfield Tan        }
298b9ac9cf6d8c5f9b25436df1bb90c5bf5f929cd7fGarfield Tan
299894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_CREATE;
3009bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
301894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
302894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
303894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.saveDocument(null, TestEnv.FILE_JPG);
304894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
305894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.dialogs.assertOverwriteConfirmed(TestEnv.FILE_JPG);
306894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
307894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
308894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
309894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testFinishPicking_SetsCorrectResultAndFinishes_ActionGetContent() throws Exception {
310894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_GET_CONTENT;
3119bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
312894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
313894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
314894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
315894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
316894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.finishPicking(TestEnv.FILE_JPG.derivedUri);
317894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
318894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
319894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
320894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
321894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
322894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
323894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
324894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
325894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, false);
326894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, false);
327894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
328894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, TestEnv.FILE_JPG.derivedUri);
329894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
330894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
331894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
332894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
333894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
334894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testFinishPicking_SetsCorrectResultAndFinishes_ActionGetContent_MultipleSelection()
335894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            throws Exception {
336894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_GET_CONTENT;
3379bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
338894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
339894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.acceptMimes = new String[] { "image/*" };
340894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
341894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
342894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
343894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.finishPicking(TestEnv.FILE_JPG.derivedUri, TestEnv.FILE_GIF.derivedUri);
344894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
345894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
346894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
347894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
348894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
349894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
350894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
351894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
352894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, false);
353894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, false);
354894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
355894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, TestEnv.FILE_JPG.derivedUri, TestEnv.FILE_GIF.derivedUri);
356894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
357894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
358894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
359894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
360894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
361894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testFinishPicking_SetsCorrectResultAndFinishes_ActionOpen() throws Exception {
362894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_OPEN;
3639bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
364894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
365894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
366894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
367894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
368894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.finishPicking(TestEnv.FILE_JPG.derivedUri);
369894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
370894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
371894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
372894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
373894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
374894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
375894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
376894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
377894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, true);
378894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
379894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
380894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, TestEnv.FILE_JPG.derivedUri);
381894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
382894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
383894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
384894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
385894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
386894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testFinishPicking_SetsCorrectResultAndFinishes_ActionOpen_MultipleSelection()
387894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            throws Exception {
388894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_OPEN;
3899bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
390894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
391894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.acceptMimes = new String[] { "image/*" };
392894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
393894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
394894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
395894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.finishPicking(TestEnv.FILE_JPG.derivedUri, TestEnv.FILE_GIF.derivedUri);
396894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
397894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
398894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
399894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
400894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
401894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
402894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
403894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
404894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, true);
405894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
406894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
407894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, TestEnv.FILE_JPG.derivedUri, TestEnv.FILE_GIF.derivedUri);
408894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
409894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
410894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
411894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
412894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    @Test
413894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    public void testFinishPicking_SetsCorrectResultAndFinishes_ActionCreate() throws Exception {
414894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.action = State.ACTION_CREATE;
4159bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
416894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.state.stack.push(TestEnv.FOLDER_1);
417894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
418894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertNotCalled();
419894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
420894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.finishPicking(TestEnv.FILE_JPG.derivedUri);
421894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
422894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
423894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
424894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertLastAccessedStackUpdated();
425894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
426894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
427894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        final Intent result = mActivity.setResult.getLastValue().second;
428894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_READ_URI_PERMISSION, true);
429894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, true);
430894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
431894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertPermission(result, Intent.FLAG_GRANT_PREFIX_URI_PERMISSION, false);
432894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        assertContent(result, TestEnv.FILE_JPG.derivedUri);
433894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
434894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.finishedHandler.assertCalled();
435ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    }
436ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
437800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    @Test
438800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    public void testOnAppPickedResult_OnOK() throws Exception {
439800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        Intent intent = new Intent();
440800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD, Activity.RESULT_OK, intent);
441800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mActivity.finishedHandler.assertCalled();
442800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mActivity.setResult.assertCalled();
443800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin
444800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        assertEquals(Activity.RESULT_OK, (long) mActivity.setResult.getLastValue().first);
445800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        assertEquals(intent, mActivity.setResult.getLastValue().second);
446800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    }
447800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin
448800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    @Test
449800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    public void testOnAppPickedResult_OnNotOK() throws Exception {
450800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        Intent intent = new Intent();
451800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mHandler.onActivityResult(0, Activity.RESULT_OK, intent);
452800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mActivity.finishedHandler.assertNotCalled();
453800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mActivity.setResult.assertNotCalled();
454800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin
455800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mHandler.onActivityResult(AbstractActionHandler.CODE_FORWARD, Activity.RESULT_CANCELED,
456800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin                intent);
457800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mActivity.finishedHandler.assertNotCalled();
458800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mActivity.setResult.assertNotCalled();
459800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    }
460800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin
461800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    @Test
462800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    public void testOpenAppRoot() throws Exception {
463800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        mHandler.openRoot(TestResolveInfo.create());
464800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        assertEquals((long) mActivity.startActivityForResult.getLastValue().second,
465800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin                AbstractActionHandler.CODE_FORWARD);
466800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin        assertNotNull(mActivity.startActivityForResult.getLastValue().first);
467800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin    }
468800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin
469894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    private void testInitLocationDefaultToRecentsOnAction(@ActionType int action)
470ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan            throws Exception {
471ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan        mEnv.state.action = action;
472894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
473ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan        mActivity.refreshCurrentRootAndDirectory.assertNotCalled();
474ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
475894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mHandler.initLocation(mActivity.getIntent());
476ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
477894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mEnv.beforeAsserts();
4789bd4099ee27f8302a06fc66980079f29127318f8Jon Mann        assertEquals(TestProvidersAccess.RECENTS, mEnv.state.stack.getRoot());
479894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        mActivity.refreshCurrentRootAndDirectory.assertCalled();
480ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan    }
481ae9375844c27ee532c4a3c73d9d2297884933c1eGarfield Tan
4820f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    private void assertRootPicked(Uri expectedUri) throws Exception {
4830f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        mEnv.beforeAsserts();
4840f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay
4850f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        mActivity.rootPicked.assertCalled();
4860f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        RootInfo root = mActivity.rootPicked.getLastValue();
4870f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        assertNotNull(root);
4880f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay        assertEquals(expectedUri, root.getUri());
4890f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay    }
490894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
491894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    private void assertLastAccessedStackUpdated() {
4922e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan        assertEquals(mEnv.state.stack, mLastAccessed.getLastAccessed(
4932e81db6f2030ec6c8dd758c3020ce5db8363bf25Garfield Tan                mActivity, mEnv.providers, mEnv.state));
494894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
495894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
496894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    private void assertPermission(Intent intent, int permission, boolean granted) {
497894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        int flags = intent.getFlags();
498894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
499894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        if (granted) {
500894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            assertEquals(permission, flags & permission);
501894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        } else {
502894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            assertEquals(0, flags & permission);
503894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        }
504894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
505894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
506894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    private void assertContent(Intent intent, Uri... contents) {
507894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        if (contents.length == 1) {
508894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            assertEquals(contents[0], intent.getData());
509894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        } else {
510894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            ClipData clipData = intent.getClipData();
511894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan
512894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            assertNotNull(clipData);
513894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            for (int i = 0; i < mEnv.state.acceptMimes.length; ++i) {
514894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan                assertEquals(mEnv.state.acceptMimes[i], clipData.getDescription().getMimeType(i));
515894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            }
516894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            for (int i = 0; i < contents.length; ++i) {
517894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan                assertEquals(contents[i], clipData.getItemAt(i).getUri());
518894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan            }
519894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan        }
520894d487698ff5c7052f499602fb74ad89f1d2d15Garfield Tan    }
5210f5ec83eeee1d68f344c036cdff0c31ff68e6ee8Steve McKay}
522