package com.github.andlyticsproject;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
import com.github.andlyticsproject.chart.Chart;
import com.github.andlyticsproject.chart.Chart.ValueCallbackHander;
import com.github.andlyticsproject.model.AppStats;
import com.github.andlyticsproject.util.Utils;
public class RatingsChartListAdapter extends ChartListAdapter<AppStats> {
private static final int COL_AVG_RATING = 1;
private static final int COL_RATINGS_5 = 2;
private static final int COL_RATINGS_4 = 3;
private static final int COL_RATINGS_3 = 4;
private static final int COL_RATINGS_2 = 5;
private static final int COL_RATINGS_1 = 6;
private Integer highestRatingChange;
private Integer lowestRatingChange;
public RatingsChartListAdapter(Activity activity) {
super(activity);
}
@Override
public int getNumPages() {
return 1;
}
@Override
public int getNumCharts(int page) throws IndexOutOfBoundsException {
switch (page) {
case 0:
return 7;
}
throw new IndexOutOfBoundsException("page=" + page);
}
@Override
public String getChartTitle(int page, int column) throws IndexOutOfBoundsException {
if (column == COL_DATE) {
return "";
}
switch (page) {
case 0: {
switch (column) {
case COL_AVG_RATING:
return activity.getString(R.string.average_rating);
case COL_RATINGS_1:
return "1* " + activity.getString(R.string.num_ratings);
case COL_RATINGS_2:
return "2* " + activity.getString(R.string.num_ratings);
case COL_RATINGS_3:
return "3* " + activity.getString(R.string.num_ratings);
case COL_RATINGS_4:
return "4* " + activity.getString(R.string.num_ratings);
case COL_RATINGS_5:
return "5* " + activity.getString(R.string.num_ratings);
}
}
break;
}
throw new IndexOutOfBoundsException("page=" + page + " column=" + column);
}
@Override
public void updateChartValue(int position, int page, int column, TextView tv)
throws IndexOutOfBoundsException {
AppStats appInfo = getItem(position);
if (column == COL_DATE) {
tv.setText(dateFormat.format(appInfo.getDate()));
return;
}
int textColor = BLACK_TEXT;
switch (page) {
case 0: {
switch (column) {
case COL_AVG_RATING:
tv.setText(appInfo.getAvgRatingString());
tv.setTextColor(textColor);
return;
case COL_RATINGS_5:
if (appInfo.getRating5Diff() > 0) {
tv.setText("+" + appInfo.getRating5Diff());
} else {
tv.setText(appInfo.getRating5Diff().toString());
}
tv.setTextColor(textColor);
return;
case COL_RATINGS_4:
if (appInfo.getRating4Diff() > 0) {
tv.setText("+" + appInfo.getRating4Diff());
} else {
tv.setText(appInfo.getRating4Diff().toString());
}
tv.setTextColor(textColor);
return;
case COL_RATINGS_3:
if (appInfo.getRating3Diff() > 0) {
tv.setText("+" + appInfo.getRating3Diff());
} else {
tv.setText(appInfo.getRating3Diff().toString());
}
tv.setTextColor(textColor);
return;
case COL_RATINGS_2:
if (appInfo.getRating2Diff() > 0) {
tv.setText("+" + appInfo.getRating2Diff());
} else {
tv.setText(appInfo.getRating2Diff().toString());
}
tv.setTextColor(textColor);
return;
case COL_RATINGS_1:
if (appInfo.getRating1Diff() > 0) {
tv.setText("+" + appInfo.getRating1Diff());
} else {
tv.setText(appInfo.getRating1Diff().toString());
}
tv.setTextColor(textColor);
return;
}
}
break;
}
throw new IndexOutOfBoundsException("page=" + page + " column=" + column);
}
@Override
public View buildChart(Context context, Chart baseChart, List<?> statsForApp, int page,
int column) throws IndexOutOfBoundsException {
ValueCallbackHander handler = null;
switch (page) {
case 0: {
switch (column) {
case COL_AVG_RATING:
handler = new DevConValueCallbackHander() {
@Override
public double getValue(Object appInfo) {
return ((AppStats) appInfo).getAvgRating();
}
};
return baseChart.buildLineChart(context, statsForApp.toArray(), handler);
case COL_RATINGS_1:
handler = new DevConValueCallbackHander() {
@Override
public double getValue(Object appInfo) {
return ((AppStats) appInfo).getRating1Diff();
}
};
return baseChart.buildBarChart(context, statsForApp.toArray(), handler,
highestRatingChange, lowestRatingChange);
case COL_RATINGS_2:
handler = new DevConValueCallbackHander() {
@Override
public double getValue(Object appInfo) {
return ((AppStats) appInfo).getRating2Diff();
}
};
return baseChart.buildBarChart(context, statsForApp.toArray(), handler,
highestRatingChange, lowestRatingChange);
case COL_RATINGS_3:
handler = new DevConValueCallbackHander() {
@Override
public double getValue(Object appInfo) {
return ((AppStats) appInfo).getRating3Diff();
}
};
return baseChart.buildBarChart(context, statsForApp.toArray(), handler,
highestRatingChange, lowestRatingChange);
case COL_RATINGS_4:
handler = new DevConValueCallbackHander() {
@Override
public double getValue(Object appInfo) {
return ((AppStats) appInfo).getRating4Diff();
}
};
return baseChart.buildBarChart(context, statsForApp.toArray(), handler,
highestRatingChange, lowestRatingChange);
case COL_RATINGS_5:
handler = new DevConValueCallbackHander() {
@Override
public double getValue(Object appInfo) {
return ((AppStats) appInfo).getRating5Diff();
}
};
return baseChart.buildBarChart(context, statsForApp.toArray(), handler,
highestRatingChange, lowestRatingChange);
}
}
break;
}
throw new IndexOutOfBoundsException("page=" + page + " column=" + column);
}
@Override
public String getSubHeadLine(int page, int column) throws IndexOutOfBoundsException {
if (column == COL_DATE) {
return "";
}
switch (page) {
case 0: {
switch (column) {
case COL_AVG_RATING:
return overallStats.getAvgRatingString();
case COL_RATINGS_1:
return Utils.safeToString(overallStats.getRating1());
case COL_RATINGS_2:
return Utils.safeToString(overallStats.getRating2());
case COL_RATINGS_3:
return Utils.safeToString(overallStats.getRating3());
case COL_RATINGS_4:
return Utils.safeToString(overallStats.getRating4());
case COL_RATINGS_5:
Preferences.saveShowChartHint(activity, false);
return Utils.safeToString(overallStats.getRating5());
}
}
}
throw new IndexOutOfBoundsException("page=" + page + " column=" + column);
}
@Override
public AppStats getItem(int position) {
return getStats().get(position);
}
@Override
protected boolean isSmothValue(int page, int position) {
return page == 0 ? getItem(position).isSmoothingApplied() : false;
}
public void setHighestRatingChange(Integer highestRatingChange) {
this.highestRatingChange = highestRatingChange;
}
public void setLowestRatingChange(Integer lowestRatingChange) {
this.lowestRatingChange = lowestRatingChange;
}
}