package com.github.andlyticsproject; import java.util.List; import android.app.Activity; import android.content.Context; import android.graphics.Typeface; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; import com.github.andlyticsproject.chart.Chart; public abstract class BaseChartListAdapter<T> extends BaseAdapter { private static String LOG_TAG = BaseChartListAdapter.class.toString(); /** * * @return the number of pages that will has the adapter */ private final int numPages, numColumns[]; private final int maxColumns; private final Activity activity; private float scale; private int currentPage, currentColumn; private final boolean usesSmooth; private final OnClickListener columnClickListener; private final int listItemTextSize; private final int colorOdd; private final int colorEven; public abstract T getItem(int position); public abstract int getNumPages(); /** * * @param page * Page to request number of charts (columns) index start at 0 * @return Number of charts(columns) that will has the requested page */ public abstract int getNumCharts(int page) throws IndexOutOfBoundsException; /** * * @param page * @param column * @return Chart title at selected page/column * @throws IndexOutOfBoundsException */ public abstract String getChartTitle(int page, int column) throws IndexOutOfBoundsException; /** * * @param page * @param column * @return Chart subhead line * @throws IndexOutOfBoundsException */ public abstract String getSubHeadLine(int page, int column) throws IndexOutOfBoundsException; /** * * @param position * @param page * @param column * @return Chart title at selected page/column * @throws IndexOutOfBoundsException */ public abstract void updateChartValue(int position, int page, int column, TextView tv) throws IndexOutOfBoundsException; public BaseChartListAdapter(Activity activity) { if (!(activity instanceof ChartSwitcher)) { throw new ClassCastException("Activity must implement ChartSwitcher."); } this.activity = activity; numPages = getNumPages(); int max = -1; boolean useSmoth = false; numColumns = new int[numPages]; for (int i = 0; i < numPages; i++) { numColumns[i] = getNumCharts(i); max = Math.max(max, numColumns[i]); if (useSmothColumn(i)) useSmoth = true; } usesSmooth = useSmoth; maxColumns = max; this.scale = activity.getResources().getDisplayMetrics().density; listItemTextSize = activity.getResources().getDimensionPixelSize( R.dimen.chart_list_item_text_size); currentPage = 0; currentColumn = 1; colorOdd = activity.getResources().getColor(R.color.rowLight); colorEven = activity.getResources().getColor(R.color.rowDark); columnClickListener = new OnClickListener() { @Override public void onClick(View v) { int column = (Integer) v.getTag(); Log.i(LOG_TAG, "Pressed " + column); ((ChartSwitcher) BaseChartListAdapter.this.activity).setCurrentChart(currentPage, column); } }; } static class ViewHolder { final TextView fields[]; public ViewHolder(int numFields) { fields = new TextView[numFields]; } } @Override public final View getView(int position, View convertView, ViewGroup parent) { int i; ViewHolder holder; if (convertView == null) { convertView = activity.getLayoutInflater().inflate(R.layout.base_chart_list_item, null); holder = new ViewHolder(maxColumns + (usesSmooth ? 1 : 0)); for (i = 0; i < maxColumns; i++) { holder.fields[i] = createTextView("", false, i > 0); if (i > 0) { holder.fields[i].setOnClickListener(columnClickListener); holder.fields[i].setTag(i); } ((ViewGroup) convertView).addView(holder.fields[i]); } if (usesSmooth) { holder.fields[i] = createTextView("*", false, false); ((ViewGroup) convertView).addView(holder.fields[i], 1); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // coloring table rows if (1 == position % 2) { convertView.setBackgroundColor(colorOdd); } else { convertView.setBackgroundColor(colorEven); } // First field always will be the date Typeface typeface = holder.fields[0].getTypeface(); for (i = 0; i < maxColumns; i++) holder.fields[i].setTypeface(typeface, Typeface.NORMAL); int diff = maxColumns - numColumns[currentPage]; for (i = 0; i < maxColumns; i++) holder.fields[i].setVisibility(View.VISIBLE); if (numColumns[currentPage] < maxColumns) { for (i = maxColumns - diff; i < maxColumns; i++) holder.fields[i].setVisibility(View.GONE); } updateChartValue(position, currentPage, 0, holder.fields[0]); for (i = 1; i < numColumns[currentPage]; i++) updateChartValue(position, currentPage, i, holder.fields[i]); holder.fields[currentColumn].setTypeface(typeface, Typeface.BOLD); if (usesSmooth) { holder.fields[holder.fields.length - 1].setVisibility(isSmothValue(currentPage, position) ? View.VISIBLE : View.INVISIBLE); } return convertView; } protected abstract boolean useSmothColumn(int page); protected abstract boolean isSmothValue(int page, int position); @SuppressWarnings("deprecation") private TextView createTextView(String string, boolean bold, boolean weight) { TextView view = new TextView(activity); view.setText(string); int top = (int) (2 * scale); int left = (int) (2 * scale); view.setPadding(left, top, left, top); view.setTextColor(activity.getResources().getColor(R.color.blackText)); if (weight) { view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, .2f)); } else { view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } view.setGravity(Gravity.RIGHT); if (bold) { view.setTypeface(view.getTypeface(), Typeface.BOLD); } view.setTextSize(TypedValue.COMPLEX_UNIT_PX, listItemTextSize); return view; } public abstract View buildChart(Context context, Chart baseChart, List<?> statsForApp, int page, int column) throws IndexOutOfBoundsException; public String getCurrentChartTitle() { return getChartTitle(currentPage, currentColumn); } public String getCurrentSubHeadLine() { return getSubHeadLine(currentPage, currentColumn); } public void setCurrentChart(int page, int column) { // new Exception().printStackTrace(); currentPage = page; currentColumn = column; // Log.i(LOG_TAG,"Seting current "+currentPage+" c="+currentColumn); } public int getCurrentColumn() { // Log.i(LOG_TAG,"Getting current C "+currentPage+" c="+currentColumn); return currentColumn; } public int getCurrentPage() { // Log.i(LOG_TAG,"Getting current P "+currentPage+" c="+currentColumn); return currentPage; } }