package com.V4Creations.vtulife.afilechooser; import java.io.File; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Locale; import android.content.Context; import android.os.AsyncTask; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.V4Creations.vtulife.R; import com.V4Creations.vtulife.controller.adapters.SupportArrayAdapter; public class FileListAdapter extends SupportArrayAdapter<File> { private final static int ICON_FOLDER = R.drawable.folder; public FileListAdapter(Context context) { super(context); } public void setListItems(ArrayList<File> files) { validateFileWRTExtention(files); clear(); supportAddAll(files); } private void validateFileWRTExtention(ArrayList<File> files) { ArrayList<String> extentionsArrayList = FileChooserActivity.EXTENSIONS; if (extentionsArrayList != null) { for (int i = 0; i < files.size(); i++) { boolean isExtentionExist = false; for (String ext : extentionsArrayList) if (getExtention(files.get(i).getAbsolutePath()).matches( "(?i)" + ext)) { isExtentionExist = true; break; } if (!isExtentionExist && !files.get(i).isDirectory()) files.remove(i--); } } } @Override public View getView(int position, View convertView, ViewGroup parent) { File file = getItem(position); ViewHolder viewHolder; if (convertView == null) { convertView = getLayoutInflater().inflate( R.layout.list_directory_item, null); viewHolder = new ViewHolder(); viewHolder.nameTextView = (TextView) convertView .findViewById(R.id.nameTextView); viewHolder.sizeTextView = (TextView) convertView .findViewById(R.id.sizeTextView); viewHolder.dateTextView = (TextView) convertView .findViewById(R.id.dateTextView); viewHolder.iconImageView = (ImageView) convertView .findViewById(R.id.iconImageView); convertView.setTag(viewHolder); } else viewHolder = (ViewHolder) convertView.getTag(); int fileIcon = selectImage(getExtention(file.getAbsolutePath())); viewHolder.iconImageView .setImageResource(file.isDirectory() ? ICON_FOLDER : fileIcon); viewHolder.nameTextView.setText(file.getName()); viewHolder.sizeTextView.setText(readableFileSize(file.length())); viewHolder.sizeTextView.setTag(position); if (file.isDirectory()) setFolderSize(viewHolder.sizeTextView, file, position); viewHolder.dateTextView .setText(getLastModifiedDate(file.lastModified())); int color = R.color.odd_color; if (position % 2 == 0) color = R.color.even_color; convertView.setBackgroundResource(color); return convertView; } private CharSequence getLastModifiedDate(long lastModified) { SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.getDefault()); return sdf.format(lastModified); } private String getExtention(String fileNameString) { String extension = ""; int i = fileNameString.lastIndexOf('.'); int p = Math.max(fileNameString.lastIndexOf('/'), fileNameString.lastIndexOf('\\')); if (i > p) { extension = fileNameString.substring(i + 1); } return extension; } private int selectImage(String ext) { if (ext.matches("(?i)png") || ext.matches("(?i)jpeg") || ext.matches("(?i)jpg") || ext.matches("(?i)bmp")) return R.drawable.jpeg; else if (ext.matches("(?i)gif")) return R.drawable.gif; else if (ext.matches("(?i)zip") || ext.matches("(?i)rar") || ext.matches("(?i)tar") || ext.matches("(?i)7zip") || ext.matches("(?i)gz")) return R.drawable.archive; else if (ext.matches("(?i)exe")) return R.drawable.exe; else if (ext.matches("(?i)txt")) return R.drawable.txt; else if (ext.matches("(?i)htm") || ext.matches("(?i)html") || ext.matches("(?i)xml") || ext.matches("(?i)php") || ext.matches("(?i)pl")) return R.drawable.html; else if (ext.matches("(?i)flv")) return R.drawable.flash; else if (ext.matches("(?i)swf")) return R.drawable.swf; else if (ext.matches("(?i)xls")) return R.drawable.xsl; else if (ext.matches("(?i)doc") || ext.matches("(?i)docx")) return R.drawable.doc; else if (ext.matches("(?i)pdf")) return R.drawable.pdf; else if (ext.matches("(?i)psd")) return R.drawable.psd; else if (ext.matches("(?i)rm")) return R.drawable.real; else if (ext.matches("(?i)mpeg") || ext.matches("(?i)mpg") || ext.matches("(?i)mov") || ext.matches("(?i)avi") || ext.matches("(?i)mp4") || ext.matches("(?i)3gp") || ext.matches("(?i)vob")) return R.drawable.video; else return R.drawable.unknown; } public static String readableFileSize(long size) { if (size <= 0) return "0"; final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; } private void setFolderSize(final TextView sizeTextView, final File file, final int position) { new AsyncTask<Void, Void, Long>() { private long folderSize(File directory) { long length = 0; for (File file : directory.listFiles()) { if (file.isFile()) length += file.length(); else length += folderSize(file); } return length; } @Override protected Long doInBackground(Void... params) { return folderSize(file); } @Override protected void onPostExecute(Long result) { super.onPostExecute(result); int pos = (Integer) sizeTextView.getTag(); if (pos == position) sizeTextView.setText(readableFileSize(result)); } }.execute(); } private static class ViewHolder { TextView nameTextView; TextView sizeTextView; TextView dateTextView; ImageView iconImageView; } }