Merge tag 'oc-android-1.9' into sdcard-save
[pub/Android/ownCloud.git] / src / com / owncloud / android / utils / DisplayUtils.java
index c18a0e4..a30595c 100644 (file)
 \r
 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.app.Activity;\r
 import android.content.Context;\r
+import android.graphics.Point;\r
+import android.graphics.PorterDuff;\r
 import android.os.Build;\r
 import android.text.format.DateUtils;\r
-import android.webkit.MimeTypeMap;\r
+import android.view.Display;\r
+import android.widget.ProgressBar;\r
+import android.widget.SeekBar;\r
 \r
 import com.owncloud.android.MainApp;\r
 import com.owncloud.android.R;\r
 import com.owncloud.android.datamodel.OCFile;\r
 \r
+import java.net.IDN;\r
+import java.text.DateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
 /**\r
  * A helper class for some string operations.\r
  */\r
 public class DisplayUtils {\r
     \r
     private static final String OWNCLOUD_APP_NAME = "ownCloud";\r
-\r
-    //private static String TAG = DisplayUtils.class.getSimpleName(); \r
     \r
     private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };\r
 \r
-    private static HashMap<String, String> mimeType2HUmanReadable;\r
+    private static Map<String, String> mimeType2HumanReadable;\r
+\r
     static {\r
-        mimeType2HUmanReadable = new HashMap<String, String>();\r
+        mimeType2HumanReadable = new HashMap<String, String>();\r
         // images\r
-        mimeType2HUmanReadable.put("image/jpeg", "JPEG image");\r
-        mimeType2HUmanReadable.put("image/jpg", "JPEG image");\r
-        mimeType2HUmanReadable.put("image/png", "PNG image");\r
-        mimeType2HUmanReadable.put("image/bmp", "Bitmap image");\r
-        mimeType2HUmanReadable.put("image/gif", "GIF image");\r
-        mimeType2HUmanReadable.put("image/svg+xml", "JPEG image");\r
-        mimeType2HUmanReadable.put("image/tiff", "TIFF image");\r
+        mimeType2HumanReadable.put("image/jpeg", "JPEG image");\r
+        mimeType2HumanReadable.put("image/jpg", "JPEG image");\r
+        mimeType2HumanReadable.put("image/png", "PNG image");\r
+        mimeType2HumanReadable.put("image/bmp", "Bitmap image");\r
+        mimeType2HumanReadable.put("image/gif", "GIF image");\r
+        mimeType2HumanReadable.put("image/svg+xml", "JPEG image");\r
+        mimeType2HumanReadable.put("image/tiff", "TIFF image");\r
         // music\r
-        mimeType2HUmanReadable.put("audio/mpeg", "MP3 music file");\r
-        mimeType2HUmanReadable.put("application/ogg", "OGG music file");\r
-\r
+        mimeType2HumanReadable.put("audio/mpeg", "MP3 music file");\r
+        mimeType2HumanReadable.put("application/ogg", "OGG music file");\r
     }\r
 \r
-    private static final String TYPE_APPLICATION = "application";\r
-    private static final String TYPE_AUDIO = "audio";\r
-    private static final String TYPE_IMAGE = "image";\r
-    private static final String TYPE_TXT = "text";\r
-    private static final String TYPE_VIDEO = "video";\r
-    \r
-    private static final String SUBTYPE_PDF = "pdf";\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 = {\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 = { \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
-    private static final String SUBTYPE_OCTET_STREAM = "octet-stream";\r
-    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
      * \r
@@ -134,100 +95,14 @@ public class DisplayUtils {
      * @return A human friendly version of the MIME type\r
      */\r
     public static String convertMIMEtoPrettyPrint(String mimetype) {\r
-        if (mimeType2HUmanReadable.containsKey(mimetype)) {\r
-            return mimeType2HUmanReadable.get(mimetype);\r
+        if (mimeType2HumanReadable.containsKey(mimetype)) {\r
+            return mimeType2HumanReadable.get(mimetype);\r
         }\r
         if (mimetype.split("/").length >= 2)\r
             return mimetype.split("/")[1].toUpperCase() + " file";\r
         return "Unknown type";\r
     }\r
-    \r
-    \r
-    /**\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; 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 getFileTypeIconId(String mimetype, String filename) {\r
-\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
-            String subtype = (parts.length > 1) ? parts[1] : "";\r
-            \r
-            if(TYPE_TXT.equals(type)) {\r
-                return R.drawable.file_doc;\r
-    \r
-            } else if(TYPE_IMAGE.equals(type)) {\r
-                return R.drawable.file_image;\r
-                \r
-            } else if(TYPE_VIDEO.equals(type)) {\r
-                return R.drawable.file_movie;\r
-                \r
-            } else if(TYPE_AUDIO.equals(type)) {  \r
-                return R.drawable.file_sound;\r
-                \r
-            } else if(TYPE_APPLICATION.equals(type)) {\r
-                \r
-                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
-                } else if (SUBTYPES_SPREADSHEET_SET.contains(subtype)) {\r
-                    return R.drawable.file_xls;\r
-\r
-                } else if (SUBTYPES_PRESENTATION_SET.contains(subtype)) {\r
-                    return R.drawable.file_ppt;\r
-\r
-                } else if (SUBTYPES_COMPRESSED_SET.contains(subtype)) {\r
-                    return R.drawable.file_zip;\r
-\r
-                } else if (SUBTYPE_OCTET_STREAM.equals(subtype) ) {\r
-                    if (getExtension(filename).equalsIgnoreCase(EXTENSION_RAR)) {\r
-                        return R.drawable.file_zip;\r
-                        \r
-                    } else if (getExtension(filename).equalsIgnoreCase(EXTENSION_RTF)) {\r
-                        return R.drawable.file_doc;\r
-                        \r
-                    } else if (getExtension(filename).equalsIgnoreCase(EXTENSION_3GP)) {\r
-                        return R.drawable.file_movie;\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
-        }\r
-\r
-        // default icon\r
-        return R.drawable.file;\r
-    }\r
 \r
-    \r
-    private static String getExtension(String filename) {\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 milliseconds that have passed since 01/01/1970\r
@@ -239,7 +114,6 @@ public class DisplayUtils {
         return df.format(date);\r
     }\r
     \r
-    \r
     public static int getSeasonalIconId() {\r
         if (Calendar.getInstance().get(Calendar.DAY_OF_YEAR) >= 354 &&\r
                 MainApp.getAppContext().getString(R.string.app_name).equals(OWNCLOUD_APP_NAME)) {\r
@@ -257,11 +131,18 @@ public class DisplayUtils {
      */\r
     @TargetApi(Build.VERSION_CODES.GINGERBREAD)\r
     public static String convertIdn(String url, boolean toASCII) {\r
-        \r
+\r
+        String urlNoDots = url;\r
+        String dots="";\r
+        while (urlNoDots.startsWith(".")) {\r
+            urlNoDots = url.substring(1);\r
+            dots = dots + ".";\r
+        }\r
+\r
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {\r
             // Find host name after '//' or '@'\r
             int hostStart = 0;\r
-            if  (url.indexOf("//") != -1) {\r
+            if  (urlNoDots.indexOf("//") != -1) {\r
                 hostStart = url.indexOf("//") + "//".length();\r
             } else if (url.indexOf("@") != -1) {\r
                 hostStart = url.indexOf("@") + "@".length();\r
@@ -269,14 +150,14 @@ public class DisplayUtils {
 \r
             int hostEnd = url.substring(hostStart).indexOf("/");\r
             // Handle URL which doesn't have a path (path is implicitly '/')\r
-            hostEnd = (hostEnd == -1 ? url.length() : hostStart + hostEnd);\r
+            hostEnd = (hostEnd == -1 ? urlNoDots.length() : hostStart + hostEnd);\r
 \r
-            String host = url.substring(hostStart, hostEnd);\r
+            String host = urlNoDots.substring(hostStart, hostEnd);\r
             host = (toASCII ? IDN.toASCII(host) : IDN.toUnicode(host));\r
 \r
-            return url.substring(0, hostStart) + host + url.substring(hostEnd);\r
+            return dots + urlNoDots.substring(0, hostStart) + host + urlNoDots.substring(hostEnd);\r
         } else {\r
-            return url;\r
+            return dots + url;\r
         }\r
     }\r
 \r
@@ -312,22 +193,19 @@ public class DisplayUtils {
         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
+            dateString = DateUtils.getRelativeDateTimeString(c, time, minResolution, transitionResolution, flags);\r
+        }\r
+\r
+        String[] parts = dateString.toString().split(",");\r
+        if (parts.length == 2) {\r
+            if (parts[1].contains(":") && !parts[0].contains(":")) {\r
+                return parts[0];\r
+            } else if (parts[0].contains(":") && !parts[1].contains(":")) {\r
+                return parts[1];\r
             }\r
         }\r
-        \r
-        return dateString.toString().split(",")[0];\r
+        //dateString contains unexpected format. fallback: use relative date time string from android api as is.\r
+        return dateString.toString();\r
     }\r
 \r
     /**\r
@@ -343,4 +221,53 @@ public class DisplayUtils {
         return path;\r
     }\r
 \r
+\r
+    /**\r
+     * Gets the screen size in pixels in a backwards compatible way\r
+     *\r
+     * @param caller        Activity calling; needed to get access to the {@link android.view.WindowManager}\r
+     * @return              Size in pixels of the screen, or default {@link Point} if caller is null\r
+     */\r
+    public static Point getScreenSize(Activity caller) {\r
+        Point size = new Point();\r
+        if (caller != null) {\r
+            Display display = caller.getWindowManager().getDefaultDisplay();\r
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {\r
+                display.getSize(size);\r
+            } else {\r
+                size.set(display.getWidth(), display.getHeight());\r
+            }\r
+        }\r
+        return size;\r
+    }\r
+\r
+    /**\r
+     * sets the coloring of the given progress bar to color_accent.\r
+     *\r
+     * @param progressBar the progress bar to be colored\r
+     */\r
+    public static void colorPreLollipopHorizontalProgressBar(ProgressBar progressBar) {\r
+        if (progressBar != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {\r
+            int color = progressBar.getResources().getColor(R.color.color_accent);\r
+            progressBar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);\r
+            progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * sets the coloring of the given seek bar to color_accent.\r
+     *\r
+     * @param seekBar the seek bar to be colored\r
+     */\r
+    public static void colorPreLollipopHorizontalSeekBar(SeekBar seekBar) {\r
+        if (seekBar != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {\r
+            colorPreLollipopHorizontalProgressBar(seekBar);\r
+\r
+            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\r
+                int color = seekBar.getResources().getColor(R.color.color_accent);\r
+                seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);\r
+                seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);\r
+            }\r
+        }\r
+    }\r
 }\r