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/02/12 04:51:47 UTC
android commit: [CB-2213] Added NATIVE_URI support.
Updated Branches:
refs/heads/master 8ab7278db -> 1246a81d3
[CB-2213] Added NATIVE_URI support.
This is mostly the same as FILE_URI on Android.
Also replaced calls to `stripFileProtocol` with the more general-purpose `getRealPathFromURI`. This helps support some operations on content URIs.
Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/1246a81d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/1246a81d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/1246a81d
Branch: refs/heads/master
Commit: 1246a81d391252dff78544d5908287a20b41a7dd
Parents: 8ab7278
Author: Max Woghiren <ma...@gmail.com>
Authored: Wed Feb 6 15:48:23 2013 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Mon Feb 11 22:45:14 2013 -0500
----------------------------------------------------------------------
.../src/org/apache/cordova/CameraLauncher.java | 5 +-
framework/src/org/apache/cordova/FileUtils.java | 68 +++++++++------
2 files changed, 46 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/1246a81d/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 3012ee3..9f3a56f 100755
--- a/framework/src/org/apache/cordova/CameraLauncher.java
+++ b/framework/src/org/apache/cordova/CameraLauncher.java
@@ -58,6 +58,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
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 NATIVE_URI = 2; // On Android, this is the same as FILE_URI
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
@@ -310,7 +311,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
}
// If sending filename back
- else if (destType == FILE_URI) {
+ else if (destType == FILE_URI || destType == NATIVE_URI) {
if (!this.saveToPhotoAlbum) {
uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
} else {
@@ -434,7 +435,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
}
// If sending filename back
- else if (destType == FILE_URI) {
+ else if (destType == FILE_URI || destType == NATIVE_URI) {
// Do we need to scale the returned file
if (this.targetHeight > 0 && this.targetWidth > 0) {
try {
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/1246a81d/framework/src/org/apache/cordova/FileUtils.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/FileUtils.java b/framework/src/org/apache/cordova/FileUtils.java
index 554458b..b461b02 100755
--- a/framework/src/org/apache/cordova/FileUtils.java
+++ b/framework/src/org/apache/cordova/FileUtils.java
@@ -43,7 +43,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
-import android.util.Log;
import android.webkit.MimeTypeMap;
//import android.app.Activity;
@@ -89,7 +88,7 @@ public class FileUtils extends CordovaPlugin {
* Executes the request and returns whether the action was valid.
*
* @param action The action to execute.
- * @param args JSONArry of arguments for the plugin.
+ * @param args JSONArray of arguments for the plugin.
* @param callbackContext The callback context used when calling back into JavaScript.
* @return True if the action was valid, false otherwise.
*/
@@ -238,7 +237,7 @@ public class FileUtils extends CordovaPlugin {
* @param filePath the path to check
*/
private void notifyDelete(String filePath) {
- String newFilePath = stripFileProtocol(filePath);
+ String newFilePath = getRealPathFromURI(Uri.parse(filePath), cordova);
try {
this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media.DATA + " = ?",
@@ -342,18 +341,18 @@ public class FileUtils extends CordovaPlugin {
* @throws InvalidModificationException
* @throws EncodingException
* @throws JSONException
- * @throws FileExistsException
+ * @throws FileExistsException
*/
private JSONObject transferTo(String fileName, String newParent, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
- fileName = stripFileProtocol(fileName);
- newParent = stripFileProtocol(newParent);
+ String newFileName = getRealPathFromURI(Uri.parse(fileName), cordova);
+ newParent = getRealPathFromURI(Uri.parse(newParent), cordova);
// Check for invalid file name
if (newName != null && newName.contains(":")) {
throw new EncodingException("Bad file name");
}
- File source = new File(fileName);
+ File source = new File(newFileName);
if (!source.exists()) {
// The file/directory we are copying doesn't exist so we should fail.
@@ -385,7 +384,14 @@ public class FileUtils extends CordovaPlugin {
}
} else {
if (move) {
- return moveFile(source, destination);
+ JSONObject newFileEntry = moveFile(source, destination);
+
+ // If we've moved a file given its content URI, we need to clean up.
+ if (fileName.startsWith("content://")) {
+ notifyDelete(fileName);
+ }
+
+ return newFileEntry;
} else {
return copyFile(source, destination);
}
@@ -483,7 +489,7 @@ public class FileUtils extends CordovaPlugin {
if (!destinationDir.exists()) {
if (!destinationDir.mkdir()) {
// If we can't create the directory then fail
- throw new NoModificationAllowedException("Couldn't create the destination direcotry");
+ throw new NoModificationAllowedException("Couldn't create the destination directory");
}
}
@@ -561,8 +567,8 @@ public class FileUtils extends CordovaPlugin {
* @throws JSONException
* @throws IOException
* @throws InvalidModificationException
- * @throws NoModificationAllowedException
- * @throws FileExistsException
+ * @throws NoModificationAllowedException
+ * @throws FileExistsException
*/
private JSONObject moveDirectory(File srcDir, File destinationDir) throws IOException, JSONException, InvalidModificationException, NoModificationAllowedException, FileExistsException {
// Renaming a file to an existing directory should fail
@@ -742,7 +748,7 @@ public class FileUtils extends CordovaPlugin {
if (fileName.startsWith("/")) {
fp = new File(fileName);
} else {
- dirPath = stripFileProtocol(dirPath);
+ dirPath = getRealPathFromURI(Uri.parse(dirPath), cordova);
fp = new File(dirPath + File.separator + fileName);
}
return fp;
@@ -757,7 +763,7 @@ public class FileUtils extends CordovaPlugin {
* @throws JSONException
*/
private JSONObject getParent(String filePath) throws JSONException {
- filePath = stripFileProtocol(filePath);
+ filePath = getRealPathFromURI(Uri.parse(filePath), cordova);
if (atRootDirectory(filePath)) {
return getEntry(filePath);
@@ -773,7 +779,7 @@ public class FileUtils extends CordovaPlugin {
* @return true if we are at the root, false otherwise.
*/
private boolean atRootDirectory(String filePath) {
- filePath = stripFileProtocol(filePath);
+ filePath = getRealPathFromURI(Uri.parse(filePath), cordova);
if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + cordova.getActivity().getPackageName() + "/cache") ||
filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) ||
@@ -803,7 +809,7 @@ public class FileUtils extends CordovaPlugin {
* @return
*/
private File createFileObject(String filePath) {
- filePath = stripFileProtocol(filePath);
+ filePath = getRealPathFromURI(Uri.parse(filePath), cordova);
File file = new File(filePath);
return file;
@@ -845,7 +851,7 @@ public class FileUtils extends CordovaPlugin {
metadata.put("size", file.length());
metadata.put("type", getMimeType(filePath));
metadata.put("name", file.getName());
- metadata.put("fullPath", file.getAbsolutePath());
+ metadata.put("fullPath", filePath);
metadata.put("lastModifiedDate", file.lastModified());
return metadata;
@@ -1028,7 +1034,7 @@ public class FileUtils extends CordovaPlugin {
if (filename != null) {
// Stupid bug in getFileExtensionFromUrl when the file name has a space
// So we need to replace the space with a url encoded %20
-
+
// CB-2185: Stupid bug not putting JPG extension in the mime-type map
String url = filename.replace(" ", "%20").toLowerCase();
MimeTypeMap map = MimeTypeMap.getSingleton();
@@ -1050,10 +1056,15 @@ public class FileUtils extends CordovaPlugin {
* @param data The contents of the file.
* @param offset The position to begin writing the file.
* @throws FileNotFoundException, IOException
+ * @throws NoModificationAllowedException
*/
/**/
- public long write(String filename, String data, int offset) throws FileNotFoundException, IOException {
- filename = stripFileProtocol(filename);
+ public long write(String filename, String data, int offset) throws FileNotFoundException, IOException, NoModificationAllowedException {
+ if (filename.startsWith("content://")) {
+ throw new NoModificationAllowedException("Couldn't write to file given its content URI");
+ }
+
+ filename = getRealPathFromURI(Uri.parse(filename), cordova);
boolean append = false;
if (offset > 0) {
@@ -1079,9 +1090,14 @@ public class FileUtils extends CordovaPlugin {
* @param filename
* @param size
* @throws FileNotFoundException, IOException
+ * @throws NoModificationAllowedException
*/
- private long truncateFile(String filename, long size) throws FileNotFoundException, IOException {
- filename = stripFileProtocol(filename);
+ private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
+ if (filename.startsWith("content://")) {
+ throw new NoModificationAllowedException("Couldn't truncate file given its content URI");
+ }
+
+ filename = getRealPathFromURI(Uri.parse(filename), cordova);
RandomAccessFile raf = new RandomAccessFile(filename, "rw");
try {
@@ -1090,7 +1106,7 @@ public class FileUtils extends CordovaPlugin {
channel.truncate(size);
return size;
}
-
+
return raf.length();
} finally {
raf.close();
@@ -1110,7 +1126,7 @@ public class FileUtils extends CordovaPlugin {
return cordova.getActivity().getContentResolver().openInputStream(uri);
}
else {
- path = stripFileProtocol(path);
+ path = getRealPathFromURI(Uri.parse(path), cordova);
return new FileInputStream(path);
}
}
@@ -1125,8 +1141,10 @@ public class FileUtils extends CordovaPlugin {
@SuppressWarnings("deprecation")
protected static String getRealPathFromURI(Uri contentUri, CordovaInterface cordova) {
final String scheme = contentUri.getScheme();
-
- if (scheme.compareTo("content") == 0) {
+
+ if (scheme == null) {
+ return contentUri.toString();
+ } else if (scheme.compareTo("content") == 0) {
String[] proj = { _DATA };
Cursor cursor = cordova.getActivity().managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(_DATA);