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