PickActivity.java revision f7adc939ea1191816a0a7572509d18d0659161ce
1e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey/*
2e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey *
4e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * you may not use this file except in compliance with the License.
6e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * You may obtain a copy of the License at
7e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey *
8e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey *
10e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * See the License for the specific language governing permissions and
14e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey * limitations under the License.
15e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey */
16e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
17e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeypackage com.android.documentsui;
18e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
1909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport static com.android.documentsui.DirectoryFragment.getCursorString;
2009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
2109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.app.ActionBar;
2209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.app.ActionBar.OnNavigationListener;
23e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.app.Activity;
24f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.app.AlertDialog;
25f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.app.Dialog;
26f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.app.DialogFragment;
27e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.app.FragmentManager;
2809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.app.FragmentManager.BackStackEntry;
2909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.app.FragmentManager.OnBackStackChangedListener;
30c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkeyimport android.content.ClipData;
31c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkeyimport android.content.ContentResolver;
32f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.content.ContentValues;
33e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.content.Context;
34f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.content.DialogInterface;
35f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.content.DialogInterface.OnClickListener;
36e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.content.Intent;
37e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.content.pm.PackageManager;
3809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.content.pm.ResolveInfo;
3909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.database.Cursor;
4009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.graphics.drawable.Drawable;
41e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.net.Uri;
42e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.os.Bundle;
43e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.provider.DocumentsContract;
4409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.provider.DocumentsContract.DocumentColumns;
45e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.util.Log;
46e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.view.LayoutInflater;
4709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.view.Menu;
4809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.view.MenuItem;
49e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.view.View;
50e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeyimport android.view.ViewGroup;
5109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.widget.BaseAdapter;
52f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport android.widget.EditText;
5309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkeyimport android.widget.TextView;
54e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
55f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkeyimport com.android.documentsui.BackendFragment.Root;
56f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
57c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkeyimport java.util.Arrays;
58c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkeyimport java.util.List;
59c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey
60e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkeypublic class DocumentsActivity extends Activity {
61e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey    private static final String TAG = "Documents";
62e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
6309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    // TODO: fragment to show recently opened documents
6409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    // TODO: pull actionbar icon from current backend
6509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
663c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    private static final int ACTION_OPEN = 1;
673c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    private static final int ACTION_CREATE = 2;
6809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
693c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    private int mAction;
70c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey    private String[] mAcceptMimes;
71c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey
723c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    private final DisplayState mDisplayState = new DisplayState();
733c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
7409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    private boolean mIgnoreNextNavigation;
7509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
7609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    private Uri mCurrentDir;
7709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    private boolean mCurrentSupportsCreate;
7809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
79e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey    @Override
80e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey    public void onCreate(Bundle icicle) {
81e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        super.onCreate(icicle);
82e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
83c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        final Intent intent = getIntent();
84c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        final String action = intent.getAction();
8509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
863c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            mAction = ACTION_OPEN;
873c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            mDisplayState.allowMultiple = intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
8809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
893c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            mAction = ACTION_CREATE;
903c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            mDisplayState.allowMultiple = false;
91c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        }
92c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey
93c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
94c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            mAcceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
95c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        } else {
96c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            mAcceptMimes = new String[] { intent.getType() };
9709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
9809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
993c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        if (mimeMatches("image/*", mAcceptMimes)) {
1003c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            mDisplayState.mode = DisplayState.MODE_GRID;
1013c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        } else {
1023c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            mDisplayState.mode = DisplayState.MODE_LIST;
1033c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        }
1043c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
105e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        setResult(Activity.RESULT_CANCELED);
10609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        setContentView(R.layout.activity);
10709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
10809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        getFragmentManager().addOnBackStackChangedListener(mStackListener);
10909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        BackendFragment.show(getFragmentManager());
11009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
11109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        updateActionBar();
11209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
1133c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        if (mAction == ACTION_CREATE) {
11409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final String mimeType = getIntent().getType();
11509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
11609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            SaveFragment.show(getFragmentManager(), mimeType, title);
11709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
118e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey    }
119e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
12009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public void updateActionBar() {
12109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        final FragmentManager fm = getFragmentManager();
12209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        final ActionBar actionBar = getActionBar();
123e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
12409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        if (fm.getBackStackEntryCount() > 0) {
12509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
12609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setDisplayShowHomeEnabled(true);
12709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setDisplayHomeAsUpEnabled(true);
12809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setTitle(null);
12909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setListNavigationCallbacks(mStackAdapter, mNavigationListener);
13009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setSelectedNavigationItem(mStackAdapter.getCount() - 1);
13109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            mIgnoreNextNavigation = true;
132e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
13309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        } else {
13409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
13509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setDisplayShowHomeEnabled(false);
13609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            actionBar.setDisplayHomeAsUpEnabled(false);
13709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
1383c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            if (mAction == ACTION_OPEN) {
13909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                actionBar.setTitle(R.string.title_open);
1403c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            } else if (mAction == ACTION_CREATE) {
14109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                actionBar.setTitle(R.string.title_save);
14209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            }
143e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        }
14409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
145e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
14609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    @Override
14709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public boolean onCreateOptionsMenu(Menu menu) {
14809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        super.onCreateOptionsMenu(menu);
14909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        getMenuInflater().inflate(R.menu.activity, menu);
15009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        return true;
15109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
15209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
15309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    @Override
15409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
15509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        super.onPrepareOptionsMenu(menu);
15609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
15709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
1583c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        createDir.setVisible(mAction == ACTION_CREATE);
15909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        createDir.setEnabled(mCurrentSupportsCreate);
16009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
16109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        return true;
162e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey    }
163e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
16409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    @Override
16509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public boolean onOptionsItemSelected(MenuItem item) {
16609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        final int id = item.getItemId();
16709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        if (id == android.R.id.home) {
16809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            getFragmentManager().popBackStack();
16909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            updateActionBar();
17009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        } else if (id == R.id.menu_create_dir) {
171f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            CreateDirectoryFragment.show(getFragmentManager());
17209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
17309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        return super.onOptionsItemSelected(item);
17409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
17509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
17609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    private OnBackStackChangedListener mStackListener = new OnBackStackChangedListener() {
17709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        @Override
17809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public void onBackStackChanged() {
17909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            updateActionBar();
18009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
18109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    };
18209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
18309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    private BaseAdapter mStackAdapter = new BaseAdapter() {
18409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        @Override
18509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public int getCount() {
18609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return getFragmentManager().getBackStackEntryCount();
18709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
188e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
18909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        @Override
19009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public Object getItem(int position) {
19109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return getFragmentManager().getBackStackEntryAt(position);
19209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
193e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
19409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        @Override
19509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public long getItemId(int position) {
19609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return getFragmentManager().getBackStackEntryAt(position).getId();
197e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        }
198e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
199e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        @Override
20009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public View getView(int position, View convertView, ViewGroup parent) {
20109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            if (convertView == null) {
20209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                convertView = LayoutInflater.from(parent.getContext())
20309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                        .inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
204e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey            }
205e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
20609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final BackStackEntry entry = getFragmentManager().getBackStackEntryAt(position);
20709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
20809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            text1.setText(entry.getBreadCrumbTitle());
209e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
21009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return convertView;
211e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        }
21209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    };
213e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey
21409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    private OnNavigationListener mNavigationListener = new OnNavigationListener() {
215e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        @Override
21609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
21709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            if (mIgnoreNextNavigation) {
21809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                mIgnoreNextNavigation = false;
21909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                return false;
22009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            }
22109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
22209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            getFragmentManager().popBackStack((int) itemId, 0);
22309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return true;
22409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
22509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    };
22609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
2273c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    public DisplayState getDisplayState() {
2283c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        return mDisplayState;
2293c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    }
2303c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
23109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public void onDirectoryChanged(Uri uri, int flags) {
23209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        mCurrentDir = uri;
23309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        mCurrentSupportsCreate = (flags & DocumentsContract.FLAG_SUPPORTS_CREATE) != 0;
23409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
2353c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        if (mAction == ACTION_CREATE) {
23609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final FragmentManager fm = getFragmentManager();
23709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            SaveFragment.get(fm).setSaveEnabled(mCurrentSupportsCreate);
23809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
23909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
24009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        invalidateOptionsMenu();
24109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
24209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
243f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey    public void onRootPicked(Root root) {
244f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        DirectoryFragment.show(getFragmentManager(), root.uri, root.title);
24509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
24609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
24709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public void onDocumentPicked(Document doc) {
24809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        final FragmentManager fm = getFragmentManager();
24909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(doc.mimeType)) {
25009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            // Nested directory picked, recurse using new fragment
2513c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            DirectoryFragment.show(fm, doc.uri, doc.displayName);
2523c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        } else if (mAction == ACTION_OPEN) {
25309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            // Explicit file picked, return
25409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            onFinished(doc.uri);
2553c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        } else if (mAction == ACTION_CREATE) {
25609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            // Overwrite current filename
25709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            SaveFragment.get(fm).setDisplayName(doc.displayName);
25809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
25909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
26009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
261c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey    public void onDocumentsPicked(List<Document> docs) {
262c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        final int size = docs.size();
263c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        final Uri[] uris = new Uri[size];
264c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        for (int i = 0; i < size; i++) {
265c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            uris[i] = docs.get(i).uri;
266c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        }
267c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        onFinished(uris);
268c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey    }
269c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey
27009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public void onSaveRequested(String mimeType, String displayName) {
271f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        final ContentValues values = new ContentValues();
272f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        values.put(DocumentColumns.MIME_TYPE, mimeType);
273f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        values.put(DocumentColumns.DISPLAY_NAME, displayName);
274f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
275f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        // TODO: handle errors from remote side
276f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        final Uri uri = getContentResolver().insert(mCurrentDir, values);
277c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        onFinished(uri);
27809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
27909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
280c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey    private void onFinished(Uri... uris) {
281c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        Log.d(TAG, "onFinished() " + Arrays.toString(uris));
28209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
28309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        final Intent intent = new Intent();
284c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        if (uris.length == 1) {
285c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            intent.setData(uris[0]);
286c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        } else if (uris.length > 1) {
287c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            final ContentResolver resolver = getContentResolver();
288c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            final ClipData clipData = new ClipData(null, mAcceptMimes, new ClipData.Item(uris[0]));
289c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            for (int i = 1; i < uris.length; i++) {
290c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey                clipData.addItem(new ClipData.Item(uris[i]));
291c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            }
292c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey            intent.setClipData(clipData);
293c317af8d44d225b63e5e8879b218f1a7575604d7Jeff Sharkey        }
29409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
295f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        // TODO: omit WRITE and PERSIST for GET_CONTENT
296f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
297f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
298f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
29909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
30009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        setResult(Activity.RESULT_OK, intent);
30109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        finish();
30209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
30309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
3043c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    public static class DisplayState {
3053c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public int mode;
3063c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public int sortBy;
3073c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public boolean allowMultiple;
3083c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
3093c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public static final int MODE_LIST = 0;
3103c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public static final int MODE_GRID = 1;
3113c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
3123c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public static final int SORT_BY_NAME = 0;
3133c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        public static final int SORT_BY_DATE = 1;
3143c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    }
3153c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
31609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public static class Document {
31709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public Uri uri;
31809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public String mimeType;
31909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public String displayName;
32009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
32109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        public static Document fromCursor(String authority, Cursor cursor) {
32209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final Document doc = new Document();
32309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final String guid = getCursorString(cursor, DocumentColumns.GUID);
32409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            doc.uri = DocumentsContract.buildDocumentUri(authority, guid);
32509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            doc.mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
32609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            doc.displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
32709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return doc;
32809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        }
329f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
330f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        public static Document fromUri(ContentResolver resolver, Uri uri) {
331f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final Document doc = new Document();
332f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            doc.uri = uri;
333f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
334f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final Cursor cursor = resolver.query(uri, null, null, null, null);
335f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            try {
336f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                if (!cursor.moveToFirst()) {
337f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    throw new IllegalArgumentException("Missing details for " + uri);
338f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                }
339f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                doc.mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
340f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                doc.displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
341f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            } finally {
342f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                cursor.close();
343f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            }
344f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
345f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            return doc;
346f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        }
34709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    }
34809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
3493c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    public static boolean mimeMatches(String filter, String[] tests) {
3503c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        for (String test : tests) {
3513c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            if (mimeMatches(filter, test)) {
3523c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey                return true;
3533c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            }
3543c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        }
3553c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        return false;
3563c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    }
3573c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
3583c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    public static boolean mimeMatches(String filter, String test) {
3593c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        if (filter.equals(test)) {
3603c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            return true;
3613c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        } else if ("*/*".equals(filter)) {
3623c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            return true;
3633c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        } else if (filter.endsWith("/*")) {
3643c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            return filter.regionMatches(0, test, 0, filter.indexOf('/'));
3653c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        } else {
3663c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey            return false;
3673c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey        }
3683c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey    }
3693c28b79c0b1c380a030dedf1c8e4148e8ca35f5aJeff Sharkey
37009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey    public static Drawable resolveDocumentIcon(Context context, String mimeType) {
37109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        // TODO: allow backends to provide custom MIME icons
37209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(mimeType)) {
37309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            return context.getResources().getDrawable(R.drawable.ic_dir);
37409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey        } else {
37509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final PackageManager pm = context.getPackageManager();
37609c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final Intent intent = new Intent(Intent.ACTION_VIEW);
37709c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            intent.setType(mimeType);
37809c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey
37909c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            final ResolveInfo info = pm.resolveActivity(
38009c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                    intent, PackageManager.MATCH_DEFAULT_ONLY);
38109c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            if (info != null) {
38209c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                return info.loadIcon(pm);
38309c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            } else {
38409c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey                return null;
38509c10bf0b982cda69fadc182841c23d6792f0471Jeff Sharkey            }
386e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey        }
387e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey    }
388f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
389f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey    private static final String TAG_CREATE_DIRECTORY = "create_directory";
390f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
391f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey    public static class CreateDirectoryFragment extends DialogFragment {
392f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        public static void show(FragmentManager fm) {
393f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final CreateDirectoryFragment dialog = new CreateDirectoryFragment();
394f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            dialog.show(fm, TAG_CREATE_DIRECTORY);
395f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        }
396f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
397f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        @Override
398f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        public Dialog onCreateDialog(Bundle savedInstanceState) {
399f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final Context context = getActivity();
400f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final ContentResolver resolver = context.getContentResolver();
401f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
402f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
403f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext());
404f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
405f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final View view = dialogInflater.inflate(R.layout.dialog_create_dir, null, false);
406f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            final EditText text1 = (EditText)view.findViewById(android.R.id.text1);
407f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
408f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            builder.setTitle(R.string.menu_create_dir);
409f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            builder.setView(view);
410f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
411f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
412f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                @Override
413f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                public void onClick(DialogInterface dialog, int which) {
414f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    final String displayName = text1.getText().toString();
415f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
416f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    final ContentValues values = new ContentValues();
417f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    values.put(DocumentColumns.MIME_TYPE, DocumentsContract.MIME_TYPE_DIRECTORY);
418f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    values.put(DocumentColumns.DISPLAY_NAME, displayName);
419f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
420f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    // TODO: handle errors from remote side
421f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    final DocumentsActivity activity = (DocumentsActivity) getActivity();
422f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    final Uri uri = resolver.insert(activity.mCurrentDir, values);
423f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
424f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    // Navigate into newly created child
425f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    final Document doc = Document.fromUri(resolver, uri);
426f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                    activity.onDocumentPicked(doc);
427f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey                }
428f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            });
429f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            builder.setNegativeButton(android.R.string.cancel, null);
430f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey
431f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey            return builder.create();
432f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey        }
433f7adc939ea1191816a0a7572509d18d0659161ceJeff Sharkey    }
434e22d02ecf489473c9983c554de308306e2741b7Jeff Sharkey}
435