mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-22 08:53:24 +08:00
Revert "Changed all usages of FileHelper to use the new DataResource mechanism."
This reverts commit 867358ea81
.
Reverting all DataResource changes for the 2.8.0 release.
Conflicts:
framework/src/org/apache/cordova/FileUtils.java
This commit is contained in:
parent
e3989bcc2b
commit
c5b37cc7e7
@ -20,7 +20,7 @@ package org.apache.cordova;
|
|||||||
|
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
|
||||||
@ -56,11 +56,6 @@ public class AudioHandler extends CordovaPlugin {
|
|||||||
this.pausedForPhone = new ArrayList<AudioPlayer>();
|
this.pausedForPhone = new ArrayList<AudioPlayer>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFilePath(String url, String source){
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.webView.pluginManager, cordova, source);
|
|
||||||
return dataResource.getRealFile().getPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the request and returns PluginResult.
|
* Executes the request and returns PluginResult.
|
||||||
* @param action The action to execute.
|
* @param action The action to execute.
|
||||||
@ -73,13 +68,13 @@ public class AudioHandler extends CordovaPlugin {
|
|||||||
String result = "";
|
String result = "";
|
||||||
|
|
||||||
if (action.equals("startRecordingAudio")) {
|
if (action.equals("startRecordingAudio")) {
|
||||||
this.startRecordingAudio(args.getString(0), getFilePath(args.getString(1), "AudioHandler.startRecordingAudio"));
|
this.startRecordingAudio(args.getString(0), FileHelper.stripFileProtocol(args.getString(1)));
|
||||||
}
|
}
|
||||||
else if (action.equals("stopRecordingAudio")) {
|
else if (action.equals("stopRecordingAudio")) {
|
||||||
this.stopRecordingAudio(args.getString(0));
|
this.stopRecordingAudio(args.getString(0));
|
||||||
}
|
}
|
||||||
else if (action.equals("startPlayingAudio")) {
|
else if (action.equals("startPlayingAudio")) {
|
||||||
this.startPlayingAudio(args.getString(0), getFilePath(args.getString(1), "AudioHandler.startPlayingAudio"));
|
this.startPlayingAudio(args.getString(0), FileHelper.stripFileProtocol(args.getString(1)));
|
||||||
}
|
}
|
||||||
else if (action.equals("seekToAudio")) {
|
else if (action.equals("seekToAudio")) {
|
||||||
this.seekToAudio(args.getString(0), args.getInt(1));
|
this.seekToAudio(args.getString(0), args.getInt(1));
|
||||||
@ -107,7 +102,7 @@ public class AudioHandler extends CordovaPlugin {
|
|||||||
}
|
}
|
||||||
else if (action.equals("create")) {
|
else if (action.equals("create")) {
|
||||||
String id = args.getString(0);
|
String id = args.getString(0);
|
||||||
String src = getFilePath(args.getString(1), "AudioHandler.create");
|
String src = FileHelper.stripFileProtocol(args.getString(1));
|
||||||
AudioPlayer audio = new AudioPlayer(this, id, src);
|
AudioPlayer audio = new AudioPlayer(this, id, src);
|
||||||
this.players.put(id, audio);
|
this.players.put(id, audio);
|
||||||
}
|
}
|
||||||
|
@ -20,15 +20,14 @@ package org.apache.cordova;
|
|||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
import org.apache.cordova.api.PluginResult;
|
import org.apache.cordova.api.PluginResult;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -42,6 +41,7 @@ import android.graphics.Bitmap;
|
|||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
|
import android.graphics.Rect;
|
||||||
import android.media.MediaScannerConnection;
|
import android.media.MediaScannerConnection;
|
||||||
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@ -290,7 +290,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
|
|
||||||
// If sending base64 image back
|
// If sending base64 image back
|
||||||
if (destType == DATA_URL) {
|
if (destType == DATA_URL) {
|
||||||
bitmap = getScaledBitmap(imageUri.toString());
|
bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString()));
|
||||||
if (bitmap == null) {
|
if (bitmap == null) {
|
||||||
// Try to get the bitmap from intent.
|
// Try to get the bitmap from intent.
|
||||||
bitmap = (Bitmap)intent.getExtras().get("data");
|
bitmap = (Bitmap)intent.getExtras().get("data");
|
||||||
@ -316,9 +316,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
if (this.saveToPhotoAlbum) {
|
if (this.saveToPhotoAlbum) {
|
||||||
Uri inputUri = getUriFromMediaStore();
|
Uri inputUri = getUriFromMediaStore();
|
||||||
//Just because we have a media URI doesn't mean we have a real file, we need to make it
|
//Just because we have a media URI doesn't mean we have a real file, we need to make it
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(inputUri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
|
uri = Uri.fromFile(new File(FileHelper.getRealPath(inputUri, this.cordova)));
|
||||||
File file = dataResource.getRealFile();
|
|
||||||
uri = Uri.fromFile(file);
|
|
||||||
} else {
|
} else {
|
||||||
uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
|
uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
|
||||||
}
|
}
|
||||||
@ -334,15 +332,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
|
|
||||||
this.callbackContext.success(uri.toString());
|
this.callbackContext.success(uri.toString());
|
||||||
} else {
|
} else {
|
||||||
bitmap = getScaledBitmap(imageUri.toString());
|
bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString()));
|
||||||
|
|
||||||
if (rotate != 0 && this.correctOrientation) {
|
if (rotate != 0 && this.correctOrientation) {
|
||||||
bitmap = getRotatedBitmap(rotate, bitmap, exif);
|
bitmap = getRotatedBitmap(rotate, bitmap, exif);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add compressed version of captured image to returned media store Uri
|
// Add compressed version of captured image to returned media store Uri
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
OutputStream os = dataResource.getOs();
|
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
||||||
os.close();
|
os.close();
|
||||||
|
|
||||||
@ -350,7 +347,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
if (this.encodingType == JPEG) {
|
if (this.encodingType == JPEG) {
|
||||||
String exifPath;
|
String exifPath;
|
||||||
if (this.saveToPhotoAlbum) {
|
if (this.saveToPhotoAlbum) {
|
||||||
exifPath = dataResource.getRealFile().getPath();
|
exifPath = FileHelper.getRealPath(uri, this.cordova);
|
||||||
} else {
|
} else {
|
||||||
exifPath = uri.getPath();
|
exifPath = uri.getPath();
|
||||||
}
|
}
|
||||||
@ -401,9 +398,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
this.callbackContext.success(uri.toString());
|
this.callbackContext.success(uri.toString());
|
||||||
} else {
|
} else {
|
||||||
String uriString = uri.toString();
|
String uriString = uri.toString();
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
|
|
||||||
// Get the path to the image. Makes loading so much easier.
|
// Get the path to the image. Makes loading so much easier.
|
||||||
String mimeType = dataResource.getMimeType();
|
String mimeType = FileHelper.getMimeType(uriString, this.cordova);
|
||||||
// If we don't have a valid image so quit.
|
// If we don't have a valid image so quit.
|
||||||
if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
|
if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
|
||||||
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
||||||
@ -444,8 +440,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// Create an ExifHelper to save the exif data that is lost during compression
|
// Create an ExifHelper to save the exif data that is lost during compression
|
||||||
String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
|
String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
|
||||||
// Some content: URIs do not map to file paths (e.g. picasa).
|
// Some content: URIs do not map to file paths (e.g. picasa).
|
||||||
File realFile = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent").getRealFile();
|
String realPath = FileHelper.getRealPath(uri, this.cordova);
|
||||||
String realPath = realFile != null? realFile.getPath() : null;
|
|
||||||
ExifHelper exif = new ExifHelper();
|
ExifHelper exif = new ExifHelper();
|
||||||
if (realPath != null && this.encodingType == JPEG) {
|
if (realPath != null && this.encodingType == JPEG) {
|
||||||
try {
|
try {
|
||||||
@ -539,15 +534,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
*/
|
*/
|
||||||
private void writeUncompressedImage(Uri uri) throws FileNotFoundException,
|
private void writeUncompressedImage(Uri uri) throws FileNotFoundException,
|
||||||
IOException {
|
IOException {
|
||||||
DataResource inputDataResource = DataResource.initiateNewDataRequestForUri(imageUri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
|
FileInputStream fis = new FileInputStream(FileHelper.stripFileProtocol(imageUri.toString()));
|
||||||
InputStream fis = inputDataResource.getIs();
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
DataResource outDataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
|
|
||||||
OutputStream os = outDataResource.getOs();
|
|
||||||
if(fis == null) {
|
|
||||||
throw new FileNotFoundException("Could not get the input file");
|
|
||||||
} else if(os == null) {
|
|
||||||
throw new FileNotFoundException("Could not get the output file");
|
|
||||||
}
|
|
||||||
byte[] buffer = new byte[4096];
|
byte[] buffer = new byte[4096];
|
||||||
int len;
|
int len;
|
||||||
while ((len = fis.read(buffer)) != -1) {
|
while ((len = fis.read(buffer)) != -1) {
|
||||||
@ -590,15 +578,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
*/
|
*/
|
||||||
private Bitmap getScaledBitmap(String imageUrl) throws IOException {
|
private Bitmap getScaledBitmap(String imageUrl) throws IOException {
|
||||||
// If no new width or height were specified return the original bitmap
|
// If no new width or height were specified return the original bitmap
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(imageUrl, webView.pluginManager, cordova, "CameraLauncher.getScaledBitmap");
|
|
||||||
if (this.targetWidth <= 0 && this.targetHeight <= 0) {
|
if (this.targetWidth <= 0 && this.targetHeight <= 0) {
|
||||||
return BitmapFactory.decodeStream(dataResource.getIs());
|
return BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova));
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out the original width and height of the image
|
// figure out the original width and height of the image
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
options.inJustDecodeBounds = true;
|
options.inJustDecodeBounds = true;
|
||||||
BitmapFactory.decodeStream(dataResource.getIs(), null, options);
|
BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
|
||||||
|
|
||||||
//CB-2292: WTF? Why is the width null?
|
//CB-2292: WTF? Why is the width null?
|
||||||
if(options.outWidth == 0 || options.outHeight == 0)
|
if(options.outWidth == 0 || options.outHeight == 0)
|
||||||
@ -612,7 +599,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// Load in the smallest bitmap possible that is closest to the size we want
|
// Load in the smallest bitmap possible that is closest to the size we want
|
||||||
options.inJustDecodeBounds = false;
|
options.inJustDecodeBounds = false;
|
||||||
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
|
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
|
||||||
Bitmap unscaledBitmap = BitmapFactory.decodeStream(dataResource.getIs(), null, options);
|
Bitmap unscaledBitmap = BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
|
||||||
if (unscaledBitmap == null) {
|
if (unscaledBitmap == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -711,20 +698,16 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
bitmap.recycle();
|
bitmap.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(oldImage, webView.pluginManager, cordova, "CameraLauncher.cleanup");
|
// Clean up initial camera-written image file.
|
||||||
File file = dataResource.getRealFile();
|
(new File(FileHelper.stripFileProtocol(oldImage.toString()))).delete();
|
||||||
if(file != null) {
|
|
||||||
// Clean up initial camera-written image file.
|
|
||||||
file.delete();
|
|
||||||
|
|
||||||
checkForDuplicateImage(imageType);
|
checkForDuplicateImage(imageType);
|
||||||
// Scan for the gallery to update pic refs in gallery
|
// Scan for the gallery to update pic refs in gallery
|
||||||
if (this.saveToPhotoAlbum && newImage != null) {
|
if (this.saveToPhotoAlbum && newImage != null) {
|
||||||
this.scanForGallery(newImage);
|
this.scanForGallery(newImage);
|
||||||
}
|
|
||||||
|
|
||||||
System.gc();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
System.gc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,7 +26,6 @@ import java.io.OutputStream;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
import org.apache.cordova.api.PluginResult;
|
import org.apache.cordova.api.PluginResult;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -130,8 +129,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
// If the mimeType isn't set the rest will fail
|
// If the mimeType isn't set the rest will fail
|
||||||
// so let's see if we can determine it.
|
// so let's see if we can determine it.
|
||||||
if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) {
|
if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.dataResource");
|
mimeType = FileHelper.getMimeType(filePath, cordova);
|
||||||
mimeType = dataResource.getMimeType();
|
|
||||||
}
|
}
|
||||||
Log.d(LOG_TAG, "Mime type = " + mimeType);
|
Log.d(LOG_TAG, "Mime type = " + mimeType);
|
||||||
|
|
||||||
@ -158,8 +156,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
private JSONObject getImageData(String filePath, JSONObject obj) throws JSONException {
|
private JSONObject getImageData(String filePath, JSONObject obj) throws JSONException {
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
options.inJustDecodeBounds = true;
|
options.inJustDecodeBounds = true;
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.getImageData");
|
BitmapFactory.decodeFile(FileHelper.stripFileProtocol(filePath), options);
|
||||||
BitmapFactory.decodeFile(dataResource.getRealFile().getPath(), options);
|
|
||||||
obj.put("height", options.outHeight);
|
obj.put("height", options.outHeight);
|
||||||
obj.put("width", options.outWidth);
|
obj.put("width", options.outWidth);
|
||||||
return obj;
|
return obj;
|
||||||
@ -351,8 +348,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private JSONObject createMediaFile(Uri data) {
|
private JSONObject createMediaFile(Uri data) {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(data, webView.pluginManager, cordova, "Capture.createMediaFile");
|
File fp = new File(FileHelper.getRealPath(data, this.cordova));
|
||||||
File fp = dataResource.getRealFile();
|
|
||||||
JSONObject obj = new JSONObject();
|
JSONObject obj = new JSONObject();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -362,7 +358,6 @@ public class Capture extends CordovaPlugin {
|
|||||||
// Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files
|
// 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
|
// 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.
|
// is stored in the audio or video content store.
|
||||||
|
|
||||||
if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
|
if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
|
||||||
if (data.toString().contains("/audio/")) {
|
if (data.toString().contains("/audio/")) {
|
||||||
obj.put("type", AUDIO_3GPP);
|
obj.put("type", AUDIO_3GPP);
|
||||||
@ -370,7 +365,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
obj.put("type", VIDEO_3GPP);
|
obj.put("type", VIDEO_3GPP);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.put("type", dataResource.getMimeType());
|
obj.put("type", FileHelper.getMimeType(fp.getAbsolutePath(), cordova));
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.put("lastModifiedDate", fp.lastModified());
|
obj.put("lastModifiedDate", fp.lastModified());
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.cordova;
|
package org.apache.cordova;
|
||||||
|
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
@ -25,7 +27,6 @@ import android.util.Log;
|
|||||||
|
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.PluginResult;
|
import org.apache.cordova.api.PluginResult;
|
||||||
import org.apache.cordova.file.EncodingException;
|
import org.apache.cordova.file.EncodingException;
|
||||||
import org.apache.cordova.file.FileExistsException;
|
import org.apache.cordova.file.FileExistsException;
|
||||||
@ -45,6 +46,8 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.RandomAccessFile;
|
import java.io.RandomAccessFile;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,7 +234,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @param filePath the path to check
|
* @param filePath the path to check
|
||||||
*/
|
*/
|
||||||
private void notifyDelete(String filePath) {
|
private void notifyDelete(String filePath) {
|
||||||
String newFilePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.notifyDelete").getRealFile().getPath();
|
String newFilePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
try {
|
try {
|
||||||
this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
||||||
MediaStore.Images.Media.DATA + " = ?",
|
MediaStore.Images.Media.DATA + " = ?",
|
||||||
@ -253,10 +256,37 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws IOException if the user can't read the file
|
* @throws IOException if the user can't read the file
|
||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSONException {
|
private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSONException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(url, webView.pluginManager, cordova, "FileUtils.resolveLocalFileSystemURI").getRealFile();
|
String decoded = URLDecoder.decode(url, "UTF-8");
|
||||||
|
|
||||||
if (fp == null || !fp.exists()) {
|
File fp = null;
|
||||||
|
|
||||||
|
// Handle the special case where you get an Android content:// uri.
|
||||||
|
if (decoded.startsWith("content:")) {
|
||||||
|
Cursor cursor = this.cordova.getActivity().managedQuery(Uri.parse(decoded), new String[] { MediaStore.Images.Media.DATA }, null, null, null);
|
||||||
|
// Note: MediaStore.Images/Audio/Video.Media.DATA is always "_data"
|
||||||
|
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
|
||||||
|
cursor.moveToFirst();
|
||||||
|
fp = new File(cursor.getString(column_index));
|
||||||
|
} else {
|
||||||
|
// Test to see if this is a valid URL first
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
URL testUrl = new URL(decoded);
|
||||||
|
|
||||||
|
if (decoded.startsWith("file://")) {
|
||||||
|
int questionMark = decoded.indexOf("?");
|
||||||
|
if (questionMark < 0) {
|
||||||
|
fp = new File(decoded.substring(7, decoded.length()));
|
||||||
|
} else {
|
||||||
|
fp = new File(decoded.substring(7, questionMark));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fp = new File(decoded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fp.exists()) {
|
||||||
throw new FileNotFoundException();
|
throw new FileNotFoundException();
|
||||||
}
|
}
|
||||||
if (!fp.canRead()) {
|
if (!fp.canRead()) {
|
||||||
@ -274,9 +304,9 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
private JSONArray readEntries(String fileName) throws FileNotFoundException, JSONException {
|
private JSONArray readEntries(String fileName) throws FileNotFoundException, JSONException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(fileName, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
|
File fp = createFileObject(fileName);
|
||||||
|
|
||||||
if (fp == null || !fp.exists()) {
|
if (!fp.exists()) {
|
||||||
// The directory we are listing doesn't exist so we should fail.
|
// The directory we are listing doesn't exist so we should fail.
|
||||||
throw new FileNotFoundException();
|
throw new FileNotFoundException();
|
||||||
}
|
}
|
||||||
@ -311,10 +341,8 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws FileExistsException
|
* @throws FileExistsException
|
||||||
*/
|
*/
|
||||||
private JSONObject transferTo(String fileName, String newParent, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
|
private JSONObject transferTo(String fileName, String newParent, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
|
||||||
DataResource dataResourceFrom = DataResource.initiateNewDataRequestForUri(fileName, webView.pluginManager, cordova, "FileUtils.transferTo");
|
String newFileName = FileHelper.getRealPath(fileName, cordova);
|
||||||
String newFileName = dataResourceFrom.getRealFile().getPath();
|
newParent = FileHelper.getRealPath(newParent, cordova);
|
||||||
DataResource dataResourceTo = DataResource.initiateNewDataRequestForUri(newParent, webView.pluginManager, cordova, "FileUtils.transferTo");
|
|
||||||
newParent = dataResourceTo.getRealFile().getPath();
|
|
||||||
|
|
||||||
// Check for invalid file name
|
// Check for invalid file name
|
||||||
if (newName != null && newName.contains(":")) {
|
if (newName != null && newName.contains(":")) {
|
||||||
@ -585,7 +613,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws FileExistsException
|
* @throws FileExistsException
|
||||||
*/
|
*/
|
||||||
private boolean removeRecursively(String filePath) throws FileExistsException {
|
private boolean removeRecursively(String filePath) throws FileExistsException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
|
File fp = createFileObject(filePath);
|
||||||
|
|
||||||
// You can't delete the root directory.
|
// You can't delete the root directory.
|
||||||
if (atRootDirectory(filePath)) {
|
if (atRootDirectory(filePath)) {
|
||||||
@ -626,7 +654,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws InvalidModificationException
|
* @throws InvalidModificationException
|
||||||
*/
|
*/
|
||||||
private boolean remove(String filePath) throws NoModificationAllowedException, InvalidModificationException {
|
private boolean remove(String filePath) throws NoModificationAllowedException, InvalidModificationException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
|
File fp = createFileObject(filePath);
|
||||||
|
|
||||||
// You can't delete the root directory.
|
// You can't delete the root directory.
|
||||||
if (atRootDirectory(filePath)) {
|
if (atRootDirectory(filePath)) {
|
||||||
@ -670,8 +698,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
throw new EncodingException("This file has a : in it's name");
|
throw new EncodingException("This file has a : in it's name");
|
||||||
}
|
}
|
||||||
|
|
||||||
String filePath = getFullFilePath(dirPath, fileName);
|
File fp = createFileObject(dirPath, fileName);
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getFile").getRealFile();
|
|
||||||
|
|
||||||
if (create) {
|
if (create) {
|
||||||
if (exclusive && fp.exists()) {
|
if (exclusive && fp.exists()) {
|
||||||
@ -713,14 +740,15 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @param fileName new file name
|
* @param fileName new file name
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String getFullFilePath(String dirPath, String fileName) {
|
private File createFileObject(String dirPath, String fileName) {
|
||||||
|
File fp = null;
|
||||||
if (fileName.startsWith("/")) {
|
if (fileName.startsWith("/")) {
|
||||||
return fileName;
|
fp = new File(fileName);
|
||||||
} else {
|
} else {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(dirPath, webView.pluginManager, cordova, "FileUtils.getFullFilePath");
|
dirPath = FileHelper.getRealPath(dirPath, cordova);
|
||||||
dirPath = dataResource.getRealFile().getPath();
|
fp = new File(dirPath + File.separator + fileName);
|
||||||
return dirPath + File.separator + fileName;
|
|
||||||
}
|
}
|
||||||
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -732,13 +760,12 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
private JSONObject getParent(String filePath) throws JSONException {
|
private JSONObject getParent(String filePath) throws JSONException {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getParent");
|
filePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
filePath = dataResource.getRealFile().getPath();
|
|
||||||
|
|
||||||
if (atRootDirectory(filePath)) {
|
if (atRootDirectory(filePath)) {
|
||||||
return getEntry(filePath);
|
return getEntry(filePath);
|
||||||
}
|
}
|
||||||
return getEntry(dataResource.getRealFile().getParent());
|
return getEntry(new File(filePath).getParent());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -749,7 +776,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @return true if we are at the root, false otherwise.
|
* @return true if we are at the root, false otherwise.
|
||||||
*/
|
*/
|
||||||
private boolean atRootDirectory(String filePath) {
|
private boolean atRootDirectory(String filePath) {
|
||||||
filePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.atRootDirectory").getRealFile().getPath();
|
filePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
|
|
||||||
if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + cordova.getActivity().getPackageName() + "/cache") ||
|
if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + cordova.getActivity().getPackageName() + "/cache") ||
|
||||||
filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) ||
|
filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) ||
|
||||||
@ -759,6 +786,19 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a File object from the passed in path
|
||||||
|
*
|
||||||
|
* @param filePath
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private File createFileObject(String filePath) {
|
||||||
|
filePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
|
|
||||||
|
File file = new File(filePath);
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up metadata about this entry.
|
* Look up metadata about this entry.
|
||||||
*
|
*
|
||||||
@ -767,9 +807,9 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws FileNotFoundException
|
* @throws FileNotFoundException
|
||||||
*/
|
*/
|
||||||
private long getMetadata(String filePath) throws FileNotFoundException {
|
private long getMetadata(String filePath) throws FileNotFoundException {
|
||||||
File file = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata").getRealFile();
|
File file = createFileObject(filePath);
|
||||||
|
|
||||||
if (file == null || !file.exists()) {
|
if (!file.exists()) {
|
||||||
throw new FileNotFoundException("Failed to find file in getMetadata");
|
throw new FileNotFoundException("Failed to find file in getMetadata");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,16 +825,15 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
private JSONObject getFileMetadata(String filePath) throws FileNotFoundException, JSONException {
|
private JSONObject getFileMetadata(String filePath) throws FileNotFoundException, JSONException {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata");
|
File file = createFileObject(filePath);
|
||||||
File file = dataResource.getRealFile();
|
|
||||||
|
|
||||||
if (file == null || !file.exists()) {
|
if (!file.exists()) {
|
||||||
throw new FileNotFoundException("File: " + filePath + " does not exist.");
|
throw new FileNotFoundException("File: " + filePath + " does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject metadata = new JSONObject();
|
JSONObject metadata = new JSONObject();
|
||||||
metadata.put("size", file.length());
|
metadata.put("size", file.length());
|
||||||
metadata.put("type", dataResource.getMimeType());
|
metadata.put("type", FileHelper.getMimeType(filePath, cordova));
|
||||||
metadata.put("name", file.getName());
|
metadata.put("name", file.getName());
|
||||||
metadata.put("fullPath", filePath);
|
metadata.put("fullPath", filePath);
|
||||||
metadata.put("lastModifiedDate", file.lastModified());
|
metadata.put("lastModifiedDate", file.lastModified());
|
||||||
@ -896,8 +935,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
this.cordova.getThreadPool().execute(new Runnable() {
|
this.cordova.getThreadPool().execute(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.readFileAs");
|
byte[] bytes = readAsBinaryHelper(filename, start, end);
|
||||||
byte[] bytes = readAsBinaryHelper(dataResource.getIs(), start, end);
|
|
||||||
|
|
||||||
PluginResult result;
|
PluginResult result;
|
||||||
switch (resultType) {
|
switch (resultType) {
|
||||||
@ -938,9 +976,10 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @return Contents of the file as a byte[].
|
* @return Contents of the file as a byte[].
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private byte[] readAsBinaryHelper(InputStream inputStream, int start, int end) throws IOException {
|
private byte[] readAsBinaryHelper(String filename, int start, int end) throws IOException {
|
||||||
int numBytesToRead = end - start;
|
int numBytesToRead = end - start;
|
||||||
byte[] bytes = new byte[numBytesToRead];
|
byte[] bytes = new byte[numBytesToRead];
|
||||||
|
InputStream inputStream = FileHelper.getInputStreamFromUriString(filename, cordova);
|
||||||
int numBytesRead = 0;
|
int numBytesRead = 0;
|
||||||
|
|
||||||
if (start > 0) {
|
if (start > 0) {
|
||||||
@ -969,8 +1008,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
throw new NoModificationAllowedException("Couldn't write to file given its content URI");
|
throw new NoModificationAllowedException("Couldn't write to file given its content URI");
|
||||||
}
|
}
|
||||||
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.write");
|
filename = FileHelper.getRealPath(filename, cordova);
|
||||||
filename = dataResource.getRealFile().getPath();
|
|
||||||
|
|
||||||
boolean append = false;
|
boolean append = false;
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
@ -999,16 +1037,13 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws NoModificationAllowedException
|
* @throws NoModificationAllowedException
|
||||||
*/
|
*/
|
||||||
private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
|
private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.truncateFile");
|
if (filename.startsWith("content://")) {
|
||||||
if(!dataResource.isWritable()) {
|
throw new NoModificationAllowedException("Couldn't truncate file given its content URI");
|
||||||
throw new NoModificationAllowedException("Couldn't truncate file as it is not writable");
|
|
||||||
}
|
|
||||||
File file = dataResource.getRealFile();
|
|
||||||
if(file == null) {
|
|
||||||
throw new FileNotFoundException("Couldn't get the file");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RandomAccessFile raf = new RandomAccessFile(file, "rw");
|
filename = FileHelper.getRealPath(filename, cordova);
|
||||||
|
|
||||||
|
RandomAccessFile raf = new RandomAccessFile(filename, "rw");
|
||||||
try {
|
try {
|
||||||
if (raf.length() >= size) {
|
if (raf.length() >= size) {
|
||||||
FileChannel channel = raf.getChannel();
|
FileChannel channel = raf.getChannel();
|
||||||
|
@ -49,7 +49,6 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
|
|||||||
new DataResourceContext("WebViewClient.shouldInterceptRequest", true /* this is from a browser request*/));
|
new DataResourceContext("WebViewClient.shouldInterceptRequest", true /* this is from a browser request*/));
|
||||||
url = dataResource.getUri().toString();
|
url = dataResource.getUri().toString();
|
||||||
|
|
||||||
// This mechanism is no longer needed due to the dataResource mechanism. It would be awesome to just get rid of it.
|
|
||||||
//Check if plugins intercept the request
|
//Check if plugins intercept the request
|
||||||
WebResourceResponse ret = super.shouldInterceptRequest(view, url);
|
WebResourceResponse ret = super.shouldInterceptRequest(view, url);
|
||||||
// The below bugfix is taken care of by the dataResource mechanism
|
// The below bugfix is taken care of by the dataResource mechanism
|
||||||
|
Loading…
Reference in New Issue
Block a user