Home | History | Annotate | Download | only in documentsui
      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