19e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey/*
29e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
39e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey *
49e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
59e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * you may not use this file except in compliance with the License.
69e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * You may obtain a copy of the License at
79e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey *
89e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
99e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey *
109e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
119e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
129e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * See the License for the specific language governing permissions and
149e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * limitations under the License.
159e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey */
169e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
179e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeypackage com.android.documentsui;
189e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
1959d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkeyimport static com.android.documentsui.BaseActivity.State.ACTION_BROWSE;
20e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKayimport static com.android.documentsui.BaseActivity.State.ACTION_CREATE;
21e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKayimport static com.android.documentsui.BaseActivity.State.ACTION_GET_CONTENT;
22e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKayimport static com.android.documentsui.BaseActivity.State.ACTION_MANAGE;
23e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKayimport static com.android.documentsui.BaseActivity.State.ACTION_OPEN;
24bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hironoimport static com.android.documentsui.BaseActivity.State.ACTION_OPEN_COPY_DESTINATION;
25ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKayimport static com.android.documentsui.BaseActivity.State.ACTION_OPEN_TREE;
2659d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_DOWN;
2759d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_NONE;
2859d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_UP;
2959d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey
306e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKayimport java.util.ArrayList;
31ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKayimport java.util.Arrays;
32ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKayimport java.util.List;
33ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
34186efa3836ec3e8c564b53d0948a51eb25cb7161Daichi Hironoimport android.app.ActionBar;
359e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.Activity;
36ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKayimport android.app.Fragment;
379e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.FragmentManager;
384eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkeyimport android.content.ActivityNotFoundException;
39be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ClipData;
4054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyimport android.content.ComponentName;
417aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkeyimport android.content.ContentProviderClient;
42be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ContentResolver;
4320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.content.ContentValues;
44f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkeyimport android.content.Context;
459e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.content.Intent;
4654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyimport android.content.pm.ResolveInfo;
4788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.content.res.Resources;
4888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.graphics.Point;
499e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.net.Uri;
50a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport android.os.AsyncTask;
519e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.os.Bundle;
52e1a03f8eec2719279037ab348df306764dc45a70Tomasz Mikolajewskiimport android.os.Parcelable;
53a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkeyimport android.provider.DocumentsContract;
543e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkeyimport android.provider.DocumentsContract.Root;
55bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.app.ActionBarDrawerToggle;
56bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.widget.DrawerLayout;
57bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.widget.DrawerLayout.DrawerListener;
589e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.util.Log;
5954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.Menu;
6054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.MenuItem;
619e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.View;
6288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.view.WindowManager;
6354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.BaseAdapter;
64f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkeyimport android.widget.Spinner;
657e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkeyimport android.widget.Toast;
66f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkeyimport android.widget.Toolbar;
679e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
68d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.RecentsProvider.RecentColumns;
69d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.RecentsProvider.ResumeColumns;
70ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo;
716e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKayimport com.android.documentsui.model.DocumentStack;
72b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport com.android.documentsui.model.DurableUtils;
73ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.RootInfo;
7420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
75e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKaypublic class DocumentsActivity extends BaseActivity {
765545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey    private static final int CODE_FORWARD = 42;
77ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    public static final String TAG = "Documents";
785545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey
7988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey    private boolean mShowAsDialog;
8088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
81f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey    private Toolbar mToolbar;
82f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey    private Spinner mToolbarStack;
83f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
84f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey    private Toolbar mRootsToolbar;
85f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
86bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private DrawerLayout mDrawerLayout;
87bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private ActionBarDrawerToggle mDrawerToggle;
88f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey    private View mRootsDrawer;
891482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
90e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey    private DirectoryContainerView mDirectoryContainer;
91e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey
92ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    private State mState;
93ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey
94ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    private ItemSelectedListener mStackListener;
95ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    private BaseAdapter mStackAdapter;
96f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
97ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    public DocumentsActivity() {
98ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        super(TAG);
99ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    }
10054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1019e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    @Override
1029e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    public void onCreate(Bundle icicle) {
1039e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        super.onCreate(icicle);
1049e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
105b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        setResult(Activity.RESULT_CANCELED);
106b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        setContentView(R.layout.activity);
10754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
108f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        final Context context = this;
10988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        final Resources res = getResources();
11088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        mShowAsDialog = res.getBoolean(R.bool.show_as_dialog);
11188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
11288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        if (mShowAsDialog) {
113f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            // Strongly define our horizontal dimension; we leave vertical as
114f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            // WRAP_CONTENT so that system resizes us when IME is showing.
11588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            final WindowManager.LayoutParams a = getWindow().getAttributes();
11688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
11788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            final Point size = new Point();
11888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            getWindowManager().getDefaultDisplay().getSize(size);
119f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            a.width = (int) res.getFraction(R.dimen.dialog_width, size.x, size.x);
12088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
121f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            getWindow().setAttributes(a);
12288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
12388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        } else {
12488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            // Non-dialog means we have a drawer
12588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
1264eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey
12788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
128f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                    R.drawable.ic_hamburger, R.string.drawer_open, R.string.drawer_close);
129be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
13088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            mDrawerLayout.setDrawerListener(mDrawerListener);
131b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey
132f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mRootsDrawer = findViewById(R.id.drawer_roots);
13388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        }
134b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey
135e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey        mDirectoryContainer = (DirectoryContainerView) findViewById(R.id.container_directory);
136e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey
137ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        mState = (icicle != null)
138ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                ? icicle.<State>getParcelable(EXTRA_STATE)
139ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                : buildDefaultState();
14054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
141f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        mToolbar = (Toolbar) findViewById(R.id.toolbar);
142f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        mToolbar.setTitleTextAppearance(context,
143f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Title);
144f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
145ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        mStackAdapter = new StackAdapter();
146ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        mStackListener = new ItemSelectedListener();
147f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        mToolbarStack = (Spinner) findViewById(R.id.stack);
148f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        mToolbarStack.setOnItemSelectedListener(mStackListener);
149f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
150f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        mRootsToolbar = (Toolbar) findViewById(R.id.roots_toolbar);
151f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        if (mRootsToolbar != null) {
152f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mRootsToolbar.setTitleTextAppearance(context,
153f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                    android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Title);
154f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        }
155f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
1568a850b4c0e0d4ceff4553dbb2490fe13f0e05f9dJeff Sharkey        setActionBar(mToolbar);
1578a850b4c0e0d4ceff4553dbb2490fe13f0e05f9dJeff Sharkey
15888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        // Hide roots when we're managing a specific root
15959d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey        if (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) {
16088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            if (mShowAsDialog) {
161f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                findViewById(R.id.container_roots).setVisibility(View.GONE);
16288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            } else {
16388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
16488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            }
165b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        }
16654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
167b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        if (mState.action == ACTION_CREATE) {
16854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String mimeType = getIntent().getType();
16954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
17054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            SaveFragment.show(getFragmentManager(), mimeType, title);
171bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        } else if (mState.action == ACTION_OPEN_TREE ||
172bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                   mState.action == ACTION_OPEN_COPY_DESTINATION) {
17321de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            PickFragment.show(getFragmentManager());
17454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
175bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
176b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        if (mState.action == ACTION_GET_CONTENT) {
17754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            final Intent moreApps = new Intent(getIntent());
17854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            moreApps.setComponent(null);
17954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            moreApps.setPackage(null);
18054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            RootsFragment.show(getFragmentManager(), moreApps);
181bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        } else if (mState.action == ACTION_OPEN ||
182bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                   mState.action == ACTION_CREATE ||
183bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                   mState.action == ACTION_OPEN_TREE ||
184bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                   mState.action == ACTION_OPEN_COPY_DESTINATION) {
18554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            RootsFragment.show(getFragmentManager(), null);
18654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
18766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
188a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        if (!mState.restored) {
1899feac1425c02d2da91e500e7c2f6b7d87a4f3d44Makoto Onuki            // In this case, we set the activity title in AsyncTask.onPostExecute().  To prevent
1909feac1425c02d2da91e500e7c2f6b7d87a4f3d44Makoto Onuki            // talkback from reading aloud the default title, we clear it here.
1919feac1425c02d2da91e500e7c2f6b7d87a4f3d44Makoto Onuki            setTitle("");
19259d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            if (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) {
193a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                final Uri rootUri = getIntent().getData();
194d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey                new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor());
195a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            } else {
196a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                new RestoreStackTask().execute();
197a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            }
1986e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay
1996e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay            // Show a failure dialog if there was a failed operation.
2006e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay            final Intent intent = getIntent();
2016e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay            final DocumentStack dstStack = intent.getParcelableExtra(CopyService.EXTRA_STACK);
2026e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay            final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0);
2036e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay            if (failure != 0) {
2046e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay                final ArrayList<DocumentInfo> failedSrcList =
2056e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay                        intent.getParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST);
2066e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay                FailureDialogFragment.show(getFragmentManager(), failure, failedSrcList, dstStack);
2076e02dc8cd69720043bd36ae29fe93e767e3b38a9Steve McKay            }
208a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        } else {
209a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            onCurrentDirectoryChanged(ANIM_NONE);
210a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
211b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey    }
212a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
213ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    private State buildDefaultState() {
214ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        State state = new State();
21566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
216b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        final Intent intent = getIntent();
217b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        final String action = intent.getAction();
218b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
219ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_OPEN;
220b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
221ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_CREATE;
222b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
223ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_GET_CONTENT;
224b9fbb7290b02de1ce621deaa2d28a5e42f2e0937Jeff Sharkey        } else if (Intent.ACTION_OPEN_DOCUMENT_TREE.equals(action)) {
225ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_OPEN_TREE;
226a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey        } else if (DocumentsContract.ACTION_MANAGE_ROOT.equals(action)) {
227ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_MANAGE;
2281407d4c77732c7fad34c6b813d05771de6ed970fJeff Sharkey        } else if (DocumentsContract.ACTION_BROWSE_DOCUMENT_ROOT.equals(action)) {
229ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_BROWSE;
2301a2fdb496ec080cd6ff7ed547320dcfa7994abbdDaichi Hirono        } else if (DocumentsIntent.ACTION_OPEN_COPY_DESTINATION.equals(action)) {
231ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.action = ACTION_OPEN_COPY_DESTINATION;
232b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        }
233bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
234ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (state.action == ACTION_OPEN || state.action == ACTION_GET_CONTENT) {
235ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.allowMultiple = intent.getBooleanExtra(
236b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey                    Intent.EXTRA_ALLOW_MULTIPLE, false);
237b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        }
238bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
239ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (state.action == ACTION_MANAGE || state.action == ACTION_BROWSE) {
240ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.acceptMimes = new String[] { "*/*" };
241ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.allowMultiple = true;
242b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
243ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
244b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else {
245ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.acceptMimes = new String[] { intent.getType() };
246b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        }
247bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
248ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        state.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
249ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        state.forceAdvanced = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false);
250ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        state.showAdvanced = state.forceAdvanced
251669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey                | LocalPreferences.getDisplayAdvancedDevices(this);
252669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey
253ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (state.action == ACTION_MANAGE || state.action == ACTION_BROWSE) {
254ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.showSize = true;
255669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey        } else {
256ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.showSize = LocalPreferences.getDisplayFileSize(this);
257669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey        }
258ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (state.action == ACTION_OPEN_COPY_DESTINATION) {
259ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            state.directoryCopy = intent.getBooleanExtra(
2601a2fdb496ec080cd6ff7ed547320dcfa7994abbdDaichi Hirono                    BaseActivity.DocumentsIntent.EXTRA_DIRECTORY_COPY, false);
2619be34298be02783b4cc91cf1784aa0627cf36012Daichi Hirono        }
262ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
26377797400ec103b1691e1c3fa602c329b49ac18caBen Kwa        state.excludedAuthorities = getExcludedAuthorities();
26477797400ec103b1691e1c3fa602c329b49ac18caBen Kwa
265ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        return state;
266a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
267a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
268a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    private class RestoreRootTask extends AsyncTask<Void, Void, RootInfo> {
269a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        private Uri mRootUri;
270a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
271a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        public RestoreRootTask(Uri rootUri) {
272a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            mRootUri = rootUri;
273a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
274a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
275a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        @Override
276a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        protected RootInfo doInBackground(Void... params) {
277a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            final String rootId = DocumentsContract.getRootId(mRootUri);
278a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            return mRoots.getRootOneshot(mRootUri.getAuthority(), rootId);
279a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
280a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
281a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        @Override
282a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        protected void onPostExecute(RootInfo root) {
283a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            if (isDestroyed()) return;
284a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            mState.restored = true;
285a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
286a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            if (root != null) {
287ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                onRootPicked(root);
288a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            } else {
289a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                Log.w(TAG, "Failed to find root: " + mRootUri);
290a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                finish();
291a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            }
292a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
293a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
294a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
295ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    @Override
296ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void onStackRestored(boolean restored, boolean external) {
297ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        // Show drawer when no stack restored, but only when requesting
298ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        // non-visual content. However, if we last used an external app,
299ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        // drawer is always shown.
300ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey
301ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        boolean showDrawer = false;
302ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (!restored) {
303ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            showDrawer = true;
304ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
305ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mState.acceptMimes)) {
306ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            showDrawer = false;
307ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
308ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (external && mState.action == ACTION_GET_CONTENT) {
309ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            showDrawer = true;
310ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
311a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
312ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (showDrawer) {
313ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            setRootsDrawerOpen(true);
314a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
315ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    }
316a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
317ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    public void onAppPicked(ResolveInfo info) {
318ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        final Intent intent = new Intent(getIntent());
319ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_FORWARD_RESULT);
320ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        intent.setComponent(new ComponentName(
321ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                info.activityInfo.applicationInfo.packageName, info.activityInfo.name));
322ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        startActivityForResult(intent, CODE_FORWARD);
323ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    }
324a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
325ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    @Override
326ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
327ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        Log.d(TAG, "onActivityResult() code=" + resultCode);
328deffadeb7485e8660ecce12822e259d96fa06dceJeff Sharkey
329ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        // Only relay back results when not canceled; otherwise stick around to
330ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        // let the user pick another app/backend.
331ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (requestCode == CODE_FORWARD && resultCode != RESULT_CANCELED) {
332deffadeb7485e8660ecce12822e259d96fa06dceJeff Sharkey
333ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            // Remember that we last picked via external app
334ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            final String packageName = getCallingPackageMaybeExtra();
335ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            final ContentValues values = new ContentValues();
336ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            values.put(ResumeColumns.EXTERNAL, 1);
337ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            getContentResolver().insert(RecentsProvider.buildResume(packageName), values);
338a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
339ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            // Pass back result to original caller
340ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            setResult(resultCode, data);
341ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            finish();
342ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        } else {
343ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            super.onActivityResult(requestCode, resultCode, data);
344dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
345a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey    }
346dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
347bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private DrawerListener mDrawerListener = new DrawerListener() {
348bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
349bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerSlide(View drawerView, float slideOffset) {
350bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerSlide(drawerView, slideOffset);
351bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
352bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
353bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
354bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerOpened(View drawerView) {
355bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerOpened(drawerView);
356bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
357bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
358bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
359bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerClosed(View drawerView) {
360bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerClosed(drawerView);
361bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
362bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
363bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
364bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerStateChanged(int newState) {
365bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerStateChanged(newState);
366bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
367bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    };
368bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
369bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    @Override
370bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    protected void onPostCreate(Bundle savedInstanceState) {
371bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        super.onPostCreate(savedInstanceState);
37288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        if (mDrawerToggle != null) {
37388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            mDrawerToggle.syncState();
37488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        }
37543aef1643b82e0fe1a524b20c2a533fd620ecfc3Jeff Sharkey        updateActionBar();
37688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey    }
37788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
37888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey    public void setRootsDrawerOpen(boolean open) {
37988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        if (!mShowAsDialog) {
38088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            if (open) {
381f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mDrawerLayout.openDrawer(mRootsDrawer);
38288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            } else {
383f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mDrawerLayout.closeDrawer(mRootsDrawer);
38488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            }
38588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        }
38688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey    }
38788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
38888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey    private boolean isRootsDrawerOpen() {
38988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        if (mShowAsDialog) {
39088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey            return false;
39188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        } else {
392f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            return mDrawerLayout.isDrawerOpen(mRootsDrawer);
39388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        }
3949e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
3959e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
396ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    @Override
39754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void updateActionBar() {
398f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        if (mRootsToolbar != null) {
3990e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski            final String prompt = getIntent().getStringExtra(DocumentsContract.EXTRA_PROMPT);
4000e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski            if (prompt != null) {
4010e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                mRootsToolbar.setTitle(prompt);
4020e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski            } else {
4030e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                if (mState.action == ACTION_OPEN ||
4040e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                    mState.action == ACTION_GET_CONTENT ||
4050e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                    mState.action == ACTION_OPEN_TREE) {
4060e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                    mRootsToolbar.setTitle(R.string.title_open);
4070e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                } else if (mState.action == ACTION_CREATE ||
4080e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                           mState.action == ACTION_OPEN_COPY_DESTINATION) {
4090e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                    mRootsToolbar.setTitle(R.string.title_save);
4100e591f95bd023fc153520efe0852180bb580a442Tomasz Mikolajewski                }
41154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            }
412f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        }
413f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
414536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski        if (!mShowAsDialog && mDrawerLayout.getDrawerLockMode(mRootsDrawer) ==
415536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski                DrawerLayout.LOCK_MODE_UNLOCKED) {
416f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mToolbar.setNavigationIcon(R.drawable.ic_hamburger);
417b7b30f691c5b87468ef6ad769487a9f4b315075dJeff Sharkey            mToolbar.setNavigationContentDescription(R.string.drawer_open);
418f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
419f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                @Override
420f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                public void onClick(View v) {
421f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                    setRootsDrawerOpen(true);
422f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                }
423f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            });
424536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski        } else {
425536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski            mToolbar.setNavigationIcon(null);
426536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski            mToolbar.setNavigationContentDescription(R.string.drawer_open);
427536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski            mToolbar.setNavigationOnClickListener(null);
428f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        }
429ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
430ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        if (mSearchManager.isExpanded()) {
431f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mToolbar.setTitle(null);
432f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mToolbarStack.setVisibility(View.GONE);
433f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey            mToolbarStack.setAdapter(null);
434f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey        } else {
435ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey            if (mState.stack.size() <= 1) {
436536ac48aa9268539913c210267679ded906057caTomasz Mikolajewski                mToolbar.setTitle(getCurrentRoot().title);
437f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mToolbarStack.setVisibility(View.GONE);
438f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mToolbarStack.setAdapter(null);
439ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            } else {
440f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mToolbar.setTitle(null);
441f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mToolbarStack.setVisibility(View.VISIBLE);
442f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mToolbarStack.setAdapter(mStackAdapter);
443f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey
444ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                mStackListener.mIgnoreNextNavigation = true;
445f52773fd62fc2fec40c2e17230b644dfbee6cf2dJeff Sharkey                mToolbarStack.setSelection(mStackAdapter.getCount() - 1);
446bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
4479e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
44854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
4499e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
45054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
45154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onCreateOptionsMenu(Menu menu) {
452ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        boolean showMenu = super.onCreateOptionsMenu(menu);
453ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
454669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey        // Most actions are visible when showing as dialog
45588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        if (mShowAsDialog) {
456ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            expandMenus(menu);
45788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        }
458ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        return showMenu;
45954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
46054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
46154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
46254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
46354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        super.onPrepareOptionsMenu(menu);
46454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
4653e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey        final RootInfo root = getCurrentRoot();
466ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        final DocumentInfo cwd = getCurrentDirectory();
467dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
46854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
469ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey        final MenuItem grid = menu.findItem(R.id.menu_grid);
4709fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        final MenuItem list = menu.findItem(R.id.menu_list);
471669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey        final MenuItem advanced = menu.findItem(R.id.menu_advanced);
472669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey        final MenuItem fileSize = menu.findItem(R.id.menu_file_size);
4731407d4c77732c7fad34c6b813d05771de6ed970fJeff Sharkey        final MenuItem settings = menu.findItem(R.id.menu_settings);
474dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
47559d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey        boolean fileSizeVisible = !(mState.action == ACTION_MANAGE
47659d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey                || mState.action == ACTION_BROWSE);
477574b4bcd1bf63f673a7fc456272a0824cbe58d8aSteve McKay        if (mState.action == ACTION_CREATE
478574b4bcd1bf63f673a7fc456272a0824cbe58d8aSteve McKay                || mState.action == ACTION_OPEN_TREE
479574b4bcd1bf63f673a7fc456272a0824cbe58d8aSteve McKay                || mState.action == ACTION_OPEN_COPY_DESTINATION) {
4809fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            createDir.setVisible(cwd != null && cwd.isCreateSupported());
481ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            mSearchManager.showMenu(false);
4829fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
4839fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            // No display options in recent directories
4849fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            if (cwd == null) {
4859fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                grid.setVisible(false);
4869fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                list.setVisible(false);
4870166ddf5bbb5d855cb2f5bca4c6a9f0281c14814Jeff Sharkey                fileSizeVisible = false;
4889fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            }
4899fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
49021de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            if (mState.action == ACTION_CREATE) {
49169aee097a3853490c9c7afb191af4f047ab1d164Steve McKay                final FragmentManager fm = getFragmentManager();
49221de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey                SaveFragment.get(fm).setSaveEnabled(cwd != null && cwd.isCreateSupported());
49321de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            }
4949fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        } else {
4959fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            createDir.setVisible(false);
496dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
497bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
49859d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey        advanced.setVisible(!(mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE));
4990166ddf5bbb5d855cb2f5bca4c6a9f0281c14814Jeff Sharkey        fileSize.setVisible(fileSizeVisible);
500a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
5011407d4c77732c7fad34c6b813d05771de6ed970fJeff Sharkey        settings.setVisible((mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE)
5021407d4c77732c7fad34c6b813d05771de6ed970fJeff Sharkey                && (root.flags & Root.FLAG_HAS_SETTINGS) != 0);
5031407d4c77732c7fad34c6b813d05771de6ed970fJeff Sharkey
50454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return true;
5059e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
5069e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
50754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
50854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onOptionsItemSelected(MenuItem item) {
50988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
510bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return true;
511bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
512ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        return super.onOptionsItemSelected(item);
51304d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey    }
51404d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey
515dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    @Override
516dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    public void onBackPressed() {
517186efa3836ec3e8c564b53d0948a51eb25cb7161Daichi Hirono        // While action bar is expanded, the state stack UI is hidden.
518186efa3836ec3e8c564b53d0948a51eb25cb7161Daichi Hirono        if (mSearchManager.cancelSearch()) {
519186efa3836ec3e8c564b53d0948a51eb25cb7161Daichi Hirono            return;
520186efa3836ec3e8c564b53d0948a51eb25cb7161Daichi Hirono        }
521186efa3836ec3e8c564b53d0948a51eb25cb7161Daichi Hirono
522fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey        if (!mState.stackTouched) {
523fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey            super.onBackPressed();
524fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey            return;
525fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey        }
526fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey
527b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        final int size = mState.stack.size();
528dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        if (size > 1) {
529b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            mState.stack.pop();
530e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey            onCurrentDirectoryChanged(ANIM_UP);
53188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey        } else if (size == 1 && !isRootsDrawerOpen()) {
532dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            // TODO: open root drawer once we can capture back key
533dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            super.onBackPressed();
534dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        } else {
535dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            super.onBackPressed();
53654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
537dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    }
53854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
539b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey    @Override
540b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey    public State getDisplayState() {
541b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        return mState;
5421482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
5431482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
544ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    @Override
545ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void onDirectoryChanged(int anim) {
546dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final FragmentManager fm = getFragmentManager();
547d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final RootInfo root = getCurrentRoot();
548ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        final DocumentInfo cwd = getCurrentDirectory();
5499fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
550e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey        mDirectoryContainer.setDrawDisappearingFirst(anim == ANIM_DOWN);
551e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey
552b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (cwd == null) {
553b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            // No directory means recents
554bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            if (mState.action == ACTION_CREATE ||
555bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                mState.action == ACTION_OPEN_TREE ||
556bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                mState.action == ACTION_OPEN_COPY_DESTINATION) {
557b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                RecentsCreateFragment.show(fm);
558b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            } else {
559e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey                DirectoryFragment.showRecentsOpen(fm, anim);
56088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey
561deffadeb7485e8660ecce12822e259d96fa06dceJeff Sharkey                // Start recents in grid when requesting visual things
562deffadeb7485e8660ecce12822e259d96fa06dceJeff Sharkey                final boolean visualMimes = MimePredicate.mimeMatches(
563deffadeb7485e8660ecce12822e259d96fa06dceJeff Sharkey                        MimePredicate.VISUAL_MIMES, mState.acceptMimes);
564ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                mState.userMode = visualMimes ? State.MODE_GRID : State.MODE_LIST;
56588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey                mState.derivedMode = mState.userMode;
566b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            }
567b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else {
568b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            if (mState.currentSearch != null) {
569b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                // Ongoing search
570e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey                DirectoryFragment.showSearch(fm, root, mState.currentSearch, anim);
571b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            } else {
572b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                // Normal boring directory
573e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey                DirectoryFragment.showNormal(fm, root, cwd, anim);
574b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            }
57554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
576b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
5779fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        // Forget any replacement target
578b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        if (mState.action == ACTION_CREATE) {
5799fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            final SaveFragment save = SaveFragment.get(fm);
5809fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            if (save != null) {
5819fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                save.setReplaceTarget(null);
5829fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            }
5839fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        }
5849fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
585bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        if (mState.action == ACTION_OPEN_TREE ||
586bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            mState.action == ACTION_OPEN_COPY_DESTINATION) {
58721de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            final PickFragment pick = PickFragment.get(fm);
58821de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            if (pick != null) {
589e9cbfe8e5adadfbe740836d46b8a52a066316697Daichi Hirono                pick.setPickTarget(mState.action, cwd);
59021de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            }
59121de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey        }
59254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
59354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
594ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void onSaveRequested(DocumentInfo replaceTarget) {
595ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        new ExistingFinishTask(replaceTarget.derivedUri).executeOnExecutor(getCurrentExecutor());
5966efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
5976efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
598ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void onSaveRequested(String mimeType, String displayName) {
599ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        new CreateFinishTask(mimeType, displayName).executeOnExecutor(getCurrentExecutor());
6005545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey    }
6015545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey
6025545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey    @Override
603ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void onRootPicked(RootInfo root) {
604ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        super.onRootPicked(root);
605ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        setRootsDrawerOpen(false);
60654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    }
60754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
608e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKay    @Override
609ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public void onDocumentPicked(DocumentInfo doc) {
61054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final FragmentManager fm = getFragmentManager();
611b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (doc.isDirectory()) {
612b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            mState.stack.push(doc);
613fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey            mState.stackTouched = true;
614e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey            onCurrentDirectoryChanged(ANIM_DOWN);
615b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
61654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            // Explicit file picked, return
617d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey            new ExistingFinishTask(doc.derivedUri).executeOnExecutor(getCurrentExecutor());
618b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else if (mState.action == ACTION_CREATE) {
6199fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            // Replace selected file
6209fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            SaveFragment.get(fm).setReplaceTarget(doc);
621b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        } else if (mState.action == ACTION_MANAGE) {
622a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey            // First try managing the document; we expect manager to filter
623a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey            // based on authority, so we don't grant.
624a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey            final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT);
625d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            manage.setData(doc.derivedUri);
626a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey
6274eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            try {
628a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                startActivity(manage);
6294eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            } catch (ActivityNotFoundException ex) {
630a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                // Fall back to viewing
631a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                final Intent view = new Intent(Intent.ACTION_VIEW);
632a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
633d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                view.setData(doc.derivedUri);
634a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey
635a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                try {
636a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                    startActivity(view);
637a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                } catch (ActivityNotFoundException ex2) {
638a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                    Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show();
639a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey                }
6404eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            }
64159d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey        } else if (mState.action == ACTION_BROWSE) {
64259d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            // Go straight to viewing
64359d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            final Intent view = new Intent(Intent.ACTION_VIEW);
64459d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
64559d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            view.setData(doc.derivedUri);
64659d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey
64759d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            try {
64859d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey                startActivity(view);
64959d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            } catch (ActivityNotFoundException ex) {
65059d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey                Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show();
65159d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey            }
65254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
65354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
65454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
655e934ce6f8430f50d1d22bccd3b341b982f5541eeSteve McKay    @Override
656ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public void onDocumentsPicked(List<DocumentInfo> docs) {
657b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
6584eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            final int size = docs.size();
6594eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            final Uri[] uris = new Uri[size];
6604eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            for (int i = 0; i < size; i++) {
661d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                uris[i] = docs.get(i).derivedUri;
6624eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey            }
663d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey            new ExistingFinishTask(uris).executeOnExecutor(getCurrentExecutor());
664be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
665be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    }
666be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
66721de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey    public void onPickRequested(DocumentInfo pickTarget) {
668bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        Uri result;
669bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        if (mState.action == ACTION_OPEN_TREE) {
670bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            result = DocumentsContract.buildTreeDocumentUri(
671bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono                    pickTarget.authority, pickTarget.documentId);
672bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        } else if (mState.action == ACTION_OPEN_COPY_DESTINATION) {
673bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            result = pickTarget.derivedUri;
674bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        } else {
675bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            // Should not be reached.
676bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            throw new IllegalStateException("Invalid mState.action.");
677bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        }
678bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        new PickFinishTask(result).executeOnExecutor(getCurrentExecutor());
67921de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey    }
68021de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey
681ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    @Override
682ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void saveStackBlocking() {
683dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final ContentResolver resolver = getContentResolver();
684dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final ContentValues values = new ContentValues();
685dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
686b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack);
687bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono        if (mState.action == ACTION_CREATE ||
688bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            mState.action == ACTION_OPEN_TREE ||
689bbe2292bc671f74d77c9a0e4e0e1d5ea5714d939Daichi Hirono            mState.action == ACTION_OPEN_COPY_DESTINATION) {
690dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            // Remember stack for last create
691dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            values.clear();
6926efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            values.put(RecentColumns.KEY, mState.stack.buildKey());
693d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            values.put(RecentColumns.STACK, rawStack);
694d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            resolver.insert(RecentsProvider.buildRecent(), values);
695dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
696dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
697dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        // Remember location for next app launch
69815be83612c34b65404f15d0feafdb4a329467769Jeff Sharkey        final String packageName = getCallingPackageMaybeExtra();
699dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        values.clear();
700d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        values.put(ResumeColumns.STACK, rawStack);
701deffadeb7485e8660ecce12822e259d96fa06dceJeff Sharkey        values.put(ResumeColumns.EXTERNAL, 0);
702dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        resolver.insert(RecentsProvider.buildResume(packageName), values);
7036efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
7046efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
705ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    @Override
706ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    void onTaskFinished(Uri... uris) {
7076efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        Log.d(TAG, "onFinished() " + Arrays.toString(uris));
708dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
70954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final Intent intent = new Intent();
710be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        if (uris.length == 1) {
711be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            intent.setData(uris[0]);
712be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        } else if (uris.length > 1) {
713ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            final ClipData clipData = new ClipData(
714b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey                    null, mState.acceptMimes, new ClipData.Item(uris[0]));
715be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            for (int i = 1; i < uris.length; i++) {
716be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey                clipData.addItem(new ClipData.Item(uris[i]));
717be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            }
718be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            intent.setClipData(clipData);
719be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
72054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
721b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey        if (mState.action == ACTION_GET_CONTENT) {
72254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
72304ec6f4f092f1c2d56ef6213019ce4b9068b8a0aJeff Sharkey        } else if (mState.action == ACTION_OPEN_TREE) {
72421de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
72521de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
72621de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey                    | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
72721de56a94668e0fda1b8bb4ee4f99a09b40d28fdJeff Sharkey                    | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
72804ec6f4f092f1c2d56ef6213019ce4b9068b8a0aJeff Sharkey        } else if (mState.action == ACTION_OPEN_COPY_DESTINATION) {
72904ec6f4f092f1c2d56ef6213019ce4b9068b8a0aJeff Sharkey            // Picking a copy destination is only used internally by us, so we
73004ec6f4f092f1c2d56ef6213019ce4b9068b8a0aJeff Sharkey            // don't need to extend permissions to the caller.
73104ec6f4f092f1c2d56ef6213019ce4b9068b8a0aJeff Sharkey            intent.putExtra(CopyService.EXTRA_STACK, (Parcelable) mState.stack);
73254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } else {
73354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
73454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
735e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey                    | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
73654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
73754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
73854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        setResult(Activity.RESULT_OK, intent);
73954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        finish();
74054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
74154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
742ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    public static DocumentsActivity get(Fragment fragment) {
743ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        return (DocumentsActivity) fragment.getActivity();
744ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    }
745ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
746ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    private final class PickFinishTask extends AsyncTask<Void, Void, Void> {
747ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        private final Uri mUri;
748ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
749ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        public PickFinishTask(Uri uri) {
750ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            mUri = uri;
751ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
752ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
753ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        @Override
754ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        protected Void doInBackground(Void... params) {
755ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            saveStackBlocking();
756ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            return null;
757ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
758ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
759ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        @Override
760ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        protected void onPostExecute(Void result) {
761ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            onTaskFinished(mUri);
762ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
763ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    }
764ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
765ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    final class ExistingFinishTask extends AsyncTask<Void, Void, Void> {
766ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        private final Uri[] mUris;
767ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
768ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        public ExistingFinishTask(Uri... uris) {
769ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            mUris = uris;
770ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
771ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
772ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        @Override
773ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        protected Void doInBackground(Void... params) {
774ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            saveStackBlocking();
775ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            return null;
776ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
777ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
778ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        @Override
779ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        protected void onPostExecute(Void result) {
780ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay            onTaskFinished(mUris);
781ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay        }
782ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    }
783ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay
784ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    /**
785ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay     * Task that creates a new document in the background.
786ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay     */
787ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay    final class CreateFinishTask extends AsyncTask<Void, Void, Uri> {
7886efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        private final String mMimeType;
7896efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        private final String mDisplayName;
7906efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
7916efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        public CreateFinishTask(String mimeType, String displayName) {
7926efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            mMimeType = mimeType;
7936efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            mDisplayName = displayName;
7946efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        }
7956efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
7966efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        @Override
79704d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey        protected void onPreExecute() {
79804d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey            setPending(true);
79904d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey        }
80004d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey
80104d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey        @Override
8026efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        protected Uri doInBackground(Void... params) {
8037aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            final ContentResolver resolver = getContentResolver();
8046efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            final DocumentInfo cwd = getCurrentDirectory();
8057aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey
8067aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            ContentProviderClient client = null;
8077aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            Uri childUri = null;
8087aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            try {
8097aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey                client = DocumentsApplication.acquireUnstableProviderOrThrow(
8107aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey                        resolver, cwd.derivedUri.getAuthority());
8117aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey                childUri = DocumentsContract.createDocument(
8127aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey                        client, cwd.derivedUri, mMimeType, mDisplayName);
8137aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            } catch (Exception e) {
8147aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey                Log.w(TAG, "Failed to create document", e);
8157aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            } finally {
8167aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey                ContentProviderClient.releaseQuietly(client);
8177aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey            }
8187aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey
8196efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (childUri != null) {
8206efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                saveStackBlocking();
8216efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
8227aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey
8236efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            return childUri;
8246efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        }
8256efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
8266efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        @Override
8276efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        protected void onPostExecute(Uri result) {
8286efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (result != null) {
829ef3e2cf35fbede340d5ff830b410baea8e461a94Steve McKay                onTaskFinished(result);
8306efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            } else {
8316efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                Toast.makeText(DocumentsActivity.this, R.string.save_error, Toast.LENGTH_SHORT)
8326efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        .show();
8336efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
83404d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey
83504d45a0bdd47c243ad7ccb179aa52a83e7bf45dbJeff Sharkey            setPending(false);
8366efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        }
8376efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
8389e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey}
839