You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by bc...@apache.org on 2012/05/15 06:38:01 UTC
[10/15] Updates.
http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/c8fafa6b/framework/src/org/apache/cordova/CameraLauncher.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CameraLauncher.java b/framework/src/org/apache/cordova/CameraLauncher.java
index 5751464..94d7e9c 100755
--- a/framework/src/org/apache/cordova/CameraLauncher.java
+++ b/framework/src/org/apache/cordova/CameraLauncher.java
@@ -26,7 +26,7 @@ import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.codec.binary.Base64;
-import org.apache.cordova.api.CordovaInterface;
+//import org.apache.cordova.api.CordovaInterface;
import org.apache.cordova.api.LOG;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
@@ -35,7 +35,7 @@ import org.json.JSONException;
import android.app.Activity;
import android.content.ContentValues;
-import android.content.Context;
+//import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
@@ -53,50 +53,50 @@ public class CameraLauncher extends Plugin {
private static final int DATA_URL = 0; // Return base64 encoded string
private static final int FILE_URI = 1; // Return file uri (content://media/external/images/media/2 for Android)
-
+
private static final int PHOTOLIBRARY = 0; // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
private static final int CAMERA = 1; // Take picture from camera
private static final int SAVEDPHOTOALBUM = 2; // Choose image from picture library (same as PHOTOLIBRARY for Android)
-
+
private static final int PICTURE = 0; // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
private static final int VIDEO = 1; // allow selection of video only, ONLY RETURNS URL
private static final int ALLMEDIA = 2; // allow selection from all media types
-
+
private static final int JPEG = 0; // Take a picture of type JPEG
private static final int PNG = 1; // Take a picture of type PNG
private static final String GET_PICTURE = "Get Picture";
private static final String GET_VIDEO = "Get Video";
private static final String GET_All = "Get All";
-
+
private static final String LOG_TAG = "CameraLauncher";
-
+
private int mQuality; // Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality)
private int targetWidth; // desired width of the image
private int targetHeight; // desired height of the image
private Uri imageUri; // Uri of captured image
private int encodingType; // Type of encoding to use
private int mediaType; // What type of media to retrieve
-
+
public String callbackId;
private int numPics;
-
+
//This should never be null!
- private CordovaInterface cordova;
-
+ //private CordovaInterface cordova;
+
/**
* Constructor.
*/
public CameraLauncher() {
}
- public void setContext(Context mCtx) {
- super.setContext(mCtx);
- if(CordovaInterface.class.isInstance(mCtx))
- cordova = (CordovaInterface) mCtx;
- else
- LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
- }
-
+// public void setContext(CordovaInterface mCtx) {
+// super.setContext(mCtx);
+// if (CordovaInterface.class.isInstance(mCtx))
+// cordova = (CordovaInterface) mCtx;
+// else
+// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
+// }
+
/**
* Executes the request and returns PluginResult.
*
@@ -107,9 +107,9 @@ public class CameraLauncher extends Plugin {
*/
public PluginResult execute(String action, JSONArray args, String callbackId) {
PluginResult.Status status = PluginResult.Status.OK;
- String result = "";
+ String result = "";
this.callbackId = callbackId;
-
+
try {
if (action.equals("takePicture")) {
int srcType = CAMERA;
@@ -127,7 +127,7 @@ public class CameraLauncher extends Plugin {
this.targetHeight = args.getInt(4);
this.encodingType = args.getInt(5);
this.mediaType = args.getInt(6);
-
+
if (srcType == CAMERA) {
this.takePicture(destType, encodingType);
}
@@ -144,11 +144,11 @@ public class CameraLauncher extends Plugin {
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}
-
+
//--------------------------------------------------------------------------
// LOCAL METHODS
//--------------------------------------------------------------------------
-
+
/**
* Take a picture with the camera.
* When an image is captured or the camera view is cancelled, the result is returned
@@ -166,20 +166,21 @@ public class CameraLauncher extends Plugin {
public void takePicture(int returnType, int encodingType) {
// Save the number of images currently on disk for later
this.numPics = queryImgDB().getCount();
-
+
// Display camera
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
-
+
// Specify file so that large image is captured and returned
// TODO: What if there isn't any external storage?
File photo = createCaptureFile(encodingType);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
this.imageUri = Uri.fromFile(photo);
-
- if(cordova != null)
- cordova.startActivityForResult((Plugin) this, intent, (CAMERA+1)*16 + returnType+1);
- else
- LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
+
+ if (this.ctx != null) {
+ this.ctx.startActivityForResult((Plugin) this, intent, (CAMERA + 1) * 16 + returnType + 1);
+ }
+// else
+// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
}
/**
@@ -191,9 +192,9 @@ public class CameraLauncher extends Plugin {
private File createCaptureFile(int encodingType) {
File photo = null;
if (encodingType == JPEG) {
- photo = new File(DirectoryManager.getTempDirectoryPath(ctx), "Pic.jpg");
+ photo = new File(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()), "Pic.jpg");
} else if (encodingType == PNG) {
- photo = new File(DirectoryManager.getTempDirectoryPath(ctx), "Pic.png");
+ photo = new File(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()), "Pic.png");
} else {
throw new IllegalArgumentException("Invalid Encoding Type: " + encodingType);
}
@@ -212,23 +213,25 @@ public class CameraLauncher extends Plugin {
Intent intent = new Intent();
String title = GET_PICTURE;
if (this.mediaType == PICTURE) {
- intent.setType("image/*");
+ intent.setType("image/*");
}
else if (this.mediaType == VIDEO) {
- intent.setType("video/*");
+ intent.setType("video/*");
title = GET_VIDEO;
}
else if (this.mediaType == ALLMEDIA) {
// I wanted to make the type 'image/*, video/*' but this does not work on all versions
// of android so I had to go with the wildcard search.
- intent.setType("*/*");
+ intent.setType("*/*");
title = GET_All;
}
-
+
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
- cordova.startActivityForResult((Plugin) this, Intent.createChooser(intent,
- new String(title)), (srcType+1)*16 + returnType + 1);
+ if (this.ctx != null) {
+ this.ctx.startActivityForResult((Plugin) this, Intent.createChooser(intent,
+ new String(title)), (srcType + 1) * 16 + returnType + 1);
+ }
}
/**
@@ -262,8 +265,8 @@ public class CameraLauncher extends Plugin {
// kept and Bitmap.SCALE_TO_FIT specified when scaling, but this
// would result in whitespace in the new image.
else {
- double newRatio = newWidth / (double)newHeight;
- double origRatio = origWidth / (double)origHeight;
+ double newRatio = newWidth / (double) newHeight;
+ double origRatio = origWidth / (double) origHeight;
if (origRatio > newRatio) {
newHeight = (newWidth * origHeight) / origWidth;
@@ -271,10 +274,10 @@ public class CameraLauncher extends Plugin {
newWidth = (newHeight * origWidth) / origHeight;
}
}
-
+
return Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
}
-
+
/**
* Called when the camera view exits.
*
@@ -284,22 +287,22 @@ public class CameraLauncher extends Plugin {
* @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
*/
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
-
+
// Get src and dest types from request code
- int srcType = (requestCode/16) - 1;
+ int srcType = (requestCode / 16) - 1;
int destType = (requestCode % 16) - 1;
- int rotate = 0;
-
- // Create an ExifHelper to save the exif data that is lost during compression
- ExifHelper exif = new ExifHelper();
- try {
- if (this.encodingType == JPEG) {
- exif.createInFile(DirectoryManager.getTempDirectoryPath(ctx) + "/Pic.jpg");
- exif.readExifData();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
+ int rotate = 0;
+
+ // Create an ExifHelper to save the exif data that is lost during compression
+ ExifHelper exif = new ExifHelper();
+ try {
+ if (this.encodingType == JPEG) {
+ exif.createInFile(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()) + "/Pic.jpg");
+ exif.readExifData();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
// If CAMERA
if (srcType == CAMERA) {
@@ -309,15 +312,15 @@ public class CameraLauncher extends Plugin {
// Read in bitmap of captured image
Bitmap bitmap;
try {
- bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getContentResolver(), imageUri);
+ bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getActivity().getContentResolver(), imageUri);
} catch (FileNotFoundException e) {
Uri uri = intent.getData();
- android.content.ContentResolver resolver = this.ctx.getContentResolver();
+ android.content.ContentResolver resolver = this.ctx.getActivity().getContentResolver();
bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
}
bitmap = scaleBitmap(bitmap);
-
+
// If sending base64 image back
if (destType == DATA_URL) {
this.processPicture(bitmap);
@@ -325,33 +328,33 @@ public class CameraLauncher extends Plugin {
}
// If sending filename back
- else if (destType == FILE_URI){
+ else if (destType == FILE_URI) {
// Create entry in media store for image
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
ContentValues values = new ContentValues();
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = null;
try {
- uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+ uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException e) {
LOG.d(LOG_TAG, "Can't write to external media storage.");
try {
- uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
+ uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException ex) {
- LOG.d(LOG_TAG, "Can't write to internal media storage.");
+ LOG.d(LOG_TAG, "Can't write to internal media storage.");
this.failPicture("Error capturing image - no media storage found.");
return;
}
}
// Add compressed version of captured image to returned media store Uri
- OutputStream os = this.ctx.getContentResolver().openOutputStream(uri);
+ OutputStream os = this.ctx.getActivity().getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
os.close();
-
+
// Restore exif data to file
if (this.encodingType == JPEG) {
- exif.createOutFile(FileUtils.getRealPathFromURI(uri, ((Activity) this.ctx)));
+ exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
exif.writeExifData();
}
@@ -361,12 +364,12 @@ public class CameraLauncher extends Plugin {
bitmap.recycle();
bitmap = null;
System.gc();
-
+
checkForDuplicateImage(FILE_URI);
} catch (IOException e) {
e.printStackTrace();
this.failPicture("Error capturing image.");
- }
+ }
}
// If cancelled
@@ -379,37 +382,37 @@ public class CameraLauncher extends Plugin {
this.failPicture("Did not complete!");
}
}
-
+
// If retrieving photo from library
else if ((srcType == PHOTOLIBRARY) || (srcType == SAVEDPHOTOALBUM)) {
if (resultCode == Activity.RESULT_OK) {
Uri uri = intent.getData();
- android.content.ContentResolver resolver = this.ctx.getContentResolver();
-
+ android.content.ContentResolver resolver = this.ctx.getActivity().getContentResolver();
+
// If you ask for video or all media type you will automatically get back a file URI
// and there will be no attempt to resize any returned data
if (this.mediaType != PICTURE) {
- this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
+ this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
}
else {
// If sending base64 image back
if (destType == DATA_URL) {
try {
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
- String[] cols = { MediaStore.Images.Media.ORIENTATION };
- Cursor cursor = this.ctx.getContentResolver().query(intent.getData(),
- cols,
- null, null, null);
- if (cursor != null) {
- cursor.moveToPosition(0);
- rotate = cursor.getInt(0);
- cursor.close();
- }
- if (rotate != 0) {
- Matrix matrix = new Matrix();
- matrix.setRotate(rotate);
- bitmap = bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
- }
+ String[] cols = { MediaStore.Images.Media.ORIENTATION };
+ Cursor cursor = this.ctx.getActivity().getContentResolver().query(intent.getData(),
+ cols,
+ null, null, null);
+ if (cursor != null) {
+ cursor.moveToPosition(0);
+ rotate = cursor.getInt(0);
+ cursor.close();
+ }
+ if (rotate != 0) {
+ Matrix matrix = new Matrix();
+ matrix.setRotate(rotate);
+ bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
+ }
bitmap = scaleBitmap(bitmap);
this.processPicture(bitmap);
bitmap.recycle();
@@ -420,7 +423,7 @@ public class CameraLauncher extends Plugin {
this.failPicture("Error retrieving image.");
}
}
-
+
// If sending filename back
else if (destType == FILE_URI) {
// Do we need to scale the returned file
@@ -428,21 +431,21 @@ public class CameraLauncher extends Plugin {
try {
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
bitmap = scaleBitmap(bitmap);
-
- String fileName = DirectoryManager.getTempDirectoryPath(ctx) + "/resize.jpg";
- OutputStream os = new FileOutputStream(fileName);
+
+ String fileName = DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()) + "/resize.jpg";
+ OutputStream os = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
os.close();
-
+
// Restore exif data to file
if (this.encodingType == JPEG) {
- exif.createOutFile(FileUtils.getRealPathFromURI(uri, ((Activity) ctx)));
+ exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
exif.writeExifData();
}
bitmap.recycle();
bitmap = null;
-
+
// The resized image is cached by the app in order to get around this and not have to delete you
// application cache I'm adding the current system time to the end of the file url.
this.success(new PluginResult(PluginResult.Status.OK, ("file://" + fileName + "?" + System.currentTimeMillis())), this.callbackId);
@@ -453,16 +456,16 @@ public class CameraLauncher extends Plugin {
}
}
else {
- this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
+ this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
}
}
}
}
else if (resultCode == Activity.RESULT_CANCELED) {
- this.failPicture("Selection cancelled.");
+ this.failPicture("Selection cancelled.");
}
else {
- this.failPicture("Selection did not complete!");
+ this.failPicture("Selection did not complete!");
}
}
}
@@ -473,14 +476,14 @@ public class CameraLauncher extends Plugin {
* @return a cursor
*/
private Cursor queryImgDB() {
- return this.ctx.getContentResolver().query(
+ return this.ctx.getActivity().getContentResolver().query(
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
null,
null,
null);
}
-
+
/**
* Used to find out if we are in a situation where the Camera Intent adds to images
* to the content store. If we are using a FILE_URI and the number of images in the DB
@@ -492,17 +495,17 @@ public class CameraLauncher extends Plugin {
int diff = 1;
Cursor cursor = queryImgDB();
int currentNumOfImages = cursor.getCount();
-
+
if (type == FILE_URI) {
diff = 2;
}
-
+
// delete the duplicate file if the difference is 2 for file URI or 1 for Data URL
if ((currentNumOfImages - numPics) == diff) {
cursor.moveToLast();
- int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1;
+ int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1;
Uri uri = Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + "/" + id);
- this.ctx.getContentResolver().delete(uri, null, null);
+ this.ctx.getActivity().getContentResolver().delete(uri, null, null);
}
}
@@ -511,25 +514,24 @@ public class CameraLauncher extends Plugin {
*
* @param bitmap
*/
- public void processPicture(Bitmap bitmap) {
+ public void processPicture(Bitmap bitmap) {
ByteArrayOutputStream jpeg_data = new ByteArrayOutputStream();
try {
if (bitmap.compress(CompressFormat.JPEG, mQuality, jpeg_data)) {
- byte[] code = jpeg_data.toByteArray();
+ byte[] code = jpeg_data.toByteArray();
byte[] output = Base64.encodeBase64(code);
String js_out = new String(output);
this.success(new PluginResult(PluginResult.Status.OK, js_out), this.callbackId);
js_out = null;
output = null;
code = null;
- }
- }
- catch(Exception e) {
+ }
+ } catch (Exception e) {
this.failPicture("Error compressing image.");
- }
+ }
jpeg_data = null;
}
-
+
/**
* Send error message to JavaScript.
*
http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/c8fafa6b/framework/src/org/apache/cordova/Capture.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/Capture.java b/framework/src/org/apache/cordova/Capture.java
index c1ee74f..bfb5307 100644
--- a/framework/src/org/apache/cordova/Capture.java
+++ b/framework/src/org/apache/cordova/Capture.java
@@ -32,7 +32,7 @@ import org.json.JSONObject;
import android.app.Activity;
import android.content.ContentValues;
-import android.content.Context;
+//import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -40,47 +40,47 @@ import android.media.MediaPlayer;
import android.net.Uri;
import android.util.Log;
-
public class Capture extends Plugin {
private static final String VIDEO_3GPP = "video/3gpp";
- private static final String VIDEO_MP4 = "video/mp4";
+ private static final String VIDEO_MP4 = "video/mp4";
private static final String AUDIO_3GPP = "audio/3gpp";
private static final String IMAGE_JPEG = "image/jpeg";
-
+
private static final int CAPTURE_AUDIO = 0; // Constant for capture audio
private static final int CAPTURE_IMAGE = 1; // Constant for capture image
private static final int CAPTURE_VIDEO = 2; // Constant for capture video
private static final String LOG_TAG = "Capture";
-
+
private static final int CAPTURE_INTERNAL_ERR = 0;
- private static final int CAPTURE_APPLICATION_BUSY = 1;
- private static final int CAPTURE_INVALID_ARGUMENT = 2;
+// private static final int CAPTURE_APPLICATION_BUSY = 1;
+// private static final int CAPTURE_INVALID_ARGUMENT = 2;
private static final int CAPTURE_NO_MEDIA_FILES = 3;
- private static final int CAPTURE_NOT_SUPPORTED = 20;
-
+// private static final int CAPTURE_NOT_SUPPORTED = 20;
+
private String callbackId; // The ID of the callback to be invoked with our result
private long limit; // the number of pics/vids/clips to take
private double duration; // optional duration parameter for video recording
private JSONArray results; // The array of results to be returned to the user
private Uri imageUri; // Uri of captured image
- private CordovaInterface cordova;
-
- public void setContext(Context mCtx)
- {
- if(CordovaInterface.class.isInstance(mCtx))
- cordova = (CordovaInterface) mCtx;
- else
- LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
- }
-
+
+ //private CordovaInterface cordova;
+
+// public void setContext(Context mCtx)
+// {
+// if (CordovaInterface.class.isInstance(mCtx))
+// cordova = (CordovaInterface) mCtx;
+// else
+// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
+// }
+
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
this.callbackId = callbackId;
this.limit = 1;
this.duration = 0.0f;
this.results = new JSONArray();
-
+
JSONObject options = args.optJSONObject(0);
if (options != null) {
limit = options.optLong("limit", 1);
@@ -102,9 +102,9 @@ public class Capture extends Plugin {
this.captureImage();
}
else if (action.equals("captureVideo")) {
- this.captureVideo(duration);
+ this.captureVideo(duration);
}
-
+
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;
@@ -133,7 +133,7 @@ public class Capture extends Plugin {
mimeType = FileUtils.getMimeType(filePath);
}
Log.d(LOG_TAG, "Mime type = " + mimeType);
-
+
if (mimeType.equals(IMAGE_JPEG) || filePath.endsWith(".jpg")) {
obj = getImageData(filePath, obj);
}
@@ -143,8 +143,7 @@ public class Capture extends Plugin {
else if (mimeType.equals(VIDEO_3GPP) || mimeType.equals(VIDEO_MP4)) {
obj = getAudioVideoData(filePath, obj, true);
}
- }
- catch (JSONException e) {
+ } catch (JSONException e) {
Log.d(LOG_TAG, "Error: setting media file data object");
}
return obj;
@@ -179,15 +178,14 @@ public class Capture extends Plugin {
try {
player.setDataSource(filePath);
player.prepare();
- obj.put("duration", player.getDuration()/1000);
+ obj.put("duration", player.getDuration() / 1000);
if (video) {
obj.put("height", player.getVideoHeight());
obj.put("width", player.getVideoWidth());
}
- }
- catch (IOException e) {
+ } catch (IOException e) {
Log.d(LOG_TAG, "Error: loading video file");
- }
+ }
return obj;
}
@@ -197,7 +195,7 @@ public class Capture extends Plugin {
private void captureAudio() {
Intent intent = new Intent(android.provider.MediaStore.Audio.Media.RECORD_SOUND_ACTION);
- cordova.startActivityForResult((Plugin) this, intent, CAPTURE_AUDIO);
+ this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_AUDIO);
}
/**
@@ -207,11 +205,11 @@ public class Capture extends Plugin {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
// Specify file so that large image is captured and returned
- File photo = new File(DirectoryManager.getTempDirectoryPath(ctx), "Capture.jpg");
+ File photo = new File(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()), "Capture.jpg");
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
this.imageUri = Uri.fromFile(photo);
- cordova.startActivityForResult((Plugin) this, intent, CAPTURE_IMAGE);
+ this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_IMAGE);
}
/**
@@ -221,10 +219,10 @@ public class Capture extends Plugin {
Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
// Introduced in API 8
//intent.putExtra(android.provider.MediaStore.EXTRA_DURATION_LIMIT, duration);
-
- cordova.startActivityForResult((Plugin) this, intent, CAPTURE_VIDEO);
+
+ this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_VIDEO);
}
-
+
/**
* Called when the video view exits.
*
@@ -260,11 +258,11 @@ public class Capture extends Plugin {
try {
// Create an ExifHelper to save the exif data that is lost during compression
ExifHelper exif = new ExifHelper();
- exif.createInFile(DirectoryManager.getTempDirectoryPath(ctx) + "/Capture.jpg");
+ exif.createInFile(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()) + "/Capture.jpg");
exif.readExifData();
-
+
// Read in bitmap of captured image
- Bitmap bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getContentResolver(), imageUri);
+ Bitmap bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getActivity().getContentResolver(), imageUri);
// Create entry in media store for image
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
@@ -272,34 +270,34 @@ public class Capture extends Plugin {
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, IMAGE_JPEG);
Uri uri = null;
try {
- uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+ uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException e) {
LOG.d(LOG_TAG, "Can't write to external media storage.");
try {
- uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
+ uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException ex) {
- LOG.d(LOG_TAG, "Can't write to internal media storage.");
+ LOG.d(LOG_TAG, "Can't write to internal media storage.");
this.fail(createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image - no media storage found."));
return;
}
}
// Add compressed version of captured image to returned media store Uri
- OutputStream os = this.ctx.getContentResolver().openOutputStream(uri);
+ OutputStream os = this.ctx.getActivity().getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
bitmap.recycle();
bitmap = null;
System.gc();
-
+
// Restore exif data to file
- exif.createOutFile(FileUtils.getRealPathFromURI(uri, ((Activity) this.ctx)));
+ exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
exif.writeExifData();
-
+
// Add image to results
results.put(createMediaFile(uri));
-
+
if (results.length() >= limit) {
// Send Uri back to JavaScript for viewing image
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
@@ -330,7 +328,7 @@ public class Capture extends Plugin {
else if (resultCode == Activity.RESULT_CANCELED) {
// If we have partial results send them back to the user
if (results.length() > 0) {
- this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
+ this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
}
// user canceled the action
else {
@@ -341,7 +339,7 @@ public class Capture extends Plugin {
else {
// If we have partial results send them back to the user
if (results.length() > 0) {
- this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
+ this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
}
// something bad happened
else {
@@ -357,38 +355,38 @@ public class Capture extends Plugin {
* @return a JSONObject that represents a File
* @throws IOException
*/
- private JSONObject createMediaFile(Uri data){
- File fp = new File(FileUtils.getRealPathFromURI(data, ((Activity) this.ctx)));
+ private JSONObject createMediaFile(Uri data) {
+ File fp = new File(FileUtils.getRealPathFromURI(data, this.ctx));
JSONObject obj = new JSONObject();
- try {
+ try {
// File properties
obj.put("name", fp.getName());
obj.put("fullPath", fp.getAbsolutePath());
-
+
// Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files
// are reported as video/3gpp. I'm doing this hacky check of the URI to see if it
// is stored in the audio or video content store.
if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
if (data.toString().contains("/audio/")) {
- obj.put("type", AUDIO_3GPP);
+ obj.put("type", AUDIO_3GPP);
} else {
- obj.put("type", VIDEO_3GPP);
- }
+ obj.put("type", VIDEO_3GPP);
+ }
} else {
- obj.put("type", FileUtils.getMimeType(fp.getAbsolutePath()));
+ obj.put("type", FileUtils.getMimeType(fp.getAbsolutePath()));
}
-
+
obj.put("lastModifiedDate", fp.lastModified());
obj.put("size", fp.length());
} catch (JSONException e) {
// this will never happen
e.printStackTrace();
}
-
+
return obj;
}
-
+
private JSONObject createErrorObject(int code, String message) {
JSONObject obj = new JSONObject();
try {
http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/c8fafa6b/framework/src/org/apache/cordova/CompassListener.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CompassListener.java b/framework/src/org/apache/cordova/CompassListener.java
index 65b33bb..e9fbcac 100755
--- a/framework/src/org/apache/cordova/CompassListener.java
+++ b/framework/src/org/apache/cordova/CompassListener.java
@@ -27,7 +27,6 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -43,18 +42,18 @@ public class CompassListener extends Plugin implements SensorEventListener {
public static int STARTING = 1;
public static int RUNNING = 2;
public static int ERROR_FAILED_TO_START = 3;
-
+
public long TIMEOUT = 30000; // Timeout in msec to shut off listener
-
+
int status; // status of listener
float heading; // most recent heading value
long timeStamp; // time of most recent value
long lastAccessTime; // time the value was last retrieved
int accuracy; // accuracy of the sensor
-
+
private SensorManager sensorManager;// Sensor manager
Sensor mSensor; // Compass sensor returned by sensor manager
-
+
/**
* Constructor.
*/
@@ -70,9 +69,9 @@ public class CompassListener extends Plugin implements SensorEventListener {
*
* @param ctx The context of the main Activity.
*/
- public void setContext(Context ctx) {
+ public void setContext(CordovaInterface ctx) {
super.setContext(ctx);
- this.sensorManager = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE);
+ this.sensorManager = (SensorManager) ctx.getActivity().getSystemService(Context.SENSOR_SERVICE);
}
/**
@@ -85,8 +84,8 @@ public class CompassListener extends Plugin implements SensorEventListener {
*/
public PluginResult execute(String action, JSONArray args, String callbackId) {
PluginResult.Status status = PluginResult.Status.OK;
- String result = "";
-
+ String result = "";
+
try {
if (action.equals("start")) {
this.start();
@@ -116,7 +115,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
}
}
if (timeout == 0) {
- return new PluginResult(PluginResult.Status.IO_EXCEPTION, CompassListener.ERROR_FAILED_TO_START);
+ return new PluginResult(PluginResult.Status.IO_EXCEPTION, CompassListener.ERROR_FAILED_TO_START);
}
}
return new PluginResult(status, getCompassHeading());
@@ -159,7 +158,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
}
return false;
}
-
+
/**
* Called when listener is to be shut down and object is being destroyed.
*/
@@ -177,13 +176,14 @@ public class CompassListener extends Plugin implements SensorEventListener {
* @return status of listener
*/
public int start() {
-
+
// If already starting or running, then just return
if ((this.status == CompassListener.RUNNING) || (this.status == CompassListener.STARTING)) {
return this.status;
}
// Get compass sensor from sensor manager
+ @SuppressWarnings("deprecation")
List<Sensor> list = this.sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
// If found, then register as listener
@@ -198,10 +198,10 @@ public class CompassListener extends Plugin implements SensorEventListener {
else {
this.setStatus(CompassListener.ERROR_FAILED_TO_START);
}
-
+
return this.status;
}
-
+
/**
* Stop listening to compass sensor.
*/
@@ -211,8 +211,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
}
this.setStatus(CompassListener.STOPPED);
}
-
-
+
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@@ -237,7 +236,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
this.stop();
}
}
-
+
/**
* Get status of compass sensor.
*
@@ -246,7 +245,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
public int getStatus() {
return this.status;
}
-
+
/**
* Get the most recent compass heading.
*
@@ -256,7 +255,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
this.lastAccessTime = System.currentTimeMillis();
return this.heading;
}
-
+
/**
* Set the timeout to turn off compass sensor if getHeading() hasn't been called.
*
@@ -265,7 +264,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
public void setTimeout(long timeout) {
this.TIMEOUT = timeout;
}
-
+
/**
* Get the timeout to turn off compass sensor if getHeading() hasn't been called.
*
@@ -290,7 +289,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
*/
private JSONObject getCompassHeading() {
JSONObject obj = new JSONObject();
-
+
try {
obj.put("magneticHeading", this.getHeading());
obj.put("trueHeading", this.getHeading());
@@ -301,7 +300,7 @@ public class CompassListener extends Plugin implements SensorEventListener {
} catch (JSONException e) {
// Should never happen
}
-
+
return obj;
}
http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/c8fafa6b/framework/src/org/apache/cordova/ContactAccessor.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/ContactAccessor.java b/framework/src/org/apache/cordova/ContactAccessor.java
index 12669ce..99c375a 100644
--- a/framework/src/org/apache/cordova/ContactAccessor.java
+++ b/framework/src/org/apache/cordova/ContactAccessor.java
@@ -18,11 +18,12 @@ package org.apache.cordova;
import java.util.HashMap;
-import android.app.Activity;
-import android.content.Context;
+//import android.app.Activity;
+//import android.content.Context;
import android.util.Log;
import android.webkit.WebView;
+import org.apache.cordova.api.CordovaInterface;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -35,11 +36,11 @@ import org.json.JSONObject;
* Eclair or higher, we want to use {@link ContactAccessorSdk5}.
*/
public abstract class ContactAccessor {
-
+
protected final String LOG_TAG = "ContactsAccessor";
- protected Context mApp;
+ protected CordovaInterface mApp;
protected WebView mView;
-
+
/**
* Check to see if the data associated with the key is required to
* be populated in the Contact object.
@@ -47,22 +48,22 @@ public abstract class ContactAccessor {
* @param map created by running buildPopulationSet.
* @return true if the key data is required
*/
- protected boolean isRequired(String key, HashMap<String,Boolean> map) {
- Boolean retVal = map.get(key);
- return (retVal == null) ? false : retVal.booleanValue();
- }
-
+ protected boolean isRequired(String key, HashMap<String, Boolean> map) {
+ Boolean retVal = map.get(key);
+ return (retVal == null) ? false : retVal.booleanValue();
+ }
+
/**
* Create a hash map of what data needs to be populated in the Contact object
* @param fields the list of fields to populate
* @return the hash map of required data
*/
- protected HashMap<String,Boolean> buildPopulationSet(JSONArray fields) {
- HashMap<String,Boolean> map = new HashMap<String,Boolean>();
-
- String key;
- try {
- if (fields.length() == 1 && fields.getString(0).equals("*")) {
+ protected HashMap<String, Boolean> buildPopulationSet(JSONArray fields) {
+ HashMap<String, Boolean> map = new HashMap<String, Boolean>();
+
+ String key;
+ try {
+ if (fields.length() == 1 && fields.getString(0).equals("*")) {
map.put("displayName", true);
map.put("name", true);
map.put("nickname", true);
@@ -76,90 +77,88 @@ public abstract class ContactAccessor {
map.put("urls", true);
map.put("photos", true);
map.put("categories", true);
- }
- else {
- for (int i=0; i<fields.length(); i++) {
- key = fields.getString(i);
- if (key.startsWith("displayName")) {
- map.put("displayName", true);
- }
- else if (key.startsWith("name")) {
- map.put("displayName", true);
- map.put("name", true);
- }
- else if (key.startsWith("nickname")) {
- map.put("nickname", true);
- }
- else if (key.startsWith("phoneNumbers")) {
- map.put("phoneNumbers", true);
- }
- else if (key.startsWith("emails")) {
- map.put("emails", true);
- }
- else if (key.startsWith("addresses")) {
- map.put("addresses", true);
- }
- else if (key.startsWith("ims")) {
- map.put("ims", true);
- }
- else if (key.startsWith("organizations")) {
- map.put("organizations", true);
- }
- else if (key.startsWith("birthday")) {
- map.put("birthday", true);
- }
- else if (key.startsWith("note")) {
- map.put("note", true);
- }
- else if (key.startsWith("urls")) {
- map.put("urls", true);
}
+ else {
+ for (int i = 0; i < fields.length(); i++) {
+ key = fields.getString(i);
+ if (key.startsWith("displayName")) {
+ map.put("displayName", true);
+ }
+ else if (key.startsWith("name")) {
+ map.put("displayName", true);
+ map.put("name", true);
+ }
+ else if (key.startsWith("nickname")) {
+ map.put("nickname", true);
+ }
+ else if (key.startsWith("phoneNumbers")) {
+ map.put("phoneNumbers", true);
+ }
+ else if (key.startsWith("emails")) {
+ map.put("emails", true);
+ }
+ else if (key.startsWith("addresses")) {
+ map.put("addresses", true);
+ }
+ else if (key.startsWith("ims")) {
+ map.put("ims", true);
+ }
+ else if (key.startsWith("organizations")) {
+ map.put("organizations", true);
+ }
+ else if (key.startsWith("birthday")) {
+ map.put("birthday", true);
+ }
+ else if (key.startsWith("note")) {
+ map.put("note", true);
+ }
+ else if (key.startsWith("urls")) {
+ map.put("urls", true);
+ }
else if (key.startsWith("photos")) {
map.put("photos", true);
}
else if (key.startsWith("categories")) {
map.put("categories", true);
}
- }
+ }
+ }
+ } catch (JSONException e) {
+ Log.e(LOG_TAG, e.getMessage(), e);
}
+ return map;
}
- catch (JSONException e) {
- Log.e(LOG_TAG, e.getMessage(), e);
- }
- return map;
- }
-
- /**
- * Convenience method to get a string from a JSON object. Saves a
- * lot of try/catch writing.
- * If the property is not found in the object null will be returned.
- *
- * @param obj contact object to search
- * @param property to be looked up
- * @return The value of the property
- */
- protected String getJsonString(JSONObject obj, String property) {
- String value = null;
- try {
- if (obj != null) {
- value = obj.getString(property);
- if (value.equals("null")) {
- Log.d(LOG_TAG, property + " is string called 'null'");
- value = null;
- }
+
+ /**
+ * Convenience method to get a string from a JSON object. Saves a
+ * lot of try/catch writing.
+ * If the property is not found in the object null will be returned.
+ *
+ * @param obj contact object to search
+ * @param property to be looked up
+ * @return The value of the property
+ */
+ protected String getJsonString(JSONObject obj, String property) {
+ String value = null;
+ try {
+ if (obj != null) {
+ value = obj.getString(property);
+ if (value.equals("null")) {
+ Log.d(LOG_TAG, property + " is string called 'null'");
+ value = null;
+ }
+ }
+ } catch (JSONException e) {
+ Log.d(LOG_TAG, "Could not get = " + e.getMessage());
}
+ return value;
}
- catch (JSONException e) {
- Log.d(LOG_TAG, "Could not get = " + e.getMessage());
- }
- return value;
- }
/**
* Handles adding a JSON Contact object into the database.
* @return TODO
*/
- public abstract String save(JSONObject contact);
+ public abstract String save(JSONObject contact);
/**
* Handles searching through SDK-specific contacts API.
@@ -175,25 +174,29 @@ public abstract class ContactAccessor {
/**
* Handles removing a contact from the database.
*/
- public abstract boolean remove(String id);
-
- /**
- * A class that represents the where clause to be used in the database query
- */
- class WhereOptions {
- private String where;
- private String[] whereArgs;
- public void setWhere(String where) {
- this.where = where;
- }
- public String getWhere() {
- return where;
- }
- public void setWhereArgs(String[] whereArgs) {
- this.whereArgs = whereArgs;
- }
- public String[] getWhereArgs() {
- return whereArgs;
+ public abstract boolean remove(String id);
+
+ /**
+ * A class that represents the where clause to be used in the database query
+ */
+ class WhereOptions {
+ private String where;
+ private String[] whereArgs;
+
+ public void setWhere(String where) {
+ this.where = where;
+ }
+
+ public String getWhere() {
+ return where;
+ }
+
+ public void setWhereArgs(String[] whereArgs) {
+ this.whereArgs = whereArgs;
+ }
+
+ public String[] getWhereArgs() {
+ return whereArgs;
+ }
}
- }
}