package com.hawkbrowser.app; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import com.hawkbrowser.R; import com.hawkbrowser.base.MimeManager; import com.hawkbrowser.util.CommonUtil; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Environment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; public class FileListAdapter extends BaseAdapter implements AdapterView.OnItemClickListener { private List<File> mFiles; private List<File> mCheckedItems; private Context mContext; private Listener mListener; private boolean mIsInEditMode; public static interface Listener { void onFileItemClick(File file); void onFileItemChecked(File file); } public FileListAdapter(Context context, File currentFolder) { mIsInEditMode = false; mContext = context; setData(currentFolder); } public void setEditable(boolean bEditable) { mIsInEditMode = bEditable; } public boolean getEditable() { return mIsInEditMode; } public List<File> getCheckedItems() { return mCheckedItems; } public List<File> getAllItems() { return mFiles; } public void setData(File currentFolder) { mCheckedItems = new ArrayList<File>(); File[] files = currentFolder.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return !pathname.isHidden(); } }); if((null == files) || (files.length <= 0)) { mFiles = new ArrayList<File>(); } else { mFiles = new ArrayList<File>(files.length); for(File file : files) { mFiles.add(file); } Collections.sort(mFiles, new Comparator<File>() { @Override public int compare(File f1, File f2) { if(f1.isDirectory()) { if(f2.isDirectory()) { return f1.getName().compareTo(f2.getName()); } else { return -1; } } else { if(f2.isDirectory()) { return 1; } else { return f1.getName().compareTo(f2.getName()); } } } }); } // In edit mode, don't need "go to up dir" item if(!mIsInEditMode) { File rootFile = Environment.getExternalStorageDirectory(); if(!rootFile.equals(currentFolder)) { mFiles.add(0, null); } } } public void setListener(Listener listener) { mListener = listener; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ViewGroup vg = (ViewGroup)view; if(mIsInEditMode) { CheckBox cb = (CheckBox)vg.findViewById(R.id.file_item_check); cb.setChecked(!cb.isChecked()); if(cb.isChecked()) { mCheckedItems.add(mFiles.get(position)); } else { mCheckedItems.remove(mFiles.get(position)); } if(null != mListener) { mListener.onFileItemChecked(mFiles.get(position)); } } else { if(null != mListener) { mListener.onFileItemClick(mFiles.get(position)); } } } @Override public int getCount() { // TODO Auto-generated method stub return mFiles.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub File file = mFiles.get(position); return (null != file) ? file.hashCode() : 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LayoutInflater inflater = LayoutInflater.from(mContext); ViewGroup itemView = (ViewGroup) inflater.inflate(R.layout.file_list_item, null); ImageView itemIcon = (ImageView) itemView.findViewById(R.id.file_item_icon); TextView itemName = (TextView) itemView.findViewById(R.id.file_item_name); ImageView arrowIcon = (ImageView) itemView.findViewById(R.id.file_item_arrow); File file = mFiles.get(position); View check = itemView.findViewById(R.id.file_item_check); if(null == file) { itemIcon.setImageResource(R.drawable.icon_up_dir); itemName.setText(R.string.back_to_parent); arrowIcon.setVisibility(View.GONE); check.setVisibility(View.GONE); } else { itemName.setText(file.getName()); check.setVisibility(mIsInEditMode ? View.VISIBLE : View.GONE); if(file.isDirectory()) { itemIcon.setImageResource(R.drawable.icon_folder); arrowIcon.setVisibility(View.VISIBLE); } else { Drawable icon = MimeManager.instance().getDrawable(mContext, file.getPath()); if(null != icon) { itemIcon.setImageDrawable(icon); } else { itemIcon.setImageResource(R.drawable.icon_file); } arrowIcon.setVisibility(View.GONE); } } return itemView; } }