summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-05-19 20:38:56 +0100
committerBen Murdoch <benm@google.com>2010-05-20 19:00:30 +0100
commit62b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5 (patch)
treec688bccd6cba5709d7d8fe900295644ccb76c8ca /src/com/android
parentd746a94137a87ffcc1fcefdac9a3764c3bc3f5cd (diff)
downloadpackages_apps_Browser-62b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5.zip
packages_apps_Browser-62b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5.tar.gz
packages_apps_Browser-62b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5.tar.bz2
Add support for the camera as a source for the file picker.
Determine whether to show the camera based on the accept type associated with the input element. Change-Id: I48fea76fbd7a1f3df3c87288f28e01a32d9e955e
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/browser/BrowserActivity.java93
-rw-r--r--src/com/android/browser/Tab.java4
2 files changed, 91 insertions, 6 deletions
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 6af45f4..23a086a 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -2794,15 +2794,85 @@ public class BrowserActivity extends Activity
* The Object used to inform the WebView of the file to upload.
*/
private ValueCallback<Uri> mUploadMessage;
+ private String mCameraFilePath;
+
+ void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+
+ final String imageMimeType = "image/*";
+ final String imageSourceKey = "source";
+ final String imageSourceValueCamera = "camera";
+ final String imageSourceValueGallery = "gallery";
+
+ // image source can be 'gallery' or 'camera'.
+ String imageSource = "";
+
+ // We add the camera intent if there was no accept type (or '*/*') or 'image/*'.
+ boolean addCameraIntent = true;
- void openFileChooser(ValueCallback<Uri> uploadMsg) {
if (mUploadMessage != null) return;
mUploadMessage = uploadMsg;
+
+ // Parse the accept type.
+ String params[] = acceptType.split(";");
+ String mimeType = params[0];
+
+ for (String p : params) {
+ String[] keyValue = p.split("=");
+ if (keyValue.length == 2) {
+ // Process key=value parameters.
+ if (imageSourceKey.equals(keyValue[0])) {
+ imageSource = keyValue[1];
+ }
+ }
+ }
+
+ // This intent will display the standard OPENABLE file picker.
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
- i.setType("*/*");
- BrowserActivity.this.startActivityForResult(Intent.createChooser(i,
- getString(R.string.choose_upload)), FILE_SELECTED);
+
+ // Create an intent to add to the standard file picker that will
+ // capture an image from the camera. We'll combine this intent with
+ // the standard OPENABLE picker unless the web developer specifically
+ // requested the camera or gallery be opened by passing a parameter
+ // in the accept type.
+ Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+ File externalDataDir = Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_DCIM);
+ File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
+ File.separator + "browser-photos");
+ cameraDataDir.mkdirs();
+ mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +
+ System.currentTimeMillis() + ".jpg";
+ cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
+
+ if (mimeType.equals(imageMimeType)) {
+ i.setType(imageMimeType);
+ if (imageSource.equals(imageSourceValueCamera)) {
+ // Specified 'image/*' and requested the camera, so go ahead and launch the camera
+ // directly.
+ BrowserActivity.this.startActivityForResult(cameraIntent, FILE_SELECTED);
+ return;
+ } else if (imageSource.equals(imageSourceValueGallery)) {
+ // Specified gallery as the source, so don't want to consider the camera.
+ addCameraIntent = false;
+ }
+ } else {
+ i.setType("*/*");
+ }
+
+ // Combine the chooser and the extra choices (like camera)
+ Intent chooser = new Intent(Intent.ACTION_CHOOSER);
+ chooser.putExtra(Intent.EXTRA_INTENT, i);
+
+ if (addCameraIntent) {
+ // Add the camera Intent
+ Intent[] choices = new Intent[1];
+ choices[0] = cameraIntent;
+ chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, choices);
+ }
+
+ chooser.putExtra(Intent.EXTRA_TITLE, getString(R.string.choose_upload));
+ BrowserActivity.this.startActivityForResult(chooser, FILE_SELECTED);
}
// -------------------------------------------------------------------------
@@ -3521,8 +3591,23 @@ public class BrowserActivity extends Activity
if (null == mUploadMessage) break;
Uri result = intent == null || resultCode != RESULT_OK ? null
: intent.getData();
+
+ // As we ask the camera to save the result of the user taking
+ // a picture, the camera application does not return anything other
+ // than RESULT_OK. So we need to check whether the file we expected
+ // was written to disk in the in the case that we
+ // did not get an intent returned but did get a RESULT_OK. If it was,
+ // we assume that this result has came back from the camera.
+ if (result == null && intent == null && resultCode == RESULT_OK) {
+ File cameraFile = new File(mCameraFilePath);
+ if (cameraFile.exists()) {
+ result = Uri.fromFile(cameraFile);
+ }
+ }
+
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
+ mCameraFilePath = null;
break;
default:
break;
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index b9942c0..79c4574 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -1173,9 +1173,9 @@ class Tab {
}
@Override
- public void openFileChooser(ValueCallback<Uri> uploadMsg) {
+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
if (mInForeground) {
- mActivity.openFileChooser(uploadMsg);
+ mActivity.openFileChooser(uploadMsg, acceptType);
} else {
uploadMsg.onReceiveValue(null);
}