1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.documentsui; 18 19 import static com.android.documentsui.DocumentsActivity.TAG; 20 21 import android.app.AlertDialog; 22 import android.app.Dialog; 23 import android.app.DialogFragment; 24 import android.app.FragmentManager; 25 import android.content.ContentProviderClient; 26 import android.content.ContentResolver; 27 import android.content.Context; 28 import android.content.DialogInterface; 29 import android.content.DialogInterface.OnClickListener; 30 import android.net.Uri; 31 import android.os.AsyncTask; 32 import android.os.Bundle; 33 import android.provider.DocumentsContract; 34 import android.provider.DocumentsContract.Document; 35 import android.util.Log; 36 import android.view.LayoutInflater; 37 import android.view.View; 38 import android.widget.EditText; 39 import android.widget.Toast; 40 41 import com.android.documentsui.model.DocumentInfo; 42 43 /** 44 * Dialog to create a new directory. 45 */ 46 public class CreateDirectoryFragment extends DialogFragment { 47 private static final String TAG_CREATE_DIRECTORY = "create_directory"; 48 49 public static void show(FragmentManager fm) { 50 final CreateDirectoryFragment dialog = new CreateDirectoryFragment(); 51 dialog.show(fm, TAG_CREATE_DIRECTORY); 52 } 53 54 @Override 55 public Dialog onCreateDialog(Bundle savedInstanceState) { 56 final Context context = getActivity(); 57 final ContentResolver resolver = context.getContentResolver(); 58 59 final AlertDialog.Builder builder = new AlertDialog.Builder(context); 60 final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext()); 61 62 final View view = dialogInflater.inflate(R.layout.dialog_create_dir, null, false); 63 final EditText text1 = (EditText) view.findViewById(android.R.id.text1); 64 65 builder.setTitle(R.string.menu_create_dir); 66 builder.setView(view); 67 68 builder.setPositiveButton(android.R.string.ok, new OnClickListener() { 69 @Override 70 public void onClick(DialogInterface dialog, int which) { 71 final String displayName = text1.getText().toString(); 72 73 final DocumentsActivity activity = (DocumentsActivity) getActivity(); 74 final DocumentInfo cwd = activity.getCurrentDirectory(); 75 76 new CreateDirectoryTask(activity, cwd, displayName).executeOnExecutor( 77 ProviderExecutor.forAuthority(cwd.authority)); 78 } 79 }); 80 builder.setNegativeButton(android.R.string.cancel, null); 81 82 return builder.create(); 83 } 84 85 private class CreateDirectoryTask extends AsyncTask<Void, Void, DocumentInfo> { 86 private final DocumentsActivity mActivity; 87 private final DocumentInfo mCwd; 88 private final String mDisplayName; 89 90 public CreateDirectoryTask( 91 DocumentsActivity activity, DocumentInfo cwd, String displayName) { 92 mActivity = activity; 93 mCwd = cwd; 94 mDisplayName = displayName; 95 } 96 97 @Override 98 protected void onPreExecute() { 99 mActivity.setPending(true); 100 } 101 102 @Override 103 protected DocumentInfo doInBackground(Void... params) { 104 final ContentResolver resolver = mActivity.getContentResolver(); 105 ContentProviderClient client = null; 106 try { 107 client = DocumentsApplication.acquireUnstableProviderOrThrow( 108 resolver, mCwd.derivedUri.getAuthority()); 109 final Uri childUri = DocumentsContract.createDocument( 110 client, mCwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName); 111 return DocumentInfo.fromUri(resolver, childUri); 112 } catch (Exception e) { 113 Log.w(TAG, "Failed to create directory", e); 114 return null; 115 } finally { 116 ContentProviderClient.releaseQuietly(client); 117 } 118 } 119 120 @Override 121 protected void onPostExecute(DocumentInfo result) { 122 if (result != null) { 123 // Navigate into newly created child 124 mActivity.onDocumentPicked(result); 125 } else { 126 Toast.makeText(mActivity, R.string.create_error, Toast.LENGTH_SHORT).show(); 127 } 128 129 mActivity.setPending(false); 130 } 131 } 132 } 133