package com.obsez.android.lib.filechooser.tool; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import com.obsez.android.lib.filechooser.R; import com.obsez.android.lib.filechooser.internals.FileUtil; import com.obsez.android.lib.filechooser.internals.UiUtil; import com.obsez.android.lib.filechooser.internals.WrappedDrawable; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Stack; /** * Created by coco on 6/7/15. */ public class DirAdapter extends ArrayAdapter { public DirAdapter(Context cxt, String dateFormat) { super(cxt, R.layout.li_row_textview, R.id.text, new ArrayList<>()); this.init(dateFormat); } public DirAdapter(Context cxt, List entries, int resId, String dateFormat) { super(cxt, resId, R.id.text, entries); this.init(dateFormat); } @SuppressLint("SimpleDateFormat") private void init(String dateFormat) { _formatter = new SimpleDateFormat( dateFormat != null && !"".equals(dateFormat.trim()) ? dateFormat.trim() : "yyyy/MM/dd HH:mm:ss"); _defaultFolderIcon = ContextCompat.getDrawable(getContext(), R.drawable.ic_folder); _defaultFileIcon = ContextCompat.getDrawable(getContext(), R.drawable.ic_file); TypedArray ta = getContext().obtainStyledAttributes(R.styleable.FileChooser); int colorFilter = ta.getColor(R.styleable.FileChooser_fileListItemSelectedTint, getContext().getResources().getColor(R.color.li_row_background_tint)); ta.recycle(); _colorFilter = new PorterDuffColorFilter(colorFilter, PorterDuff.Mode.MULTIPLY); } @FunctionalInterface public interface GetView { /** * @param file file that should me displayed * @param isSelected whether file is selected when _enableMultiple is set to true * @param isFocused @deprecated! use fileListItemFocusedDrawable attribute instead * @param convertView see {@link ArrayAdapter#getView(int, View, ViewGroup)} * @param parent see {@link ArrayAdapter#getView(int, View, ViewGroup)} * @param inflater a layout inflater with the FileChooser theme wrapped context * @return your custom row item view */ @NonNull View getView(@NonNull File file, boolean isSelected, @Deprecated boolean isFocused, View convertView, @NonNull ViewGroup parent, @NonNull LayoutInflater inflater); } public void overrideGetView(GetView getView) { this._getView = getView; } // This function is called to show each view item @SuppressWarnings("ConstantConditions") @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { final File file = super.getItem(position); if (file == null) return super.getView(position, convertView, parent); final boolean isSelected = _selected.get(file.hashCode(), null) != null; if (_getView != null) { return _getView.getView(file, isSelected, false, convertView, parent, LayoutInflater.from(getContext())); } ViewGroup view = (ViewGroup) super.getView(position, convertView, parent); TextView tvName = view.findViewById(R.id.text); TextView tvSize = view.findViewById(R.id.txt_size); TextView tvDate = view.findViewById(R.id.txt_date); //ImageView ivIcon = (ImageView) view.findViewById(R.id.icon); tvDate.setVisibility(View.VISIBLE); tvName.setText(file.getName()); Drawable icon; if (file.isDirectory()) { icon = _defaultFolderIcon.getConstantState().newDrawable(); tvSize.setText(""); if (file.lastModified() != 0L) { tvDate.setText(_formatter.format(new Date(file.lastModified()))); } else { tvDate.setVisibility(View.GONE); } } else { Drawable d = null; if (_resolveFileType) { d = UiUtil.resolveFileTypeIcon(getContext(), Uri.fromFile(file)); if (d != null) { d = new WrappedDrawable(d, 24, 24); } } if (d == null) { d = _defaultFileIcon; } icon = d.getConstantState().newDrawable(); tvSize.setText(FileUtil.getReadableFileSize(file.length())); tvDate.setText(_formatter.format(new Date(file.lastModified()))); } if (file.isHidden()) { final PorterDuffColorFilter filter = new PorterDuffColorFilter(0x80ffffff, PorterDuff.Mode.SRC_ATOP); icon.mutate().setColorFilter(filter); } tvName.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); View root = view.findViewById(R.id.root); if (root.getBackground() == null) { // root.setBackgroundResource(R.color.li_row_background); } if (!isSelected) { // root.getBackground().clearColorFilter(); } else { // root.getBackground().setColorFilter(_colorFilter); } return view; } public Drawable getDefaultFolderIcon() { return _defaultFolderIcon; } public void setDefaultFolderIcon(Drawable defaultFolderIcon) { this._defaultFolderIcon = defaultFolderIcon; } public Drawable getDefaultFileIcon() { return _defaultFileIcon; } public void setDefaultFileIcon(Drawable defaultFileIcon) { this._defaultFileIcon = defaultFileIcon; } public boolean isResolveFileType() { return _resolveFileType; } public void setResolveFileType(boolean resolveFileType) { this._resolveFileType = resolveFileType; } public void setEntries(List entries) { setNotifyOnChange(false); super.clear(); setNotifyOnChange(true); super.addAll(entries); //_hoveredIndex = -1; } @Override public long getItemId(int position) { try { //noinspection ConstantConditions return getItem(position).hashCode(); } catch (IndexOutOfBoundsException e) { try { //noinspection ConstantConditions return getItem(0).hashCode(); } catch (IndexOutOfBoundsException ex) { return 0; } } } public void selectItem(int position) { int id = (int) getItemId(position); if (_selected.get(id, null) == null) { _selected.append(id, getItem(position)); } else { _selected.delete(id); } notifyDataSetChanged(); } public boolean isSelected(int position) { return isSelectedById((int) getItemId(position)); } public boolean isSelectedById(int id) { return _selected.get(id, null) != null; } public boolean isAnySelected() { return _selected.size() > 0; } public boolean isOneSelected() { return _selected.size() == 1; } public List getSelected() { ArrayList list = new ArrayList(); for (int i = 0; i < _selected.size(); i++) { list.add(_selected.valueAt(i)); } return list; } public void clearSelected() { _selected.clear(); } public boolean isEmpty() { return getCount() == 0 || (getCount() == 1 && (getItem(0) instanceof RootFile)); } public Stack getIndexStack() { return _indexStack; } private SimpleDateFormat _formatter; private Drawable _defaultFolderIcon = null; private Drawable _defaultFileIcon = null; private boolean _resolveFileType = false; private PorterDuffColorFilter _colorFilter; private SparseArray _selected = new SparseArray(); private GetView _getView = null; private Stack _indexStack = new Stack<>(); }