import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
-import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.media.ExifInterface;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.AsyncTask;
public static Bitmap mDefaultImg =
BitmapFactory.decodeResource(
MainApp.getAppContext().getResources(),
- DisplayUtils.getResourceId("image/png", "default.png")
+ DisplayUtils.getFileTypeIconId("image/png", "default.png")
);
return null;
}
-
- public static boolean cancelPotentialWork(OCFile file, ImageView imageView) {
- final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
-
- if (bitmapWorkerTask != null) {
- final OCFile bitmapData = bitmapWorkerTask.mFile;
- // If bitmapData is not yet set or it differs from the new data
- if (bitmapData == null || bitmapData != file) {
- // Cancel previous task
- bitmapWorkerTask.cancel(true);
- } else {
- // The same work is already in progress
- return false;
- }
- }
- // No task associated with the ImageView, or an existing task was cancelled
- return true;
- }
-
- public static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) {
- if (imageView != null) {
- final Drawable drawable = imageView.getDrawable();
- if (drawable instanceof AsyncDrawable) {
- final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
- return asyncDrawable.getBitmapWorkerTask();
- }
- }
- return null;
- }
-
- public static class ThumbnailGenerationTask extends AsyncTask<OCFile, Void, Bitmap> {
+ public static class ThumbnailGenerationTask extends AsyncTask<Object, Void, Bitmap> {
private final WeakReference<ImageView> mImageViewReference;
private static Account mAccount;
- private OCFile mFile;
+ private Object mFile;
private FileDataStorageManager mStorageManager;
-
+
+
public ThumbnailGenerationTask(ImageView imageView, FileDataStorageManager storageManager, Account account) {
- // Use a WeakReference to ensure the ImageView can be garbage collected
+ // Use a WeakReference to ensure the ImageView can be garbage collected
mImageViewReference = new WeakReference<ImageView>(imageView);
if (storageManager == null)
throw new IllegalArgumentException("storageManager must not be NULL");
mAccount = account;
}
- // Decode image in background.
+ public ThumbnailGenerationTask(ImageView imageView) {
+ // Use a WeakReference to ensure the ImageView can be garbage collected
+ mImageViewReference = new WeakReference<ImageView>(imageView);
+ }
+
@Override
- protected Bitmap doInBackground(OCFile... params) {
+ protected Bitmap doInBackground(Object... params) {
Bitmap thumbnail = null;
-
+
try {
if (mAccount != null) {
AccountManager accountMgr = AccountManager.get(MainApp.getAppContext());
-
+
mServerVersion = accountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION);
OwnCloudAccount ocAccount = new OwnCloudAccount(mAccount, MainApp.getAppContext());
mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
getClientFor(ocAccount, MainApp.getAppContext());
}
-
+
mFile = params[0];
- final String imageKey = String.valueOf(mFile.getRemoteId());
-
- // Check disk cache in background thread
- thumbnail = getBitmapFromDiskCache(imageKey);
-
- // Not found in disk cache
- if (thumbnail == null || mFile.needsUpdateThumbnail()) {
- // Converts dp to pixel
- Resources r = MainApp.getAppContext().getResources();
-
- int px = (int) Math.round(r.getDimension(R.dimen.file_icon_size));
-
- if (mFile.isDown()){
- Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
- mFile.getStoragePath(), px, px);
-
- if (bitmap != null) {
- thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
-
- // Rotate image, obeying exif tag
- thumbnail = BitmapUtils.rotateImage(thumbnail, mFile.getStoragePath());
-
- // Add thumbnail to cache
- addBitmapToCache(imageKey, thumbnail);
- mFile.setNeedsUpdateThumbnail(false);
- mStorageManager.saveFile(mFile);
- }
-
- } else {
- // Download thumbnail from server
- if (mClient != null && mServerVersion != null) {
- OwnCloudVersion serverOCVersion = new OwnCloudVersion(mServerVersion);
- if (serverOCVersion.compareTo(new OwnCloudVersion(MINOR_SERVER_VERSION_FOR_THUMBS)) >= 0) {
- try {
- int status = -1;
-
- String uri = mClient.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" +
- px + "/" + px + Uri.encode(mFile.getRemotePath(), "/");
- Log_OC.d("Thumbnail", "URI: " + uri);
- GetMethod get = new GetMethod(uri);
- status = mClient.executeMethod(get);
- if (status == HttpStatus.SC_OK) {
- byte[] bytes = get.getResponseBody();
- Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
- thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
-
- // Add thumbnail to cache
- if (thumbnail != null) {
- addBitmapToCache(imageKey, thumbnail);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- Log_OC.d(TAG, "Server too old");
- }
- }
- }
+ if (mFile instanceof OCFile) {
+ thumbnail = doOCFileInBackground();
+ } else if (mFile instanceof File) {
+ thumbnail = doFileInBackground();
+ } else {
+ // do nothing
}
-
- } catch (Throwable t) {
- // the app should never break due to a problem with thumbnails
- Log_OC.e(TAG, "Generation of thumbnail for " + mFile + " failed", t);
- if (t instanceof OutOfMemoryError) {
- System.gc();
+
+ }catch(Throwable t){
+ // the app should never break due to a problem with thumbnails
+ Log_OC.e(TAG, "Generation of thumbnail for " + mFile + " failed", t);
+ if (t instanceof OutOfMemoryError) {
+ System.gc();
+ }
}
- }
-
+
return thumbnail;
}
-
+
protected void onPostExecute(Bitmap bitmap){
if (isCancelled()) {
bitmap = null;
if (mImageViewReference != null && bitmap != null) {
final ImageView imageView = mImageViewReference.get();
- final ThumbnailGenerationTask bitmapWorkerTask =
- getBitmapWorkerTask(imageView);
+ final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
if (this == bitmapWorkerTask && imageView != null) {
- if (imageView.getTag().equals(mFile.getFileId())) {
+ String tagId = "";
+ if (mFile instanceof OCFile){
+ tagId = String.valueOf(((OCFile)mFile).getFileId());
+ } else if (mFile instanceof File){
+ tagId = String.valueOf(((File)mFile).hashCode());
+ }
+ if (String.valueOf(imageView.getTag()).equals(tagId)) {
imageView.setImageBitmap(bitmap);
}
}
}
}
+
+ /**
+ * Add thumbnail to cache
+ * @param imageKey: thumb key
+ * @param bitmap: image for extracting thumbnail
+ * @param path: image path
+ * @param px: thumbnail dp
+ * @return Bitmap
+ */
+ private Bitmap addThumbnailToCache(String imageKey, Bitmap bitmap, String path, int px){
+
+ Bitmap thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
+
+ // Rotate image, obeying exif tag
+ thumbnail = BitmapUtils.rotateImage(thumbnail,path);
+
+ // Add thumbnail to cache
+ addBitmapToCache(imageKey, thumbnail);
+
+ return thumbnail;
+ }
+
+ /**
+ * Converts size of file icon from dp to pixel
+ * @return int
+ */
+ private int getThumbnailDimension(){
+ // Converts dp to pixel
+ Resources r = MainApp.getAppContext().getResources();
+ return (int) Math.round(r.getDimension(R.dimen.file_icon_size));
+ }
+
+ private Bitmap doOCFileInBackground() {
+ Bitmap thumbnail = null;
+ OCFile file = (OCFile)mFile;
+
+ final String imageKey = String.valueOf(file.getRemoteId());
+
+ // Check disk cache in background thread
+ thumbnail = getBitmapFromDiskCache(imageKey);
+
+ // Not found in disk cache
+ if (thumbnail == null || file.needsUpdateThumbnail()) {
+
+ int px = getThumbnailDimension();
+
+ if (file.isDown()) {
+ Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
+ file.getStoragePath(), px, px);
+
+ if (bitmap != null) {
+ thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), px);
+
+ file.setNeedsUpdateThumbnail(false);
+ mStorageManager.saveFile(file);
+ }
+
+ } else {
+ // Download thumbnail from server
+ if (mClient != null && mServerVersion != null) {
+ OwnCloudVersion serverOCVersion = new OwnCloudVersion(mServerVersion);
+ if (serverOCVersion.compareTo(new OwnCloudVersion(MINOR_SERVER_VERSION_FOR_THUMBS)) >= 0) {
+ try {
+ int status = -1;
+
+ String uri = mClient.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" +
+ px + "/" + px + Uri.encode(file.getRemotePath(), "/");
+ Log_OC.d("Thumbnail", "URI: " + uri);
+ GetMethod get = new GetMethod(uri);
+ status = mClient.executeMethod(get);
+ if (status == HttpStatus.SC_OK) {
+ byte[] bytes = get.getResponseBody();
+ Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
+
+ // Add thumbnail to cache
+ if (thumbnail != null) {
+ addBitmapToCache(imageKey, thumbnail);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ Log_OC.d(TAG, "Server too old");
+ }
+ }
+ }
+ }
+
+ return thumbnail;
+
+ }
+
+ private Bitmap doFileInBackground() {
+ Bitmap thumbnail = null;
+ File file = (File)mFile;
+
+ final String imageKey = String.valueOf(file.hashCode());
+
+ // Check disk cache in background thread
+ thumbnail = getBitmapFromDiskCache(imageKey);
+
+ // Not found in disk cache
+ if (thumbnail == null) {
+
+ int px = getThumbnailDimension();
+
+ Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
+ file.getAbsolutePath(), px, px);
+
+ if (bitmap != null) {
+ thumbnail = addThumbnailToCache(imageKey, bitmap, file.getPath(), px);
+ }
+ }
+ return thumbnail;
+ }
+
}
-
-
+
+ public static boolean cancelPotentialWork(Object file, ImageView imageView) {
+ final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
+
+ if (bitmapWorkerTask != null) {
+ final Object bitmapData = bitmapWorkerTask.mFile;
+ // If bitmapData is not yet set or it differs from the new data
+ if (bitmapData == null || bitmapData != file) {
+ // Cancel previous task
+ bitmapWorkerTask.cancel(true);
+ } else {
+ // The same work is already in progress
+ return false;
+ }
+ }
+ // No task associated with the ImageView, or an existing task was cancelled
+ return true;
+ }
+
+ public static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) {
+ if (imageView != null) {
+ final Drawable drawable = imageView.getDrawable();
+ if (drawable instanceof AsyncDrawable) {
+ final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
+ return asyncDrawable.getBitmapWorkerTask();
+ }
+ }
+ return null;
+ }
+
public static class AsyncDrawable extends BitmapDrawable {
private final WeakReference<ThumbnailGenerationTask> bitmapWorkerTaskReference;
public AsyncDrawable(
Resources res, Bitmap bitmap, ThumbnailGenerationTask bitmapWorkerTask
- ) {
-
+ ) {
+
super(res, bitmap);
bitmapWorkerTaskReference =
- new WeakReference<ThumbnailGenerationTask>(bitmapWorkerTask);
+ new WeakReference<ThumbnailGenerationTask>(bitmapWorkerTask);
}
public ThumbnailGenerationTask getBitmapWorkerTask() {
return bitmapWorkerTaskReference.get();
}
}
-
-
- /**
- * Remove from cache the remoteId passed
- * @param fileRemoteId: remote id of mFile passed
- */
- public static void removeFileFromCache(String fileRemoteId){
- synchronized (mThumbnailsDiskCacheLock) {
- if (mThumbnailCache != null) {
- mThumbnailCache.removeKey(fileRemoteId);
- }
- mThumbnailsDiskCacheLock.notifyAll(); // Wake any waiting threads
- }
- }
-
}
*/\r
package com.owncloud.android.ui.adapter;\r
\r
-
+\r
import java.io.File;\r
import java.util.Collections;\r
import java.util.Comparator;\r
import com.owncloud.android.datamodel.FileDataStorageManager;\r
import com.owncloud.android.datamodel.OCFile;\r
import com.owncloud.android.datamodel.ThumbnailsCacheManager;\r
-import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncDrawable;\r
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
import com.owncloud.android.ui.activity.ComponentsGetter;\r
import com.owncloud.android.utils.DisplayUtils;\r
import com.owncloud.android.utils.FileStorageUtils;\r
-
+\r
\r
/**\r
* This Adapter populates a ListView with all files and folders in an ownCloud\r
* @author Tobias Kaminsky\r
* @author David A. Velasco\r
*/\r
-public class FileListListAdapter extends BaseAdapter implements ListAdapter {
+public class FileListListAdapter extends BaseAdapter implements ListAdapter {\r
private final static String PERMISSION_SHARED_WITH_ME = "S";\r
\r
private Context mContext;\r
private Vector<OCFile> mFiles = null;\r
private boolean mJustFolders;\r
\r
- private FileDataStorageManager mStorageManager;
- private Account mAccount;
+ private FileDataStorageManager mStorageManager;\r
+ private Account mAccount;\r
private ComponentsGetter mTransferServiceGetter;\r
\r
private SharedPreferences mAppPreferences;\r
mJustFolders = justFolders;\r
mContext = context;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
-
- mTransferServiceGetter = transferServiceGetter;
+\r
+ mTransferServiceGetter = transferServiceGetter;\r
\r
mAppPreferences = PreferenceManager\r
.getDefaultSharedPreferences(mContext);\r
\r
// Read sorting order, default to sort by name ascending\r
- FileStorageUtils.mSortOrder = mAppPreferences\r
- .getInt("sortOrder", 0);\r
- FileStorageUtils.mSortAscending = mAppPreferences.getBoolean("sortAscending", true);
+ FileStorageUtils.mSortOrder = mAppPreferences.getInt("sortOrder", 0);\r
+ FileStorageUtils.mSortAscending = mAppPreferences.getBoolean("sortAscending", true);\r
+\r
\r
// initialise thumbnails cache on background thread\r
new ThumbnailsCacheManager.InitDiskCacheTask().execute();\r
\r
}\r
-
+ \r
@Override\r
public boolean areAllItemsEnabled() {\r
return true;\r
if (thumbnail != null && !file.needsUpdateThumbnail()){\r
fileIcon.setImageBitmap(thumbnail);\r
} else {\r
+\r
// generate new Thumbnail\r
if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) {\r
- final ThumbnailsCacheManager.ThumbnailGenerationTask task = \r
+ final ThumbnailsCacheManager.ThumbnailGenerationTask task =\r
new ThumbnailsCacheManager.ThumbnailGenerationTask(\r
fileIcon, mStorageManager, mAccount\r
);\r
if (thumbnail == null) {\r
thumbnail = ThumbnailsCacheManager.mDefaultImg;\r
}\r
- final AsyncDrawable asyncDrawable = new AsyncDrawable(\r
+ final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =\r
+ new ThumbnailsCacheManager.AsyncDrawable(\r
mContext.getResources(), \r
thumbnail, \r
task\r
}\r
}\r
} else {\r
- fileIcon.setImageResource(\r
- DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())\r
- );\r
+ fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName()));\r
}\r
-
+\r
if (checkIfFileIsSharedWithMe(file)) {\r
sharedWithMeIconV.setVisibility(View.VISIBLE);\r
}\r
// } else {\r
fileSizeV.setVisibility(View.INVISIBLE);\r
// }\r
-
+\r
lastModV.setVisibility(View.VISIBLE);\r
lastModV.setText(showRelativeTimestamp(file));\r
checkBoxV.setVisibility(View.GONE);\r
sharedWithMeIconV.setVisibility(View.VISIBLE);\r
} else {\r
fileIcon.setImageResource(\r
- DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())\r
+ DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName())\r
);\r
}\r
\r
\r
return view;\r
}\r
-
+\r
/**\r
* Local Folder size in human readable format\r
* \r
return "0 B";\r
}\r
\r
-
-
+ /**\r
+ * Local Folder size\r
+ * @param dir File\r
+ * @return Size in bytes\r
+ */\r
+ private long getFolderSize(File dir) {\r
+ if (dir.exists()) {\r
+ long result = 0;\r
+ File[] fileList = dir.listFiles();\r
+ for(int i = 0; i < fileList.length; i++) {\r
+ if(fileList[i].isDirectory()) {\r
+ result += getFolderSize(fileList[i]);\r
+ } else {\r
+ result += fileList[i].length();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+ return 0;\r
+ } \r
+\r
@Override\r
public int getViewTypeCount() {\r
return 1;\r
FileStorageUtils.mSortOrder = order;\r
FileStorageUtils.mSortAscending = ascending;\r
\r
-
+\r
mFiles = FileStorageUtils.sortFolder(mFiles);\r
notifyDataSetChanged();\r
\r
private CharSequence showRelativeTimestamp(OCFile file){\r
return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(),\r
DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);\r
- }
-
+ }\r
}\r
import java.util.Comparator;
import android.content.Context;
+import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.owncloud.android.R;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+import com.owncloud.android.utils.BitmapUtils;
import com.owncloud.android.utils.DisplayUtils;
/**
private Context mContext;
private File mDirectory;
private File[] mFiles = null;
-
+
public LocalFileListAdapter(File directory, Context context) {
mContext = context;
swapDirectory(directory);
} else {
fileIcon.setImageResource(R.drawable.ic_menu_archive);
}
+ fileIcon.setTag(file.hashCode());
TextView fileSizeV = (TextView) view.findViewById(R.id.file_size);
TextView lastModV = (TextView) view.findViewById(R.id.last_mod);
}
checkBoxV.setVisibility(View.VISIBLE);
}
+
+ // get Thumbnail if file is image
+ if (BitmapUtils.isImage(file)){
+ // Thumbnail in Cache?
+ Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
+ String.valueOf(file.hashCode())
+ );
+ if (thumbnail != null){
+ fileIcon.setImageBitmap(thumbnail);
+ } else {
+
+ // generate new Thumbnail
+ if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) {
+ final ThumbnailsCacheManager.ThumbnailGenerationTask task =
+ new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
+ if (thumbnail == null) {
+ thumbnail = ThumbnailsCacheManager.mDefaultImg;
+ }
+ final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =
+ new ThumbnailsCacheManager.AsyncDrawable(
+ mContext.getResources(),
+ thumbnail,
+ task
+ );
+ fileIcon.setImageDrawable(asyncDrawable);
+ task.execute(file);
+ }
+ }
+ } else {
+ fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(null, file.getName()));
+ }
} else {
fileSizeV.setVisibility(View.GONE);
checkBoxV.setVisibility(View.GONE);
}
- view.findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); // not GONE; the alignment changes; ugly way to keep it
+ view.findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); // not GONE; the alignment would change
view.findViewById(R.id.imageView3).setVisibility(View.GONE);
view.findViewById(R.id.sharedIcon).setVisibility(View.GONE);
}
ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon);
if (iv != null) {
- iv.setImageResource(DisplayUtils.getResourceId(mimetype, filename));
+ iv.setImageResource(DisplayUtils.getFileTypeIconId(mimetype, filename));
}
}
import android.graphics.Matrix;
import android.graphics.BitmapFactory.Options;
import android.media.ExifInterface;
+import android.net.Uri;
+import android.webkit.MimeTypeMap;
+
+import java.io.File;
/**
* Utility class with methods for decoding Bitmaps.
}
return resultBitmap;
}
-
+
+ /**
+ * Checks if file passed is an image
+ * @param file
+ * @return true/false
+ */
+ public static boolean isImage(File file) {
+ Uri selectedUri = Uri.fromFile(file);
+ String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString().toLowerCase());
+ String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
+
+ return (mimeType != null && mimeType.startsWith("image/"));
+ }
}
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 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
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
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
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