blob: 9f4451663706732e5c9e7d4e19b62b06a129dc94 [file] [log] [blame]
Jeff Sharkey76112212013-08-06 11:26:10 -07001/*
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
17package com.android.documentsui;
18
Steve McKayfefcd702015-08-20 16:19:38 +000019import static com.android.documentsui.Shared.TAG;
Jeff Sharkey3fd11772013-09-30 14:26:27 -070020
Jeff Sharkey76112212013-08-06 11:26:10 -070021import android.app.AlertDialog;
22import android.app.Dialog;
23import android.app.DialogFragment;
24import android.app.FragmentManager;
Jeff Sharkey3fd11772013-09-30 14:26:27 -070025import android.content.ContentProviderClient;
Jeff Sharkey76112212013-08-06 11:26:10 -070026import android.content.ContentResolver;
Jeff Sharkey76112212013-08-06 11:26:10 -070027import android.content.Context;
28import android.content.DialogInterface;
29import android.content.DialogInterface.OnClickListener;
30import android.net.Uri;
Jeff Sharkey9dd02622013-09-27 16:44:11 -070031import android.os.AsyncTask;
Jeff Sharkey76112212013-08-06 11:26:10 -070032import android.os.Bundle;
Jeff Sharkeyb6a7f2c2013-08-27 18:26:48 -070033import android.provider.DocumentsContract;
Jeff Sharkey724deeb2013-08-31 15:02:20 -070034import android.provider.DocumentsContract.Document;
Ben Kwac4693342015-09-30 10:00:10 -070035import android.support.design.widget.Snackbar;
Jeff Sharkey3fd11772013-09-30 14:26:27 -070036import android.util.Log;
Steve McKayceeb3f72015-05-19 16:10:25 -070037import android.view.KeyEvent;
Jeff Sharkey76112212013-08-06 11:26:10 -070038import android.view.LayoutInflater;
39import android.view.View;
40import android.widget.EditText;
Steve McKayceeb3f72015-05-19 16:10:25 -070041import android.widget.TextView;
42import android.widget.TextView.OnEditorActionListener;
Jeff Sharkey76112212013-08-06 11:26:10 -070043
Jeff Sharkey724deeb2013-08-31 15:02:20 -070044import com.android.documentsui.model.DocumentInfo;
Jeff Sharkey76112212013-08-06 11:26:10 -070045
46/**
47 * Dialog to create a new directory.
48 */
49public class CreateDirectoryFragment extends DialogFragment {
50 private static final String TAG_CREATE_DIRECTORY = "create_directory";
51
52 public static void show(FragmentManager fm) {
53 final CreateDirectoryFragment dialog = new CreateDirectoryFragment();
54 dialog.show(fm, TAG_CREATE_DIRECTORY);
55 }
56
57 @Override
58 public Dialog onCreateDialog(Bundle savedInstanceState) {
59 final Context context = getActivity();
60 final ContentResolver resolver = context.getContentResolver();
61
Tomasz Mikolajewski137437e2015-08-03 19:32:34 +090062 final AlertDialog.Builder builder = new AlertDialog.Builder(context);
Jeff Sharkey76112212013-08-06 11:26:10 -070063 final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext());
64
65 final View view = dialogInflater.inflate(R.layout.dialog_create_dir, null, false);
Steve McKayceeb3f72015-05-19 16:10:25 -070066 final EditText editText = (EditText) view.findViewById(android.R.id.text1);
Jeff Sharkey76112212013-08-06 11:26:10 -070067
68 builder.setTitle(R.string.menu_create_dir);
69 builder.setView(view);
70
Steve McKayceeb3f72015-05-19 16:10:25 -070071 builder.setPositiveButton(
72 android.R.string.ok,
73 new OnClickListener() {
74 @Override
75 public void onClick(DialogInterface dialog, int which) {
76 createDirectory(editText.getText().toString());
77 }
78 });
Jeff Sharkeyf63b7772013-10-01 17:57:41 -070079
Jeff Sharkey76112212013-08-06 11:26:10 -070080 builder.setNegativeButton(android.R.string.cancel, null);
Steve McKayceeb3f72015-05-19 16:10:25 -070081 final AlertDialog dialog = builder.create();
Jeff Sharkey76112212013-08-06 11:26:10 -070082
Steve McKayceeb3f72015-05-19 16:10:25 -070083 editText.setOnEditorActionListener(
84 new OnEditorActionListener() {
85 @Override
86 public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
87 if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER
88 && event.hasNoModifiers()) {
89 createDirectory(editText.getText().toString());
90 dialog.dismiss();
91 return true;
92 }
93 return false;
94 }
95 });
96
97
98 return dialog;
99 }
100
101 private void createDirectory(String name) {
102 final BaseActivity activity = (BaseActivity) getActivity();
103 final DocumentInfo cwd = activity.getCurrentDirectory();
104
105 new CreateDirectoryTask(activity, cwd, name).executeOnExecutor(
106 ProviderExecutor.forAuthority(cwd.authority));
Jeff Sharkey76112212013-08-06 11:26:10 -0700107 }
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700108
109 private class CreateDirectoryTask extends AsyncTask<Void, Void, DocumentInfo> {
Steve McKayd0a2a2c2015-03-25 14:35:33 -0700110 private final BaseActivity mActivity;
Jeff Sharkey0aa26922013-10-08 17:09:18 -0700111 private final DocumentInfo mCwd;
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700112 private final String mDisplayName;
113
Jeff Sharkey0aa26922013-10-08 17:09:18 -0700114 public CreateDirectoryTask(
Steve McKayd0a2a2c2015-03-25 14:35:33 -0700115 BaseActivity activity, DocumentInfo cwd, String displayName) {
Jeff Sharkey0aa26922013-10-08 17:09:18 -0700116 mActivity = activity;
117 mCwd = cwd;
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700118 mDisplayName = displayName;
119 }
120
121 @Override
Jeff Sharkey4be51f12013-10-23 15:46:38 -0700122 protected void onPreExecute() {
123 mActivity.setPending(true);
124 }
125
126 @Override
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700127 protected DocumentInfo doInBackground(Void... params) {
Jeff Sharkey0aa26922013-10-08 17:09:18 -0700128 final ContentResolver resolver = mActivity.getContentResolver();
Jeff Sharkey3fd11772013-09-30 14:26:27 -0700129 ContentProviderClient client = null;
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700130 try {
Jeff Sharkey3fd11772013-09-30 14:26:27 -0700131 client = DocumentsApplication.acquireUnstableProviderOrThrow(
Jeff Sharkey0aa26922013-10-08 17:09:18 -0700132 resolver, mCwd.derivedUri.getAuthority());
Jeff Sharkey3fd11772013-09-30 14:26:27 -0700133 final Uri childUri = DocumentsContract.createDocument(
Jeff Sharkey0aa26922013-10-08 17:09:18 -0700134 client, mCwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName);
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700135 return DocumentInfo.fromUri(resolver, childUri);
Jeff Sharkey3fd11772013-09-30 14:26:27 -0700136 } catch (Exception e) {
137 Log.w(TAG, "Failed to create directory", e);
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700138 return null;
Jeff Sharkey3fd11772013-09-30 14:26:27 -0700139 } finally {
140 ContentProviderClient.releaseQuietly(client);
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700141 }
142 }
143
144 @Override
145 protected void onPostExecute(DocumentInfo result) {
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700146 if (result != null) {
147 // Navigate into newly created child
Steve McKay351a7492015-08-04 10:11:01 -0700148 mActivity.onDirectoryCreated(result);
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700149 } else {
Ben Kwac4693342015-09-30 10:00:10 -0700150 Shared.makeSnackbar(mActivity, R.string.create_error, Snackbar.LENGTH_SHORT).show();
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700151 }
Jeff Sharkey4be51f12013-10-23 15:46:38 -0700152
153 mActivity.setPending(false);
Jeff Sharkey9dd02622013-09-27 16:44:11 -0700154 }
155 }
Jeff Sharkey76112212013-08-06 11:26:10 -0700156}