DocumentsActivity.java revision 20d96d8aff2193d548977e23ce5158657cac94e0
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 static com.android.documentsui.DirectoryFragment.getCursorString;
2054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
2154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.ActionBar;
2254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.ActionBar.OnNavigationListener;
239e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.Activity;
2420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.app.AlertDialog;
2520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.app.Dialog;
2620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.app.DialogFragment;
279e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.FragmentManager;
2854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.FragmentManager.BackStackEntry;
2954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.FragmentManager.OnBackStackChangedListener;
30be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ClipData;
31be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ContentResolver;
3220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.content.ContentValues;
339e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.content.Context;
3420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.content.DialogInterface;
3520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.content.DialogInterface.OnClickListener;
369e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.content.Intent;
379e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.content.pm.PackageManager;
3854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.content.pm.ResolveInfo;
3954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.database.Cursor;
4054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.graphics.drawable.Drawable;
419e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.net.Uri;
429e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.os.Bundle;
439e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.provider.DocumentsContract;
4454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.provider.DocumentsContract.DocumentColumns;
459e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.util.Log;
469e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.LayoutInflater;
4754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.Menu;
4854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.MenuItem;
499e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.View;
509e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.ViewGroup;
5154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.BaseAdapter;
5220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.widget.EditText;
5354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.TextView;
549e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
5520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport com.android.documentsui.BackendFragment.Root;
5620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
57be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport java.util.Arrays;
58be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport java.util.List;
59be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
609e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeypublic class DocumentsActivity extends Activity {
619e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    private static final String TAG = "Documents";
629e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
6354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    // TODO: fragment to show recently opened documents
6454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    // TODO: pull actionbar icon from current backend
6554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
661482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    private static final int ACTION_OPEN = 1;
671482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    private static final int ACTION_CREATE = 2;
6854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
691482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    private int mAction;
70be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    private String[] mAcceptMimes;
71be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
721482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    private final DisplayState mDisplayState = new DisplayState();
731482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
7454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private boolean mIgnoreNextNavigation;
7554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
7654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private Uri mCurrentDir;
7754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private boolean mCurrentSupportsCreate;
7854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
799e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    @Override
809e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    public void onCreate(Bundle icicle) {
819e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        super.onCreate(icicle);
829e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
83be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final Intent intent = getIntent();
84be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final String action = intent.getAction();
8554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
861482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mAction = ACTION_OPEN;
871482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mDisplayState.allowMultiple = intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
8854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
891482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mAction = ACTION_CREATE;
901482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mDisplayState.allowMultiple = false;
91be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
92be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
93be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
94be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            mAcceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
95be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        } else {
96be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            mAcceptMimes = new String[] { intent.getType() };
9754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
9854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
991482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        if (mimeMatches("image/*", mAcceptMimes)) {
1001482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mDisplayState.mode = DisplayState.MODE_GRID;
1011482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else {
1021482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            mDisplayState.mode = DisplayState.MODE_LIST;
1031482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        }
1041482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
1059e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        setResult(Activity.RESULT_CANCELED);
10654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        setContentView(R.layout.activity);
10754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
10854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        getFragmentManager().addOnBackStackChangedListener(mStackListener);
10954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        BackendFragment.show(getFragmentManager());
11054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
11154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        updateActionBar();
11254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1131482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        if (mAction == ACTION_CREATE) {
11454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String mimeType = getIntent().getType();
11554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
11654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            SaveFragment.show(getFragmentManager(), mimeType, title);
11754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
1189e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
1199e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
12054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void updateActionBar() {
12154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final FragmentManager fm = getFragmentManager();
12254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final ActionBar actionBar = getActionBar();
1239e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
12454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (fm.getBackStackEntryCount() > 0) {
12554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
12654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setDisplayShowHomeEnabled(true);
12754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setDisplayHomeAsUpEnabled(true);
12854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setTitle(null);
12954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setListNavigationCallbacks(mStackAdapter, mNavigationListener);
13054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setSelectedNavigationItem(mStackAdapter.getCount() - 1);
13154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            mIgnoreNextNavigation = true;
1329e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
13354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        } else {
13454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
13554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setDisplayShowHomeEnabled(false);
13654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            actionBar.setDisplayHomeAsUpEnabled(false);
13754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1381482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            if (mAction == ACTION_OPEN) {
13954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                actionBar.setTitle(R.string.title_open);
1401482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            } else if (mAction == ACTION_CREATE) {
14154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                actionBar.setTitle(R.string.title_save);
14254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            }
1439e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
14454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
1459e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
14654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
14754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onCreateOptionsMenu(Menu menu) {
14854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        super.onCreateOptionsMenu(menu);
14954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        getMenuInflater().inflate(R.menu.activity, menu);
15054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return true;
15154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
15254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
15354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
15454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
15554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        super.onPrepareOptionsMenu(menu);
15654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
15754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
1581482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        createDir.setVisible(mAction == ACTION_CREATE);
15954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        createDir.setEnabled(mCurrentSupportsCreate);
16054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
16154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return true;
1629e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
1639e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
16454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
16554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public boolean onOptionsItemSelected(MenuItem item) {
16654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final int id = item.getItemId();
16754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (id == android.R.id.home) {
16854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            getFragmentManager().popBackStack();
16954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            updateActionBar();
17054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        } else if (id == R.id.menu_create_dir) {
17120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            CreateDirectoryFragment.show(getFragmentManager());
17254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
17354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return super.onOptionsItemSelected(item);
17454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
17554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
17654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private OnBackStackChangedListener mStackListener = new OnBackStackChangedListener() {
17754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
17854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public void onBackStackChanged() {
17954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            updateActionBar();
18054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
18154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    };
18254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
18354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private BaseAdapter mStackAdapter = new BaseAdapter() {
18454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
18554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public int getCount() {
18654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return getFragmentManager().getBackStackEntryCount();
18754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
1889e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
18954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
19054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public Object getItem(int position) {
19154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return getFragmentManager().getBackStackEntryAt(position);
19254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
1939e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
19454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
19554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public long getItemId(int position) {
19654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return getFragmentManager().getBackStackEntryAt(position).getId();
1979e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
1989e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
1999e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        @Override
20054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public View getView(int position, View convertView, ViewGroup parent) {
20154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            if (convertView == null) {
20254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                convertView = LayoutInflater.from(parent.getContext())
20354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                        .inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
2049e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey            }
2059e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
20654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final BackStackEntry entry = getFragmentManager().getBackStackEntryAt(position);
20754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
20854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            text1.setText(entry.getBreadCrumbTitle());
2099e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
21054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return convertView;
2119e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
21254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    };
2139e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey
21454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private OnNavigationListener mNavigationListener = new OnNavigationListener() {
2159e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        @Override
21654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
21754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            if (mIgnoreNextNavigation) {
21854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                mIgnoreNextNavigation = false;
21954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                return false;
22054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            }
22154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
22254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            getFragmentManager().popBackStack((int) itemId, 0);
22354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return true;
22454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
22554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    };
22654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
2271482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    public DisplayState getDisplayState() {
2281482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        return mDisplayState;
2291482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
2301482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
23154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void onDirectoryChanged(Uri uri, int flags) {
23254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mCurrentDir = uri;
23354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mCurrentSupportsCreate = (flags & DocumentsContract.FLAG_SUPPORTS_CREATE) != 0;
23454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
2351482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        if (mAction == ACTION_CREATE) {
23654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final FragmentManager fm = getFragmentManager();
23754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            SaveFragment.get(fm).setSaveEnabled(mCurrentSupportsCreate);
23854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
23954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
24054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        invalidateOptionsMenu();
24154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
24254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
24320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey    public void onRootPicked(Root root) {
24420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        DirectoryFragment.show(getFragmentManager(), root.uri, root.title);
24554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
24654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
24754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void onDocumentPicked(Document doc) {
24854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final FragmentManager fm = getFragmentManager();
24954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(doc.mimeType)) {
25054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            // Nested directory picked, recurse using new fragment
2511482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            DirectoryFragment.show(fm, doc.uri, doc.displayName);
2521482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else if (mAction == ACTION_OPEN) {
25354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            // Explicit file picked, return
25454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            onFinished(doc.uri);
2551482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else if (mAction == ACTION_CREATE) {
25654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            // Overwrite current filename
25754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            SaveFragment.get(fm).setDisplayName(doc.displayName);
25854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
25954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
26054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
261be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    public void onDocumentsPicked(List<Document> docs) {
262be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final int size = docs.size();
263be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        final Uri[] uris = new Uri[size];
264be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        for (int i = 0; i < size; i++) {
265be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            uris[i] = docs.get(i).uri;
266be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
267be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        onFinished(uris);
268be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    }
269be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey
27054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void onSaveRequested(String mimeType, String displayName) {
27120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        final ContentValues values = new ContentValues();
27220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        values.put(DocumentColumns.MIME_TYPE, mimeType);
27320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        values.put(DocumentColumns.DISPLAY_NAME, displayName);
27420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
27520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        // TODO: handle errors from remote side
27620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        final Uri uri = getContentResolver().insert(mCurrentDir, values);
277be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        onFinished(uri);
27854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
27954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
280be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey    private void onFinished(Uri... uris) {
281be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        Log.d(TAG, "onFinished() " + Arrays.toString(uris));
28254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
28354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final Intent intent = new Intent();
284be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        if (uris.length == 1) {
285be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            intent.setData(uris[0]);
286be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        } else if (uris.length > 1) {
287be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            final ContentResolver resolver = getContentResolver();
288be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            final ClipData clipData = new ClipData(null, mAcceptMimes, new ClipData.Item(uris[0]));
289be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            for (int i = 1; i < uris.length; i++) {
290be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey                clipData.addItem(new ClipData.Item(uris[i]));
291be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            }
292be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey            intent.setClipData(clipData);
293be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey        }
29454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
29520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        // TODO: omit WRITE and PERSIST for GET_CONTENT
29620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
29720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
29820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
29954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
30054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        setResult(Activity.RESULT_OK, intent);
30154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        finish();
30254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
30354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
3041482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    public static class DisplayState {
3051482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public int mode;
3061482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public int sortBy;
3071482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public boolean allowMultiple;
3081482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
3091482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public static final int MODE_LIST = 0;
3101482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public static final int MODE_GRID = 1;
3111482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
3121482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public static final int SORT_BY_NAME = 0;
3131482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        public static final int SORT_BY_DATE = 1;
3141482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
3151482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
31654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public static class Document {
31754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public Uri uri;
31854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public String mimeType;
31954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public String displayName;
32054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
32154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public static Document fromCursor(String authority, Cursor cursor) {
32254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final Document doc = new Document();
32354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final String guid = getCursorString(cursor, DocumentColumns.GUID);
32454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            doc.uri = DocumentsContract.buildDocumentUri(authority, guid);
32554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            doc.mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
32654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            doc.displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
32754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return doc;
32854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
32920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
33020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        public static Document fromUri(ContentResolver resolver, Uri uri) {
33120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final Document doc = new Document();
33220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            doc.uri = uri;
33320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
33420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final Cursor cursor = resolver.query(uri, null, null, null, null);
33520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            try {
33620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                if (!cursor.moveToFirst()) {
33720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    throw new IllegalArgumentException("Missing details for " + uri);
33820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                }
33920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                doc.mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
34020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                doc.displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
34120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            } finally {
34220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                cursor.close();
34320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            }
34420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
34520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            return doc;
34620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        }
34754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
34854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
3491482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    public static boolean mimeMatches(String filter, String[] tests) {
3501482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        for (String test : tests) {
3511482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            if (mimeMatches(filter, test)) {
3521482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey                return true;
3531482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            }
3541482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        }
3551482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        return false;
3561482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
3571482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
3581482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    public static boolean mimeMatches(String filter, String test) {
3591482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        if (filter.equals(test)) {
3601482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            return true;
3611482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else if ("*/*".equals(filter)) {
3621482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            return true;
3631482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else if (filter.endsWith("/*")) {
3641482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            return filter.regionMatches(0, test, 0, filter.indexOf('/'));
3651482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        } else {
3661482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey            return false;
3671482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey        }
3681482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey    }
3691482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey
37054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public static Drawable resolveDocumentIcon(Context context, String mimeType) {
37154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        // TODO: allow backends to provide custom MIME icons
37254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(mimeType)) {
37354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            return context.getResources().getDrawable(R.drawable.ic_dir);
37454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        } else {
37554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final PackageManager pm = context.getPackageManager();
37654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final Intent intent = new Intent(Intent.ACTION_VIEW);
37754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            intent.setType(mimeType);
37854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
37954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            final ResolveInfo info = pm.resolveActivity(
38054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                    intent, PackageManager.MATCH_DEFAULT_ONLY);
38154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            if (info != null) {
38254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                return info.loadIcon(pm);
38354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            } else {
38454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey                return null;
38554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            }
3869e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey        }
3879e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey    }
38820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
38920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey    private static final String TAG_CREATE_DIRECTORY = "create_directory";
39020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
39120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey    public static class CreateDirectoryFragment extends DialogFragment {
39220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        public static void show(FragmentManager fm) {
39320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final CreateDirectoryFragment dialog = new CreateDirectoryFragment();
39420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            dialog.show(fm, TAG_CREATE_DIRECTORY);
39520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        }
39620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
39720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        @Override
39820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        public Dialog onCreateDialog(Bundle savedInstanceState) {
39920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final Context context = getActivity();
40020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final ContentResolver resolver = context.getContentResolver();
40120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
40220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
40320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext());
40420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
40520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final View view = dialogInflater.inflate(R.layout.dialog_create_dir, null, false);
40620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            final EditText text1 = (EditText)view.findViewById(android.R.id.text1);
40720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
40820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            builder.setTitle(R.string.menu_create_dir);
40920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            builder.setView(view);
41020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
41120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
41220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                @Override
41320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                public void onClick(DialogInterface dialog, int which) {
41420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    final String displayName = text1.getText().toString();
41520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
41620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    final ContentValues values = new ContentValues();
41720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    values.put(DocumentColumns.MIME_TYPE, DocumentsContract.MIME_TYPE_DIRECTORY);
41820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    values.put(DocumentColumns.DISPLAY_NAME, displayName);
41920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
42020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    // TODO: handle errors from remote side
42120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    final DocumentsActivity activity = (DocumentsActivity) getActivity();
42220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    final Uri uri = resolver.insert(activity.mCurrentDir, values);
42320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
42420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    // Navigate into newly created child
42520d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    final Document doc = Document.fromUri(resolver, uri);
42620d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                    activity.onDocumentPicked(doc);
42720d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey                }
42820d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            });
42920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            builder.setNegativeButton(android.R.string.cancel, null);
43020d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey
43120d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey            return builder.create();
43220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey        }
43320d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey    }
4349e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey}
435