package com.boardgamegeek.ui.widget;
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.v7.graphics.Palette;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.boardgamegeek.R;
import com.boardgamegeek.provider.BggContract;
import com.boardgamegeek.provider.BggContract.Artists;
import com.boardgamegeek.provider.BggContract.Designers;
import com.boardgamegeek.provider.BggContract.Games;
import com.boardgamegeek.provider.BggContract.Publishers;
import com.boardgamegeek.ui.GameDetailActivity;
import com.boardgamegeek.util.ActivityUtils;
import butterknife.BindView;
import butterknife.ButterKnife;
import icepick.Icepick;
import icepick.State;
public class GameDetailRow extends LinearLayout {
@BindView(android.R.id.icon) ImageView iconView;
@BindView(R.id.data) TextView dataView;
private int queryToken;
private String oneMore;
private String someMore;
private int nameColumnIndex;
private int idColumnIndex;
@State int count;
private int gameId;
private String gameName;
private String label;
private Drawable icon;
public GameDetailRow(Context context) {
super(context);
init(context, null);
}
public GameDetailRow(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
@Override
protected Parcelable onSaveInstanceState() {
return Icepick.saveInstanceState(this, super.onSaveInstanceState());
}
@Override
public void onRestoreInstanceState(Parcelable state) {
super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state));
}
private void init(Context context, AttributeSet attrs) {
oneMore = context.getString(R.string.one_more);
someMore = context.getString(R.string.some_more);
setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
int backgroundResId = 0;
TypedArray a = context.obtainStyledAttributes(new int[] { android.R.attr.selectableItemBackground });
try {
backgroundResId = a.getResourceId(0, backgroundResId);
} finally {
a.recycle();
}
setBackgroundResource(backgroundResId);
setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
setGravity(Gravity.CENTER_VERTICAL);
setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.game_detail_row_height));
setOrientation(HORIZONTAL);
LayoutInflater.from(context).inflate(R.layout.widget_game_detail_row, this, true);
ButterKnife.bind(this);
if (attrs != null) {
a = context.obtainStyledAttributes(attrs, R.styleable.GameDetailRow);
try {
label = a.getString(R.styleable.GameDetailRow_label);
icon = a.getDrawable(R.styleable.GameDetailRow_icon_res);
queryToken = a.getInt(R.styleable.GameDetailRow_query_token, BggContract.INVALID_ID);
} finally {
a.recycle();
}
}
if (icon == null) {
iconView.setVisibility(View.GONE);
} else {
iconView.setVisibility(View.VISIBLE);
iconView.setImageDrawable(icon);
}
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = (Uri) getTag();
if (uri != null) {
getContext().startActivity(new Intent(Intent.ACTION_VIEW, uri));
} else {
Intent intent = new Intent(getContext(), GameDetailActivity.class);
intent.putExtra(ActivityUtils.KEY_TITLE, label);
intent.putExtra(ActivityUtils.KEY_GAME_ID, gameId);
intent.putExtra(ActivityUtils.KEY_GAME_NAME, gameName);
intent.putExtra(ActivityUtils.KEY_QUERY_TOKEN, queryToken);
getContext().startActivity(intent);
}
}
});
}
public void clear() {
dataView.setText("");
}
public void colorIcon(Palette.Swatch swatch) {
iconView.setColorFilter(swatch.getRgb());
}
public static final ButterKnife.Setter<GameDetailRow, Palette.Swatch> colorIconSetter =
new ButterKnife.Setter<GameDetailRow, Palette.Swatch>() {
@Override
public void set(@NonNull GameDetailRow view, Palette.Swatch value, int index) {
if (value != null) {
view.colorIcon(value);
}
}
};
public void bind(Cursor cursor, int nameColumnIndex, int idColumnIndex, int gameId, String gameName) {
this.nameColumnIndex = nameColumnIndex;
this.idColumnIndex = idColumnIndex;
this.gameId = gameId;
this.gameName = gameName;
updateData(cursor);
}
private void updateData(Cursor cursor) {
count = cursor.getCount();
CharSequence summary = null;
final CharSequence text = joinNames(cursor);
if (!TextUtils.isEmpty(text)) {
TextPaint paint = new TextPaint();
paint.setTextSize(dataView.getTextSize());
summary = TextUtils.commaEllipsize(text, paint, dataView.getWidth() * 2, oneMore, someMore);
if (TextUtils.isEmpty(summary)) {
summary = String.format(someMore, count);
}
}
if (count == 1 && idColumnIndex != -1) {
cursor.moveToFirst();
Uri uri = null;
int id = cursor.getInt(idColumnIndex);
if (queryToken == getResources().getInteger(R.integer.query_token_designers)) {
uri = Designers.buildDesignerUri(id);
} else if (queryToken == getResources().getInteger(R.integer.query_token_artists)) {
uri = Artists.buildArtistUri(id);
} else if (queryToken == getResources().getInteger(R.integer.query_token_publishers)) {
uri = Publishers.buildPublisherUri(id);
} else if (queryToken == getResources().getInteger(R.integer.query_token_expansions) ||
queryToken == getResources().getInteger(R.integer.query_token_base_games)) {
uri = Games.buildGameUri(id);
}
if (uri != null) {
setTag(uri);
}
}
dataView.setText(summary);
}
private String joinNames(Cursor cursor) {
StringBuilder sb = new StringBuilder();
if (cursor != null && cursor.moveToFirst()) {
boolean firstTime = true;
do {
if (firstTime) {
firstTime = false;
} else {
sb.append(", ");
}
sb.append(cursor.getString(nameColumnIndex));
} while (cursor.moveToNext());
}
return sb.toString();
}
}