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