Merge branch 'master' into develop
[pub/Android/ownCloud.git] / src / com / owncloud / android / utils / DisplayUtils.java
index f8e1acc..999700f 100644 (file)
 package com.owncloud.android.utils;\r
 \r
 import java.net.IDN;\r
+import java.text.DateFormat;\r
 import java.util.Arrays;\r
 import java.util.Calendar;\r
 import java.util.Date;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.Set;\r
+import java.util.Vector;\r
 \r
 import android.annotation.TargetApi;\r
+import android.content.Context;\r
 import android.os.Build;\r
+import android.text.format.DateUtils;\r
+import android.webkit.MimeTypeMap;\r
 \r
 import com.owncloud.android.MainApp;\r
 import com.owncloud.android.R;\r
+import com.owncloud.android.datamodel.OCFile;\r
 \r
 /**\r
  * A helper class for some string operations.\r
@@ -70,21 +76,28 @@ public class DisplayUtils {
     private static final String TYPE_VIDEO = "video";\r
     \r
     private static final String SUBTYPE_PDF = "pdf";\r
-    private static final String[] SUBTYPES_DOCUMENT = { "msword",\r
-                                                        "vnd.openxmlformats-officedocument.wordprocessingml.document",\r
-                                                        "vnd.oasis.opendocument.text",\r
-                                                        "rtf"\r
-                                                        };\r
+    private static final String SUBTYPE_XML = "xml";\r
+    private static final String[] SUBTYPES_DOCUMENT = { \r
+        "msword",\r
+        "vnd.openxmlformats-officedocument.wordprocessingml.document",\r
+        "vnd.oasis.opendocument.text",\r
+        "rtf",\r
+        "javascript"\r
+    };\r
     private static Set<String> SUBTYPES_DOCUMENT_SET = new HashSet<String>(Arrays.asList(SUBTYPES_DOCUMENT));\r
-    private static final String[] SUBTYPES_SPREADSHEET = { "msexcel",\r
-                                                           "vnd.openxmlformats-officedocument.spreadsheetml.sheet",\r
-                                                           "vnd.oasis.opendocument.spreadsheet"\r
-                                                           };\r
+    private static final String[] SUBTYPES_SPREADSHEET = {\r
+        "msexcel",\r
+        "vnd.ms-excel",\r
+        "vnd.openxmlformats-officedocument.spreadsheetml.sheet",\r
+        "vnd.oasis.opendocument.spreadsheet"\r
+    };\r
     private static Set<String> SUBTYPES_SPREADSHEET_SET = new HashSet<String>(Arrays.asList(SUBTYPES_SPREADSHEET));\r
-    private static final String[] SUBTYPES_PRESENTATION = { "mspowerpoint",\r
-                                                            "vnd.openxmlformats-officedocument.presentationml.presentation",\r
-                                                            "vnd.oasis.opendocument.presentation"\r
-                                                            };\r
+    private static final String[] SUBTYPES_PRESENTATION = { \r
+        "mspowerpoint",\r
+        "vnd.ms-powerpoint",\r
+        "vnd.openxmlformats-officedocument.presentationml.presentation",\r
+        "vnd.oasis.opendocument.presentation"\r
+    };\r
     private static Set<String> SUBTYPES_PRESENTATION_SET = new HashSet<String>(Arrays.asList(SUBTYPES_PRESENTATION));\r
     private static final String[] SUBTYPES_COMPRESSED = {"x-tar", "x-gzip", "zip"};\r
     private static final Set<String> SUBTYPES_COMPRESSED_SET = new HashSet<String>(Arrays.asList(SUBTYPES_COMPRESSED));\r
@@ -92,6 +105,8 @@ public class DisplayUtils {
     private static final String EXTENSION_RAR = "rar";\r
     private static final String EXTENSION_RTF = "rtf";\r
     private static final String EXTENSION_3GP = "3gp";\r
+    private static final String EXTENSION_PY = "py";\r
+    private static final String EXTENSION_JS = "js";\r
     \r
     /**\r
      * Converts the file size in bytes to human readable output.\r
@@ -111,30 +126,6 @@ public class DisplayUtils {
     }\r
 \r
     /**\r
-     * Removes special HTML entities from a string\r
-     * \r
-     * @param s Input string\r
-     * @return A cleaned version of the string\r
-     */\r
-    public static String HtmlDecode(String s) {\r
-        /*\r
-         * TODO: Perhaps we should use something more proven like:\r
-         * http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#unescapeHtml%28java.lang.String%29\r
-         */\r
-\r
-        String ret = "";\r
-        for (int i = 0; i < s.length(); ++i) {\r
-            if (s.charAt(i) == '%') {\r
-                ret += (char) Integer.parseInt(s.substring(i + 1, i + 3), 16);\r
-                i += 2;\r
-            } else {\r
-                ret += s.charAt(i);\r
-            }\r
-        }\r
-        return ret;\r
-    }\r
-\r
-    /**\r
      * Converts MIME types like "image/jpg" to more end user friendly output\r
      * like "JPG image".\r
      * \r
@@ -152,18 +143,25 @@ public class DisplayUtils {
     \r
     \r
     /**\r
-     * Returns the resource identifier of an image resource to use as icon associated to a \r
-     * known MIME type.\r
+     * Returns the resource identifier of an image to use as icon associated to a known MIME type.\r
      * \r
-     * @param mimetype      MIME type string.\r
-     * @param filename      name, with extension\r
-     * @return              Resource identifier of an image resource.\r
+     * @param mimetype      MIME type string; if NULL, the method tries to guess it from the extension in filename\r
+     * @param filename      Name, with extension.\r
+     * @return              Identifier of an image resource.\r
      */\r
-    public static int getResourceId(String mimetype, String filename) {\r
+    public static int getFileTypeIconId(String mimetype, String filename) {\r
 \r
-        if (mimetype == null || "DIR".equals(mimetype)) {\r
-            return R.drawable.ic_menu_archive;\r
+        if (mimetype == null) {\r
+            String fileExtension = getExtension(filename);\r
+            mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);\r
+            if (mimetype == null) {\r
+                mimetype = TYPE_APPLICATION + "/" + SUBTYPE_OCTET_STREAM;\r
+            }\r
+        } \r
             \r
+        if ("DIR".equals(mimetype)) {\r
+            return R.drawable.ic_menu_archive;\r
+\r
         } else {\r
             String [] parts = mimetype.split("/");\r
             String type = parts[0];\r
@@ -186,6 +184,9 @@ public class DisplayUtils {
                 if (SUBTYPE_PDF.equals(subtype)) {\r
                     return R.drawable.file_pdf;\r
                     \r
+                } else if (SUBTYPE_XML.equals(subtype)) {\r
+                    return R.drawable.file_doc;\r
+\r
                 } else if (SUBTYPES_DOCUMENT_SET.contains(subtype)) {\r
                     return R.drawable.file_doc;\r
 \r
@@ -197,7 +198,7 @@ public class DisplayUtils {
 \r
                 } else if (SUBTYPES_COMPRESSED_SET.contains(subtype)) {\r
                     return R.drawable.file_zip;\r
-                    \r
+\r
                 } else if (SUBTYPE_OCTET_STREAM.equals(subtype) ) {\r
                     if (getExtension(filename).equalsIgnoreCase(EXTENSION_RAR)) {\r
                         return R.drawable.file_zip;\r
@@ -207,7 +208,10 @@ public class DisplayUtils {
                         \r
                     } else if (getExtension(filename).equalsIgnoreCase(EXTENSION_3GP)) {\r
                         return R.drawable.file_movie;\r
-                        \r
+                     \r
+                    } else if ( getExtension(filename).equalsIgnoreCase(EXTENSION_PY) ||\r
+                                getExtension(filename).equalsIgnoreCase(EXTENSION_JS)) {\r
+                        return R.drawable.file_doc;\r
                     } \r
                 } \r
             }\r
@@ -219,19 +223,19 @@ public class DisplayUtils {
 \r
     \r
     private static String getExtension(String filename) {\r
-        String extension = filename.substring(filename.lastIndexOf(".") + 1);\r
-        \r
+        String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();\r
         return extension;\r
     }\r
     \r
     /**\r
      * Converts Unix time to human readable format\r
-     * @param miliseconds that have passed since 01/01/1970\r
+     * @param milliseconds that have passed since 01/01/1970\r
      * @return The human readable time for the users locale\r
      */\r
     public static String unixTimeToHumanReadable(long milliseconds) {\r
         Date date = new Date(milliseconds);\r
-        return date.toLocaleString();\r
+        DateFormat df = DateFormat.getDateTimeInstance();\r
+        return df.format(date);\r
     }\r
     \r
     \r
@@ -291,4 +295,51 @@ public class DisplayUtils {
         }\r
         return fileExtension;\r
     }\r
+\r
+    @SuppressWarnings("deprecation")\r
+    public static CharSequence getRelativeDateTimeString (\r
+            Context c, long time, long minResolution, long transitionResolution, int flags\r
+            ){\r
+        \r
+        CharSequence dateString = "";\r
+        \r
+        // in Future\r
+        if (time > System.currentTimeMillis()){\r
+            return DisplayUtils.unixTimeToHumanReadable(time);\r
+        } \r
+        // < 60 seconds -> seconds ago\r
+        else if ((System.currentTimeMillis() - time) < 60 * 1000) {\r
+            return c.getString(R.string.file_list_seconds_ago);\r
+        } else {\r
+            // Workaround 2.x bug (see https://github.com/owncloud/android/issues/716)\r
+            if (    Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB && \r
+                    (System.currentTimeMillis() - time) > 24 * 60 * 60 * 1000   ) {\r
+                Date date = new Date(time);\r
+                date.setHours(0);\r
+                date.setMinutes(0);\r
+                date.setSeconds(0);\r
+                dateString = DateUtils.getRelativeDateTimeString(\r
+                        c, date.getTime(), minResolution, transitionResolution, flags\r
+                );\r
+            } else {\r
+                dateString = DateUtils.getRelativeDateTimeString(c, time, minResolution, transitionResolution, flags);\r
+            }\r
+        }\r
+        \r
+        return dateString.toString().split(",")[0];\r
+    }\r
+\r
+    /**\r
+     * Update the passed path removing the last "/" if it is not the root folder\r
+     * @param path\r
+     */\r
+    public static String getPathWithoutLastSlash(String path) {\r
+\r
+        // Remove last slash from path\r
+        if (path.length() > 1 && path.charAt(path.length()-1) == OCFile.PATH_SEPARATOR.charAt(0)) {\r
+            path = path.substring(0, path.length()-1);\r
+        }\r
+        return path;\r
+    }\r
+\r
 }\r