package cw.kop.autobackground.sources;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.PorterDuff;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.Arrays;
import cw.kop.autobackground.R;
import cw.kop.autobackground.files.FileHandler;
import cw.kop.autobackground.settings.AppSettings;
/**
* Created by TheKeeperOfPie on 4/10/2015.
*/
public class AdapterSources extends RecyclerView.Adapter<AdapterSources.ViewHolder> {
private static final String TAG = AdapterSources.class.getCanonicalName();
private int baseImageHeight;
private int overlayColorResource;
private int colorFilterInt;
private int colorPrimary;
private int cardViewToInflate;
private float sideMarginPixels;
private AdapterSourceListener adapterSourceListener;
private ControllerSources controllerSources;
public AdapterSources(Activity activity, ControllerSources controllerSources, AdapterSourceListener adapterSourceListener) {
Resources resources = activity.getResources();
cardViewToInflate = AppSettings.getTheme().equals(AppSettings.APP_LIGHT_THEME) ?
R.layout.source_list_card :
R.layout.source_list_card_dark;
colorFilterInt = AppSettings.getColorFilterInt(activity);
colorPrimary = resources.getColor(R.color.BLUE_OPAQUE);
overlayColorResource = AppSettings.getBackgroundColorResource();
sideMarginPixels = resources.getDimensionPixelSize(R.dimen.side_margin);
baseImageHeight = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
28,
resources.getDisplayMetrics()) + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
24,
resources.getDisplayMetrics()));
this.controllerSources = controllerSources;
this.adapterSourceListener = adapterSourceListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(cardViewToInflate, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Source source = controllerSources.get(position);
boolean use = source.isUse();
boolean preview = source.isPreview();
holder.title.setText(source.getTitle());
holder.imageOverlay.setVisibility(use ? View.INVISIBLE : View.VISIBLE);
holder.sourceExpandContainer.setVisibility(source.isExpanded() ? View.VISIBLE : View.GONE);
if (source.getType().equals(AppSettings.FOLDER)) {
holder.toolbar.getMenu().findItem(R.id.item_source_download).setEnabled(false);
}
else {
holder.toolbar.getMenu().findItem(R.id.item_source_download).setEnabled(true);
}
if (preview) {
holder.sourceImage.getLayoutParams().height = (int) ((adapterSourceListener.getItemWidth() - 2f * sideMarginPixels) / 16f * 9);
holder.sourceImage.setImageResource(R.drawable.ic_file_download_white_48dp);
holder.sourceImage.setColorFilter(colorFilterInt, PorterDuff.Mode.MULTIPLY);
holder.sourceImage.requestLayout();
if (source.getType().equals(AppSettings.FOLDER)) {
String[] folders = source.getData().split(AppSettings.DATA_SPLITTER);
for (String folder : folders) {
File[] files = new File(folder).listFiles(
FileHandler.getImageFileNameFilter());
if (files != null && files.length > 0) {
File file;
if (files.length > 1 && adapterSourceListener.getSpanForPosition(position) == 1) {
file = files[1];
}
else {
file = files[0];
}
source.setImageFile(file);
holder.sourceImage.clearColorFilter();
Picasso.with(adapterSourceListener.getActivity())
.load(file)
.fit()
.centerCrop()
.into(
holder.sourceImage);
break;
}
else {
holder.sourceImage.setImageResource(
R.drawable.ic_not_interested_white_48dp);
}
}
}
else {
File folder = new File(AppSettings.getDownloadPath() + "/" + source.getTitle() + " " + AppSettings.getImagePrefix());
if (folder.exists() && folder.isDirectory()) {
File[] files = folder.listFiles(FileHandler.getImageFileNameFilter());
if (files != null && files.length > 0) {
File file;
if (files.length > 1 && adapterSourceListener.getSpanForPosition(position) == 1) {
file = files[1];
}
else {
file = files[0];
}
source.setImageFile(file);
holder.sourceImage.clearColorFilter();
Picasso.with(adapterSourceListener.getActivity())
.load(file)
.fit()
.centerCrop()
.into(holder.sourceImage);
}
}
}
}
else {
Picasso.with(adapterSourceListener.getActivity()).load(android.R.color.transparent).into(holder.sourceImage);
holder.sourceImage.getLayoutParams().height = baseImageHeight;
holder.sourceImage.requestLayout();
}
if (!preview || !use) {
holder.title.setTextColor(colorFilterInt);
holder.title.setShadowLayer(0f, 0f, 0f, 0x00000000);
}
else {
holder.title.setTextColor(0xFFFFFFFF);
holder.title.setShadowLayer(5.0f, -1f, -1f, 0xFF000000);
}
SpannableString typePrefix = new SpannableString("Type: ");
typePrefix.setSpan(new ForegroundColorSpan(colorPrimary), 0, typePrefix.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString dataPrefix = new SpannableString("Data: ");
dataPrefix.setSpan(new ForegroundColorSpan(colorPrimary), 0, dataPrefix.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString numPrefix = new SpannableString("Number of Images: ");
numPrefix.setSpan(new ForegroundColorSpan(colorPrimary), 0, numPrefix.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString sortPrefix = new SpannableString("Sort By: ");
sortPrefix.setSpan(new ForegroundColorSpan(colorPrimary), 0, sortPrefix.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString timePrefix = new SpannableString("Active Time: ");
timePrefix.setSpan(new ForegroundColorSpan(colorPrimary), 0, timePrefix.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.sourceType.setText(typePrefix);
holder.sourceType.append(source.getType());
holder.sourceData.setText(dataPrefix);
if (source.getType().equals(AppSettings.FOLDER)) {
holder.sourceData.append(Arrays.toString(source.getData()
.split(AppSettings.DATA_SPLITTER)));
}
else {
holder.sourceData.append(source.getData());
}
holder.sourceNum.setText(numPrefix);
if (source.getType().equals(AppSettings.FOLDER)) {
holder.sourceNum.append("" + source.getNum());
}
else {
holder.sourceNum.append(source.getNumStored() + " / " + source.getNum());
}
holder.sourceSort.setVisibility(View.VISIBLE);
holder.sourceSort.setText(sortPrefix);
holder.sourceSort.append(source.getSort());
holder.sourceTime.setText(timePrefix);
if (source.isUseTime()) {
holder.sourceTime.append(source.getTime());
}
else {
holder.sourceTime.append("N/A");
}
}
@Override
public int getItemCount() {
adapterSourceListener.setEmptyArrowVisibility(
controllerSources.size() == 0 ? View.VISIBLE : View.GONE);
return controllerSources.size();
}
protected class ViewHolder extends RecyclerView.ViewHolder {
protected final CardView cardView;
protected final EditText title;
protected final View imageOverlay;
protected final TextView sourceType;
protected final TextView sourceData;
protected final TextView sourceNum;
protected final TextView sourceSort;
protected final TextView sourceTime;
protected final ImageView sourceImage;
protected final LinearLayout sourceExpandContainer;
protected final Toolbar toolbar;
public ViewHolder(View itemView) {
super(itemView);
cardView = (CardView) itemView.findViewById(R.id.source_card);
title = (EditText) itemView.findViewById(R.id.source_title);
imageOverlay = itemView.findViewById(R.id.source_image_overlay);
sourceType = (TextView) itemView.findViewById(R.id.source_type);
sourceData = (TextView) itemView.findViewById(R.id.source_data);
sourceNum = (TextView) itemView.findViewById(R.id.source_num);
sourceSort = (TextView) itemView.findViewById(R.id.source_sort);
sourceTime = (TextView) itemView.findViewById(R.id.source_time);
sourceImage = (ImageView) itemView.findViewById(R.id.source_image);
sourceExpandContainer = (LinearLayout) itemView.findViewById(R.id.source_expand_container);
toolbar = (Toolbar) itemView.findViewById(R.id.toolbar_actions);
toolbar.inflateMenu(R.menu.menu_source);
toolbar.getMenu().findItem(R.id.item_source_download).getIcon().setColorFilter(colorFilterInt,
PorterDuff.Mode.MULTIPLY);
toolbar.getMenu().findItem(R.id.item_source_delete).getIcon().setColorFilter(colorFilterInt,
PorterDuff.Mode.MULTIPLY);
toolbar.getMenu().findItem(R.id.item_source_view).getIcon().setColorFilter(colorFilterInt,
PorterDuff.Mode.MULTIPLY);
toolbar.getMenu().findItem(R.id.item_source_edit).getIcon().setColorFilter(colorFilterInt,
PorterDuff.Mode.MULTIPLY);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.item_source_download:
adapterSourceListener.onDownloadClick(ViewHolder.this.itemView,
controllerSources.get(getPosition()));
break;
case R.id.item_source_delete:
adapterSourceListener.onDeleteClick(ViewHolder.this.itemView,
getPosition());
break;
case R.id.item_source_view:
adapterSourceListener.onViewImageClick(ViewHolder.this.itemView,
getPosition());
break;
case R.id.item_source_edit:
adapterSourceListener.onEditClick(ViewHolder.this.itemView,
getPosition());
break;
}
return false;
}
});
sourceImage.setMinimumHeight(baseImageHeight);
imageOverlay.setBackgroundResource(overlayColorResource);
title.setClickable(false);
View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
adapterSourceListener.onLongClick(getPosition());
return true;
}
};
title.setOnLongClickListener(longClickListener);
cardView.setOnLongClickListener(longClickListener);
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
controllerSources.get(getPosition()).setExpanded(!sourceExpandContainer.isShown());
sourceExpandContainer.setVisibility(sourceExpandContainer.isShown() ? View.GONE : View.VISIBLE);
}
};
cardView.setOnClickListener(clickListener);
title.setOnClickListener(clickListener);
}
}
public interface AdapterSourceListener {
void onDownloadClick(View view, Source source);
void onDeleteClick(View view, int index);
void onViewImageClick(View view, int index);
void onEditClick(View view, int index);
void onLongClick(int position);
Context getActivity();
void setEmptyArrowVisibility(int visibility);
float getItemWidth();
int getSpanForPosition(int position);
}
}