package com.github.andlyticsproject;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import com.github.andlyticsproject.Preferences.Timeframe;
import com.github.andlyticsproject.chart.Chart.ChartSet;
import com.github.andlyticsproject.model.AppStatsSummary;
import com.github.andlyticsproject.model.Statistic;
import com.github.andlyticsproject.model.StatsSummary;
import com.github.andlyticsproject.util.LoaderBase;
import com.github.andlyticsproject.util.LoaderResult;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class ChartFragment<T extends Statistic> extends ChartFragmentBase implements
StatsView<T> {
private static final String TAG = ChartFragment.class.getSimpleName();
static class AppStatsSummaryLoader extends LoaderBase<AppStatsSummary> {
static final String ARG_PACKAGE_NAME = "packageName";
static final String ARG_TIMEFRAME = "timeframe";
static final String ARG_SMOOTH_ENABLED = "smoothEnabled";
private ContentAdapter db;
private String packageName;
private Timeframe timeframe;
private boolean smoothEnabled;
public AppStatsSummaryLoader(Activity context, String packageName, Timeframe timeframe,
boolean smoothEnabled) {
super(context);
db = ContentAdapter.getInstance(AndlyticsApp.getInstance());
this.packageName = packageName;
this.timeframe = timeframe;
this.smoothEnabled = smoothEnabled;
}
@Override
protected AppStatsSummary load() throws Exception {
if (packageName == null) {
return null;
}
Log.d(TAG, "loading stats for " + packageName);
return db.getStatsForApp(packageName, timeframe, smoothEnabled);
}
@Override
protected void releaseResult(LoaderResult<AppStatsSummary> result) {
// just a string, nothing to do
}
@Override
protected boolean isActive(LoaderResult<AppStatsSummary> result) {
return false;
}
}
protected DetailedStatsActivity statsActivity;
private ListView historyList;
private ChartListAdapter<T> historyListAdapter;
private TextView historyListFooter;
private View oneEntryHint;
protected ChartSet currentChartSet;
private boolean smoothEnabled;
public ChartFragment() {
setHasOptionsMenu(true);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
statsActivity.setActionBarTitle(getTitle());
Bundle b = getArguments();
if (b != null) {
String chartSet = b.getString(DetailsActivity.EXTRA_CHART_SET);
if (chartSet != null) {
currentChartSet = ChartSet.valueOf(chartSet);
}
}
currentChartSet = getChartSet();
smoothEnabled = Preferences.getChartSmooth(getActivity());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// DON'T init loader here, data is loaded twice!
}
public abstract void initLoader(Bundle args);
public abstract void restartLoader(Bundle args);
public abstract ChartSet getChartSet();
public abstract ChartListAdapter<T> createChartAdapter();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
oneEntryHint = (View) view.findViewById(R.id.base_chart_one_entry_hint);
historyList = (ListView) view.findViewById(R.id.base_chart_list);
View inflate = getActivity().getLayoutInflater().inflate(R.layout.chart_list_footer, null);
historyListFooter = (TextView) inflate.findViewById(R.id.chart_footer_text);
historyList.addFooterView(inflate, null, false);
historyListAdapter = createChartAdapter();
setAdapter(historyListAdapter);
// column 0 is always date, select next one
historyListAdapter.setCurrentChart(0, 1);
setAllowChangePageSliding(true);
return view;
}
@Override
public void onResume() {
super.onResume();
loadCurrentData();
}
@Override
public void updateView(StatsSummary<T> statsSummary) {
if (statsSummary == null) {
return;
}
if (historyListAdapter == null) {
return;
}
List<T> statsForApp = statsSummary.getStats();
if (statsForApp != null && statsForApp.size() > 0) {
boolean smoothedValues = statsSummary.applySmoothedValues();
historyListAdapter.setOverallStats(statsSummary.getOverallStats());
setupListAdapter(historyListAdapter, statsSummary);
updateCharts(statsForApp);
DateFormat dateFormat = Preferences.getDateFormatLong(getActivity());
timetext = dateFormat.format(statsForApp.get(0).getDate()) + " - "
+ dateFormat.format(statsForApp.get(statsForApp.size() - 1).getDate());
updateChartHeadline();
// make a shallow copy, otherwise original data can't be used to
// restore state
List<T> statsForAppReversed = new ArrayList<T>();
statsForAppReversed.addAll(statsForApp);
Collections.reverse(statsForAppReversed);
historyListAdapter.setStats(statsForAppReversed);
/*
* int page=historyListAdapter.getCurrentPage(); int
* column=historyListAdapter.getCurrentColumn();
* historyListAdapter.setCurrentChart(page, column);
*/
historyListAdapter.notifyDataSetChanged();
if (smoothedValues && currentChartSet.equals(ChartSet.DOWNLOADS)) {
historyListFooter.setVisibility(View.VISIBLE);
} else {
historyListFooter.setVisibility(View.INVISIBLE);
}
if (oneEntryHint != null) {
if (statsForApp.size() == 1) {
oneEntryHint.setVisibility(View.VISIBLE);
} else {
oneEntryHint.setVisibility(View.INVISIBLE);
}
}
restoreChartSelection();
}
}
public abstract void setupListAdapter(ChartListAdapter<T> listAdapter,
StatsSummary<T> statsSummary);
protected String getChartHint() {
return getString(R.string.revenue);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
statsActivity = (DetailedStatsActivity) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
statsActivity = null;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.charts_menu, menu);
MenuItem activeTimeFrame = null;
switch (currentTimeFrame) {
case LAST_SEVEN_DAYS:
activeTimeFrame = menu.findItem(R.id.itemChartsmenuTimeframe7);
break;
case LAST_THIRTY_DAYS:
activeTimeFrame = menu.findItem(R.id.itemChartsmenuTimeframe30);
break;
case LAST_NINETY_DAYS:
activeTimeFrame = menu.findItem(R.id.itemChartsmenuTimeframe90);
break;
case UNLIMITED:
activeTimeFrame = menu.findItem(R.id.itemChartsmenuTimeframeUnlimited);
break;
case MONTH_TO_DATE:
activeTimeFrame = menu.findItem(R.id.itemChartsmenuTimeframeMonthToDate);
break;
}
activeTimeFrame.setChecked(true);
if (statsActivity.isRefreshing()) {
menu.findItem(R.id.itemChartsmenuRefresh).setActionView(
R.layout.action_bar_indeterminate_progress);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Context ctx = getActivity();
switch (item.getItemId()) {
case R.id.itemChartsmenuRefresh:
setChartIgnoreCallLayouts(true);
executeLoadData(currentTimeFrame);
return true;
case R.id.itemChartsmenuToggle:
toggleChartData(item);
return true;
case R.id.itemChartsmenuTimeframe7:
currentTimeFrame = Timeframe.LAST_SEVEN_DAYS;
executeLoadData(currentTimeFrame);
Preferences.saveChartTimeframe(Timeframe.LAST_SEVEN_DAYS, ctx);
item.setChecked(true);
return true;
case R.id.itemChartsmenuTimeframe30:
currentTimeFrame = Timeframe.LAST_THIRTY_DAYS;
executeLoadData(currentTimeFrame);
Preferences.saveChartTimeframe(Timeframe.LAST_THIRTY_DAYS, ctx);
item.setChecked(true);
return true;
case R.id.itemChartsmenuTimeframe90:
currentTimeFrame = Timeframe.LAST_NINETY_DAYS;
executeLoadData(currentTimeFrame);
Preferences.saveChartTimeframe(Timeframe.LAST_NINETY_DAYS, ctx);
item.setChecked(true);
return true;
case R.id.itemChartsmenuTimeframeUnlimited:
currentTimeFrame = Timeframe.UNLIMITED;
executeLoadData(currentTimeFrame);
Preferences.saveChartTimeframe(Timeframe.UNLIMITED, ctx);
item.setChecked(true);
return true;
case R.id.itemChartsmenuTimeframeMonthToDate:
currentTimeFrame = Timeframe.MONTH_TO_DATE;
executeLoadData(currentTimeFrame);
Preferences.saveChartTimeframe(Timeframe.MONTH_TO_DATE, ctx);
item.setChecked(true);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void notifyChangedDataformat() {
executeLoadData(currentTimeFrame);
}
@Override
protected void executeLoadData(Timeframe currentTimeFrame) {
Bundle args = new Bundle();
args.putString(AppStatsSummaryLoader.ARG_PACKAGE_NAME, statsActivity.getPackage());
args.putBoolean(AppStatsSummaryLoader.ARG_SMOOTH_ENABLED, smoothEnabled);
args.putSerializable(AppStatsSummaryLoader.ARG_TIMEFRAME, currentTimeFrame);
statsActivity.refreshStarted();
restartLoader(args);
}
protected void loadCurrentData() {
Bundle args = new Bundle();
args.putString(AppStatsSummaryLoader.ARG_PACKAGE_NAME, statsActivity.getPackage());
args.putBoolean(AppStatsSummaryLoader.ARG_SMOOTH_ENABLED, smoothEnabled);
args.putSerializable(AppStatsSummaryLoader.ARG_TIMEFRAME, getCurrentTimeFrame());
statsActivity.refreshStarted();
initLoader(args);
}
public void setCurrentChartSet(ChartSet currentChartSet) {
this.currentChartSet = currentChartSet;
}
public ChartSet getCurrentChartSet() {
return currentChartSet;
}
}