package be.geelen.yarr.postPages;
import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import be.geelen.yarr.PostAdapter;
import be.geelen.yarr.R;
import be.geelen.yarr.VoteViewPager;
public class PostPageIndicator extends View implements
ViewPager.OnPageChangeListener,
VoteViewPager.OnVoteListener {
private VoteViewPager voteViewPager;
private int currentItem;
private int position;
private float positionOffset;
private HashMap<Integer, Integer> colors = new HashMap<Integer, Integer>();
public PostPageIndicator(Context context) {
super(context);
}
public PostPageIndicator(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
}
public void setVoteViewPager(VoteViewPager voteViewPager) {
if (voteViewPager.getAdapter() == null)
return;
this.voteViewPager = voteViewPager;
voteViewPager.setOnVoteListener(this);
final PostAdapter postAdapter = (PostAdapter) this.voteViewPager.getAdapter();
postAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
for (int i = 0; i < postAdapter.getNumChildren(); i++) {
JSONObject child = postAdapter.getChild(i);
checkColorFor(child, i);
}
invalidate();
}
});
invalidate();
}
private void checkColorFor(JSONObject child, int i) {
// orange > blue > red > green > yellow
try {
child = child.getJSONObject("data");
if (!child.isNull("likes")) {
if (child.getBoolean("likes")) {
colors.put(i, getResources().getColor(R.color.reddit_upvote));
} else {
colors.put(i, getResources().getColor(R.color.reddit_downvote));
}
} else if ("admin".equals(child.get("distinguished"))) {
colors.put(i, getResources().getColor(R.color.reddit_admin));
} else if ("moderator".equals(child.get("distinguished"))) {
colors.put(i, getResources().getColor(R.color.reddit_moderator));
} else if (child.getBoolean("stickied")) {
colors.put(i, getResources().getColor(R.color.reddit_moderator));
} else if (child.getInt("gilded") > 0) {
colors.put(i, getResources().getColor(R.color.reddit_gold));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
this.position = position;
this.positionOffset = positionOffset;
invalidate();
}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {}
@Override
protected void onDraw(Canvas canvas) {
PostAdapter adapter = (PostAdapter) voteViewPager.getAdapter();
int count = ((PostAdapter) voteViewPager.getAdapter()).getNumChildren();
if (count == 0)
return;
for (int i = 0; i < count; i++) {
float top = 0;
float left = i * getWidth() / count;
float right = (i + 1) * getWidth() / count;
float bottom = getHeight();
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(getColorForPost(i));
canvas.drawRect(left, top, right, bottom, paint);
}
Paint seperatorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
seperatorPaint.setColor(getResources().getColor(R.color.grey_100));
for (int i = 1; i < count; i++) {
float top = (float) (getHeight() * .2);
float x = i * getWidth() / count;
float bottom = (float) (getHeight() * .8);
canvas.drawLine(x, top, x, bottom, seperatorPaint);
}
float strokeWidth = 3;
float top = strokeWidth / 2;
float left = (position + positionOffset) * getWidth() / count;
float right = left + getWidth() / count;
float bottom = getHeight() - strokeWidth / 2;
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(strokeWidth);
canvas.drawRect(left, top, right, bottom, paint);
}
int getColorForPost(int position) {
if (colors.containsKey(position)) {
return colors.get(position);
}
return getResources().getColor(R.color.reddit_neutral);
}
@Override
public void onVote(int i, boolean up) {
if (up) {
colors.put(i, getResources().getColor(R.color.reddit_upvote));
} else {
colors.put(i, getResources().getColor(R.color.reddit_downvote));
}
invalidate();
}
}