-/* ownCloud Android client application\r
+/**\r
+ * ownCloud Android client application\r
+ *\r
+ * @author Bartek Przybylski\r
+ * @author David A. Velasco\r
* Copyright (C) 2011 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
+ * Copyright (C) 2015 ownCloud Inc.\r
*\r
* This program is free software: you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License version 2,\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.os.Build;\r
-import android.text.format.DateFormat;\r
import android.text.format.DateUtils;\r
+import android.view.Display;\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
- * \r
- * @author Bartek Przybylski\r
- * @author David A. Velasco\r
*/\r
public class DisplayUtils {\r
\r
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
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
\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
\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
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
\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
\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
\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
*/\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
}\r
- \r
+\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
- \r
- String host = url.substring(hostStart, hostEnd);\r
+ hostEnd = (hostEnd == -1 ? urlNoDots.length() : hostStart + hostEnd);\r
+\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
+\r
+ return dots + urlNoDots.substring(0, hostStart) + host + urlNoDots.substring(hostEnd);\r
} else {\r
- return url;\r
+ return dots + url;\r
}\r
}\r
\r
return fileExtension;\r
}\r
\r
- public static CharSequence getRelativeDateTimeString(Context c, long time, long minResolution, long transitionResolution, int flags){\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
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 && (System.currentTimeMillis() - time) > 24 * 60 * 60 * 1000){\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(c, date.getTime(), minResolution, transitionResolution, flags);\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];
+ 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
+ /**\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