From 862a8eab8d8422cfb30eee9afe9dcdccfe79f766 Mon Sep 17 00:00:00 2001 From: Andrew Grieve Date: Mon, 9 Sep 2013 15:37:55 -0400 Subject: [PATCH] [CB-4763] Delete FileHelper.java, Move getMimeType() into CordovaResourceApi. --- .../apache/cordova/CordovaResourceApi.java | 59 ++++++- .../src/org/apache/cordova/FileHelper.java | 162 ------------------ .../cordova/test/CordovaResourceApiTest.java | 23 +-- 3 files changed, 69 insertions(+), 175 deletions(-) delete mode 100644 framework/src/org/apache/cordova/FileHelper.java diff --git a/framework/src/org/apache/cordova/CordovaResourceApi.java b/framework/src/org/apache/cordova/CordovaResourceApi.java index f03f1b55..96f3d25b 100644 --- a/framework/src/org/apache/cordova/CordovaResourceApi.java +++ b/framework/src/org/apache/cordova/CordovaResourceApi.java @@ -26,6 +26,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Looper; import android.util.Base64; +import android.webkit.MimeTypeMap; import com.squareup.okhttp.OkHttpClient; @@ -42,6 +43,7 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.channels.FileChannel; +import java.util.Locale; public class CordovaResourceApi { @SuppressWarnings("unused") @@ -150,6 +152,46 @@ public class CordovaResourceApi { return null; } + public String getMimeType(Uri uri) { + switch (getUriType(uri)) { + case URI_TYPE_FILE: + case URI_TYPE_ASSET: + return getMimeTypeFromPath(uri.getPath()); + case URI_TYPE_CONTENT: + case URI_TYPE_RESOURCE: + return contentResolver.getType(uri); + case URI_TYPE_DATA: { + return getDataUriMimeType(uri); + } + case URI_TYPE_HTTP: + case URI_TYPE_HTTPS: { + try { + HttpURLConnection conn = httpClient.open(new URL(uri.toString())); + conn.setDoInput(false); + conn.setRequestMethod("HEAD"); + return conn.getHeaderField("Content-Type"); + } catch (IOException e) { + } + } + } + + return null; + } + + private String getMimeTypeFromPath(String path) { + String extension = path; + int lastDot = extension.lastIndexOf('.'); + if (lastDot != -1) { + extension = extension.substring(lastDot + 1); + } + // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185). + extension = extension.toLowerCase(Locale.getDefault()); + if (extension.equals("3ga")) { + return "audio/3gpp"; + } + return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + /** * Opens a stream to the givne URI, also providing the MIME type & length. * @return Never returns null. @@ -177,7 +219,7 @@ public class CordovaResourceApi { switch (getUriType(uri)) { case URI_TYPE_FILE: { FileInputStream inputStream = new FileInputStream(uri.getPath()); - String mimeType = FileHelper.getMimeTypeForExtension(uri.getPath()); + String mimeType = getMimeTypeFromPath(uri.getPath()); long length = inputStream.getChannel().size(); return new OpenForReadResult(uri, inputStream, mimeType, length, null); } @@ -194,7 +236,7 @@ public class CordovaResourceApi { // Will occur if the file is compressed. inputStream = assetManager.open(assetPath); } - String mimeType = FileHelper.getMimeTypeForExtension(assetPath); + String mimeType = getMimeTypeFromPath(assetPath); return new OpenForReadResult(uri, inputStream, mimeType, length, assetFd); } case URI_TYPE_CONTENT: @@ -314,6 +356,19 @@ public class CordovaResourceApi { } } + private String getDataUriMimeType(Uri uri) { + String uriAsString = uri.getSchemeSpecificPart(); + int commaPos = uriAsString.indexOf(','); + if (commaPos == -1) { + return null; + } + String[] mimeParts = uriAsString.substring(0, commaPos).split(";"); + if (mimeParts.length > 0) { + return mimeParts[0]; + } + return null; + } + private OpenForReadResult readDataUri(Uri uri) { String uriAsString = uri.getSchemeSpecificPart(); int commaPos = uriAsString.indexOf(','); diff --git a/framework/src/org/apache/cordova/FileHelper.java b/framework/src/org/apache/cordova/FileHelper.java deleted file mode 100644 index 5ac8f7a1..00000000 --- a/framework/src/org/apache/cordova/FileHelper.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - 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 android.database.Cursor; -import android.net.Uri; -import android.webkit.MimeTypeMap; - -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.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.nio.charset.Charset; -import java.util.Locale; - -public class FileHelper { - private static final String LOG_TAG = "FileUtils"; - private static final String _DATA = "_data"; - - /** - * Returns the real path of the given URI string. - * If the given URI string represents a content:// URI, the real path is retrieved from the media store. - * - * @param uriString the URI string of the audio/image/video - * @param cordova the current application context - * @return the full path to the file - */ - @SuppressWarnings("deprecation") - public static String getRealPath(String uriString, CordovaInterface cordova) { - String realPath = null; - - if (uriString.startsWith("content://")) { - String[] proj = { _DATA }; - Cursor cursor = cordova.getActivity().managedQuery(Uri.parse(uriString), proj, null, null, null); - int column_index = cursor.getColumnIndexOrThrow(_DATA); - cursor.moveToFirst(); - realPath = cursor.getString(column_index); - if (realPath == null) { - LOG.e(LOG_TAG, "Could get real path for URI string %s", uriString); - } - } else if (uriString.startsWith("file://")) { - realPath = uriString.substring(7); - if (realPath.startsWith("/android_asset/")) { - LOG.e(LOG_TAG, "Cannot get real path for URI string %s because it is a file:///android_asset/ URI.", uriString); - realPath = null; - } - } else { - realPath = uriString; - } - - return realPath; - } - - /** - * Returns the real path of the given URI. - * If the given URI is a content:// URI, the real path is retrieved from the media store. - * - * @param uri the URI of the audio/image/video - * @param cordova the current application context - * @return the full path to the file - */ - public static String getRealPath(Uri uri, CordovaInterface cordova) { - return FileHelper.getRealPath(uri.toString(), cordova); - } - - /** - * Returns an input stream based on given URI string. - * - * @param uriString the URI string from which to obtain the input stream - * @param cordova the current application context - * @return an input stream into the data at the given URI or null if given an invalid URI string - * @throws IOException - */ - public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException { - if (uriString.startsWith("content")) { - Uri uri = Uri.parse(uriString); - return cordova.getActivity().getContentResolver().openInputStream(uri); - } else if (uriString.startsWith("file://")) { - int question = uriString.indexOf("?"); - if (question > -1) { - uriString = uriString.substring(0,question); - } - if (uriString.startsWith("file:///android_asset/")) { - Uri uri = Uri.parse(uriString); - String relativePath = uri.getPath().substring(15); - return cordova.getActivity().getAssets().open(relativePath); - } else { - return new FileInputStream(getRealPath(uriString, cordova)); - } - } else { - return new FileInputStream(getRealPath(uriString, cordova)); - } - } - - /** - * Removes the "file://" prefix from the given URI string, if applicable. - * If the given URI string doesn't have a "file://" prefix, it is returned unchanged. - * - * @param uriString the URI string to operate on - * @return a path without the "file://" prefix - */ - public static String stripFileProtocol(String uriString) { - if (uriString.startsWith("file://")) { - uriString = uriString.substring(7); - } - return uriString; - } - - public static String getMimeTypeForExtension(String path) { - String extension = path; - int lastDot = extension.lastIndexOf('.'); - if (lastDot != -1) { - extension = extension.substring(lastDot + 1); - } - // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185). - extension = extension.toLowerCase(Locale.getDefault()); - if (extension.equals("3ga")) { - return "audio/3gpp"; - } - return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - } - - /** - * Returns the mime type of the data specified by the given URI string. - * - * @param uriString the URI string of the data - * @return the mime type of the specified data - */ - public static String getMimeType(String uriString, CordovaInterface cordova) { - String mimeType = null; - - Uri uri = Uri.parse(uriString); - if (uriString.startsWith("content://")) { - mimeType = cordova.getActivity().getContentResolver().getType(uri); - } else { - mimeType = getMimeTypeForExtension(uri.getPath()); - } - - return mimeType; - } -} diff --git a/test/src/org/apache/cordova/test/CordovaResourceApiTest.java b/test/src/org/apache/cordova/test/CordovaResourceApiTest.java index 1078a4ef..5aad9128 100644 --- a/test/src/org/apache/cordova/test/CordovaResourceApiTest.java +++ b/test/src/org/apache/cordova/test/CordovaResourceApiTest.java @@ -22,11 +22,18 @@ package org.apache.cordova.test; * */ +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Environment; +import android.provider.MediaStore; +import android.test.ActivityInstrumentationTestCase2; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CordovaResourceApi; import org.apache.cordova.CordovaResourceApi.OpenForReadResult; import org.apache.cordova.CordovaWebView; -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginEntry; import org.apache.cordova.test.actions.CordovaWebViewTestActivity; import org.json.JSONArray; @@ -34,17 +41,9 @@ import org.json.JSONException; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Scanner; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.os.Environment; -import android.provider.MediaStore; -import android.test.ActivityInstrumentationTestCase2; - public class CordovaResourceApiTest extends ActivityInstrumentationTestCase2 { public CordovaResourceApiTest() @@ -99,7 +98,9 @@ public class CordovaResourceApiTest extends ActivityInstrumentationTestCase2