UploadHandler.java revision 51f6a2f1dc524b31476fb71de36f2bd79f499d08
18233facddcc51865d612a919d450db6954aa48e3Michael Kolb/*
28233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Copyright (C) 2010 The Android Open Source Project
38233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
48233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
58233facddcc51865d612a919d450db6954aa48e3Michael Kolb * you may not use this file except in compliance with the License.
68233facddcc51865d612a919d450db6954aa48e3Michael Kolb * You may obtain a copy of the License at
78233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
88233facddcc51865d612a919d450db6954aa48e3Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
98233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Unless required by applicable law or agreed to in writing, software
118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * See the License for the specific language governing permissions and
148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * limitations under the License.
158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
168233facddcc51865d612a919d450db6954aa48e3Michael Kolb
178233facddcc51865d612a919d450db6954aa48e3Michael Kolbpackage com.android.browser;
188233facddcc51865d612a919d450db6954aa48e3Michael Kolb
198233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.app.Activity;
20e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdochimport android.content.ActivityNotFoundException;
218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.Intent;
228233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.Uri;
238233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.os.Environment;
248233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.provider.MediaStore;
258233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.ValueCallback;
26e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdochimport android.widget.Toast;
278233facddcc51865d612a919d450db6954aa48e3Michael Kolb
288233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport java.io.File;
298233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport java.util.Vector;
308233facddcc51865d612a919d450db6954aa48e3Michael Kolb
318233facddcc51865d612a919d450db6954aa48e3Michael Kolb/**
328233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Handle the file upload callbacks from WebView here
338233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
348233facddcc51865d612a919d450db6954aa48e3Michael Kolbpublic class UploadHandler {
358233facddcc51865d612a919d450db6954aa48e3Michael Kolb
368233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /*
378233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * The Object used to inform the WebView of the file to upload.
388233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
398233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private ValueCallback<Uri> mUploadMessage;
408233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private String mCameraFilePath;
418233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4251f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch    private boolean mHandled;
4351f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch    private boolean mCaughtActivityNotFoundException;
4451f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch
458233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private Controller mController;
468233facddcc51865d612a919d450db6954aa48e3Michael Kolb
478233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public UploadHandler(Controller controller) {
488233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mController = controller;
498233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
508233facddcc51865d612a919d450db6954aa48e3Michael Kolb
518233facddcc51865d612a919d450db6954aa48e3Michael Kolb    String getFilePath() {
528233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return mCameraFilePath;
538233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
548233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5551f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch    boolean handled() {
5651f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch        return mHandled;
5751f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch    }
5851f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch
598233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onResult(int resultCode, Intent intent) {
6051f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch
6151f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch        if (resultCode == Activity.RESULT_CANCELED && mCaughtActivityNotFoundException) {
6251f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch            // Couldn't resolve an activity, we are going to try again so skip
6351f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch            // this result.
6451f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch            mCaughtActivityNotFoundException = false;
6551f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch            return;
6651f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch        }
6751f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch
688233facddcc51865d612a919d450db6954aa48e3Michael Kolb        Uri result = intent == null || resultCode != Activity.RESULT_OK ? null
698233facddcc51865d612a919d450db6954aa48e3Michael Kolb                : intent.getData();
708233facddcc51865d612a919d450db6954aa48e3Michael Kolb
718233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // As we ask the camera to save the result of the user taking
728233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // a picture, the camera application does not return anything other
738233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // than RESULT_OK. So we need to check whether the file we expected
748233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // was written to disk in the in the case that we
758233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // did not get an intent returned but did get a RESULT_OK. If it was,
768233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // we assume that this result has came back from the camera.
778233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (result == null && intent == null && resultCode == Activity.RESULT_OK) {
788233facddcc51865d612a919d450db6954aa48e3Michael Kolb            File cameraFile = new File(mCameraFilePath);
798233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (cameraFile.exists()) {
808233facddcc51865d612a919d450db6954aa48e3Michael Kolb                result = Uri.fromFile(cameraFile);
818233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // Broadcast to the media scanner that we have a new photo
828233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // so it will be added into the gallery for the user.
838233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mController.getActivity().sendBroadcast(
848233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result));
858233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
868233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
878233facddcc51865d612a919d450db6954aa48e3Michael Kolb
888233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUploadMessage.onReceiveValue(result);
8951f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch        mHandled = true;
9051f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch        mCaughtActivityNotFoundException = false;
918233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
928233facddcc51865d612a919d450db6954aa48e3Michael Kolb
938233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
948233facddcc51865d612a919d450db6954aa48e3Michael Kolb
958233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String imageMimeType = "image/*";
968233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String videoMimeType = "video/*";
978233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String audioMimeType = "audio/*";
988233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String mediaSourceKey = "capture";
998233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String mediaSourceValueCamera = "camera";
1008233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String mediaSourceValueFileSystem = "filesystem";
1018233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String mediaSourceValueCamcorder = "camcorder";
1028233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final String mediaSourceValueMicrophone = "microphone";
1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb
104e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // According to the spec, media source can be 'filesystem' or 'camera' or 'camcorder'
105e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // or 'microphone'.
1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb        String mediaSource = "";
1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mUploadMessage != null) {
1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // Already a file picker operation in progress.
1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUploadMessage = uploadMsg;
1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Parse the accept type.
1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb        String params[] = acceptType.split(";");
1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb        String mimeType = params[0];
1188233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1198233facddcc51865d612a919d450db6954aa48e3Michael Kolb        for (String p : params) {
1208233facddcc51865d612a919d450db6954aa48e3Michael Kolb            String[] keyValue = p.split("=");
1218233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (keyValue.length == 2) {
1228233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // Process key=value parameters.
1238233facddcc51865d612a919d450db6954aa48e3Michael Kolb                if (mediaSourceKey.equals(keyValue[0])) {
1248233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    mediaSource = keyValue[1];
1258233facddcc51865d612a919d450db6954aa48e3Michael Kolb                }
1268233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
1278233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1288233facddcc51865d612a919d450db6954aa48e3Michael Kolb
129e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        //Ensure it is not still set from a previous upload.
130e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        mCameraFilePath = null;
1318233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1328233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mimeType.equals(imageMimeType)) {
1338233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (mediaSource.equals(mediaSourceValueCamera)) {
134e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified 'image/*' and requested the camera, so go ahead and launch the
135e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // camera directly.
136e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(createCameraIntent());
1378233facddcc51865d612a919d450db6954aa48e3Michael Kolb                return;
1388233facddcc51865d612a919d450db6954aa48e3Michael Kolb            } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
139e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified 'image/*' and requested the filesystem, so go ahead and launch an
140e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // OPENABLE intent.
141e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(createOpenableIntent(imageMimeType));
142e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                return;
143e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            } else {
144e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified just 'image/*', so launch an intent for both the Camera and image/*
145e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // OPENABLE.
146e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                Intent chooser = createChooserIntent(createCameraIntent());
147e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(imageMimeType));
148e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(chooser);
149e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                return;
1508233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
1518233facddcc51865d612a919d450db6954aa48e3Michael Kolb        } else if (mimeType.equals(videoMimeType)) {
1528233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (mediaSource.equals(mediaSourceValueCamcorder)) {
1538233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // Specified 'video/*' and requested the camcorder, so go ahead and launch the
1548233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // camcorder directly.
155e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(createCamcorderIntent());
1568233facddcc51865d612a919d450db6954aa48e3Michael Kolb                return;
1578233facddcc51865d612a919d450db6954aa48e3Michael Kolb            } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
158e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified 'video/*' and requested the filesystem, so go ahead and launch an
159e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // an OPENABLE intent.
160e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(createOpenableIntent(videoMimeType));
161e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                return;
162e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            } else {
163e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified just 'video/*', so go ahead and launch an intent for both camcorder and
164e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // video/* OPENABLE.
165e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                Intent chooser = createChooserIntent(createCamcorderIntent());
166e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(videoMimeType));
167e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(chooser);
168e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                return;
1698233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
1708233facddcc51865d612a919d450db6954aa48e3Michael Kolb        } else if (mimeType.equals(audioMimeType)) {
1718233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (mediaSource.equals(mediaSourceValueMicrophone)) {
1728233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // Specified 'audio/*' and requested microphone, so go ahead and launch the sound
1738233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // recorder.
174e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(createSoundRecorderIntent());
175e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                return;
176e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
177e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified 'audio/*' and requested filesystem, so go ahead and launch an
178e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // OPENABLE intent.
179e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(createOpenableIntent(audioMimeType));
180e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                return;
181e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            } else {
182e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Specified just 'audio/*', so go ahead and launch an intent for both the sound
183e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // recorder and audio/* OPENABLE.
184e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                Intent chooser = createChooserIntent(createSoundRecorderIntent());
185e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(audioMimeType));
186e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                startActivity(chooser);
1878233facddcc51865d612a919d450db6954aa48e3Michael Kolb                return;
1888233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
1898233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1908233facddcc51865d612a919d450db6954aa48e3Michael Kolb
191e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // No special handling based on the accept type was necessary, so trigger the default
192e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // file upload chooser.
193e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        startActivity(createDefaultOpenableIntent());
194e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    }
1958233facddcc51865d612a919d450db6954aa48e3Michael Kolb
196e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private void startActivity(Intent intent) {
197e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        try {
198e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            mController.getActivity().startActivityForResult(intent, Controller.FILE_SELECTED);
199e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        } catch (ActivityNotFoundException e) {
200e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            // No installed app was able to handle the intent that
201e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            // we sent, so fallback to the default file upload control.
202e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            try {
20351f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch                mCaughtActivityNotFoundException = true;
204e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                mController.getActivity().startActivityForResult(createDefaultOpenableIntent(),
205e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                        Controller.FILE_SELECTED);
206e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            } catch (ActivityNotFoundException e2) {
207e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                // Nothing can return us a file, so file upload is effectively disabled.
208e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                Toast.makeText(mController.getActivity(), R.string.uploads_disabled,
209e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                        Toast.LENGTH_LONG).show();
210e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch            }
2118233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
212e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    }
2138233facddcc51865d612a919d450db6954aa48e3Michael Kolb
214e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private Intent createDefaultOpenableIntent() {
215e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // Create and return a chooser with the default OPENABLE
216e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // actions including the camera, camcorder and sound
217e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        // recorder where available.
218e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
219e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        i.addCategory(Intent.CATEGORY_OPENABLE);
220e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        i.setType("*/*");
2218233facddcc51865d612a919d450db6954aa48e3Michael Kolb
222e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        Intent chooser = createChooserIntent(createCameraIntent(), createCamcorderIntent(),
223e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                createSoundRecorderIntent());
224e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        chooser.putExtra(Intent.EXTRA_INTENT, i);
225e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        return chooser;
226e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    }
2278233facddcc51865d612a919d450db6954aa48e3Michael Kolb
228e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private Intent createChooserIntent(Intent... intents) {
229e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        Intent chooser = new Intent(Intent.ACTION_CHOOSER);
230e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
2318233facddcc51865d612a919d450db6954aa48e3Michael Kolb        chooser.putExtra(Intent.EXTRA_TITLE,
2328233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mController.getActivity().getResources()
2338233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        .getString(R.string.choose_upload));
234e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        return chooser;
2358233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2368233facddcc51865d612a919d450db6954aa48e3Michael Kolb
237e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private Intent createOpenableIntent(String type) {
238e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
239e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        i.addCategory(Intent.CATEGORY_OPENABLE);
240e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        i.setType(type);
241e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        return i;
242e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    }
243e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch
244e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private Intent createCameraIntent() {
245e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
246e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        File externalDataDir = Environment.getExternalStoragePublicDirectory(
247e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                Environment.DIRECTORY_DCIM);
248e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
249e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                File.separator + "browser-photos");
250e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        cameraDataDir.mkdirs();
251e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +
252e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch                System.currentTimeMillis() + ".jpg";
253e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
254e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        return cameraIntent;
255e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    }
256e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch
257e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private Intent createCamcorderIntent() {
258e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        return new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
259e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    }
260e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch
261e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch    private Intent createSoundRecorderIntent() {
262e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch        return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
2638233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2648233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2658233facddcc51865d612a919d450db6954aa48e3Michael Kolb}
266