package io.kaif.mobile.view.widget;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.InsetDrawable;
import android.util.AttributeSet;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Space;
import io.kaif.mobile.R;
import io.kaif.mobile.model.Vote;
import io.kaif.mobile.view.animation.VoteAnimation;
import io.kaif.mobile.view.graphics.drawable.Triangle;
import io.kaif.mobile.view.util.Views;
public class DebateActions extends LinearLayout {
public static final int BUTTON_SIZE_DP = 24;
public static final int BUTTON_PADDING_DP = 3;
private Vote.VoteState voteState;
private OnVoteClickListener onVoteClickListener;
private Button downVote;
private Button upVote;
private ImageButton reply;
public DebateActions(Context context) {
this(context, null);
}
public DebateActions(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(HORIZONTAL);
initViews(context);
}
public DebateActions(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOrientation(HORIZONTAL);
initViews(context);
}
private void initViews(Context context) {
upVote = new Button(context);
int px = (int) Views.convertDpToPixel(BUTTON_SIZE_DP, context);
int paddingPx = (int) Views.convertDpToPixel(BUTTON_PADDING_DP, context);
addView(new Space(context), new LinearLayout.LayoutParams(0, 0, 1));
upVote.setBackground(new InsetDrawable(new Triangle(context.getResources()
.getColor(R.color.vote_state_empty)), paddingPx));
addView(upVote, new LinearLayout.LayoutParams(px, px));
upVote.setOnClickListener(v -> {
if (onVoteClickListener != null) {
Vote.VoteState from = voteState;
Vote.VoteState to = (voteState == Vote.VoteState.UP
? Vote.VoteState.EMPTY
: Vote.VoteState.UP);
onVoteClickListener.onVoteClicked(from, to);
}
});
addView(new Space(context), new LinearLayout.LayoutParams(0, 0, 1));
downVote = new Button(context);
downVote.setBackground(new InsetDrawable(new Triangle(context.getResources()
.getColor(R.color.vote_state_empty), true), paddingPx));
addView(downVote, new LinearLayout.LayoutParams(px, px));
downVote.setOnClickListener(v -> {
if (onVoteClickListener != null) {
Vote.VoteState from = voteState;
Vote.VoteState to = (voteState == Vote.VoteState.DOWN
? Vote.VoteState.EMPTY
: Vote.VoteState.DOWN);
onVoteClickListener.onVoteClicked(from, to);
}
});
addView(new Space(context), new LinearLayout.LayoutParams(0, 0, 1));
reply = new ImageButton(context);
reply.setImageResource(R.drawable.ic_reply);
reply.setScaleType(ImageView.ScaleType.CENTER);
reply.setBackground(null);
addView(reply, new LinearLayout.LayoutParams(px, px));
addView(new Space(context), new LinearLayout.LayoutParams(0, 0, 1));
}
public void setOnReplyClickListener(OnClickListener onClickListener) {
reply.setOnClickListener(view -> {
Animation animation = AnimationUtils.loadAnimation(view.getContext(),
R.anim.scale_action_icon);
view.startAnimation(animation);
onClickListener.onClick(view);
});
}
public void setOnVoteClickListener(OnVoteClickListener onVoteClickListener) {
this.onVoteClickListener = onVoteClickListener;
}
public void updateVoteState(Vote.VoteState voteState) {
this.voteState = voteState;
int upColor = R.color.vote_state_empty;
int downColor = R.color.vote_state_empty;
switch (voteState) {
case UP:
upColor = R.color.vote_state_up;
break;
case DOWN:
downColor = R.color.vote_state_down;
break;
}
downVote.getBackground()
.setColorFilter(getContext().getResources().getColor(downColor), PorterDuff.Mode.SRC_IN);
downVote.getBackground().invalidateSelf();
upVote.getBackground()
.setColorFilter(getContext().getResources().getColor(upColor), PorterDuff.Mode.SRC_IN);
upVote.getBackground().invalidateSelf();
}
public void playAnimations(Vote.VoteState from) {
playUpVoteAnimation(from, voteState);
playDownVoteAnimation(from, voteState);
}
private void playUpVoteAnimation(Vote.VoteState prevState, Vote.VoteState newVoteState) {
switch (prevState) {
case DOWN:
case EMPTY:
switch (newVoteState) {
case UP:
VoteAnimation.voteUpAnimation(upVote).start();
break;
}
break;
case UP:
switch (newVoteState) {
case DOWN:
case EMPTY:
VoteAnimation.voteUpReverseAnimation(upVote).start();
break;
}
break;
}
}
private void playDownVoteAnimation(Vote.VoteState prevState, Vote.VoteState newVoteState) {
switch (prevState) {
case DOWN:
switch (newVoteState) {
case UP:
case EMPTY:
VoteAnimation.voteDownReverseAnimation(downVote).start();
break;
}
break;
case EMPTY:
case UP:
switch (newVoteState) {
case DOWN:
VoteAnimation.voteDownAnimation(downVote).start();
break;
}
break;
}
}
}