package com.jasonrobinson.racer.adapter;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.jasonrobinson.racer.R;
import com.jasonrobinson.racer.model.Ladder.Entry;
import com.jasonrobinson.racer.model.Ladder.Entry.Character;
import java.math.BigDecimal;
import java.math.MathContext;
public class LadderAdapter extends BaseAdapter {
private Entry[] mPreviousEntries;
private Entry[] mEntries;
private boolean mUseClassRank;
private boolean mBorderFirstItem;
public LadderAdapter(Entry[] entries, boolean useClassRank, boolean borderFirstItem) {
mEntries = entries;
mUseClassRank = useClassRank;
mBorderFirstItem = borderFirstItem;
}
@Override
public int getCount() {
return mEntries.length;
}
@Override
public Entry getItem(int position) {
return mEntries[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Context context = parent.getContext();
View view = convertView;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.ladder_item, parent, false);
view.setTag(new ViewHolder(view));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.bottomBorderView.setVisibility(mBorderFirstItem && position == 0 ? View.VISIBLE : View.INVISIBLE);
Entry entry = getItem(position);
Character character = entry.getCharacter();
holder.rankTextView.setText(Integer.toString(mUseClassRank ? entry.getClassRank() : entry.getRank()));
holder.nameTextView.setText(character.getName());
if (entry.isDead()) {
holder.nameTextView.setPaintFlags(holder.nameTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
holder.nameTextView.setPaintFlags(holder.nameTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
}
holder.levelTextView.setText(Integer.toString(character.getLevel()));
holder.classTextView.setText(character.getPoeClass());
holder.experienceTextView.setText(formatExperience(character.getExperience()));
applyRankChange(parent.getContext(), view, entry);
return view;
}
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void applyRankChange(Context context, View v, Entry entry) {
RankChange rankChange = getRankChange(entry);
Drawable drawable;
switch (rankChange) {
case UP:
drawable = new ColorDrawable(context.getResources().getColor(R.color.rank_up));
break;
case DOWN:
drawable = new ColorDrawable(context.getResources().getColor(R.color.rank_down));
break;
case NONE:
default:
drawable = new ColorDrawable(context.getResources().getColor(R.color.rank_none));
break;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
v.setBackground(drawable);
} else {
v.setBackgroundDrawable(drawable);
}
}
private CharSequence formatExperience(long experience) {
MathContext mc = new MathContext(4);
if (experience >= 1000000000) { // billion
return new BigDecimal((double) experience / 1000000000).round(mc).toString() + "B";
} else if (experience >= 1000000) { // million
return new BigDecimal((double) experience / 1000000).round(mc).toString() + "M";
} else if (experience >= 1000) { // thousand
return new BigDecimal((double) experience / 1000).round(mc).toString() + "K";
}
return Long.toString(experience);
}
private RankChange getRankChange(Entry entry) {
if (mPreviousEntries == null) {
return RankChange.NONE;
}
Entry prevEntry = findPreviousEntry(entry);
if (prevEntry == null || entry.getRank() > prevEntry.getRank()) {
return RankChange.UP;
} else if (entry.getRank() < prevEntry.getRank()) {
return RankChange.DOWN;
}
return RankChange.NONE;
}
private Entry findPreviousEntry(Entry entry) {
if (mPreviousEntries == null) {
return null;
}
String character = entry.getCharacter().getName();
for (Entry prevEntry : mPreviousEntries) {
String prevCharacter = prevEntry.getCharacter().getName();
if (character.equals(prevCharacter)) {
return prevEntry;
}
}
return null;
}
public void setEntries(Entry[] entries, boolean useClassRank) {
mPreviousEntries = mEntries;
mEntries = entries;
mUseClassRank = useClassRank;
notifyDataSetChanged();
}
public void setBorderFirstItem(boolean enable) {
mBorderFirstItem = enable;
}
private enum RankChange {
UP,
DOWN,
NONE
}
private class ViewHolder {
public TextView rankTextView;
public TextView nameTextView;
public TextView levelTextView;
public TextView classTextView;
public TextView experienceTextView;
public View bottomBorderView;
public ViewHolder(View v) {
rankTextView = (TextView) v.findViewById(R.id.rank);
nameTextView = (TextView) v.findViewById(R.id.name);
levelTextView = (TextView) v.findViewById(R.id.level);
classTextView = (TextView) v.findViewById(R.id.poeClass);
experienceTextView = (TextView) v.findViewById(R.id.experience);
bottomBorderView = v.findViewById(R.id.bottomBorder);
}
}
}