package net.bradmont.openmpd.fragments;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View.OnClickListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ViewSwitcher;
import net.bradmont.openmpd.*;
import net.bradmont.openmpd.R;
import net.bradmont.openmpd.activities.*;
import net.bradmont.openmpd.views.HelpDialog;
import net.bradmont.openmpd.helpers.Analytics;
import net.bradmont.holograph.BarGraph;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class AnalyticsFragment extends Fragment {
private static final String CLEAR_CACHE_SQL =
"drop table if exists giving_summary_cache;";
private static final String VERIFY_CACHE_SQL =
"SELECT name FROM sqlite_master WHERE type='table' AND name='giving_summary_cache';";
private static final String CACHE_SQL =
"create table giving_summary_cache as " +
"select month.month as month, base_giving/100 as base, " +
"regular_giving/100 as regular, frequent_giving/100 as frequent, "+
"special_gifts/100 as special from "+
" month left outer join monthly_base_giving A "+
" on month.month=A.month"+
" left outer join regular_by_month B"+
" on month.month=B.month"+
" left outer join frequent_by_month C"+
" on month.month=C.month"+
" left outer join special_gifts_by_month D"+
" on month.month=D.month"+
" order by month.month;";
private static final String GIVING_SQL =
"select * from giving_summary_cache;";
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.analytics, null);
setHasOptionsMenu(true);
((TextView) view.findViewById(R.id.twelve_month_average))
.setText(Analytics.getAverage());
((TextView) view.findViewById(R.id.weighted_average))
.setText(Analytics.getWeightedAverage());
((TextView) view.findViewById(R.id.monthly))
.setText(Analytics.getStableMonthly());
((TextView) view.findViewById(R.id.quarterly_and_annual))
.setText(Analytics.getStableRegular());
((TextView) view.findViewById(R.id.repeating_irregular))
.setText(Analytics.getFrequentAverage());
((TextView) view.findViewById(R.id.avg_special))
.setText(Analytics.getAverageSpecial());
((TextView) view.findViewById(R.id.late))
.setText(Analytics.getLateAverage());
((TextView) view.findViewById(R.id.lapsed))
.setText(Analytics.getLapsedAverage());
((TextView) view.findViewById(R.id.dropped_support))
.setText(Analytics.getDroppedTotal());
((TextView) view.findViewById(R.id.ongoing_total))
.setText(Analytics.getOngoingTotal());
if (verifyCache()){
populateGraph(view);
} else {
final ViewSwitcher switcher = (ViewSwitcher) view.findViewById(R.id.graph_switcher);
final View rootView = view;
switcher.showNext();
((BaseActivity) getActivity()).queueTask(new Runnable(){
public void run(){
createCache();
getActivity().runOnUiThread( new Runnable(){
public void run(){
populateGraph(rootView);
switcher.showNext();
}
});
}
});
}
return view;
}
private View populateGraph(View parent){
// set up bar grap
BarGraph graph = (BarGraph) parent.findViewById(R.id.magic_graph);
Float [] [] vals = null;
if (!verifyCache()){
createCache();
}
Cursor cur1 = MPDDBHelper.get().getReadableDatabase().rawQuery(
GIVING_SQL, null);
vals = new Float[cur1.getCount()][4];
String [] labels = new String[cur1.getCount()];
String [] groups = new String[cur1.getCount()];
String [] parts = null;
cur1.moveToFirst();
SimpleDateFormat dateFormat = new SimpleDateFormat("MMM");
Calendar cal = Calendar.getInstance();
for (int i = 0; i < cur1.getCount(); i++){
parts = cur1.getString(0).split("-");
groups[i] = parts[0];
cal.set(Calendar.MONTH, Integer.parseInt(parts[1]) -1);
labels[i] = dateFormat.format(cal.getTime());
try {
vals[i][0] = cur1.getFloat(1);
} catch (Exception e){
vals[i][0]=0f;
}
try {
vals[i][1] = cur1.getFloat(2);
} catch (Exception e){
vals[i][1]=0f;
}
try {
vals[i][2] = cur1.getFloat(3);
} catch (Exception e){
vals[i][2]=0f;
}
try {
vals[i][3] = cur1.getFloat(4);
} catch (Exception e){
vals[i][3]=0f;
}
cur1.moveToNext();
}
cur1.close();
graph.setLabels(labels);
graph.setValues(vals);
graph.setGroups(groups);
return parent;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//addCards();
}
@Override
public void onResume(){
super.onResume();
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.analytics_fragment, menu);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenMPD.get());
// if debug disabled
if (!prefs.getBoolean("pref_debug_enabled", false)){
menu.findItem(R.id.menu_debug).setVisible(false);
}
}
@Override
public boolean onOptionsItemSelected (MenuItem item){
switch (item.getItemId() ){
case R.id.menu_help:
HelpDialog.showHelp(getActivity(), R.string.help_main_title, R.string.help_main);
return true;
case R.id.menu_settings:
Intent switchIntent = new Intent(getActivity(), SettingsActivity.class);
startActivity(switchIntent);
return true;
case R.id.menu_debug:
switchIntent = new Intent(getActivity(), DebugActivity.class);
startActivity(switchIntent);
return true;
}
return false;
}
public void showUpdateNews(final int version){
final SharedPreferences prefs = getActivity().getSharedPreferences("openmpd", Context.MODE_PRIVATE);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.update_news)
.setTitle(R.string.whats_new);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
prefs.edit()
.putInt("updateNews", version)
.apply();
}
});
builder.show();
}
public boolean verifyCache(){
Cursor cur1 = MPDDBHelper.get().getReadableDatabase().rawQuery(VERIFY_CACHE_SQL, null);
boolean result = (cur1.getCount() == 1);
cur1.close();
return result;
}
public static void createCache(){
MPDDBHelper.get().getWritableDatabase().execSQL(CACHE_SQL);
}
public static void clearCache(){
MPDDBHelper.get().getWritableDatabase().execSQL(CLEAR_CACHE_SQL);
}
}