package com.openfarmanager.android.adapters;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.openfarmanager.android.App;
import com.openfarmanager.android.R;
import com.openfarmanager.android.core.Settings;
import com.openfarmanager.android.core.archive.ArchiveUtils;
import com.openfarmanager.android.core.archive.MimeTypes;
import com.openfarmanager.android.core.bookmark.BookmarkManager;
import com.openfarmanager.android.filesystem.FileProxy;
import com.openfarmanager.android.filesystem.FileSystemFile;
import com.openfarmanager.android.filesystem.FileSystemScanner;
import com.openfarmanager.android.model.Bookmark;
import com.openfarmanager.android.model.OpenDirectoryActionListener;
import com.openfarmanager.android.utils.CustomFormatter;
import com.openfarmanager.android.utils.Extensions;
import com.openfarmanager.android.utils.StorageUtils;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author Vlad Namashko
*/
public class FileSystemAdapter extends RecyclerView.Adapter<FileSystemAdapter.ViewHolder> {
private static float sScaledDensity;
static {
sScaledDensity = App.sInstance.getResources().getDisplayMetrics().scaledDensity;
}
protected File mBaseDir;
protected List<FileProxy> mSelectedFiles = new ArrayList<FileProxy>();
protected List<FileProxy> mFiles = new ArrayList<FileProxy>();
boolean mIsRoot;
private String mFilter;
private OpenDirectoryActionListener mListener;
private OnItemClickListener mOnItemClickListener;
public static SimpleDateFormat sDateFormat = new SimpleDateFormat("dd MM yyyy HH:mm");
public FileSystemAdapter(File baseDir, Integer selection, OpenDirectoryActionListener listener) {
mListener = listener;
setBaseDir(baseDir, selection == null ? -1 : selection, true);
}
protected FileSystemAdapter() {
}
public Object getItem(int i) {
if (mIsRoot) {
return mFiles.get(i);
}
if (i == 0) {
return new FileSystemFile(mBaseDir, "..");
}
return mFiles.get(i - 1);
}
private void setColor(TextView name, TextView size, int color) {
name.setTextColor(color);
size.setTextColor(color);
}
public void setSelectedFiles(List<FileProxy> selectedFiles) {
mSelectedFiles.clear();
mSelectedFiles.addAll(selectedFiles);
}
public void clearSelectedFiles() {
mSelectedFiles.clear();
}
public void setBaseDir(File baseDir) {
setBaseDir(baseDir, -1);
}
public void setBaseDir(final File baseDir, final Integer selection) {
setBaseDir(baseDir, selection, false);
}
private void setBaseDir(final File baseDir, final Integer selection, final boolean restoreDefaultPath) {
if (baseDir == null) {
return;
}
mBaseDir = baseDir;
mIsRoot = FileSystemScanner.sInstance.isRoot(baseDir);
clearSelectedFiles();
final BookmarkManager bookmarkManager = App.sInstance.getBookmarkManager();
final String path = mBaseDir.getAbsolutePath();
if (path.equals(bookmarkManager.getBookmarksFolder())) {
mFiles.clear();
List<Bookmark> bookmarks = bookmarkManager.getBookmarks();
for (Bookmark bookmark : bookmarks) {
mFiles.add(new FileSystemFile(mBaseDir, bookmark.getBookmarkLabel(), bookmark));
}
notifyDataSetChanged();
} else {
new AsyncTask<Void, Void, List<FileProxy>>() {
@Override
protected List<FileProxy> doInBackground(Void... params) {
List<FileProxy> files = FileSystemScanner.sInstance.fallingDown(mBaseDir, mFilter);
if (files != null && bookmarkManager.isBookmarksEnabled() && path.equals(bookmarkManager.getBookmarksPath())) {
files.add(new FileSystemFile(mBaseDir, BookmarkManager.BOOKMARKS_FOLDER, true));
FileSystemScanner.sInstance.sort(files);
}
return files;
}
@Override
protected void onPostExecute(List<FileProxy> files) {
if (files != null) {
mFiles = files;
notifyDataSetChanged();
mListener.onDirectoryOpened(baseDir, selection);
} else {
if (restoreDefaultPath) {
setBaseDir(StorageUtils.getSdCard());
} else {
mListener.onError();
}
}
}
}.execute();
}
}
protected String formatSize(long length) {
return CustomFormatter.formatBytes(length);
}
public void filter(String obj) {
mFilter = obj;
setBaseDir(mBaseDir);
notifyDataSetChanged();
}
public void resetFilter() {
mFilter = null;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(App.sInstance.getApplicationContext()).inflate(R.layout.panel_item, parent, false));
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
bindView(holder, position);
setupListeners(holder, position);
}
protected void bindView(ViewHolder holder, final int position) {
FileProxy item = (FileProxy) getItem(position);
File fileItem = (File) item;
Settings settings = App.sInstance.getSettings();
holder.name.setText(item.getName());
if (mSelectedFiles.contains(item)) {
setColor(holder.name, holder.info, settings.getSelectedColor());
} else if ((!fileItem.canRead() || fileItem.isHidden()) && !item.isVirtualDirectory()) {
setColor(holder.name, holder.info, settings.getHiddenColor());
} else if (item.isDirectory()) {
setColor(holder.name, holder.info, settings.getFolderColor());
} else if (ArchiveUtils.getMimeType(fileItem).equals(MimeTypes.MIME_APPLICATION_ANDROID_PACKAGE)) {
setColor(holder.name, holder.info, settings.getInstallColor());
} else if (ArchiveUtils.isArchiveFile(fileItem)) {
setColor(holder.name, holder.info, settings.getArchiveColor());
} else {
setColor(holder.name, holder.info, settings.getTextColor());
}
holder.configureCell(settings);
if (item.isUpNavigator()) {
holder.info.setText(R.string.folder_up);
} else if (item.isDirectory()) {
if (item.isRoot()) {
holder.info.setText(R.string.folder_root);
} else if (item.isVirtualDirectory()) {
holder.info.setText(R.string.virtual_folder);
} else {
holder.info.setText(R.string.folder);
}
} else {
int type = Extensions.tryParse(App.sInstance.getSettings().getFileInfoType(), 0);
String value = "";
switch (type) {
case 0: default:
value = formatSize(item.getSize());
break;
case 1:
long lastModified = item.lastModifiedDate();
value = lastModified == 0 ? "" : sDateFormat.format(new Date(lastModified));
break;
case 2:
File file = (File) item;
value += file.canRead() ? "r" : "-";
value += file.canWrite() ? "w" : "-";
break;
}
holder.info.setText(value);
}
}
protected void setupListeners(ViewHolder holder, final int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(v, position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemClickListener.onItemLongClick(v, position);
return false;
}
});
}
@Override
public int getItemCount() {
return mFiles.size() + (mIsRoot ? 0 : 1);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView name;
TextView info;
public ViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.item_name);
info = (TextView) view.findViewById(R.id.item_info);
}
public void configureCell(Settings settings) {
int size = App.sInstance.getSettings().getMainPanelFontSize();
name.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
info.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
Typeface typeface = settings.getMainPanelFontType();
name.setTypeface(typeface);
info.setTypeface(typeface);
int margin = (int) sScaledDensity * settings.getMainPanelCellMargin();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) name.getLayoutParams();
params.setMargins(0, margin, 0, margin);
name.setLayoutParams(params);
}
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
}