DocumentsActivity.java revision a5599ef636e37cb0b6474349936999be1afe6987
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
1954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.ActionBar;
2054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.ActionBar.OnNavigationListener;
219e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.Activity;
229fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.app.Fragment;
239e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.FragmentManager;
24be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ClipData;
2554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyimport android.content.ComponentName;
26be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ContentResolver;
2720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.content.ContentValues;
289e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.content.Intent;
2954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyimport android.content.pm.ResolveInfo;
3054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.database.Cursor;
31bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.graphics.drawable.ColorDrawable;
329e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.net.Uri;
339e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.os.Bundle;
34a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkeyimport android.provider.DocumentsContract;
3554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.provider.DocumentsContract.DocumentColumns;
36bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.app.ActionBarDrawerToggle;
37bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.view.GravityCompat;
38bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.widget.DrawerLayout;
39bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.widget.DrawerLayout.DrawerListener;
409e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.util.Log;
419e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.LayoutInflater;
4254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.Menu;
4354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.MenuItem;
449e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.View;
459e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.ViewGroup;
4654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.BaseAdapter;
47bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.widget.SearchView;
48b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkeyimport android.widget.SearchView.OnCloseListener;
49bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.widget.SearchView.OnQueryTextListener;
5054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.TextView;
517e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkeyimport android.widget.Toast;
529e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
53ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport com.android.documentsui.model.Document;
54b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkeyimport com.android.documentsui.model.DocumentStack;
55ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport com.android.documentsui.model.Root;
5620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
570c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkeyimport java.io.FileNotFoundException;
58be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport java.util.Arrays;
59be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport java.util.List;
60be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
619e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeypublic class DocumentsActivity extends Activity {
62ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    public static final String TAG = "Documents";
639e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
64b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    public static final int ACTION_OPEN = 1;
65b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    public static final int ACTION_CREATE = 2;
6654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    public static final int ACTION_GET_CONTENT = 3;
67a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey    public static final int ACTION_MANAGE = 4;
6854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
691482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    private int mAction;
70be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
71bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private SearchView mSearchView;
72bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
7366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    private View mRootsContainer;
74bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private DrawerLayout mDrawerLayout;
75bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private ActionBarDrawerToggle mDrawerToggle;
76bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
771482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    private final DisplayState mDisplayState = new DisplayState();
781482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
79b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    /** Current user navigation stack; empty implies recents. */
80255b4a6fdb8296e95e6ee57f7155ecc0cb995650Jeff Sharkey    private DocumentStack mStack = new DocumentStack();
81b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    /** Currently active search, overriding any stack. */
82b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    private String mCurrentSearch;
8354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
849e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    @Override
859e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    public void onCreate(Bundle icicle) {
869e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        super.onCreate(icicle);
879e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
88be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final Intent intent = getIntent();
89be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final String action = intent.getAction();
9054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
911482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mAction = ACTION_OPEN;
9254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
931482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mAction = ACTION_CREATE;
9454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
9554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            mAction = ACTION_GET_CONTENT;
96a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        } else if (Intent.ACTION_MANAGE_DOCUMENT.equals(action)) {
97a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mAction = ACTION_MANAGE;
9854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
9954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
10054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
10154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            mDisplayState.allowMultiple = intent.getBooleanExtra(
10254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    Intent.EXTRA_ALLOW_MULTIPLE, false);
103be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
104be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
105a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        if (mAction == ACTION_MANAGE) {
106a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDisplayState.acceptMimes = new String[] { "*/*" };
107a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
108ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            mDisplayState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
109be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        } else {
110ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            mDisplayState.acceptMimes = new String[] { intent.getType() };
11154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
11254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
11354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        mDisplayState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
1141482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
1159e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        setResult(Activity.RESULT_CANCELED);
11654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        setContentView(R.layout.activity);
11754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1181482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        if (mAction == ACTION_CREATE) {
11954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String mimeType = getIntent().getType();
12054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
12154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            SaveFragment.show(getFragmentManager(), mimeType, title);
12254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
123bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
12454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        if (mAction == ACTION_GET_CONTENT) {
12554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            final Intent moreApps = new Intent(getIntent());
12654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            moreApps.setComponent(null);
12754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            moreApps.setPackage(null);
12854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            RootsFragment.show(getFragmentManager(), moreApps);
129a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        } else if (mAction == ACTION_OPEN || mAction == ACTION_CREATE) {
13054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            RootsFragment.show(getFragmentManager(), null);
13154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
13266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
133a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        if (mAction == ACTION_MANAGE) {
134a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDisplayState.sortOrder = DisplayState.SORT_ORDER_DATE;
135a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        }
136a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
13766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        mRootsContainer = findViewById(R.id.container_roots);
13866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
139bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
140bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
141bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
142bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
143bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
144bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mDrawerLayout.setDrawerListener(mDrawerListener);
145bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
146bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
147a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        if (mAction == ACTION_MANAGE) {
148a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
149a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
150a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            final Uri rootUri = intent.getData();
151a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            final String authority = rootUri.getAuthority();
152a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            final String rootId = DocumentsContract.getRootId(rootUri);
153a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
154a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            final Root root = RootsCache.findRoot(this, authority, rootId);
155a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            if (root != null) {
156a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                onRootPicked(root, true);
157a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            } else {
158a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                Log.w(TAG, "Failed to find root: " + rootUri);
159a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                finish();
160a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            }
161a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
162a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        } else {
163a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDrawerLayout.openDrawer(mRootsContainer);
164a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
165a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            // Restore last stack for calling package
166a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            // TODO: move into async loader
167a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            final String packageName = getCallingPackage();
168a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            final Cursor cursor = getContentResolver()
169a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                    .query(RecentsProvider.buildResume(packageName), null, null, null, null);
170a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            try {
171a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                if (cursor.moveToFirst()) {
172a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                    final String raw = cursor.getString(
173a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                            cursor.getColumnIndex(RecentsProvider.COL_PATH));
174a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                    mStack = DocumentStack.deserialize(getContentResolver(), raw);
175a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                }
176a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            } catch (FileNotFoundException e) {
177a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                Log.w(TAG, "Failed to resume", e);
178a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            } finally {
179a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                cursor.close();
180dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            }
181a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
182a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            onCurrentDirectoryChanged();
183dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
184a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey    }
185dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
186a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey    @Override
187a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey    public void onStart() {
188a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        super.onStart();
189a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
190a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        if (mAction == ACTION_MANAGE) {
191a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDisplayState.showSize = true;
192a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        } else {
193a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDisplayState.showSize = SettingsActivity.getDisplayFileSize(this);
194a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        }
195bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    }
196bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
197bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private DrawerListener mDrawerListener = new DrawerListener() {
198bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
199bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerSlide(View drawerView, float slideOffset) {
200bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerSlide(drawerView, slideOffset);
201bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
202bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
203bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
204bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerOpened(View drawerView) {
205bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerOpened(drawerView);
206bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            updateActionBar();
207bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
208bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
209bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
210bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerClosed(View drawerView) {
211bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerClosed(drawerView);
212bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            updateActionBar();
213bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
214bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
215bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
216bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public void onDrawerStateChanged(int newState) {
217bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            mDrawerToggle.onDrawerStateChanged(newState);
218bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
219bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    };
220bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
221bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    @Override
222bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    protected void onPostCreate(Bundle savedInstanceState) {
223bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        super.onPostCreate(savedInstanceState);
224bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mDrawerToggle.syncState();
2259e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
2269e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
22754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void updateActionBar() {
22854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final ActionBar actionBar = getActionBar();
2299e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
230bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        actionBar.setDisplayShowHomeEnabled(true);
2319e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
23266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        if (mDrawerLayout.isDrawerOpen(mRootsContainer)) {
23354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
234bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            actionBar.setIcon(new ColorDrawable());
23554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
23654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
23754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                actionBar.setTitle(R.string.title_open);
2381482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            } else if (mAction == ACTION_CREATE) {
23954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                actionBar.setTitle(R.string.title_save);
24054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            }
241bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
242a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            actionBar.setDisplayHomeAsUpEnabled(true);
243a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            mDrawerToggle.setDrawerIndicatorEnabled(true);
244a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
245bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        } else {
246dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            final Root root = getCurrentRoot();
247dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            actionBar.setIcon(root != null ? root.icon : null);
248ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
249b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            if (root.isRecents) {
250ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
251ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                actionBar.setTitle(root.title);
252ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            } else {
253ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
254ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                actionBar.setTitle(null);
255ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                actionBar.setListNavigationCallbacks(mSortAdapter, mSortListener);
256ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                actionBar.setSelectedNavigationItem(mDisplayState.sortOrder);
257ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            }
258bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
259dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            if (mStack.size() > 1) {
260a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                actionBar.setDisplayHomeAsUpEnabled(true);
261a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                mDrawerToggle.setDrawerIndicatorEnabled(false);
262a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            } else if (mAction == ACTION_MANAGE) {
263a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                actionBar.setDisplayHomeAsUpEnabled(false);
264bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                mDrawerToggle.setDrawerIndicatorEnabled(false);
265bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            } else {
266a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey                actionBar.setDisplayHomeAsUpEnabled(true);
267bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                mDrawerToggle.setDrawerIndicatorEnabled(true);
268bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
2699e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
27054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
2719e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
27254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
27354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onCreateOptionsMenu(Menu menu) {
27454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        super.onCreateOptionsMenu(menu);
27554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        getMenuInflater().inflate(R.menu.activity, menu);
276bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
277bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        final MenuItem searchMenu = menu.findItem(R.id.menu_search);
278bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mSearchView = (SearchView) searchMenu.getActionView();
279bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        mSearchView.setOnQueryTextListener(new OnQueryTextListener() {
280bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            @Override
281bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            public boolean onQueryTextSubmit(String query) {
282b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                mCurrentSearch = query;
2839fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                onCurrentDirectoryChanged();
284bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                mSearchView.setIconified(true);
285bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                return true;
286bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
287bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
288bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            @Override
289bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            public boolean onQueryTextChange(String newText) {
290bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                return false;
291bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
292bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        });
293bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
294b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        mSearchView.setOnCloseListener(new OnCloseListener() {
295b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            @Override
296b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            public boolean onClose() {
297b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                mCurrentSearch = null;
2989fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                onCurrentDirectoryChanged();
299b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                return false;
300b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            }
301b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        });
302b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
30354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return true;
30454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
30554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
30654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
30754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
30854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        super.onPrepareOptionsMenu(menu);
30954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
3109fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        final FragmentManager fm = getFragmentManager();
311dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final Document cwd = getCurrentDirectory();
312dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
31354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
314bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        final MenuItem search = menu.findItem(R.id.menu_search);
3159fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        final MenuItem grid =  menu.findItem(R.id.menu_grid);
3169fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        final MenuItem list = menu.findItem(R.id.menu_list);
317a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        final MenuItem settings = menu.findItem(R.id.menu_settings);
318dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
3199fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        grid.setVisible(mDisplayState.mode != DisplayState.MODE_GRID);
3209fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        list.setVisible(mDisplayState.mode != DisplayState.MODE_LIST);
3219fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
3229fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        final boolean searchVisible;
323dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        if (mAction == ACTION_CREATE) {
3249fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            createDir.setVisible(cwd != null && cwd.isCreateSupported());
3259fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            searchVisible = false;
3269fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
3279fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            // No display options in recent directories
3289fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            if (cwd == null) {
3299fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                grid.setVisible(false);
3309fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                list.setVisible(false);
3319fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            }
3329fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
333dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            SaveFragment.get(fm).setSaveEnabled(cwd != null && cwd.isCreateSupported());
3349fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        } else {
3359fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            createDir.setVisible(false);
3369fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            searchVisible = cwd != null && cwd.isSearchSupported();
337dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
338bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
3399fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        // TODO: close any search in-progress when hiding
3409fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        search.setVisible(searchVisible);
341b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
342a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        settings.setVisible(mAction != ACTION_MANAGE);
343a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey
34454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return true;
3459e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
3469e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
34754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
34854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onOptionsItemSelected(MenuItem item) {
349bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        if (mDrawerToggle.onOptionsItemSelected(item)) {
350bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return true;
351bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
352bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
35354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final int id = item.getItemId();
35454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (id == android.R.id.home) {
355dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            onBackPressed();
356bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return true;
35754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        } else if (id == R.id.menu_create_dir) {
35820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            CreateDirectoryFragment.show(getFragmentManager());
359bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return true;
360bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        } else if (id == R.id.menu_search) {
361bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return false;
362b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else if (id == R.id.menu_grid) {
363b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            mDisplayState.mode = DisplayState.MODE_GRID;
364b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            updateDisplayState();
365b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            invalidateOptionsMenu();
366b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            return true;
367b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else if (id == R.id.menu_list) {
368b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            mDisplayState.mode = DisplayState.MODE_LIST;
369b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            updateDisplayState();
370b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            invalidateOptionsMenu();
371b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            return true;
3729fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        } else if (id == R.id.menu_settings) {
3739fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            startActivity(new Intent(this, SettingsActivity.class));
3749fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            return true;
375b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else {
376b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            return super.onOptionsItemSelected(item);
37754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
37854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
37954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
380dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    @Override
381dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    public void onBackPressed() {
382dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final int size = mStack.size();
383dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        if (size > 1) {
384dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            mStack.pop();
3859fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            onCurrentDirectoryChanged();
38666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        } else if (size == 1 && !mDrawerLayout.isDrawerOpen(mRootsContainer)) {
387dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            // TODO: open root drawer once we can capture back key
388dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            super.onBackPressed();
389dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        } else {
390dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            super.onBackPressed();
39154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
392dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    }
39354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
394bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    // TODO: support additional sort orders
395bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private BaseAdapter mSortAdapter = new BaseAdapter() {
39654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
39754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public int getCount() {
3989fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            return mDisplayState.showSize ? 3 : 2;
39954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
4009e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
40154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
40254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public Object getItem(int position) {
403bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            switch (position) {
404bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                case 0:
405bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                    return getText(R.string.sort_name);
406bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                case 1:
407bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                    return getText(R.string.sort_date);
4089fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                case 2:
4099fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                    return getText(R.string.sort_size);
410bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                default:
411bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                    return null;
412bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
41354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
4149e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
41554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
41654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public long getItemId(int position) {
417bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return position;
4189e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
4199e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
4209e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        @Override
42154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public View getView(int position, View convertView, ViewGroup parent) {
42254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            if (convertView == null) {
42354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                convertView = LayoutInflater.from(parent.getContext())
424bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                        .inflate(R.layout.item_title, parent, false);
425bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
426bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
427bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            final TextView title = (TextView) convertView.findViewById(android.R.id.title);
428bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
429bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
430dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            final Document cwd = getCurrentDirectory();
431dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            if (cwd != null) {
432dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey                title.setText(cwd.displayName);
433bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            } else {
434b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                // No directory means recents
435b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                title.setText(R.string.root_recent);
436bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            }
437bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
438bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            summary.setText((String) getItem(position));
439bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
440bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            return convertView;
441bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        }
442bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey
443bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        @Override
444bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey        public View getDropDownView(int position, View convertView, ViewGroup parent) {
445bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            if (convertView == null) {
446bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey                convertView = LayoutInflater.from(parent.getContext())
44754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                        .inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
4489e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey            }
4499e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
45054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
451bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey            text1.setText((String) getItem(position));
4529e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
45354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return convertView;
4549e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
45554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    };
4569e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
457bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey    private OnNavigationListener mSortListener = new OnNavigationListener() {
4589e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        @Override
45954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
460ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            mDisplayState.sortOrder = itemPosition;
461b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            updateDisplayState();
46254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return true;
46354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
46454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    };
46554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
466dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    public Root getCurrentRoot() {
467b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        final Document cwd = getCurrentDirectory();
468b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (cwd != null) {
469b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            return RootsCache.findRoot(this, cwd);
470b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else {
471b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            return RootsCache.getRecentsRoot(this);
472b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        }
473dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    }
474dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
475dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    public Document getCurrentDirectory() {
476dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        return mStack.peek();
477dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    }
478dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
4791482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    public DisplayState getDisplayState() {
4801482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        return mDisplayState;
4811482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
4821482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
4839fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    private void onCurrentDirectoryChanged() {
484dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final FragmentManager fm = getFragmentManager();
485dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final Document cwd = getCurrentDirectory();
4869fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
487b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (cwd == null) {
488b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            // No directory means recents
489b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            if (mAction == ACTION_CREATE) {
490b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                RecentsCreateFragment.show(fm);
491b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            } else {
492b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                DirectoryFragment.showRecentsOpen(fm);
493b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            }
494b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else {
495b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            if (mCurrentSearch != null) {
496b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                // Ongoing search
497b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                DirectoryFragment.showSearch(fm, cwd.uri, mCurrentSearch);
498b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            } else {
499b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                // Normal boring directory
500b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey                DirectoryFragment.showNormal(fm, cwd.uri);
501b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            }
50254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
503b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
5049fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        // Forget any replacement target
5059fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        if (mAction == ACTION_CREATE) {
5069fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            final SaveFragment save = SaveFragment.get(fm);
5079fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            if (save != null) {
5089fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                save.setReplaceTarget(null);
5099fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            }
5109fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        }
5119fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
512dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        updateActionBar();
51354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        invalidateOptionsMenu();
514dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        dumpStack();
51554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
51654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
517b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    private void updateDisplayState() {
518b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        // TODO: handle multiple directory stacks on tablets
519b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        DirectoryFragment.get(getFragmentManager()).updateDisplayState();
520b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    }
521b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
522b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    public void onStackPicked(DocumentStack stack) {
523b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        mStack = stack;
5249fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        onCurrentDirectoryChanged();
525b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey    }
526b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
52766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    public void onRootPicked(Root root, boolean closeDrawer) {
528ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        // Clear entire backstack and start in new root
529ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        mStack.clear();
530b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey
531b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (!root.isRecents) {
5320c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey            try {
5330c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey                onDocumentPicked(Document.fromRoot(getContentResolver(), root));
5340c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey            } catch (FileNotFoundException e) {
5350c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey            }
536b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        } else {
5379fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            onCurrentDirectoryChanged();
538b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        }
53966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
54066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        if (closeDrawer) {
54166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            mDrawerLayout.closeDrawers();
54266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        }
543ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
544ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
54554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    public void onAppPicked(ResolveInfo info) {
54654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        final Intent intent = new Intent(getIntent());
54754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
54854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        intent.setComponent(new ComponentName(
54954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                info.activityInfo.applicationInfo.packageName, info.activityInfo.name));
55054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        startActivity(intent);
55154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        finish();
55254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    }
55354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
55454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void onDocumentPicked(Document doc) {
55554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final FragmentManager fm = getFragmentManager();
556b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (doc.isDirectory()) {
557dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            mStack.push(doc);
5589fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            onCurrentDirectoryChanged();
55954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
56054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            // Explicit file picked, return
56154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            onFinished(doc.uri);
5621482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else if (mAction == ACTION_CREATE) {
5639fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            // Replace selected file
5649fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            SaveFragment.get(fm).setReplaceTarget(doc);
56554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
56654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
56754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
568be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    public void onDocumentsPicked(List<Document> docs) {
569be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final int size = docs.size();
570be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final Uri[] uris = new Uri[size];
571be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        for (int i = 0; i < size; i++) {
572be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            uris[i] = docs.get(i).uri;
573be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
574be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        onFinished(uris);
575be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    }
576be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
5779fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    public void onSaveRequested(Document replaceTarget) {
5789fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        onFinished(replaceTarget.uri);
5799fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    }
58092d7e697a864a3e18bef4ef256bb3eb339a66b4eJeff Sharkey
5819fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    public void onSaveRequested(String mimeType, String displayName) {
58220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        final ContentValues values = new ContentValues();
58320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        values.put(DocumentColumns.MIME_TYPE, mimeType);
58420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        values.put(DocumentColumns.DISPLAY_NAME, displayName);
58520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
586dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final Document cwd = getCurrentDirectory();
587dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final Uri childUri = getContentResolver().insert(cwd.uri, values);
588dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        if (childUri != null) {
589dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            onFinished(childUri);
5907e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkey        } else {
5917e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkey            Toast.makeText(this, R.string.save_error, Toast.LENGTH_SHORT).show();
5927e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkey        }
59354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
59454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
595be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    private void onFinished(Uri... uris) {
596be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        Log.d(TAG, "onFinished() " + Arrays.toString(uris));
59754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
598dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final ContentResolver resolver = getContentResolver();
599dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final ContentValues values = new ContentValues();
600dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
601b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        final String rawStack = DocumentStack.serialize(mStack);
602dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        if (mAction == ACTION_CREATE) {
603dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            // Remember stack for last create
604dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            values.clear();
605b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey            values.put(RecentsProvider.COL_PATH, rawStack);
606dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            resolver.insert(RecentsProvider.buildRecentCreate(), values);
607dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
60854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
609dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            // Remember opened items
610dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            for (Uri uri : uris) {
611dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey                values.clear();
612dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey                values.put(RecentsProvider.COL_URI, uri.toString());
613dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey                resolver.insert(RecentsProvider.buildRecentOpen(), values);
614dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            }
615dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
616dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
617dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        // Remember location for next app launch
618dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        final String packageName = getCallingPackage();
619dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        values.clear();
620b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        values.put(RecentsProvider.COL_PATH, rawStack);
621dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        resolver.insert(RecentsProvider.buildResume(packageName), values);
622dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey
62354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final Intent intent = new Intent();
624be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        if (uris.length == 1) {
625be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            intent.setData(uris[0]);
626be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        } else if (uris.length > 1) {
627ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            final ClipData clipData = new ClipData(
628ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                    null, mDisplayState.acceptMimes, new ClipData.Item(uris[0]));
629be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            for (int i = 1; i < uris.length; i++) {
630be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey                clipData.addItem(new ClipData.Item(uris[i]));
631be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            }
632be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            intent.setClipData(clipData);
633be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
63454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
63554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        if (mAction == ACTION_GET_CONTENT) {
63654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
63754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } else {
63854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
63954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
64054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
64154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
64254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
64354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        setResult(Activity.RESULT_OK, intent);
64454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        finish();
64554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
64654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
6471482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    public static class DisplayState {
648ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        public int mode = MODE_LIST;
649ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        public String[] acceptMimes;
650ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        public int sortOrder = SORT_ORDER_NAME;
651ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        public boolean allowMultiple = false;
652b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        public boolean showSize = false;
65354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        public boolean localOnly = false;
6541482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
6551482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public static final int MODE_LIST = 0;
6561482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public static final int MODE_GRID = 1;
6571482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
658ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        public static final int SORT_ORDER_NAME = 0;
659ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        public static final int SORT_ORDER_DATE = 1;
6609fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        public static final int SORT_ORDER_SIZE = 2;
6611482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
6621482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
663dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    private void dumpStack() {
664dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        Log.d(TAG, "Current stack:");
665dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        for (Document doc : mStack) {
666dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey            Log.d(TAG, "--> " + doc);
667dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey        }
668dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey    }
6699fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
6709fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    public static DocumentsActivity get(Fragment fragment) {
6719fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        return (DocumentsActivity) fragment.getActivity();
6729fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    }
6739e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey}
674