You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/07/05 14:48:07 UTC
[26/51] [partial] Merge master2->master
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/Camera.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/Camera.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/Camera.java
deleted file mode 100644
index d54483f..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/Camera.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.camera;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Date;
-
-import javax.microedition.io.Connector;
-import javax.microedition.io.file.FileConnection;
-
-import org.apache.cordova.api.Plugin;
-import org.apache.cordova.api.PluginResult;
-import org.apache.cordova.json4j.JSONArray;
-import org.apache.cordova.json4j.JSONException;
-import org.apache.cordova.util.Logger;
-
-import net.rim.blackberry.api.invoke.CameraArguments;
-import net.rim.blackberry.api.invoke.Invoke;
-import net.rim.device.api.io.Base64OutputStream;
-import net.rim.device.api.io.IOUtilities;
-import net.rim.device.api.system.ApplicationDescriptor;
-import net.rim.device.api.system.Bitmap;
-import net.rim.device.api.system.Characters;
-import net.rim.device.api.system.ControlledAccessException;
-import net.rim.device.api.system.EncodedImage;
-import net.rim.device.api.system.EventInjector;
-import net.rim.device.api.system.JPEGEncodedImage;
-import net.rim.device.api.system.PNGEncodedImage;
-import net.rim.device.api.ui.UiApplication;
-
-/**
- * The Camera plugin interface.
- *
- * The Camera class can invoke the following actions:
- *
- * - takePicture: takes photo and returns base64 encoded image or image file URI
- *
- * future?
- * - captureVideo...
- *
- */
-public class Camera extends Plugin
-{
- /**
- * Possible actions.
- */
- public static final String ACTION_TAKE_PICTURE = "takePicture";
-
- /**
- * Maximum image encoding size (in bytes) to allow. (Obtained unofficially
- * through trial and error). Anything larger will cause stability issues
- * when sending back to the browser.
- */
- private static final long MAX_ENCODING_SIZE = 1500000L;
-
- /**
- * Executes the requested action and returns a PluginResult.
- *
- * @param action The action to execute.
- * @param callbackId The callback ID to be invoked upon action completion
- * @param args JSONArry of arguments for the action.
- * @return A PluginResult object with a status and message.
- */
- public PluginResult execute(String action, JSONArray args, String callbackId)
- {
- PluginResult result = null;
-
- // take a picture
- if (action != null && action.equals(ACTION_TAKE_PICTURE))
- {
- // Parse the options specified for the take picture action.
- CameraOptions options;
- try {
- options = CameraOptions.fromJSONArray(args);
- } catch (NumberFormatException e) {
- return new PluginResult(PluginResult.Status.JSON_EXCEPTION, "One of the camera options is not a valid number.");
- } catch (JSONException e) {
- return new PluginResult(PluginResult.Status.JSON_EXCEPTION, "One of the camera options is not valid JSON.");
- }
-
- // launch native camera application
- launchCamera(new PhotoListener(options, callbackId));
-
- // The native camera application runs in a separate process, so we
- // must now wait for the listener to retrieve the photo taken.
- // Return NO_RESULT status so plugin manager does not invoke a callback,
- // but keep the callback so the listener can invoke it later.
- result = new PluginResult(PluginResult.Status.NO_RESULT);
- result.setKeepCallback(true);
- return result;
- }
- else
- {
- result = new PluginResult(PluginResult.Status.INVALID_ACTION, "Camera: Invalid action:" + action);
- }
-
- return result;
- }
-
- /**
- * Launches the native camera application.
- */
- private static void launchCamera(PhotoListener listener)
- {
- // MMAPI interface doesn't use the native Camera application or interface
- // (we would have to replicate it). So, we invoke the native Camera application,
- // which doesn't allow us to set any options.
- synchronized(UiApplication.getEventLock()) {
- UiApplication.getUiApplication().addFileSystemJournalListener(listener);
- Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA, new CameraArguments());
- }
- }
-
- /**
- * Closes the native camera application.
- */
- public static void closeCamera()
- {
- // simulate two escape characters to exit native camera application
- // no, there is no other way to do this
- UiApplication.getUiApplication().invokeLater(new Runnable() {
- public void run() {
- try
- {
- EventInjector.KeyEvent inject = new EventInjector.KeyEvent(
- EventInjector.KeyEvent.KEY_DOWN, Characters.ESCAPE, 0);
- inject.post();
- inject.post();
- }
- catch (ControlledAccessException e)
- {
- // the application doesn't have key injection permissions
- Logger.log(Camera.class.getName() + ": Unable to close camera. " +
- ApplicationDescriptor.currentApplicationDescriptor().getName() +
- " does not have key injection permissions.");
- }
- }
- });
- }
-
- /**
- * Returns the image file URI or the Base64-encoded image.
- * @param filePath The full path of the image file
- * @param options Specifies the format of the image and the result
- * @param callbackId The id of the callback to receive the result
- */
- public static void processImage(String filePath, CameraOptions options,
- String callbackId) {
- PluginResult result = null;
- try
- {
- // wait for the file to be fully written to the file system
- // to avoid premature access to it (yes, this has happened)
- waitForImageFile(filePath);
-
- // Reformat the image if the specified options require it,
- // otherwise, get encoded string if base 64 string is output format.
- String imageURIorData = filePath;
-
- // save to file:///store/home/user/ as oppsed to photo album
- // so it doesn't show up in the camera's photo album viewer
- if(!options.saveToPhotoAlbum){
- FileConnection fconnIn = null;
- FileConnection fconnOut = null;
- InputStream in = null;
- OutputStream out = null;
- String newOutName = "";
- try
- {
- fconnIn = (FileConnection)Connector.open(filePath);
- if (fconnIn.exists())
- {
- newOutName = "file:///store/home/user/"+fconnIn.getName();
- fconnOut = (FileConnection)Connector.open(newOutName);
- if (!fconnOut.exists())
- {
- fconnOut.create();
- in = fconnIn.openInputStream();
- out = fconnOut.openOutputStream();
- out.write(IOUtilities.streamToBytes(in, 96*1024));
- fconnIn.delete();
- out.close();
- imageURIorData = newOutName;
- filePath = newOutName;
- waitForImageFile(newOutName);
- }
- }
- }
- finally
- {
- if (in != null) in.close();
- if (out != null) out.close();
- if (fconnIn != null) fconnIn.close();
- if (fconnOut != null) fconnOut.close();
- }
-
- }
-
- if (options.reformat) {
- imageURIorData = reformatImage(filePath, options);
- } else if (options.destinationType == CameraOptions.DESTINATION_DATA_URL) {
- imageURIorData = encodeImage(filePath);
- }
-
- // we have to check the size to avoid memory errors in the browser
- if (imageURIorData.length() > MAX_ENCODING_SIZE)
- {
- // it's a big one. this is for your own good.
- String msg = "Encoded image is too large. Try reducing camera image size.";
- Logger.log(Camera.class.getName() + ": " + msg);
- result = new PluginResult(PluginResult.Status.ERROR, msg);
- }
- else
- {
- result = new PluginResult(PluginResult.Status.OK, imageURIorData);
- }
- }
- catch (Exception e)
- {
- result = new PluginResult(PluginResult.Status.IO_EXCEPTION, e.toString());
- }
-
- // send result back to JavaScript
- sendResult(result, callbackId);
- }
-
- /**
- * Waits for the image file to be fully written to the file system.
- * @param filePath Full path of the image file
- * @throws IOException
- */
- private static void waitForImageFile(String filePath) throws IOException
- {
- long start = (new Date()).getTime();
- FileConnection fconn = null;
- try
- {
- fconn = (FileConnection)Connector.open(filePath, Connector.READ);
- if (fconn.exists())
- {
- long fileSize = fconn.fileSize();
- long size = 0;
- while (true)
- {
- try { Thread.sleep(100); } catch (InterruptedException e) {}
- size = fconn.fileSize();
- if (size == fileSize) {
- break;
- }
- fileSize = size;
- }
- Logger.log(Camera.class.getName() + ": " + filePath +
- " size=" + Long.toString(fileSize) + " bytes");
- }
- }
- finally
- {
- if (fconn != null) fconn.close();
- }
- long end = (new Date()).getTime();
- Logger.log(Camera.class.getName() + ": wait time=" + Long.toString(end-start) + " ms");
- }
-
- /**
- * Opens the specified image file and converts its contents to a Base64-encoded string.
- * @param filePath Full path of the image file
- * @return file contents as a Base64-encoded String
- */
- private static String encodeImage(String filePath) throws IOException
- {
- String imageData = null;
-
- // open the image file
- FileConnection fconn = null;
- InputStream in = null;
- ByteArrayOutputStream byteArrayOS = null;
- try
- {
- fconn = (FileConnection)Connector.open(filePath);
- if (fconn.exists())
- {
- // encode file contents using BASE64 encoding
- in = fconn.openInputStream();
- byteArrayOS = new ByteArrayOutputStream();
- Base64OutputStream base64OS = new Base64OutputStream(byteArrayOS);
- base64OS.write(IOUtilities.streamToBytes(in, 96*1024));
- base64OS.flush();
- base64OS.close();
- imageData = byteArrayOS.toString();
-
- Logger.log(Camera.class.getName() + ": Base64 encoding size=" +
- Integer.toString(imageData.length()));
- }
- }
- finally
- {
- if (in != null) in.close();
- if (fconn != null) fconn.close();
- if (byteArrayOS != null) byteArrayOS.close();
- }
-
- return imageData;
- }
-
- /**
- * Reformats the image taken with the camera based on the options specified.
- *
- * Unfortunately, reformatting the image will cause EXIF data in the photo
- * to be lost. Most importantly the orientation data is lost so the
- * picture is not auto rotated by software that recognizes EXIF data.
- *
- * @param filePath
- * The full path of the image file
- * @param options
- * Specifies the format of the image and the result
- * @return the reformatted image file URI or Base64-encoded image
- * @throws IOException
- */
- private static String reformatImage(String filePath, CameraOptions options)
- throws IOException {
- long start = (new Date()).getTime();
-
- // Open the original image created by the camera application and read
- // it into an EncodedImage object.
- FileConnection fconn = null;
- InputStream in = null;
- Bitmap originalImage = null;
- try {
- fconn = (FileConnection) Connector.open(filePath);
- in = fconn.openInputStream();
- originalImage = Bitmap.createBitmapFromBytes(IOUtilities.streamToBytes(in, 96*1024), 0, -1, 1);
- } finally {
- if (in != null)
- in.close();
- if (fconn != null)
- fconn.close();
- }
-
- int newWidth = options.targetWidth;
- int newHeight = options.targetHeight;
- int origWidth = originalImage.getWidth();
- int origHeight = originalImage.getHeight();
-
- // If only width or only height was specified, the missing dimension is
- // set based on the current aspect ratio of the image.
- if (newWidth > 0 && newHeight <= 0) {
- newHeight = (newWidth * origHeight) / origWidth;
- } else if (newWidth <= 0 && newHeight > 0) {
- newWidth = (newHeight * origWidth) / origHeight;
- } else if (newWidth <= 0 && newHeight <= 0) {
- newWidth = origWidth;
- newHeight = origHeight;
- } else {
- // If the user specified both a positive width and height
- // (potentially different aspect ratio) then the width or height is
- // scaled so that the image fits while maintaining aspect ratio.
- // Alternatively, the specified width and height could have been
- // kept and Bitmap.SCALE_TO_FIT specified when scaling, but this
- // would result in whitespace in the new image.
- double newRatio = newWidth / (double)newHeight;
- double origRatio = origWidth / (double)origHeight;
-
- if (origRatio > newRatio) {
- newHeight = (newWidth * origHeight) / origWidth;
- } else if (origRatio < newRatio) {
- newWidth = (newHeight * origWidth) / origHeight;
- }
- }
-
- Bitmap newImage = new Bitmap(newWidth, newHeight);
- originalImage.scaleInto(newImage, options.imageFilter, Bitmap.SCALE_TO_FILL);
-
- // Convert the image to the appropriate encoding. PNG does not allow
- // quality to be specified so the only affect that the quality option
- // has for a PNG is on the seelction of the image filter.
- EncodedImage encodedImage;
- if (options.encoding == CameraOptions.ENCODING_PNG) {
- encodedImage = PNGEncodedImage.encode(newImage);
- } else {
- encodedImage = JPEGEncodedImage.encode(newImage, options.quality);
- }
-
- // Rewrite the modified image back out to the same file. This is done
- // to ensure that for every picture taken, only one shows up in the
- // gallery. If the encoding changed the file extension will differ
- // from the original.
- OutputStream out = null;
- int dirIndex = filePath.lastIndexOf('/');
- String filename = filePath.substring(dirIndex + 1, filePath.lastIndexOf('.'))
- + options.fileExtension;
- try {
- fconn = (FileConnection) Connector.open(filePath);
- fconn.truncate(0);
- out = fconn.openOutputStream();
- out.write(encodedImage.getData());
- fconn.rename(filename);
- } finally {
- if (out != null)
- out.close();
- if (fconn != null)
- fconn.close();
- }
-
- // Return either the Base64-encoded string or the image URI for the
- // new image.
- String imageURIorData;
- if (options.destinationType == CameraOptions.DESTINATION_DATA_URL) {
- ByteArrayOutputStream byteArrayOS = null;
-
- try {
- byteArrayOS = new ByteArrayOutputStream();
- Base64OutputStream base64OS = new Base64OutputStream(
- byteArrayOS);
- base64OS.write(encodedImage.getData());
- base64OS.flush();
- base64OS.close();
- imageURIorData = byteArrayOS.toString();
- Logger.log(Camera.class.getName() + ": Base64 encoding size="
- + Integer.toString(imageURIorData.length()));
- } finally {
- if (byteArrayOS != null) {
- byteArrayOS.close();
- }
- }
- } else {
- imageURIorData = filePath.substring(0, dirIndex + 1) + filename;
- }
-
- long end = (new Date()).getTime();
- Logger.log(Camera.class.getName() + ": reformat time=" + Long.toString(end-start) + " ms");
-
- return imageURIorData;
- }
-
- /**
- * Sends result back to JavaScript.
- * @param result PluginResult
- */
- private static void sendResult(PluginResult result, String callbackId)
- {
- // invoke the appropriate callback
- if (result.getStatus() == PluginResult.Status.OK.ordinal())
- {
- success(result, callbackId);
- }
- else
- {
- error(result, callbackId);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/CameraOptions.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/CameraOptions.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/CameraOptions.java
deleted file mode 100644
index 8bfa0df..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/CameraOptions.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.camera;
-
-import org.apache.cordova.json4j.JSONArray;
-import org.apache.cordova.json4j.JSONException;
-
-import net.rim.device.api.system.Bitmap;
-
-/**
- * A helper class to hold all the options specified when using the camera api.
- */
-public class CameraOptions {
-
- /** Return the result as a Base-64 encoded string. */
- public static final int DESTINATION_DATA_URL = 0;
-
- /** Return the result as a file URI. */
- public static final int DESTINATION_FILE_URI = 1;
-
- /** JPEG image encoding. */
- public static final int ENCODING_JPEG = 0;
-
- /** PNG image encoding. */
- public static final int ENCODING_PNG = 1;
-
- /** Select image from picture library. */
- public static final int SOURCE_PHOTOLIBRARY = 0;
-
- /** Take picture from camera. */
- public static final int SOURCE_CAMERA = 1;
-
- /** Select image from picture library. */
- public static final int SOURCE_SAVEDPHOTOALBUM = 2;
-
- // Class members with defaults set.
- public int quality = 80;
- public int destinationType = DESTINATION_DATA_URL;
- public int sourceType = SOURCE_CAMERA;
- public int targetWidth = -1;
- public int targetHeight = -1;
- public int encoding = ENCODING_JPEG;
- public String fileExtension = ".jpg";
- public int imageFilter = Bitmap.FILTER_LANCZOS;
- public boolean reformat = false;
- public boolean saveToPhotoAlbum = true;
-
- /**
- * Defines the order of args in the JSONArray
- *
- * [ 80, // quality
- * Camera.DestinationType.DATA_URL, // destinationType
- * Camera.PictureSourceType.PHOTOLIBRARY // sourceType (ignored)
- * 400, // targetWidth
- * 600, // targetHeight
- * Camera.EncodingType.JPEG // encoding
- * Camera.mediaType
- * Camera.allowEdit
- * Camera.correctOrientation
- * Camera.saveToPhotoAlbum // save to photo album
- * Camera.popoverOptions]
- */
- private static final int ARG_QUALITY = 0;
- private static final int ARG_DESTINATION_TYPE = 1;
- private static final int ARG_SOURCE_TYPE = 2;
- private static final int ARG_TARGET_WIDTH = 3;
- private static final int ARG_TARGET_HEIGHT = 4;
- private static final int ARG_ENCODING = 5;
- private static final int ARG_SAVETOPHOTOALBUM = 9;
-
- /**
- * Parse the JSONArray and populate the class members with the values.
- *
- * @param args
- * a JSON Array of camera options.
- * @return a new CameraOptions object with values set.
- * @throws NumberFormatException
- * @throws JSONException
- */
- public static CameraOptions fromJSONArray(JSONArray args)
- throws NumberFormatException, JSONException {
- CameraOptions options = new CameraOptions();
-
- if (args != null && args.length() > 0) {
- // Use the quality value to determine what image filter to use
- // if a reformat is necessary. The possible values in order from
- // fastest (poorest quality) to slowest (best quality) are:
- //
- // FILTER_BOX -> FILTER_BILINEAR -> FILTER_LANCZOS
- if (!args.isNull(ARG_QUALITY)) {
- int quality = Integer.parseInt(args.getString(ARG_QUALITY));
- if (quality > 0) {
- options.quality = quality > 100 ? 100 : quality;
- if (options.quality < 30) {
- options.imageFilter = Bitmap.FILTER_BOX;
- } else if (options.quality < 60) {
- options.imageFilter = Bitmap.FILTER_BILINEAR;
- }
- }
- }
-
- if (!args.isNull(ARG_DESTINATION_TYPE)) {
- int destType = Integer.parseInt(args
- .getString(ARG_DESTINATION_TYPE));
- if (destType == DESTINATION_FILE_URI) {
- options.destinationType = DESTINATION_FILE_URI;
- }
- }
-
- if (!args.isNull(ARG_SOURCE_TYPE)) {
- options.sourceType = Integer.parseInt(args
- .getString(ARG_SOURCE_TYPE));
- }
-
- if (!args.isNull(ARG_TARGET_WIDTH)) {
- options.targetWidth = Integer.parseInt(args
- .getString(ARG_TARGET_WIDTH));
- }
-
- if (!args.isNull(ARG_TARGET_HEIGHT)) {
- options.targetHeight = Integer.parseInt(args
- .getString(ARG_TARGET_HEIGHT));
- }
-
- if (!args.isNull(ARG_ENCODING)) {
- int encoding = Integer.parseInt(args.getString(ARG_ENCODING));
- if (encoding == ENCODING_PNG) {
- options.encoding = ENCODING_PNG;
- options.fileExtension = ".png";
- }
- }
-
- // A reformat of the picture taken from the camera is only performed
- // if a custom width or height was specified or the user wants
- // the output in an encoded form which is not JPEG.
- if (options.targetWidth > 0 || options.targetHeight > 0
- || options.encoding != ENCODING_JPEG) {
- options.reformat = true;
- }
-
- if (!args.isNull(ARG_SAVETOPHOTOALBUM)) {
- options.saveToPhotoAlbum = parseBoolean(args.getString(ARG_SAVETOPHOTOALBUM));
- }
-
- }
-
- return options;
- }
-
- /**
- * no parseBoolean in JDK 1.3 :(
- */
- public static boolean parseBoolean(String s) {
- if(s.equals("true")){
- return true;
- }else{
- return false;
- }
- }
-
- /**
- * @see java.lang.Object#toString()
- */
- public String toString() {
- StringBuffer str = new StringBuffer();
- str.append("Destination: " + destinationType + "\n");
- str.append("Source: " + sourceType + "\n");
- str.append("Quality: " + quality + "\n");
- str.append("Width: " + targetWidth + "\n");
- str.append("Height: " + targetHeight + "\n");
- str.append("Encoding: " + encoding + "\n");
- str.append("Filter: " + imageFilter + "\n");
- str.append("Reformat: " + reformat);
- str.append("Save To Photo Album: " + saveToPhotoAlbum);
- return str.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/PhotoListener.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/PhotoListener.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/PhotoListener.java
deleted file mode 100644
index 8571788..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/camera/PhotoListener.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.camera;
-
-import net.rim.device.api.io.file.FileSystemJournal;
-import net.rim.device.api.io.file.FileSystemJournalEntry;
-import net.rim.device.api.io.file.FileSystemJournalListener;
-import net.rim.device.api.ui.UiApplication;
-
-/**
- * Listens for photo added to file system and invokes the specified callback
- * with the result formatted according the specified destination type.
- */
-public class PhotoListener implements FileSystemJournalListener {
-
- /**
- * Image format options specified by the caller.
- */
- private CameraOptions options;
-
- /**
- * Callback to be invoked with the result.
- */
- private String callbackId;
-
- /**
- * Used to track file system changes.
- */
- private long lastUSN = 0;
-
- /**
- * Constructor.
- * @param options Specifies the format of the image and result
- * @param callbackId The id of the callback to receive the result
- */
- public PhotoListener(CameraOptions options, String callbackId)
- {
- this.options = options;
- this.callbackId = callbackId;
- }
-
- /**
- * Listens for file system changes. When a JPEG file is added, we process
- * it and send it back.
- */
- public void fileJournalChanged()
- {
- // next sequence number file system will use
- long USN = FileSystemJournal.getNextUSN();
-
- for (long i = USN - 1; i >= lastUSN && i < USN; --i)
- {
- FileSystemJournalEntry entry = FileSystemJournal.getEntry(i);
- if (entry == null)
- {
- break;
- }
-
- if (entry.getEvent() == FileSystemJournalEntry.FILE_ADDED)
- {
- String path = entry.getPath();
- if (path != null && path.indexOf(".jpg") != -1)
- {
- // we found a new JPEG file
- // first, stop listening to avoid processing the file more than once
- synchronized(UiApplication.getEventLock()) {
- UiApplication.getUiApplication().removeFileSystemJournalListener(this);
- }
-
- // process the image on a background thread to avoid clogging the event queue
- final String filePath = "file://" + path;
- Thread thread = new Thread(new Runnable() {
- public void run() {
- Camera.processImage(filePath, options, callbackId);
- }
- });
- thread.start();
-
- // clean up
- Camera.closeCamera();
-
- break;
- }
- }
- }
-
- // remember the file journal change number,
- // so we don't search the same events again and again
- lastUSN = USN;
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureListener.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureListener.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureListener.java
deleted file mode 100644
index 9267e9b..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureListener.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import net.rim.device.api.io.file.FileSystemJournal;
-import net.rim.device.api.io.file.FileSystemJournalEntry;
-import net.rim.device.api.io.file.FileSystemJournalListener;
-
-/**
- * Listens for audio recording files that are added to file system.
- * <p>
- * Audio recordings are added to the file system when the user stops the
- * recording. The audio recording file extension is '.amr'. Therefore, we listen
- * for the <code>FileSystemJournalEntry.FILE_ADDED</code> event, capturing when
- * the new file is written.
- * <p>
- * The file system notifications will arrive on the application event thread.
- * When it receives a notification, it adds the image file path to a MediaQueue
- * so that the capture thread can process the file.
- */
-public class AudioCaptureListener implements FileSystemJournalListener {
- /**
- * Used to track file system changes.
- */
- private long lastUSN = 0;
-
- /**
- * Queue to send media files to for processing.
- */
- private MediaQueue queue = null;
-
- /**
- * Constructor.
- */
- AudioCaptureListener(MediaQueue queue) {
- this.queue = queue;
- }
-
- public void fileJournalChanged() {
- // next sequence number file system will use
- long USN = FileSystemJournal.getNextUSN();
-
- for (long i = USN - 1; i >= lastUSN && i < USN; --i) {
- FileSystemJournalEntry entry = FileSystemJournal.getEntry(i);
- if (entry == null) {
- break;
- }
-
- // has audio recording file has been added to the file system?
- String path = entry.getPath();
- if (entry.getEvent() == FileSystemJournalEntry.FILE_ADDED
- && path.endsWith(".amr")) {
- // add file path to the capture queue
- queue.add("file://" + path);
-
- break;
- }
- }
-
- // remember the file journal change number,
- // so we don't search the same events again and again
- lastUSN = USN;
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureOperation.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureOperation.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureOperation.java
deleted file mode 100644
index f4fd9b4..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioCaptureOperation.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import java.io.IOException;
-import java.util.Date;
-
-import javax.microedition.io.Connector;
-import javax.microedition.io.file.FileConnection;
-
-import org.apache.cordova.file.File;
-import org.apache.cordova.util.FileUtils;
-import org.apache.cordova.util.Logger;
-
-import net.rim.device.api.io.MIMETypeAssociations;
-import net.rim.device.api.ui.UiApplication;
-
-public class AudioCaptureOperation extends CaptureOperation {
-
- // content type
- public static final String CONTENT_TYPE = "audio/";
-
- // maximum duration to capture media (milliseconds)
- private double duration = 0;
-
- // file system listener
- private AudioCaptureListener listener = null;
-
- /**
- * Creates and starts an audio capture operation.
- *
- * @param limit
- * maximum number of media files to capture
- * @param duration
- * maximum duration to capture media (milliseconds)
- * @param callbackId
- * the callback to receive the files
- * @param queue
- * the queue from which to retrieve captured media files
- */
- public AudioCaptureOperation(long limit, double duration, String callbackId, MediaQueue queue) {
- super(limit, callbackId, queue);
-
- if (duration > 0) {
- this.duration = duration;
- }
-
- // listener to capture image files added to file system
- this.listener = new AudioCaptureListener(queue);
-
- start();
- }
-
- /**
- * Registers file system listener and launches native voice notes recorder
- * application.
- */
- protected void setup() {
- // register listener for files being written
- synchronized(UiApplication.getEventLock()) {
- UiApplication.getUiApplication().addFileSystemJournalListener(listener);
- }
-
- // launch the native voice notes recorder application
- AudioControl.launchAudioRecorder();
- }
-
- /**
- * Unregisters file system listener and closes native voice notes recorder
- * application.
- */
- protected void teardown() {
- // remove file system listener
- synchronized(UiApplication.getEventLock()) {
- UiApplication.getUiApplication().removeFileSystemJournalListener(listener);
- }
-
- // close the native voice notes recorder application
- AudioControl.closeAudioRecorder();
- }
-
- /**
- * Retrieves the file properties for the captured audio recording.
- *
- * @param filePath
- * full path of the audio recording file
- */
- protected void processFile(String filePath) {
- Logger.log(this.getClass().getName() + ": processing file: " + filePath);
-
- // wait for file to finish writing and add it to captured files
- addCaptureFile(getMediaFile(filePath));
- }
-
- /**
- * Waits for file to be fully written to the file system before retrieving
- * its file properties.
- *
- * @param filePath
- * Full path of the image file
- * @throws IOException
- */
- private File getMediaFile(String filePath) {
- File file = new File(FileUtils.stripSeparator(filePath));
-
- // time begin waiting for file write
- long start = (new Date()).getTime();
-
- // wait for the file to be fully written, then grab its properties
- FileConnection fconn = null;
- try {
- fconn = (FileConnection) Connector.open(filePath, Connector.READ);
- if (fconn.exists()) {
- // wait for file to be fully written
- long fileSize = fconn.fileSize();
- long size = 0;
- Thread thisThread = Thread.currentThread();
- while (myThread == thisThread) {
- try {
- Thread.sleep(100);
- }
- catch (InterruptedException e) {
- break;
- }
- size = fconn.fileSize();
- if (fileSize != 0 && size == fileSize) {
- break;
- }
- fileSize = size;
- }
- Logger.log(this.getClass().getName() + ": " + filePath + " size="
- + Long.toString(fileSize) + " bytes");
-
- // retrieve file properties
- file.setLastModifiedDate(fconn.lastModified());
- file.setName(FileUtils.stripSeparator(fconn.getName()));
- file.setSize(fileSize);
- file.setType(MIMETypeAssociations.getMIMEType(filePath));
- }
- }
- catch (IOException e) {
- Logger.log(this.getClass().getName() + ": " + e);
- }
- finally {
- try {
- if (fconn != null) fconn.close();
- } catch (IOException ignored) {}
- }
-
- // log time it took to write the file
- long end = (new Date()).getTime();
- Logger.log(this.getClass().getName() + ": wait time="
- + Long.toString(end - start) + " ms");
-
- return file;
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioControl.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioControl.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioControl.java
deleted file mode 100644
index 45e9f9c..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/AudioControl.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import org.apache.cordova.util.ApplicationUtils;
-import org.apache.cordova.util.Logger;
-
-import net.rim.device.api.system.ApplicationDescriptor;
-import net.rim.device.api.system.ApplicationManager;
-import net.rim.device.api.system.ApplicationManagerException;
-import net.rim.device.api.system.CodeModuleManager;
-
-public class AudioControl {
- /**
- * Determines if the native voice notes recorder application is installed
- * on the device.
- *
- * @return true if native voice notes recorder application is installed
- */
- public static boolean hasAudioRecorderApplication() {
- return ApplicationUtils.isModuleInstalled("net_rim_bb_voicenotesrecorder");
- }
-
- /**
- * Determines if the native voice notes recorder application is running in
- * the foreground.
- *
- * @return true if native voice notes recorder application is running in
- * foreground
- */
- public static boolean isAudioRecorderActive() {
- return ApplicationUtils.isApplicationInForeground("net_rim_bb_voicenotesrecorder");
- }
-
- /**
- * Launches the native audio recorder application.
- */
- public static void launchAudioRecorder() {
- int handle = CodeModuleManager.getModuleHandle("net_rim_bb_voicenotesrecorder");
- ApplicationDescriptor ad = CodeModuleManager.getApplicationDescriptors(handle)[0];
- ApplicationDescriptor ad2 = new ApplicationDescriptor(ad, null);
- try {
- ApplicationManager.getApplicationManager().runApplication(ad2, true);
- }
- catch (ApplicationManagerException e) {
- Logger.log(AudioControl.class.getName() + ": unable to launch net_rim_bb_voicenotesrecorder");
- }
- }
-
- /**
- * Closes the native audio recorder application.
- */
- public static void closeAudioRecorder() {
- if (!isAudioRecorderActive()) {
- return;
- }
- ApplicationUtils.injectEscKeyPress(1);
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CameraControl.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CameraControl.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CameraControl.java
deleted file mode 100644
index 2ed9206..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CameraControl.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import org.apache.cordova.util.ApplicationUtils;
-
-import net.rim.blackberry.api.invoke.CameraArguments;
-import net.rim.blackberry.api.invoke.Invoke;
-import net.rim.device.api.ui.UiApplication;
-
-public class CameraControl {
- /**
- * Determines if the native camera application is running in the foreground.
- *
- * @return true if native camera application is running in foreground
- */
- public static boolean isCameraActive() {
- return ApplicationUtils.isApplicationInForeground("net_rim_bb_camera");
- }
-
- /**
- * Determines if the native video recorder application is running in the
- * foreground.
- *
- * @return true if native video recorder application is running in
- * foreground
- */
- public static boolean isVideoRecorderActive() {
- return ApplicationUtils.isApplicationInForeground("net_rim_bb_videorecorder");
- }
-
- /**
- * Launches the native camera application.
- */
- public static void launchCamera() {
- synchronized(UiApplication.getEventLock()) {
- Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA,
- new CameraArguments());
- }
- }
-
- /**
- * Launches the native video recorder application.
- */
- public static void launchVideoRecorder() {
- synchronized(UiApplication.getEventLock()) {
- Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA,
- new CameraArguments(CameraArguments.ARG_VIDEO_RECORDER));
- }
- }
-
- /**
- * Closes the native camera application.
- */
- public static void closeCamera() {
- if (!isCameraActive()) {
- return;
- }
- ApplicationUtils.injectEscKeyPress(2);
- }
-
- /**
- * Closes the native video recorder application.
- */
- public static void closeVideoRecorder() {
- if (!isVideoRecorderActive()) {
- return;
- }
- ApplicationUtils.injectEscKeyPress(2);
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureControl.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureControl.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureControl.java
deleted file mode 100644
index e37dd56..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureControl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import java.util.Enumeration;
-import java.util.Vector;
-
-public class CaptureControl {
-
- /**
- * Pending capture operations.
- */
- private Vector pendingOperations = new Vector();
-
- /**
- * Singleton.
- */
- private CaptureControl() {}
-
- /**
- * Holds the singleton for lazy instantiation.
- */
- private static class CaptureControlHolder {
- static final CaptureControl INSTANCE = new CaptureControl();
- }
-
- /**
- * Retrieves a CaptureControl instance.
- * @return CaptureControl instance.
- */
- public static final CaptureControl getCaptureControl() {
- return CaptureControlHolder.INSTANCE;
- }
-
- /**
- * Add capture operation so we can stop it manually.
- */
- public void addCaptureOperation(CaptureOperation operation) {
- if (operation == null) {
- return;
- }
-
- synchronized (pendingOperations) {
- pendingOperations.addElement(operation);
- }
- }
-
- /**
- * Remove capture operation.
- */
- public void removeCaptureOperation(CaptureOperation operation) {
- if (operation == null) {
- return;
- }
-
- synchronized (pendingOperations) {
- pendingOperations.removeElement(operation);
- }
- }
-
- /**
- * Starts an image capture operation, during which a user can take multiple
- * photos. The capture operation runs in the background.
- *
- * @param limit
- * the maximum number of images to capture during the operation
- * @param callbackId
- * the callback to be invoked with capture file properties
- */
- public void startImageCaptureOperation(long limit, String callbackId) {
- // setup a queue to receive image file paths
- MediaQueue queue = new MediaQueue();
-
- // start a capture operation on a background thread
- CaptureOperation operation = new ImageCaptureOperation(limit,
- callbackId, queue);
-
- // track the operation so we can stop or cancel it later
- addCaptureOperation(operation);
- }
-
- /**
- * Starts a video capture operation, during which a user can record multiple
- * recordings. The capture operation runs in the background.
- *
- * @param limit
- * the maximum number of images to capture during the operation
- * @param callbackId
- * the callback to be invoked with capture file properties
- */
- public void startVideoCaptureOperation(long limit, String callbackId) {
- // setup a queue to receive video recording file paths
- MediaQueue queue = new MediaQueue();
-
- // start a capture operation on a background thread
- CaptureOperation operation = new VideoCaptureOperation(limit,
- callbackId, queue);
-
- // track the operation so we can stop or cancel it later
- addCaptureOperation(operation);
- }
-
- /**
- * Starts an audio capture operation using the native voice notes recorder
- * application.
- *
- * @param limit
- * the maximum number of audio clips to capture during the
- * operation
- * @param duration
- * the maximum duration of each captured clip
- * @param callbackId
- * the callback to be invoked with the capture results
- */
- public void startAudioCaptureOperation(long limit, double duration, String callbackId) {
- // setup a queue to receive recording file paths
- MediaQueue queue = new MediaQueue();
-
- // start a capture operation on a background thread
- CaptureOperation operation = new AudioCaptureOperation(limit, duration,
- callbackId, queue);
-
- // track the operation so we can stop or cancel it later
- addCaptureOperation(operation);
- }
-
- /**
- * Stops all pending capture operations. If the <code>cancel</code>
- * parameter is <code>true</code>, no results will be sent via the callback
- * mechanism and any captured files will be removed from the file system.
- *
- * @param cancel
- * true if operations should be canceled
- */
- public void stopPendingOperations(boolean cancel) {
- // There are two scenarios where the capture operation would be stopped
- // manually:
- // 1- The user stops the capture application, and this application
- // returns to the foreground.
- // 2- It is canceled programmatically. No results should be sent.
- synchronized (pendingOperations) {
- for (Enumeration e = pendingOperations.elements(); e.hasMoreElements(); ) {
- CaptureOperation operation = (CaptureOperation) e.nextElement();
- if (cancel) {
- operation.cancel();
- }
- else {
- operation.stop();
- }
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureMode.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureMode.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureMode.java
deleted file mode 100644
index 7c71f96..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureMode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import org.apache.cordova.json4j.JSONException;
-import org.apache.cordova.json4j.JSONObject;
-
-public class CaptureMode {
-
- private String mimeType = null;
- private long height = 0;
- private long width = 0;
-
- public CaptureMode() {
- }
-
- public CaptureMode(String type) {
- this.mimeType = type;
- }
-
- public CaptureMode(String type, long width, long height) {
- this.mimeType = type;
- this.height = height;
- this.width = width;
- }
-
- public String getMimeType() {
- return mimeType;
- }
-
- public long getHeight() {
- return height;
- }
-
- public long getWidth() {
- return width;
- }
-
- public JSONObject toJSONObject() {
- JSONObject o = new JSONObject();
- try {
- o.put("type", getMimeType());
- o.put("height", getHeight());
- o.put("width", getWidth());
- }
- catch (JSONException ignored) {
- }
- return o;
- }
-
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof CaptureMode)) {
- return false;
- }
- CaptureMode cm = (CaptureMode)o;
- return ((mimeType == null ? cm.mimeType == null :
- mimeType.equals(cm.mimeType))
- && (width == cm.width)
- && (height == cm.height));
- }
-
- public int hashCode() {
- int hash = (mimeType != null ? mimeType.hashCode() : 19);
- hash = 37*hash + (int)width;
- hash = 37*hash + (int)height;
- return hash;
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureOperation.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureOperation.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureOperation.java
deleted file mode 100644
index dc85bd8..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/CaptureOperation.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Vector;
-
-import org.apache.cordova.file.File;
-import org.apache.cordova.util.FileUtils;
-import org.apache.cordova.util.Logger;
-
-public abstract class CaptureOperation implements Runnable {
- // max number of media files to capture
- protected long limit = 1;
-
- // for sending results
- protected String callbackId = null;
-
- // list of captured media files
- protected final Vector captureFiles = new Vector();
-
- // media file queue
- protected MediaQueue mediaQueue = null;
-
- // used to interrupt thread
- protected volatile Thread myThread;
-
- // to determine if operation has been canceled
- protected boolean canceled = false;
-
- /**
- * Creates and starts a capture operation on a new thread.
- *
- * @param limit
- * maximum number of media files to capture
- * @param callbackId
- * the callback to receive the files
- * @param queue
- * the queue from which to retrieve captured media files
- */
- public CaptureOperation(long limit, String callbackId, MediaQueue queue) {
- if (limit > 1) {
- this.limit = limit;
- }
-
- this.callbackId = callbackId;
- this.mediaQueue = queue;
- this.myThread = new Thread(this);
- }
-
- /**
- * Waits for media file to be captured.
- */
- public void run() {
- if (myThread == null) {
- return; // stopped before started
- }
-
- Logger.log(this.getClass().getName() + ": " + callbackId + " started");
-
- // tasks to be run before entering main loop
- setup();
-
- // capture until interrupted or we've reached capture limit
- Thread thisThread = Thread.currentThread();
- String filePath = null;
- while (myThread == thisThread && captureFiles.size() < limit) {
- try {
- // consume file added to media capture queue
- filePath = mediaQueue.remove();
- }
- catch (InterruptedException e) {
- Logger.log(this.getClass().getName() + ": " + callbackId + " interrupted");
- // and we're done
- break;
- }
- processFile(filePath);
- }
-
- // perform cleanup tasks
- teardown();
-
- // process captured results
- processResults();
-
- // unregister the operation from the controller
- CaptureControl.getCaptureControl().removeCaptureOperation(this);
-
- Logger.log(this.getClass().getName() + ": " + callbackId + " finished");
- }
-
- /**
- * Starts this capture operation on a new thread.
- */
- protected void start() {
- if (myThread == null) {
- return; // stopped before started
- }
- myThread.start();
- }
-
- /**
- * Stops the operation.
- */
- public void stop() {
- // interrupt capture thread
- Thread tmpThread = myThread;
- myThread = null;
- if (tmpThread != null && tmpThread.isAlive()) {
- tmpThread.interrupt();
- }
- }
-
- /**
- * Cancels the operation.
- */
- public void cancel() {
- canceled = true;
- stop();
- }
-
- /**
- * Processes the results of the capture operation.
- */
- protected void processResults() {
- // process results
- if (!canceled) {
- // invoke appropriate callback
- if (captureFiles.size() > 0) {
- // send capture files
- MediaCapture.captureSuccess(captureFiles, callbackId);
- }
- else {
- // error
- MediaCapture.captureError(callbackId);
- }
- }
- else {
- removeCaptureFiles();
- }
- }
-
- /**
- * Adds a media file to list of collected media files for this operation.
- *
- * @param file
- * object containing media file properties
- */
- protected void addCaptureFile(File file) {
- captureFiles.addElement(file);
- }
-
- /**
- * Removes captured files from the file system.
- */
- protected void removeCaptureFiles() {
- for (Enumeration e = captureFiles.elements(); e.hasMoreElements();) {
- File file = (File) e.nextElement();
- try {
- FileUtils.delete(file.getFullPath());
- }
- catch (IOException ignored) {
- }
- }
- }
-
- /**
- * Override this method to perform tasks before the operation starts.
- */
- protected void setup() {
- }
-
- /**
- * Override this method to perform tasks after the operation has
- * stopped.
- */
- protected void teardown() {
- }
-
- /**
- * Subclasses must implement this method to process a captured media file.
- * @param filePath the full path of the media file
- */
- protected abstract void processFile(final String filePath);
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureListener.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureListener.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureListener.java
deleted file mode 100644
index 4906ee8..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureListener.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import net.rim.device.api.io.file.FileSystemJournal;
-import net.rim.device.api.io.file.FileSystemJournalEntry;
-import net.rim.device.api.io.file.FileSystemJournalListener;
-
-/**
- * Listens for image files that are added to file system.
- * <p>
- * The file system notifications will arrive on the application event thread.
- * When it receives a notification, it adds the image file path to a MediaQueue
- * so that the capture thread can process the file.
- */
-class ImageCaptureListener implements FileSystemJournalListener {
-
- /**
- * Used to track file system changes.
- */
- private long lastUSN = 0;
-
- /**
- * Collection of media files.
- */
- private MediaQueue queue = null;
-
- /**
- * Constructor.
- */
- ImageCaptureListener(MediaQueue queue) {
- this.queue = queue;
- }
-
- /**
- * Listens for file system changes. When a JPEG file is added, we process
- * it and send it back.
- */
- public void fileJournalChanged()
- {
- // next sequence number file system will use
- long USN = FileSystemJournal.getNextUSN();
-
- for (long i = USN - 1; i >= lastUSN && i < USN; --i)
- {
- FileSystemJournalEntry entry = FileSystemJournal.getEntry(i);
- if (entry == null)
- {
- break;
- }
-
- if (entry.getEvent() == FileSystemJournalEntry.FILE_ADDED)
- {
- String path = entry.getPath();
- if (path != null && path.indexOf(".jpg") != -1)
- {
- // add file path to the capture queue
- queue.add("file://" + path);
- break;
- }
- }
- }
-
- // remember the file journal change number,
- // so we don't search the same events again and again
- lastUSN = USN;
- }
-}
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureOperation.java
----------------------------------------------------------------------
diff --git a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureOperation.java b/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureOperation.java
deleted file mode 100644
index a831dc2..0000000
--- a/lib/cordova-blackberry/framework/ext/src/org/apache/cordova/capture/ImageCaptureOperation.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cordova.capture;
-
-import java.io.IOException;
-import java.util.Date;
-import javax.microedition.io.Connector;
-import javax.microedition.io.file.FileConnection;
-
-import org.apache.cordova.file.File;
-import org.apache.cordova.util.FileUtils;
-import org.apache.cordova.util.Logger;
-
-import net.rim.device.api.io.MIMETypeAssociations;
-import net.rim.device.api.ui.UiApplication;
-
-public class ImageCaptureOperation extends CaptureOperation {
- // content type
- public static String CONTENT_TYPE = "image/";
-
- // file system listener
- private ImageCaptureListener listener = null;
-
- /**
- * Creates and starts an image capture operation.
- *
- * @param limit
- * maximum number of media files to capture
- * @param callbackId
- * the callback to receive the files
- * @param queue
- * the queue from which to retrieve captured media files
- */
- public ImageCaptureOperation(long limit, String callbackId, MediaQueue queue) {
- super(limit, callbackId, queue);
-
- // listener to capture image files added to file system
- this.listener = new ImageCaptureListener(queue);
-
- start();
- }
-
- /**
- * Registers file system listener and launches native camera application.
- */
- protected void setup() {
- // register listener for files being written
- synchronized(UiApplication.getEventLock()) {
- UiApplication.getUiApplication().addFileSystemJournalListener(listener);
- }
-
- // launch the native camera application
- CameraControl.launchCamera();
- }
-
- /**
- * Unregisters file system listener and closes native camera application.
- */
- protected void teardown() {
- // remove file system listener
- synchronized(UiApplication.getEventLock()) {
- UiApplication.getUiApplication().removeFileSystemJournalListener(listener);
- }
-
- // close the native camera application
- CameraControl.closeCamera();
- }
-
- /**
- * Waits for image file to be written to file system and retrieves its file
- * properties.
- *
- * @param filePath
- * the full path of the media file
- */
- protected void processFile(final String filePath) {
- Logger.log(this.getClass().getName() + ": processing file: " + filePath);
-
- // wait for file to finish writing and add it to captured files
- addCaptureFile(getMediaFile(filePath));
- }
-
- /**
- * Waits for file to be fully written to the file system before retrieving
- * its file properties.
- *
- * @param filePath
- * Full path of the image file
- * @throws IOException
- */
- private File getMediaFile(String filePath) {
- File file = new File(FileUtils.stripSeparator(filePath));
-
- // time begin waiting for file write
- long start = (new Date()).getTime();
-
- // wait for the file to be fully written, then grab its properties
- FileConnection fconn = null;
- try {
- fconn = (FileConnection) Connector.open(filePath, Connector.READ);
- if (fconn.exists()) {
- // wait for file to be fully written
- long fileSize = fconn.fileSize();
- long size = 0;
- Thread thisThread = Thread.currentThread();
- while (myThread == thisThread) {
- try {
- Thread.sleep(100);
- }
- catch (InterruptedException e) {
- break;
- }
- size = fconn.fileSize();
- if (size == fileSize) {
- break;
- }
- fileSize = size;
- }
- Logger.log(this.getClass().getName() + ": " + filePath + " size="
- + Long.toString(fileSize) + " bytes");
-
- // retrieve file properties
- file.setLastModifiedDate(fconn.lastModified());
- file.setName(FileUtils.stripSeparator(fconn.getName()));
- file.setSize(fileSize);
- file.setType(MIMETypeAssociations.getMIMEType(filePath));
- }
- }
- catch (IOException e) {
- Logger.log(this.getClass().getName() + ": " + e);
- }
- finally {
- try {
- if (fconn != null) fconn.close();
- } catch (IOException ignored) {}
- }
-
- // log time it took to write the file
- long end = (new Date()).getTime();
- Logger.log(this.getClass().getName() + ": wait time="
- + Long.toString(end - start) + " ms");
-
- return file;
- }
-}