Updated Branches:
  refs/heads/master 1bfcc9267 -> 862a8eab8

[CB-4763] Delete FileHelper.java, Move getMimeType() into CordovaResourceApi.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/862a8eab
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/862a8eab
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/862a8eab

Branch: refs/heads/master
Commit: 862a8eab8d8422cfb30eee9afe9dcdccfe79f766
Parents: 1bfcc92
Author: Andrew Grieve <[email protected]>
Authored: Mon Sep 9 15:37:55 2013 -0400
Committer: Andrew Grieve <[email protected]>
Committed: Mon Sep 9 15:43:04 2013 -0400

----------------------------------------------------------------------
 .../org/apache/cordova/CordovaResourceApi.java  |  59 ++++++-
 .../src/org/apache/cordova/FileHelper.java      | 162 -------------------
 .../cordova/test/CordovaResourceApiTest.java    |  23 +--
 3 files changed, 69 insertions(+), 175 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/862a8eab/framework/src/org/apache/cordova/CordovaResourceApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaResourceApi.java 
b/framework/src/org/apache/cordova/CordovaResourceApi.java
index f03f1b5..96f3d25 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(',');

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/862a8eab/framework/src/org/apache/cordova/FileHelper.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/FileHelper.java 
b/framework/src/org/apache/cordova/FileHelper.java
deleted file mode 100644
index 5ac8f7a..0000000
--- 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;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/862a8eab/test/src/org/apache/cordova/test/CordovaResourceApiTest.java
----------------------------------------------------------------------
diff --git a/test/src/org/apache/cordova/test/CordovaResourceApiTest.java 
b/test/src/org/apache/cordova/test/CordovaResourceApiTest.java
index 1078a4e..5aad912 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<CordovaWebViewTestActivity> {
 
     public CordovaResourceApiTest()
@@ -99,7 +98,9 @@ public class CordovaResourceApiTest extends 
ActivityInstrumentationTestCase2<Cor
         
         try {
             OpenForReadResult readResult = resourceApi.openForRead(uri);
-            assertEquals(expectedMimeType, readResult.mimeType);
+            String mimeType2 = resourceApi.getMimeType(uri);
+            assertEquals("openForRead mime-type", expectedMimeType, 
readResult.mimeType);
+            assertEquals("getMimeType mime-type", expectedMimeType, mimeType2);
             readResult.inputStream.read();
             if (!expectRead) {
                 fail("Expected getInputStream to throw.");

Reply via email to