/** * This file is part of FileSpace for Android, an app for managing your server (files, talks...). * <p> * Copyright (c) 2014-2015 FileSpace for Android contributors (http://mercandalli.com) * <p> * LICENSE: * <p> * FileSpace for Android is free software: you can redistribute it and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any * later version. * <p> * FileSpace for Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * @author Jonathan Mercandalli * @license http://www.gnu.org/licenses/gpl.html * @copyright 2014-2015 FileSpace for Android contributors (http://mercandalli.com) */ package com.mercandalli.android.apps.files.file; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.library.base.java.StringUtils; import com.mercandalli.android.library.base.precondition.Preconditions; import java.util.ArrayList; import java.util.List; /** * The main {@link FileModel} {@link RecyclerView.Adapter}. */ public class FileModelAdapter extends RecyclerView.Adapter<FileModelAdapter.ViewHolder> { private final Context mContext; @NonNull private final List<FileModel> mFiles; private final OnFileClickListener mOnFileClickListener; private final OnFileLongClickListener mOnFileLongClickListener; private final FileModelListener mMoreListener; private final String mStringDirectory; private final String mStringFile; private final String mStringFiles; public FileModelAdapter( final Context context, final List<FileModel> files, final FileModelListener moreListener, final OnFileClickListener onFileClickListener, final OnFileLongClickListener onFileLongClickListener) { Preconditions.checkNotNull(files); mContext = context; mFiles = new ArrayList<>(files); mMoreListener = moreListener; mOnFileClickListener = onFileClickListener; mOnFileLongClickListener = onFileLongClickListener; mStringDirectory = context.getString(R.string.file_model_adapter_directory); mStringFile = context.getString(R.string.file_model_adapter_file); mStringFiles = context.getString(R.string.file_model_adapter_files); setHasStableIds(true); } @Override public FileModelAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate( R.layout.tab_file_card, parent, false), mOnFileClickListener, mOnFileLongClickListener); } @Override public void onBindViewHolder(final ViewHolder viewHolder, int position) { final FileModel fileModel = getFileModel(position); if (fileModel == null) { return; } final String adapterTitle = getAdapterTitle(fileModel); viewHolder.mTitleTextView.setText(adapterTitle); viewHolder.mMoreView.setContentDescription("overflow#" + adapterTitle + "#" + fileModel.getId()); viewHolder.mSubtitleTextView.setText(getAdapterSubtitle(fileModel)); if (fileModel.isDirectory()) { viewHolder.mIconImageView.setImageResource(R.drawable.directory); } else if (fileModel.getType() != null) { final FileTypeModel type = fileModel.getType(); if (FileTypeModelENUM.AUDIO.type.equals(type)) { viewHolder.mIconImageView.setImageResource(R.drawable.file_audio); } else if (FileTypeModelENUM.PDF.type.equals(type)) { viewHolder.mIconImageView.setImageResource(R.drawable.file_pdf); } else if (FileTypeModelENUM.APK.type.equals(type)) { viewHolder.mIconImageView.setImageResource(R.drawable.file_apk); } else if (FileTypeModelENUM.ARCHIVE.type.equals(type)) { viewHolder.mIconImageView.setImageResource(R.drawable.file_archive); } else if (FileTypeModelENUM.FILESPACE.type.equals(type)) { viewHolder.mIconImageView.setImageResource(R.drawable.file_space); } else { viewHolder.mIconImageView.setImageResource(R.drawable.file_default); } } else { viewHolder.mIconImageView.setImageResource(R.drawable.file_default); } /* if (file.bitmap != null) viewHolder.icon.setImageBitmap(file.bitmap); */ if (mMoreListener == null) { viewHolder.mMoreView.setVisibility(View.GONE); } viewHolder.mMoreView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mMoreListener != null) { mMoreListener.executeFileModel(fileModel, v); } } }); /* if (file.selected) viewHolder.item.setBackgroundColor(ContextCompat.getColor(mActivity, R.color.tab_selected)); else viewHolder.item.setBackgroundColor(ContextCompat.getColor(mActivity, R.color.tab_file)); */ } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return 0; } @Override public int getItemCount() { return mFiles.size(); } public void setList(final List<FileModel> list) { Preconditions.checkNotNull(list); mFiles.clear(); mFiles.addAll(list); notifyDataSetChanged(); } public void addItem(FileModel name, int position) { mFiles.add(position, name); notifyItemInserted(position); } /** * Return the file title. */ private String getAdapterTitle(FileModel fileModel) { String adapterTitleStart = ""; if (fileModel.getType() == null) { if (fileModel.getName() != null) { return adapterTitleStart + fileModel.getFullName(); } else { return adapterTitleStart + fileModel.getUrl(); } } else if (fileModel.getType().equals(FileTypeModelENUM.FILESPACE.type) && fileModel.getContent() != null) { return adapterTitleStart + fileModel.getContent().getAdapterTitle(); } else if (fileModel.getName() != null) { return adapterTitleStart + fileModel.getFullName(); } else { return adapterTitleStart + fileModel.getUrl(); } } private String getAdapterSubtitle(FileModel fileModel) { if (fileModel.isDirectory() && fileModel.getCount() != 0) { return mStringDirectory + ": " + StringUtils.longToShortString(fileModel.getCount()) + " " + (fileModel.getCount() > 1 ? mStringFiles : mStringFile); } if (fileModel.isDirectory()) { return mStringDirectory; } if (FileTypeModelENUM.FILESPACE.type.equals(fileModel.getType()) && fileModel.getContent() != null) { return fileModel.getType().getTitle(mContext) + " " + StringUtils.capitalize(fileModel.getContent().getType().toString()); } if (fileModel.getType() != null) { return fileModel.getType().getTitle(mContext); } return ""; } @Nullable private FileModel getFileModel(final int adapterPosition) { if (adapterPosition >= mFiles.size()) { return null; } return mFiles.get(adapterPosition); } public interface OnFileClickListener { void onFileClick(View view, int position); } public interface OnFileLongClickListener { boolean onFileLongClick(View view, int position); } public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener, View.OnLongClickListener { public final TextView mTitleTextView; public final TextView mSubtitleTextView; public final ImageView mIconImageView; public final View mItemView; public final View mMoreView; private final OnFileClickListener mOnFileClickListener; private final OnFileLongClickListener mOnFileLongClickListener; public ViewHolder(View itemLayoutView, OnFileClickListener onFileClickListener, OnFileLongClickListener onFileLongClickListener) { super(itemLayoutView); mItemView = itemLayoutView.findViewById(R.id.tab_file_card_item); mTitleTextView = (TextView) itemLayoutView.findViewById(R.id.tab_file_card_title); mSubtitleTextView = (TextView) itemLayoutView.findViewById(R.id.tab_file_card_subtitle); mIconImageView = (ImageView) itemLayoutView.findViewById(R.id.tab_file_card_icon); mMoreView = itemLayoutView.findViewById(R.id.tab_file_card_more); mOnFileClickListener = onFileClickListener; mOnFileLongClickListener = onFileLongClickListener; itemLayoutView.setOnClickListener(this); itemLayoutView.setOnLongClickListener(this); } @Override public void onClick(View v) { if (mOnFileClickListener != null) { mOnFileClickListener.onFileClick(mIconImageView, getAdapterPosition()); } } @Override public boolean onLongClick(View v) { return mOnFileLongClickListener != null && mOnFileLongClickListener.onFileLongClick(v, getAdapterPosition()); } } }