package com.ftinc.scoop.ui;
import android.app.Activity;
import android.graphics.PorterDuff;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.support.annotation.ColorInt;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.ftinc.scoop.Scoop;
import com.ftinc.scoop.Flavor;
import com.ftinc.scoop.R;
import com.ftinc.scoop.util.AttrUtils;
import com.ftinc.scoop.util.Utils;
import java.util.ArrayList;
import java.util.List;
/**
* Project: ThemeEngineTest
* Package: com.ftinc.themeenginetest.adapter
* Created by drew.heavner on 6/8/16.
*/
public class FlavorRecyclerAdapter extends RecyclerView.Adapter<FlavorRecyclerAdapter.FlavorViewHolder> {
/***********************************************************************************************
*
* Variables
*
*/
private final LayoutInflater mInflater;
private final List<Flavor> mItems;
private OnItemClickListener mItemClickListener;
private Flavor mCurrentFlavor;
public FlavorRecyclerAdapter(Activity activity){
setHasStableIds(true);
mInflater = activity.getLayoutInflater();
mItems = new ArrayList<>();
}
/***********************************************************************************************
*
* Helper Methods
*
*/
public void setItemClickListener(OnItemClickListener itemClickListener) {
this.mItemClickListener = itemClickListener;
}
public void setCurrentFlavor(Flavor currentFlavor) {
int previousIndex = -1;
if(mCurrentFlavor != null) previousIndex = mItems.indexOf(mCurrentFlavor);
// Set the current flavor
mCurrentFlavor = currentFlavor;
// Update old position if existed
if(previousIndex != -1){
notifyItemChanged(previousIndex);
}
// Update the new position
int index = mItems.indexOf(mCurrentFlavor);
if(index != -1){
notifyItemChanged(index);
}
}
public void addAll(List<Flavor> flavors) {
mItems.clear();
mItems.addAll(flavors);
notifyDataSetChanged();
}
/***********************************************************************************************
*
* Adapter Methods
*
*/
@Override
public FlavorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return FlavorViewHolder.create(mInflater, parent);
}
@Override
public void onBindViewHolder(final FlavorViewHolder holder, final int position) {
final Flavor item = mItems.get(position);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mItemClickListener != null) mItemClickListener.onItemClicked(v, item, holder.getAdapterPosition());
}
});
holder.bind(item, item.equals(mCurrentFlavor));
}
@Override
public int getItemCount() {
return mItems.size();
}
@Override
public long getItemId(int position) {
Flavor item = mItems.get(position);
if(item != null){
return item.hashCode();
}
return super.getItemId(position);
}
/***********************************************************************************************
*
* ViewHolder
*
*/
static class FlavorViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
static FlavorViewHolder create(LayoutInflater inflater, ViewGroup parent){
View view = inflater.inflate(R.layout.item_layout_flavor, parent, false);
return new FlavorViewHolder(view);
}
TextView mTitle;
ImageView mPrimary, mDark, mAccent;
ImageView mIndicator;
ViewGroup mOptionsGroup;
Button mOptAuto, mOptSystem, mOptOff, mOptOn;
FlavorViewHolder(View itemView) {
super(itemView);
mTitle = (TextView) itemView.findViewById(R.id.title);
mPrimary = (ImageView) itemView.findViewById(R.id.primaryColor);
mDark = (ImageView) itemView.findViewById(R.id.primaryColorDark);
mAccent = (ImageView) itemView.findViewById(R.id.accentColor);
mIndicator = (ImageView) itemView.findViewById(R.id.indicator);
mOptionsGroup = (ViewGroup) itemView.findViewById(R.id.daynight_options);
mOptAuto = (Button) mOptionsGroup.findViewById(R.id.opt_auto);
mOptSystem = (Button) mOptionsGroup.findViewById(R.id.opt_system);
mOptOff = (Button) mOptionsGroup.findViewById(R.id.opt_off);
mOptOn = (Button) mOptionsGroup.findViewById(R.id.opt_on);
}
void bind(Flavor flavor, boolean isCurrentFlavor){
mTitle.setText(flavor.getName());
// Pull colors
int primary = AttrUtils.getColorAttr(itemView.getContext(), flavor.getStyleResource(), R.attr.colorPrimary);
int primaryDark = AttrUtils.getColorAttr(itemView.getContext(), flavor.getStyleResource(), R.attr.colorPrimaryDark);
int accent = AttrUtils.getColorAttr(itemView.getContext(), flavor.getStyleResource(), R.attr.colorAccent);
// Set Colors
mPrimary.setBackground(generateDrawable(primary));
mDark.setBackground(generateDrawable(primaryDark));
mAccent.setBackground(generateDrawable(accent));
// Set indicator visibility
mIndicator.setVisibility(isCurrentFlavor ? View.VISIBLE : View.GONE);
mOptionsGroup.setVisibility(flavor.isDayNight() && isCurrentFlavor ? View.VISIBLE : View.GONE);
// Set the current option as selected
int mode = Scoop.getInstance().getDayNightMode();
bindOptions(mode);
}
ShapeDrawable generateDrawable(@ColorInt int color){
ShapeDrawable d = new ShapeDrawable(new OvalShape());
d.setIntrinsicWidth(Utils.dipToPx(itemView.getContext(), 24));
d.setIntrinsicHeight(Utils.dipToPx(itemView.getContext(), 24));
d.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
return d;
}
void checkMode(Button btn, int mode, int desired){
int color = AttrUtils.getColorAttr(itemView.getContext(), mode == desired ? R.attr.colorAccent : android.R.attr.textColorPrimary);
btn.setTextColor(color);
btn.setOnClickListener(this);
}
void bindOptions(int mode){
checkMode(mOptAuto, mode, AppCompatDelegate.MODE_NIGHT_AUTO);
checkMode(mOptSystem, mode, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
checkMode(mOptOff, mode, AppCompatDelegate.MODE_NIGHT_NO);
checkMode(mOptOn, mode, AppCompatDelegate.MODE_NIGHT_YES);
}
@SuppressWarnings("WrongConstant")
@Override
public void onClick(View v) {
int i = v.getId();
int mode = 0;
if (i == R.id.opt_auto) {
mode = AppCompatDelegate.MODE_NIGHT_AUTO;
} else if (i == R.id.opt_system) {
mode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
} else if (i == R.id.opt_off) {
mode = AppCompatDelegate.MODE_NIGHT_NO;
} else if (i == R.id.opt_on) {
mode = AppCompatDelegate.MODE_NIGHT_YES;
}
AppCompatDelegate.setDefaultNightMode(mode);
Scoop.getInstance().chooseDayNightMode(mode);
bindOptions(mode);
}
}
/***********************************************************************************************
*
* Listeners
*
*/
public interface OnItemClickListener{
void onItemClicked(View view, Flavor item, int position);
}
}