Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(572)

Side by Side Diff: ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java

Issue 443683002: Allow <input type="file" multiple /> to be used on Android JB MR2+. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add a test Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.ui.base; 5 package org.chromium.ui.base;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.content.ClipData;
8 import android.content.ContentResolver; 9 import android.content.ContentResolver;
9 import android.content.Intent; 10 import android.content.Intent;
10 import android.database.Cursor; 11 import android.database.Cursor;
11 import android.net.Uri; 12 import android.net.Uri;
12 import android.os.Environment; 13 import android.os.Environment;
13 import android.provider.MediaStore; 14 import android.provider.MediaStore;
14 import android.text.TextUtils; 15 import android.text.TextUtils;
15 16
16 import org.chromium.base.CalledByNative; 17 import org.chromium.base.CalledByNative;
17 import org.chromium.base.JNINamespace; 18 import org.chromium.base.JNINamespace;
(...skipping 25 matching lines...) Expand all
43 private Uri mCameraOutputUri; 44 private Uri mCameraOutputUri;
44 45
45 private SelectFileDialog(long nativeSelectFileDialog) { 46 private SelectFileDialog(long nativeSelectFileDialog) {
46 mNativeSelectFileDialog = nativeSelectFileDialog; 47 mNativeSelectFileDialog = nativeSelectFileDialog;
47 } 48 }
48 49
49 /** 50 /**
50 * Creates and starts an intent based on the passed fileTypes and capture va lue. 51 * Creates and starts an intent based on the passed fileTypes and capture va lue.
51 * @param fileTypes MIME types requested (i.e. "image/*") 52 * @param fileTypes MIME types requested (i.e. "image/*")
52 * @param capture The capture value as described in http://www.w3.org/TR/htm l-media-capture/ 53 * @param capture The capture value as described in http://www.w3.org/TR/htm l-media-capture/
54 * @param multiple Whether it should be possible to select multiple files.
53 * @param window The WindowAndroid that can show intents 55 * @param window The WindowAndroid that can show intents
54 */ 56 */
55 @CalledByNative 57 @CalledByNative
56 private void selectFile(String[] fileTypes, boolean capture, WindowAndroid w indow) { 58 private void selectFile(
59 String[] fileTypes, boolean capture, boolean multiple, WindowAndroid window) {
57 mFileTypes = new ArrayList<String>(Arrays.asList(fileTypes)); 60 mFileTypes = new ArrayList<String>(Arrays.asList(fileTypes));
58 mCapture = capture; 61 mCapture = capture;
59 62
60 Intent chooser = new Intent(Intent.ACTION_CHOOSER); 63 Intent chooser = new Intent(Intent.ACTION_CHOOSER);
61 Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 64 Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
62 mCameraOutputUri = Uri.fromFile(getFileForImageCapture()); 65 mCameraOutputUri = Uri.fromFile(getFileForImageCapture());
63 camera.putExtra(MediaStore.EXTRA_OUTPUT, mCameraOutputUri); 66 camera.putExtra(MediaStore.EXTRA_OUTPUT, mCameraOutputUri);
64 Intent camcorder = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 67 Intent camcorder = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
65 Intent soundRecorder = new Intent( 68 Intent soundRecorder = new Intent(
66 MediaStore.Audio.Media.RECORD_SOUND_ACTION); 69 MediaStore.Audio.Media.RECORD_SOUND_ACTION);
67 70
68 // Quick check - if the |capture| parameter is set and |fileTypes| has t he appropriate MIME 71 // Quick check - if the |capture| parameter is set and |fileTypes| has t he appropriate MIME
69 // type, we should just launch the appropriate intent. Otherwise build u p a chooser based on 72 // type, we should just launch the appropriate intent. Otherwise build u p a chooser based on
70 // the accept type and then display that to the user. 73 // the accept type and then display that to the user.
71 if (captureCamera()) { 74 if (captureCamera()) {
72 if (window.showIntent(camera, this, R.string.low_memory_error)) retu rn; 75 if (window.showIntent(camera, this, R.string.low_memory_error)) retu rn;
73 } else if (captureCamcorder()) { 76 } else if (captureCamcorder()) {
74 if (window.showIntent(camcorder, this, R.string.low_memory_error)) r eturn; 77 if (window.showIntent(camcorder, this, R.string.low_memory_error)) r eturn;
75 } else if (captureMicrophone()) { 78 } else if (captureMicrophone()) {
76 if (window.showIntent(soundRecorder, this, R.string.low_memory_error )) return; 79 if (window.showIntent(soundRecorder, this, R.string.low_memory_error )) return;
77 } 80 }
78 81
79 Intent getContentIntent = new Intent(Intent.ACTION_GET_CONTENT); 82 Intent getContentIntent = new Intent(Intent.ACTION_GET_CONTENT);
80 getContentIntent.addCategory(Intent.CATEGORY_OPENABLE); 83 getContentIntent.addCategory(Intent.CATEGORY_OPENABLE);
84
85 if (multiple)
86 getContentIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
87
81 ArrayList<Intent> extraIntents = new ArrayList<Intent>(); 88 ArrayList<Intent> extraIntents = new ArrayList<Intent>();
82 if (!noSpecificType()) { 89 if (!noSpecificType()) {
83 // Create a chooser based on the accept type that was specified in t he webpage. Note 90 // Create a chooser based on the accept type that was specified in t he webpage. Note
84 // that if the web page specified multiple accept types, we will hav e built a generic 91 // that if the web page specified multiple accept types, we will hav e built a generic
85 // chooser above. 92 // chooser above.
86 if (shouldShowImageTypes()) { 93 if (shouldShowImageTypes()) {
87 extraIntents.add(camera); 94 extraIntents.add(camera);
88 getContentIntent.setType(ALL_IMAGE_TYPES); 95 getContentIntent.setType(ALL_IMAGE_TYPES);
89 } else if (shouldShowVideoTypes()) { 96 } else if (shouldShowVideoTypes()) {
90 extraIntents.add(camcorder); 97 extraIntents.add(camcorder);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 nativeOnFileSelected(mNativeSelectFileDialog, mCameraOutputUri.getPa th(), ""); 183 nativeOnFileSelected(mNativeSelectFileDialog, mCameraOutputUri.getPa th(), "");
177 184
178 // Broadcast to the media scanner that there's a new photo on the de vice so it will 185 // Broadcast to the media scanner that there's a new photo on the de vice so it will
179 // show up right away in the gallery (rather than waiting until the next time the media 186 // show up right away in the gallery (rather than waiting until the next time the media
180 // scanner runs). 187 // scanner runs).
181 window.sendBroadcast(new Intent( 188 window.sendBroadcast(new Intent(
182 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mCameraOutputUri)); 189 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mCameraOutputUri));
183 return; 190 return;
184 } 191 }
185 192
193 // Path for when EXTRA_ALLOW_MULTIPLE Intent extra has been defined. Eac h of the selected
194 // files will be shared as an entry on the Intent's ClipData.
195 if (results.getData() == null && results.getClipData() != null) {
Miguel Garcia 2014/08/05 18:01:00 can you check that the |results| intent in fact co
Peter Beverloo 2014/08/05 18:44:53 |results| is the resulting Intent, not the content
196 ClipData clipData = results.getClipData();
197
198 int itemCount = clipData.getItemCount();
199 if (itemCount == 0) {
200 onFileNotSelected();
201 return;
202 }
203
204 String[] filePathArray = new String[itemCount];
205 String[] displayNameArray = new String[itemCount];
206
207 for (int i = 0; i < itemCount; ++i) {
208 final Uri uri = clipData.getItemAt(i).getUri();
209
210 filePathArray[i] = uri.toString();
211 displayNameArray[i] = resolveFileName(uri, contentResolver);
212 }
213
214 nativeOnMultipleFilesSelected(mNativeSelectFileDialog,
215 filePathArray, displayNameArray);
216 return;
217 }
218
186 if (ContentResolver.SCHEME_FILE.equals(results.getData().getScheme())) { 219 if (ContentResolver.SCHEME_FILE.equals(results.getData().getScheme())) {
187 nativeOnFileSelected(mNativeSelectFileDialog, 220 nativeOnFileSelected(mNativeSelectFileDialog,
188 results.getData().getSchemeSpecificPart(), ""); 221 results.getData().getSchemeSpecificPart(), "");
189 return; 222 return;
190 } 223 }
191 224
192 if (ContentResolver.SCHEME_CONTENT.equals(results.getScheme())) { 225 if (ContentResolver.SCHEME_CONTENT.equals(results.getScheme())) {
193 nativeOnFileSelected(mNativeSelectFileDialog, 226 nativeOnFileSelected(mNativeSelectFileDialog,
194 results.getData().toString(), 227 results.getData().toString(),
195 resolveFileName(results.getData(), 228 resolveFileName(results.getData(),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 return false; 288 return false;
256 } 289 }
257 290
258 @CalledByNative 291 @CalledByNative
259 private static SelectFileDialog create(long nativeSelectFileDialog) { 292 private static SelectFileDialog create(long nativeSelectFileDialog) {
260 return new SelectFileDialog(nativeSelectFileDialog); 293 return new SelectFileDialog(nativeSelectFileDialog);
261 } 294 }
262 295
263 private native void nativeOnFileSelected(long nativeSelectFileDialogImpl, 296 private native void nativeOnFileSelected(long nativeSelectFileDialogImpl,
264 String filePath, String displayName); 297 String filePath, String displayName);
298 private native void nativeOnMultipleFilesSelected(long nativeSelectFileDialo gImpl,
299 String[] filePathArray, String[] displayNameArray);
265 private native void nativeOnFileNotSelected(long nativeSelectFileDialogImpl) ; 300 private native void nativeOnFileNotSelected(long nativeSelectFileDialogImpl) ;
266 } 301 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698