diff --git a/README.md b/README.md index a785943bb9..aca3242f7c 100755 --- a/README.md +++ b/README.md @@ -1,3 +1,23 @@ + Cordova Android === diff --git a/bin/check_reqs.bat b/bin/check_reqs.bat index 65514c8531..12da1e74e6 100644 --- a/bin/check_reqs.bat +++ b/bin/check_reqs.bat @@ -1,3 +1,20 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%check_reqs.js ( @@ -6,4 +23,4 @@ IF EXIST %full_path%check_reqs.js ( ECHO. ECHO ERROR: Could not find 'check_reqs.js' in 'bin' folder, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/create b/bin/create index 39aff6b849..b38ed51de4 100755 --- a/bin/create +++ b/bin/create @@ -153,6 +153,7 @@ cp "$BUILD_PATH"/bin/templates/cordova/build "$PROJECT_PATH"/cordova/build cp "$BUILD_PATH"/bin/templates/cordova/clean "$PROJECT_PATH"/cordova/clean cp "$BUILD_PATH"/bin/templates/cordova/log "$PROJECT_PATH"/cordova/log cp "$BUILD_PATH"/bin/templates/cordova/run "$PROJECT_PATH"/cordova/run +cp "$BUILD_PATH"/bin/templates/cordova/version "$PROJECT_PATH"/cordova/version cp "$BUILD_PATH"/bin/templates/cordova/lib/cordova "$PROJECT_PATH"/cordova/lib/cordova cp "$BUILD_PATH"/bin/templates/cordova/lib/install-device "$PROJECT_PATH"/cordova/lib/install-device cp "$BUILD_PATH"/bin/templates/cordova/lib/install-emulator "$PROJECT_PATH"/cordova/lib/install-emulator diff --git a/bin/templates/cordova/build.bat b/bin/templates/cordova/build.bat index 7aa7c75d52..392f374a18 100644 --- a/bin/templates/cordova/build.bat +++ b/bin/templates/cordova/build.bat @@ -1,2 +1,18 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF -%~dp0\cordova.bat build %* \ No newline at end of file +%~dp0\cordova.bat build %* diff --git a/bin/templates/cordova/clean.bat b/bin/templates/cordova/clean.bat index b41bdc9194..643c8d5957 100644 --- a/bin/templates/cordova/clean.bat +++ b/bin/templates/cordova/clean.bat @@ -1,2 +1,18 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF %~dp0\cordova.bat clean %* diff --git a/bin/templates/cordova/cordova.bat b/bin/templates/cordova/cordova.bat index 9b561993a1..6235fdb73e 100644 --- a/bin/templates/cordova/cordova.bat +++ b/bin/templates/cordova/cordova.bat @@ -1,5 +1,3 @@ -@ECHO OFF -GOTO BEGIN :: Licensed to the Apache Software Foundation (ASF) under one :: or more contributor license agreements. See the NOTICE file :: distributed with this work for additional information @@ -16,7 +14,7 @@ GOTO BEGIN :: KIND, either express or implied. See the License for the :: specific language governing permissions and limitations :: under the License. -:BEGIN +@ECHO OFF IF NOT DEFINED JAVA_HOME GOTO MISSING FOR %%X in (java.exe ant.bat android.bat) do ( SET FOUND=%%~$PATH:X diff --git a/bin/templates/cordova/lib/install-device.bat b/bin/templates/cordova/lib/install-device.bat index 52d9775954..b00e757b0d 100644 --- a/bin/templates/cordova/lib/install-device.bat +++ b/bin/templates/cordova/lib/install-device.bat @@ -1,3 +1,19 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%cordova.js ( @@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js ( ECHO. ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/templates/cordova/lib/install-emulator.bat b/bin/templates/cordova/lib/install-emulator.bat index d11a7be361..2b886304ab 100644 --- a/bin/templates/cordova/lib/install-emulator.bat +++ b/bin/templates/cordova/lib/install-emulator.bat @@ -1,3 +1,19 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%cordova.js ( @@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js ( ECHO. ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/templates/cordova/lib/list-devices.bat b/bin/templates/cordova/lib/list-devices.bat index c146f10547..3840d1291a 100644 --- a/bin/templates/cordova/lib/list-devices.bat +++ b/bin/templates/cordova/lib/list-devices.bat @@ -1,3 +1,19 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%cordova.js ( @@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js ( ECHO. ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/templates/cordova/lib/list-emulator-images.bat b/bin/templates/cordova/lib/list-emulator-images.bat index 172520b369..e21aafe99f 100644 --- a/bin/templates/cordova/lib/list-emulator-images.bat +++ b/bin/templates/cordova/lib/list-emulator-images.bat @@ -1,3 +1,19 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%cordova.js ( @@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js ( ECHO. ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/templates/cordova/lib/list-started-emulators.bat b/bin/templates/cordova/lib/list-started-emulators.bat index f1b3c5d301..eb9f3b62cd 100644 --- a/bin/templates/cordova/lib/list-started-emulators.bat +++ b/bin/templates/cordova/lib/list-started-emulators.bat @@ -1,3 +1,19 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%cordova.js ( @@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js ( ECHO. ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/templates/cordova/lib/start-emulator.bat b/bin/templates/cordova/lib/start-emulator.bat index 4f3fb5d887..758c854cc9 100644 --- a/bin/templates/cordova/lib/start-emulator.bat +++ b/bin/templates/cordova/lib/start-emulator.bat @@ -1,3 +1,19 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF SET full_path=%~dp0 IF EXIST %full_path%cordova.js ( @@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js ( ECHO. ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2 EXIT /B 1 -) \ No newline at end of file +) diff --git a/bin/templates/cordova/log.bat b/bin/templates/cordova/log.bat index 2c492e755a..c2598026b8 100644 --- a/bin/templates/cordova/log.bat +++ b/bin/templates/cordova/log.bat @@ -1,2 +1,18 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF %~dp0\cordova.bat log %* diff --git a/bin/templates/cordova/run.bat b/bin/templates/cordova/run.bat index b1cab648eb..f191f67580 100644 --- a/bin/templates/cordova/run.bat +++ b/bin/templates/cordova/run.bat @@ -1,2 +1,18 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. @ECHO OFF -%~dp0\cordova.bat run %* \ No newline at end of file +%~dp0\cordova.bat run %* diff --git a/framework/res/xml/config.xml b/framework/res/xml/config.xml index 935eda4f7f..5b5a2700d0 100644 --- a/framework/res/xml/config.xml +++ b/framework/res/xml/config.xml @@ -1,18 +1,21 @@ (); } - public String getFilePath(String url, String source){ - DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.webView.pluginManager, cordova, source); - if(dataResource.getUri().getScheme().equals("http") || dataResource.getUri().getScheme().equals("https")) - return dataResource.getUri().toString(); - else - return dataResource.getRealFile().getPath(); - } - /** * Executes the request and returns PluginResult. * @param action The action to execute. @@ -76,13 +68,13 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo 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)); @@ -110,7 +102,7 @@ else if (action.equals("getDurationAudio")) { } 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 1974dd7171..426d250570 100755 --- a/framework/src/org/apache/cordova/CameraLauncher.java +++ b/framework/src/org/apache/cordova/CameraLauncher.java @@ -20,16 +20,15 @@ Licensed to the Apache Software Foundation (ASF) under one 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.commons.codec.binary.Base64; 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; @@ -43,6 +42,7 @@ Licensed to the Apache Software Foundation (ASF) under one 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 void onActivityResult(int requestCode, int resultCode, Intent intent) { // 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 @@ else if (destType == FILE_URI || destType == NATIVE_URI) { 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 @@ else if (destType == FILE_URI || destType == NATIVE_URI) { 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.getOutputStream(); + OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri); bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os); os.close(); @@ -350,7 +347,7 @@ else if (destType == FILE_URI || destType == NATIVE_URI) { 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 @@ else if ((srcType == PHOTOLIBRARY) || (srcType == SAVEDPHOTOALBUM)) { 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 @@ else if (destType == FILE_URI || destType == NATIVE_URI) { // 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 @@ private Bitmap getRotatedBitmap(int rotate, Bitmap bitmap, ExifHelper exif) { */ private void writeUncompressedImage(Uri uri) throws FileNotFoundException, IOException { - DataResource inputDataResource = DataResource.initiateNewDataRequestForUri(imageUri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage"); - InputStream fis = inputDataResource.getInputStream(); - DataResource outDataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage"); - OutputStream os = outDataResource.getOutputStream(); - 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 @@ private Uri getUriFromMediaStore() { */ 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.getInputStream()); + 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.getInputStream(), 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 @@ private Bitmap getScaledBitmap(String imageUrl) throws IOException { // 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.getInputStream(), null, options); + Bitmap unscaledBitmap = BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options); if (unscaledBitmap == null) { return null; } @@ -711,20 +698,16 @@ private void cleanup(int imageType, Uri oldImage, Uri newImage, Bitmap bitmap) { 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(); - - checkForDuplicateImage(imageType); - // Scan for the gallery to update pic refs in gallery - if (this.saveToPhotoAlbum && newImage != null) { - this.scanForGallery(newImage); - } + // Clean up initial camera-written image file. + (new File(FileHelper.stripFileProtocol(oldImage.toString()))).delete(); - 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 d7ad419e98..5f737ca786 100644 --- a/framework/src/org/apache/cordova/Capture.java +++ b/framework/src/org/apache/cordova/Capture.java @@ -26,7 +26,6 @@ Licensed to the Apache Software Foundation (ASF) under one 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 @@ private JSONObject getFormatData(String filePath, String mimeType) throws JSONEx // 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 @@ else if (mimeType.equals(VIDEO_3GPP) || mimeType.equals(VIDEO_MP4)) { 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 @@ else if (resultCode == Activity.RESULT_CANCELED) { * @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 @@ private JSONObject createMediaFile(Uri data) { // 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 @@ private JSONObject createMediaFile(Uri data) { 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/FileHelper.java b/framework/src/org/apache/cordova/FileHelper.java index 8bc24aa168..8b446b06c3 100644 --- a/framework/src/org/apache/cordova/FileHelper.java +++ b/framework/src/org/apache/cordova/FileHelper.java @@ -26,11 +26,10 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.cordova.api.LOG; 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 java.net.URLConnection; +import java.util.Locale; public class FileHelper { private static final String LOG_TAG = "FileUtils"; @@ -91,63 +90,16 @@ public static String getRealPath(Uri uri, CordovaInterface cordova) { * @throws IOException */ public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException { - if (uriString.startsWith("content:")) { + if (uriString.startsWith("content")) { Uri uri = Uri.parse(uriString); return cordova.getActivity().getContentResolver().openInputStream(uri); } else if (uriString.startsWith("file:///android_asset/")) { Uri uri = Uri.parse(uriString); String relativePath = uri.getPath().substring(15); return cordova.getActivity().getAssets().open(relativePath); - } else if (uriString.startsWith("file://")) { - return new FileInputStream(getRealPath(uriString, cordova)); } else { - return null; - } - } - - public static OutputStream getOutputStreamFromUriString(String uriString, CordovaInterface cordova) throws FileNotFoundException{ - if (uriString.startsWith("content:")) { - Uri uri = Uri.parse(uriString); - return cordova.getActivity().getContentResolver().openOutputStream(uri); - } else if (uriString.startsWith("file:") && !uriString.startsWith("file:///android_asset/")) { - String realPath = uriString.substring(7); - return new FileOutputStream(realPath); - } else { - return null; - } - } - /** - * Returns whether the uri can be written to by openeing a File to that uri - * - * @param the URI to test - * @return boolean indicating whether the uri is writable - */ - public static boolean isUriWritable(String uriString) { - String scheme = uriString.split(":")[0]; - - if(scheme.equals("file")){ - // special case file - return !uriString.startsWith("file:///android_asset/"); - } - return "content".equals(scheme); - } - - /** - * Ensures the "file://" prefix exists for the given string - * If the given URI string already has a scheme, it is returned unchanged - * - * @param path - the path string to operate on - * @return a String with the "file://" scheme set - */ - public static String insertFileProtocol(String path) { - if(!path.matches("^[a-z0-9+.-]+:.*")){ - //Ensure it is not a relative path - if(!path.startsWith("/")){ - throw new IllegalArgumentException("Relative paths" + path + "are not allowed."); - } - path = "file://" + path; + return new FileInputStream(getRealPath(uriString, cordova)); } - return path; } /** diff --git a/framework/src/org/apache/cordova/FileUtils.java b/framework/src/org/apache/cordova/FileUtils.java index e62fc4a164..2135be9ee1 100755 --- a/framework/src/org/apache/cordova/FileUtils.java +++ b/framework/src/org/apache/cordova/FileUtils.java @@ -18,6 +18,8 @@ Licensed to the Apache Software Foundation (ASF) under one */ package org.apache.cordova; +import android.database.Cursor; +import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; @@ -25,7 +27,6 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.commons.codec.binary.Base64; 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 @@ Licensed to the Apache Software Foundation (ASF) under one 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 @@ else if (action.equals("readEntries")) { * @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 @@ private void notifyDelete(String filePath) { * @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 @@ private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSO * @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 @@ private JSONArray readEntries(String fileName) throws FileNotFoundException, JSO * @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 @@ private JSONObject moveDirectory(File srcDir, File destinationDir) throws IOExce * @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 @@ private boolean removeDirRecursively(File directory) throws FileExistsException * @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 @@ private JSONObject getFile(String dirPath, String fileName, JSONObject options, 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 @@ private JSONObject getFile(String dirPath, String fileName, JSONObject options, * @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 @@ private String getFullFilePath(String dirPath, String fileName) { * @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 @@ private JSONObject getParent(String filePath) throws JSONException { * @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 @@ private boolean atRootDirectory(String filePath) { 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 @@ private boolean atRootDirectory(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"); } @@ -785,16 +825,15 @@ private long getMetadata(String filePath) throws FileNotFoundException { * @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 void readFileAs(final String filename, final int start, final int end, fi this.cordova.getThreadPool().execute(new Runnable() { public void run() { try { - DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.readFileAs"); - byte[] bytes = readAsBinaryHelper(dataResource.getInputStream(), start, end); + byte[] bytes = readAsBinaryHelper(filename, start, end); PluginResult result; switch (resultType) { @@ -911,7 +949,7 @@ public void run() { result = new PluginResult(PluginResult.Status.OK, bytes, true); break; default: // Base64. - String contentType = dataResource.getMimeType(); + String contentType = FileHelper.getMimeType(filename, cordova); byte[] base64 = Base64.encodeBase64(bytes); String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII"); result = new PluginResult(PluginResult.Status.OK, s); @@ -938,9 +976,10 @@ public void run() { * @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 long write(String filename, String data, int offset) throws FileNotFoundE 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 long write(String filename, String data, int offset) throws FileNotFoundE * @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 14c7603767..847972ee51 100644 --- a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java +++ b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java @@ -22,8 +22,6 @@ Licensed to the Apache Software Foundation (ASF) under one import java.io.InputStream; import org.apache.cordova.api.CordovaInterface; -import org.apache.cordova.api.DataResource; -import org.apache.cordova.api.DataResourceContext; import org.apache.cordova.api.LOG; import android.annotation.TargetApi; @@ -45,27 +43,41 @@ public IceCreamCordovaWebViewClient(CordovaInterface cordova, CordovaWebView vie @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { - // We need to support the new DataResource intercepts without breaking the shouldInterceptRequest mechanism. - DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.appView.pluginManager, cordova, - "WebViewClient.shouldInterceptRequest"); - 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); + if(ret == null && (url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url))){ + ret = generateWebResourceResponse(url); + } + return ret; + } + + private WebResourceResponse generateWebResourceResponse(String url) { + if (url.startsWith("file:///android_asset/")) { + String mimetype = FileHelper.getMimeType(url, cordova); - if(ret == null) { try { - InputStream is; - String mimeType; - if((is = dataResource.getInputStream()) != null && (mimeType = dataResource.getMimeType()) != null) { - // If we don't know how to open this file, let the browser continue loading - ret = new WebResourceResponse(mimeType, "UTF-8", is); - } - } catch(IOException e) { - LOG.e("IceCreamCordovaWebViewClient", "Error occurred while loading a file.", e); + InputStream stream = FileHelper.getInputStreamFromUriString(url, cordova); + WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream); + return response; + } catch (IOException e) { + LOG.e("generateWebResourceResponse", e.getMessage(), e); } } - return ret; + return null; } + + private static boolean needsIceCreamSpaceInAssetUrlFix(String url) { + if (!url.contains("%20")){ + return false; + } + + switch(android.os.Build.VERSION.SDK_INT){ + case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH: + case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1: + return true; + default: + return false; + } + } + } diff --git a/framework/src/org/apache/cordova/JSONUtils.java b/framework/src/org/apache/cordova/JSONUtils.java index 77df8764df..da777c16c3 100644 --- a/framework/src/org/apache/cordova/JSONUtils.java +++ b/framework/src/org/apache/cordova/JSONUtils.java @@ -1,3 +1,21 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ package org.apache.cordova; import java.util.ArrayList; diff --git a/framework/src/org/apache/cordova/api/CallbackContext.java b/framework/src/org/apache/cordova/api/CallbackContext.java index a5d1255c98..237d0f4d93 100644 --- a/framework/src/org/apache/cordova/api/CallbackContext.java +++ b/framework/src/org/apache/cordova/api/CallbackContext.java @@ -1,3 +1,21 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ package org.apache.cordova.api; import org.json.JSONArray; diff --git a/framework/src/org/apache/cordova/api/CordovaPlugin.java b/framework/src/org/apache/cordova/api/CordovaPlugin.java index 866677c362..2b225e6463 100644 --- a/framework/src/org/apache/cordova/api/CordovaPlugin.java +++ b/framework/src/org/apache/cordova/api/CordovaPlugin.java @@ -175,20 +175,6 @@ public WebResourceResponse shouldInterceptRequest(String url) { return null; } - /** - * All plugins can now choose if they want to modify any uri requests. This includes all webview requests, opening of files, content uri's etc. - * This mechanism allows several plugins to modify the same request - * @param requestSource The source of the incoming request - * - * @param dataResource The resource to be loaded. - * @param dataResourceContext Context associated with the resource load - * @return Return a new DataResource if the plugin wants to assist in loading the request or null if it doesn't. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public DataResource handleDataResourceRequest(DataResource dataResource, DataResourceContext dataResourceContext) { - return null; - } - /** * Called when the WebView does a top-level navigation or refreshes. * diff --git a/framework/src/org/apache/cordova/api/DataResource.java b/framework/src/org/apache/cordova/api/DataResource.java deleted file mode 100644 index 3e6ead879a..0000000000 --- a/framework/src/org/apache/cordova/api/DataResource.java +++ /dev/null @@ -1,141 +0,0 @@ -package org.apache.cordova.api; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.cordova.FileHelper; - -import android.net.Uri; - -/* - * All requests to access files, browser network requests etc have to go through this class. - */ -public class DataResource { - private CordovaInterface cordova; - - // Uri of the request. Always required. - private Uri uri; - // Remaining fields may or may not be null - private InputStream is; - private OutputStream os; - private String mimeType; - private Boolean writable; - private File realFile; - private boolean retryIsLoad = true; - private boolean retryOsLoad = true; - private boolean retryMimeTypeLoad = true; - private boolean retryWritableLoad = true; - private boolean retryRealFileLoad = true; - - public DataResource(CordovaInterface cordova, Uri uri) { - this.cordova = cordova; - this.uri = uri; - } - public DataResource(CordovaInterface cordova, Uri uri, InputStream is, - OutputStream os, String mimeType, boolean writable, File realFile) { - this(cordova, uri); - this.is = is; - this.mimeType = mimeType; - this.writable = Boolean.valueOf(writable); - this.realFile = realFile; - } - public Uri getUri() { - // Uri is always provided - return uri; - } - public InputStream getInputStream() throws IOException { - if(is == null && retryIsLoad) { - try { - is = FileHelper.getInputStreamFromUriString(uri.toString(), cordova); - } finally { - // We failed loading once, don't try loading anymore - if(is == null) { - retryIsLoad = false; - } - } - } - return is; - } - public OutputStream getOutputStream() throws FileNotFoundException { - if(os == null && retryOsLoad) { - try { - os = FileHelper.getOutputStreamFromUriString(uri.toString(), cordova); - } finally { - // We failed loading once, don't try loading anymore - if(os == null) { - retryOsLoad = false; - } - } - } - return os; - } - public String getMimeType() { - if(mimeType == null && retryMimeTypeLoad) { - try { - mimeType = FileHelper.getMimeType(uri.toString(), cordova); - } finally { - // We failed loading once, don't try loading anymore - if(mimeType == null) { - retryMimeTypeLoad = false; - } - } - } - return mimeType; - } - public boolean isWritable() { - if(writable == null && retryWritableLoad) { - try { - writable = FileHelper.isUriWritable(uri.toString()); - } finally { - // We failed loading once, don't try loading anymore - if(writable == null) { - retryWritableLoad = false; - } - } - } - // default to false - return writable != null && writable.booleanValue(); - } - public File getRealFile() { - if(realFile == null && retryRealFileLoad) { - try { - String realPath = FileHelper.getRealPath(uri, cordova); - if(realPath != null) { - realFile = new File(realPath); - } - } finally { - // We failed loading once, don't try loading anymore - if(realFile == null) { - retryRealFileLoad = false; - } - } - } - return realFile; - } - - // static instantiation methods - public static DataResource initiateNewDataRequestForUri(String uriString, PluginManager pluginManager, CordovaInterface cordova, String requestSourceTag){ - // if no protocol is specified, assume its file: - uriString = FileHelper.insertFileProtocol(uriString); - return initiateNewDataRequestForUri(Uri.parse(uriString), pluginManager, cordova, requestSourceTag); - } - public static DataResource initiateNewDataRequestForUri(Uri uri, PluginManager pluginManager, CordovaInterface cordova, String requestSourceTag){ - return initiateNewDataRequestForUri(uri, pluginManager, cordova, new DataResourceContext(requestSourceTag)); - } - public static DataResource initiateNewDataRequestForUri(String uriString, PluginManager pluginManager, CordovaInterface cordova, DataResourceContext dataResourceContext){ - // if no protocol is specified, assume its file: - uriString = FileHelper.insertFileProtocol(uriString); - return initiateNewDataRequestForUri(Uri.parse(uriString), pluginManager, cordova, dataResourceContext); - } - public static DataResource initiateNewDataRequestForUri(Uri uri, PluginManager pluginManager, CordovaInterface cordova, DataResourceContext dataResourceContext){ - DataResource dataResource = new DataResource(cordova, uri); - if (pluginManager != null) { - // get the resource as returned by plugins - dataResource = pluginManager.handleDataResourceRequestWithPlugins(dataResource, dataResourceContext); - } - return dataResource; - } -} diff --git a/framework/src/org/apache/cordova/api/DataResourceContext.java b/framework/src/org/apache/cordova/api/DataResourceContext.java deleted file mode 100644 index 310586b261..0000000000 --- a/framework/src/org/apache/cordova/api/DataResourceContext.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.apache.cordova.api; - -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -/* - * Some context information associated with a DataRequest. - */ -public class DataResourceContext { - // A random id that is unique for a particular request. - private int requestId; - // A tag associated with the source of this dataResourceContext - private String source; - // If needed, any data associated with core plugins can be a part of the context object - // If needed, any data associated with non core plugins should store data in a Map so as to not clutter the context object - private Map dataMap; - public DataResourceContext(String source) { - this.requestId = new Random().nextInt(); - this.source = source; - this.dataMap = new HashMap(); - } - public int getRequestId() { - return requestId; - } - public String getSource() { - return source; - } - public Map getDataMap() { - return dataMap; - } -} diff --git a/framework/src/org/apache/cordova/api/PluginManager.java b/framework/src/org/apache/cordova/api/PluginManager.java index e0ceabfb43..71fc25817b 100755 --- a/framework/src/org/apache/cordova/api/PluginManager.java +++ b/framework/src/org/apache/cordova/api/PluginManager.java @@ -54,7 +54,6 @@ public class PluginManager { // Map URL schemes like foo: to plugins that want to handle those schemes // This would allow how all URLs are handled to be offloaded to a plugin protected HashMap urlMap = new HashMap(); - private int MAX_REPITIONS = 1000; /** * Constructor. @@ -401,32 +400,4 @@ private void pluginConfigurationMissing() { LOG.e(TAG, "https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml"); LOG.e(TAG, "====================================================================================="); } - - /** - * Called when the any resource is going to be loaded - either from the webview, files or any other resource - * - * - * @param dataResource The resource request to be loaded. - * @param dataResourceContext The context of the dataResource request - * @return Return the resource request that will be loaded. The returned request may be modified or unchanged. - */ - public DataResource handleDataResourceRequestWithPlugins(DataResource dataResource, DataResourceContext dataResourceContext){ - int repetitions = 0; - boolean requestModified = true; - while(requestModified && repetitions < MAX_REPITIONS) { - requestModified = false; - repetitions ++; - for (PluginEntry entry : this.entries.values()) { - if (entry.plugin != null) { - DataResource ret = entry.plugin.handleDataResourceRequest(dataResource, dataResourceContext); - if(ret != null) { - dataResource = ret; - requestModified = true; - break; - } - } - } - } - return dataResource; - } } diff --git a/test/README.md b/test/README.md index 79cf85ffbb..5d86720177 100755 --- a/test/README.md +++ b/test/README.md @@ -1,3 +1,23 @@ + # Android Native Tests # These tests are designed to verify Android native features and other Android specific features. diff --git a/test/res/xml/config.xml b/test/res/xml/config.xml index d3ea4d86dc..5ad2b25a36 100644 --- a/test/res/xml/config.xml +++ b/test/res/xml/config.xml @@ -1,4 +1,22 @@ +