package com.boardgamegeek.ui.widget; import android.content.Context; import android.graphics.Color; import android.graphics.PorterDuff.Mode; import android.graphics.Typeface; import android.support.v4.content.ContextCompat; 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.model.Player; import com.boardgamegeek.util.ColorUtils; import java.text.DecimalFormat; import butterknife.BindView; import butterknife.ButterKnife; public class PlayerRow extends LinearLayout { private final DecimalFormat ratingFormat = new DecimalFormat("0.0######"); @BindView(R.id.drag_handle) View dragHandle; @BindView(R.id.color_container) View colorContainer; @BindView(R.id.color_view) ImageView colorView; @BindView(R.id.seat) TextView seatView; @BindView(R.id.name_container) View nameContainer; @BindView(R.id.name) TextView nameView; @BindView(R.id.username) TextView usernameView; @BindView(R.id.team_color) TextView teamColorView; @BindView(R.id.score) TextView scoreView; @BindView(R.id.starting_position) TextView startingPositionView; @BindView(R.id.rating) TextView ratingView; @BindView(R.id.score_button) ImageView scoreButton; @BindView(R.id.more) View moreButton; private final Typeface nameTypeface; private final Typeface usernameTypeface; private final Typeface scoreTypeface; private final int nameColor; private boolean hasScoreListener; public PlayerRow(Context context) { this(context, null); } public PlayerRow(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.row_player, this); setBaselineAligned(false); setGravity(Gravity.CENTER_VERTICAL); setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.player_row_height)); setOrientation(LinearLayout.HORIZONTAL); int horizontalPadding = getResources().getDimensionPixelSize(R.dimen.material_margin_horizontal); int verticalPadding = getResources().getDimensionPixelSize(R.dimen.padding_standard); setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding); ButterKnife.bind(this); nameTypeface = nameView.getTypeface(); usernameTypeface = usernameView.getTypeface(); scoreTypeface = scoreView.getTypeface(); nameColor = nameView.getTextColors().getDefaultColor(); scoreButton.setColorFilter(ContextCompat.getColor(getContext(), R.color.button_under_text), Mode.SRC_IN); } public void setOnScoreListener(OnClickListener l) { hasScoreListener = true; scoreButton.setVisibility(View.VISIBLE); scoreButton.setFocusable(false); scoreButton.setOnClickListener(l); } public void setOnColorListener(OnClickListener l) { colorContainer.setFocusable(false); colorContainer.setOnClickListener(l); } public void setNameListener(OnClickListener l) { nameContainer.setVisibility(View.VISIBLE); nameContainer.setOnClickListener(l); } public void setOnMoreListener(OnClickListener l) { moreButton.setVisibility(View.VISIBLE); moreButton.setOnClickListener(l); } public void setAutoSort(boolean value) { dragHandle.setVisibility(value ? View.VISIBLE : View.INVISIBLE); } public void setPlayer(Player player) { if (player == null) { colorView.setVisibility(View.GONE); setText(seatView, ""); setText(nameView, getResources().getString(R.string.title_player)); setText(usernameView, ""); setText(teamColorView, ""); setText(scoreView, ""); setText(ratingView, ""); scoreButton.setVisibility(View.GONE); } else { setText(seatView, player.getStartingPosition()); if (TextUtils.isEmpty(player.name) && TextUtils.isEmpty(player.username)) { String name; if (player.getSeat() == Player.SEAT_UNKNOWN) { name = getResources().getString(R.string.title_player); } else { name = getResources().getString(R.string.generic_player, player.getSeat()); } setText(nameView, name, nameTypeface, player.New(), player.Win(), true); usernameView.setVisibility(View.GONE); } else if (TextUtils.isEmpty(player.name)) { setText(nameView, player.username, nameTypeface, player.New(), player.Win()); usernameView.setVisibility(View.GONE); } else { setText(nameView, player.name, nameTypeface, player.New(), player.Win()); setText(usernameView, player.username, usernameTypeface, player.New(), player.Win()); } setText(teamColorView, player.color); setText(scoreView, player.score, scoreTypeface, false, player.Win()); setText(ratingView, (player.rating > 0) ? ratingFormat.format(player.rating) : ""); setText(startingPositionView, player.getStartingPosition()); int color = ColorUtils.parseColor(player.color); colorView.setVisibility(View.VISIBLE); ColorUtils.setColorViewValue(colorView, color); if (player.getSeat() == Player.SEAT_UNKNOWN) { seatView.setVisibility(View.GONE); } else { if (color != ColorUtils.TRANSPARENT && ColorUtils.isColorDark(color)) { seatView.setTextColor(Color.WHITE); } else { seatView.setTextColor(Color.BLACK); } startingPositionView.setVisibility(View.GONE); } if (color != ColorUtils.TRANSPARENT) { teamColorView.setVisibility(View.GONE); } scoreButton.setVisibility(hasScoreListener ? View.VISIBLE : View.GONE); } } public View getMoreButton() { return moreButton; } public View getDragHandle() { return dragHandle; } private void setText(TextView textView, String text) { textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE); textView.setText(text); } private void setText(TextView textView, String text, Typeface tf, boolean italic, boolean bold) { setText(textView, text, tf, italic, bold, false); } private void setText(TextView textView, String text, Typeface tf, boolean italic, boolean bold, boolean secondary) { setText(textView, text); if (!TextUtils.isEmpty(text)) { if (italic && bold) { textView.setTypeface(tf, Typeface.BOLD_ITALIC); } else if (italic) { textView.setTypeface(tf, Typeface.ITALIC); } else if (bold) { textView.setTypeface(tf, Typeface.BOLD); } else { textView.setTypeface(tf, Typeface.NORMAL); } if (secondary) { textView.setTextColor(ContextCompat.getColor(getContext(), R.color.secondary_text)); } else { textView.setTextColor(nameColor); } } } }