From c5b37cc7e7d5bc96d98fd17ea70a165c08761682 Mon Sep 17 00:00:00 2001 From: Andrew Grieve Date: Mon, 27 May 2013 22:22:16 -0400 Subject: [PATCH] Revert "Changed all usages of FileHelper to use the new DataResource mechanism." This reverts commit 867358ea81619ce2b0e674758f1d66f1bc22172c. Reverting all DataResource changes for the 2.8.0 release. Conflicts: framework/src/org/apache/cordova/FileUtils.java --- .../src/org/apache/cordova/AudioHandler.java | 13 +- .../org/apache/cordova/CameraLauncher.java | 61 ++++----- framework/src/org/apache/cordova/Capture.java | 13 +- .../src/org/apache/cordova/FileUtils.java | 119 +++++++++++------- .../cordova/IceCreamCordovaWebViewClient.java | 1 - 5 files changed, 107 insertions(+), 100 deletions(-) diff --git a/framework/src/org/apache/cordova/AudioHandler.java b/framework/src/org/apache/cordova/AudioHandler.java index 20c3c4ef..fd8c9df0 100644 --- a/framework/src/org/apache/cordova/AudioHandler.java +++ b/framework/src/org/apache/cordova/AudioHandler.java @@ -20,7 +20,7 @@ package org.apache.cordova; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; -import org.apache.cordova.api.DataResource; + import android.content.Context; import android.media.AudioManager; @@ -56,11 +56,6 @@ public class AudioHandler extends CordovaPlugin { this.pausedForPhone = new ArrayList(); } - 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. * @param action The action to execute. @@ -73,13 +68,13 @@ public class AudioHandler extends CordovaPlugin { String result = ""; 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")) { this.stopRecordingAudio(args.getString(0)); } 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")) { this.seekToAudio(args.getString(0), args.getInt(1)); @@ -107,7 +102,7 @@ public class AudioHandler extends CordovaPlugin { } else if (action.equals("create")) { 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); this.players.put(id, audio); } diff --git a/framework/src/org/apache/cordova/CameraLauncher.java b/framework/src/org/apache/cordova/CameraLauncher.java index f434661a..8e43786c 100755 --- a/framework/src/org/apache/cordova/CameraLauncher.java +++ b/framework/src/org/apache/cordova/CameraLauncher.java @@ -20,15 +20,14 @@ package org.apache.cordova; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; -import org.apache.cordova.api.DataResource; import org.apache.cordova.api.LOG; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; @@ -42,6 +41,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.Bitmap.CompressFormat; +import android.graphics.Rect; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; @@ -290,7 +290,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect // If sending base64 image back if (destType == DATA_URL) { - bitmap = getScaledBitmap(imageUri.toString()); + bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString())); if (bitmap == null) { // Try to get the bitmap from intent. bitmap = (Bitmap)intent.getExtras().get("data"); @@ -316,9 +316,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect if (this.saveToPhotoAlbum) { Uri inputUri = getUriFromMediaStore(); //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"); - File file = dataResource.getRealFile(); - uri = Uri.fromFile(file); + uri = Uri.fromFile(new File(FileHelper.getRealPath(inputUri, this.cordova))); } else { 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()); } else { - bitmap = getScaledBitmap(imageUri.toString()); + bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString())); if (rotate != 0 && this.correctOrientation) { bitmap = getRotatedBitmap(rotate, bitmap, exif); } // Add compressed version of captured image to returned media store Uri - DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent"); - OutputStream os = dataResource.getOs(); + OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri); bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os); os.close(); @@ -350,7 +347,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect if (this.encodingType == JPEG) { String exifPath; if (this.saveToPhotoAlbum) { - exifPath = dataResource.getRealFile().getPath(); + exifPath = FileHelper.getRealPath(uri, this.cordova); } else { exifPath = uri.getPath(); } @@ -401,9 +398,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect this.callbackContext.success(uri.toString()); } else { 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. - String mimeType = dataResource.getMimeType(); + String mimeType = FileHelper.getMimeType(uriString, this.cordova); // If we don't have a valid image so quit. if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) { 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 String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg"; // 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 = realFile != null? realFile.getPath() : null; + String realPath = FileHelper.getRealPath(uri, this.cordova); ExifHelper exif = new ExifHelper(); if (realPath != null && this.encodingType == JPEG) { try { @@ -539,15 +534,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect */ private void writeUncompressedImage(Uri uri) throws FileNotFoundException, IOException { - DataResource inputDataResource = DataResource.initiateNewDataRequestForUri(imageUri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage"); - InputStream fis = inputDataResource.getIs(); - 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"); - } + FileInputStream fis = new FileInputStream(FileHelper.stripFileProtocol(imageUri.toString())); + OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri); byte[] buffer = new byte[4096]; int len; while ((len = fis.read(buffer)) != -1) { @@ -590,15 +578,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect */ private Bitmap getScaledBitmap(String imageUrl) throws IOException { // 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) { - return BitmapFactory.decodeStream(dataResource.getIs()); + return BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova)); } // figure out the original width and height of the image BitmapFactory.Options options = new BitmapFactory.Options(); 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? 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 options.inJustDecodeBounds = false; 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) { return null; } @@ -711,20 +698,16 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect bitmap.recycle(); } - DataResource dataResource = DataResource.initiateNewDataRequestForUri(oldImage, webView.pluginManager, cordova, "CameraLauncher.cleanup"); - File file = dataResource.getRealFile(); - if(file != null) { - // Clean up initial camera-written image file. - file.delete(); + // Clean up initial camera-written image file. + (new File(FileHelper.stripFileProtocol(oldImage.toString()))).delete(); - checkForDuplicateImage(imageType); - // Scan for the gallery to update pic refs in gallery - if (this.saveToPhotoAlbum && newImage != null) { - this.scanForGallery(newImage); - } - - System.gc(); + checkForDuplicateImage(imageType); + // Scan for the gallery to update pic refs in gallery + if (this.saveToPhotoAlbum && newImage != null) { + this.scanForGallery(newImage); } + + System.gc(); } /** diff --git a/framework/src/org/apache/cordova/Capture.java b/framework/src/org/apache/cordova/Capture.java index d7ad419e..5f737ca7 100644 --- a/framework/src/org/apache/cordova/Capture.java +++ b/framework/src/org/apache/cordova/Capture.java @@ -26,7 +26,6 @@ import java.io.OutputStream; import android.os.Build; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; -import org.apache.cordova.api.DataResource; import org.apache.cordova.api.LOG; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; @@ -130,8 +129,7 @@ public class Capture extends CordovaPlugin { // If the mimeType isn't set the rest will fail // so let's see if we can determine it. if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.dataResource"); - mimeType = dataResource.getMimeType(); + mimeType = FileHelper.getMimeType(filePath, cordova); } 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 { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.getImageData"); - BitmapFactory.decodeFile(dataResource.getRealFile().getPath(), options); + BitmapFactory.decodeFile(FileHelper.stripFileProtocol(filePath), options); obj.put("height", options.outHeight); obj.put("width", options.outWidth); return obj; @@ -351,8 +348,7 @@ public class Capture extends CordovaPlugin { * @throws IOException */ private JSONObject createMediaFile(Uri data) { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(data, webView.pluginManager, cordova, "Capture.createMediaFile"); - File fp = dataResource.getRealFile(); + File fp = new File(FileHelper.getRealPath(data, this.cordova)); JSONObject obj = new JSONObject(); try { @@ -362,7 +358,6 @@ public class Capture extends CordovaPlugin { // 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); @@ -370,7 +365,7 @@ public class Capture extends CordovaPlugin { obj.put("type", VIDEO_3GPP); } } else { - obj.put("type", dataResource.getMimeType()); + obj.put("type", FileHelper.getMimeType(fp.getAbsolutePath(), cordova)); } obj.put("lastModifiedDate", fp.lastModified()); diff --git a/framework/src/org/apache/cordova/FileUtils.java b/framework/src/org/apache/cordova/FileUtils.java index fe5a4ab1..f6db0ac7 100755 --- a/framework/src/org/apache/cordova/FileUtils.java +++ b/framework/src/org/apache/cordova/FileUtils.java @@ -18,6 +18,8 @@ */ package org.apache.cordova; +import android.database.Cursor; +import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.Base64; @@ -25,7 +27,6 @@ import android.util.Log; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; -import org.apache.cordova.api.DataResource; import org.apache.cordova.api.PluginResult; import org.apache.cordova.file.EncodingException; import org.apache.cordova.file.FileExistsException; @@ -45,6 +46,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLDecoder; import java.nio.channels.FileChannel; /** @@ -231,7 +234,7 @@ public class FileUtils extends CordovaPlugin { * @param filePath the path to check */ private void notifyDelete(String filePath) { - String newFilePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.notifyDelete").getRealFile().getPath(); + String newFilePath = FileHelper.getRealPath(filePath, cordova); try { this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA + " = ?", @@ -253,10 +256,37 @@ public class FileUtils extends CordovaPlugin { * @throws IOException if the user can't read the file * @throws JSONException */ + @SuppressWarnings("deprecation") 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(); } if (!fp.canRead()) { @@ -274,9 +304,9 @@ public class FileUtils extends CordovaPlugin { * @throws 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. throw new FileNotFoundException(); } @@ -311,10 +341,8 @@ public class FileUtils extends CordovaPlugin { * @throws 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 = dataResourceFrom.getRealFile().getPath(); - DataResource dataResourceTo = DataResource.initiateNewDataRequestForUri(newParent, webView.pluginManager, cordova, "FileUtils.transferTo"); - newParent = dataResourceTo.getRealFile().getPath(); + String newFileName = FileHelper.getRealPath(fileName, cordova); + newParent = FileHelper.getRealPath(newParent, cordova); // Check for invalid file name if (newName != null && newName.contains(":")) { @@ -585,7 +613,7 @@ public class FileUtils extends CordovaPlugin { * @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. if (atRootDirectory(filePath)) { @@ -626,7 +654,7 @@ public class FileUtils extends CordovaPlugin { * @throws 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. if (atRootDirectory(filePath)) { @@ -670,8 +698,7 @@ public class FileUtils extends CordovaPlugin { throw new EncodingException("This file has a : in it's name"); } - String filePath = getFullFilePath(dirPath, fileName); - File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getFile").getRealFile(); + File fp = createFileObject(dirPath, fileName); if (create) { if (exclusive && fp.exists()) { @@ -713,14 +740,15 @@ public class FileUtils extends CordovaPlugin { * @param fileName new file name * @return */ - private String getFullFilePath(String dirPath, String fileName) { + private File createFileObject(String dirPath, String fileName) { + File fp = null; if (fileName.startsWith("/")) { - return fileName; + fp = new File(fileName); } else { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(dirPath, webView.pluginManager, cordova, "FileUtils.getFullFilePath"); - dirPath = dataResource.getRealFile().getPath(); - return dirPath + File.separator + fileName; + dirPath = FileHelper.getRealPath(dirPath, cordova); + fp = new File(dirPath + File.separator + fileName); } + return fp; } /** @@ -732,13 +760,12 @@ public class FileUtils extends CordovaPlugin { * @throws JSONException */ private JSONObject getParent(String filePath) throws JSONException { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getParent"); - filePath = dataResource.getRealFile().getPath(); + filePath = FileHelper.getRealPath(filePath, cordova); if (atRootDirectory(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. */ 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") || filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) || @@ -759,6 +786,19 @@ public class FileUtils extends CordovaPlugin { 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. * @@ -767,9 +807,9 @@ public class FileUtils extends CordovaPlugin { * @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"); } @@ -785,16 +825,15 @@ public class FileUtils extends CordovaPlugin { * @throws JSONException */ private JSONObject getFileMetadata(String filePath) throws FileNotFoundException, JSONException { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata"); - File file = dataResource.getRealFile(); + File file = createFileObject(filePath); - if (file == null || !file.exists()) { + if (!file.exists()) { throw new FileNotFoundException("File: " + filePath + " does not exist."); } JSONObject metadata = new JSONObject(); metadata.put("size", file.length()); - metadata.put("type", dataResource.getMimeType()); + metadata.put("type", FileHelper.getMimeType(filePath, cordova)); metadata.put("name", file.getName()); metadata.put("fullPath", filePath); metadata.put("lastModifiedDate", file.lastModified()); @@ -896,8 +935,7 @@ public class FileUtils extends CordovaPlugin { this.cordova.getThreadPool().execute(new Runnable() { public void run() { try { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.readFileAs"); - byte[] bytes = readAsBinaryHelper(dataResource.getIs(), start, end); + byte[] bytes = readAsBinaryHelper(filename, start, end); PluginResult result; switch (resultType) { @@ -938,9 +976,10 @@ public class FileUtils extends CordovaPlugin { * @return Contents of the file as a byte[]. * @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; byte[] bytes = new byte[numBytesToRead]; + InputStream inputStream = FileHelper.getInputStreamFromUriString(filename, cordova); int numBytesRead = 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"); } - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.write"); - filename = dataResource.getRealFile().getPath(); + filename = FileHelper.getRealPath(filename, cordova); boolean append = false; if (offset > 0) { @@ -999,16 +1037,13 @@ public class FileUtils extends CordovaPlugin { * @throws NoModificationAllowedException */ private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.truncateFile"); - if(!dataResource.isWritable()) { - 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"); + if (filename.startsWith("content://")) { + throw new NoModificationAllowedException("Couldn't truncate file given its content URI"); } - RandomAccessFile raf = new RandomAccessFile(file, "rw"); + filename = FileHelper.getRealPath(filename, cordova); + + RandomAccessFile raf = new RandomAccessFile(filename, "rw"); try { if (raf.length() >= size) { FileChannel channel = raf.getChannel(); diff --git a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java index 2a686d8a..d71fbe86 100644 --- a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java +++ b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java @@ -49,7 +49,6 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient { new DataResourceContext("WebViewClient.shouldInterceptRequest", true /* this is from a browser request*/)); 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 WebResourceResponse ret = super.shouldInterceptRequest(view, url); // The below bugfix is taken care of by the dataResource mechanism