/* * Copyright (C) 2012-2016 The Android Money Manager Ex Project Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.money.manager.ex.reports; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.Toast; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.formatter.PercentFormatter; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.listener.OnChartValueSelectedListener; import com.money.manager.ex.R; import com.money.manager.ex.core.UIHelper; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import timber.log.Timber; public class PieChartFragment extends Fragment implements OnChartValueSelectedListener { private static final String LOGCAT = PieChartFragment.class.getSimpleName(); private static final Integer MAX_NUM_ITEMS = 12; // key arguments // public static final String KEY_TITLE = "PieChartFragment:Title"; public static final String KEY_CATEGORIES_VALUES = "PieChartFragment:CategoriesValues"; public static final String KEY_SAVED_INSTANCE = "PieChartFragment:SavedInstance"; public static final String KEY_DISPLAY_AS_UP_ENABLED = "PieChartFragment:DisplayHomeAsUpEnabled"; // color private static final int COLORS[] = {R.color.material_red_500, R.color.material_deep_purple_500, R.color.material_light_blue_500, R.color.material_green_500, R.color.material_yellow_500, R.color.material_deep_orange_500, R.color.material_blue_grey_500, R.color.material_pink_500, R.color.material_indigo_500, R.color.material_cyan_500, R.color.material_light_green_500, R.color.material_amber_500, R.color.material_brown_500, R.color.material_purple_500, R.color.material_blue_500, R.color.material_teal_500, R.color.material_lime_500, R.color.material_orange_500, R.color.material_grey_500}; // bundle arguments private Bundle mArguments; // layout private LinearLayout mLayout; private PieChart mChart; ArrayList<ValuePieEntry> mPieCharts; private int mTextColor; // show back home private boolean mDisplayHomeAsUpEnabled = false; public void buildChart() { mPieCharts = (ArrayList<ValuePieEntry>) mArguments.getSerializable(KEY_CATEGORIES_VALUES); //sort pie charts Collections.sort(mPieCharts, new Comparator<ValuePieEntry>() { @Override public int compare(ValuePieEntry lhs, ValuePieEntry rhs) { return lhs.getValue() > rhs.getValue() ? -1 : lhs.getValue() == rhs.getValue() ? 0 : 1; } }); ArrayList<Entry> yVals1 = new ArrayList<>(); ArrayList<String> xVals = new ArrayList<>(); int length = mPieCharts.size() < MAX_NUM_ITEMS ? mPieCharts.size() : MAX_NUM_ITEMS; for (int i = 0; i < length; i++) { Entry e = new Entry((float) mPieCharts.get(i).getValue(), i); yVals1.add(e); xVals.add(mPieCharts.get(i).getText()); } PieDataSet dataSet = new PieDataSet(yVals1, ""); dataSet.setSliceSpace(3f); ArrayList<Integer> colors = new ArrayList<>(); for (int c : COLORS) colors.add(getResources().getColor(c)); dataSet.setColors(colors); PieData data = new PieData(xVals, dataSet); data.setValueFormatter(new PercentFormatter()); if (mTextColor != -1) data.setValueTextColor(getResources().getColor(mTextColor)); data.setValueTextSize(11f); data.setValueTextColor(Color.WHITE); mChart.setData(data); // undo all highlights mChart.highlightValues(null); mChart.invalidate(); Legend l = mChart.getLegend(); if (l != null) { l.setEnabled(false); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTextColor = new UIHelper(getActivity()).resolveAttribute(R.attr.chartTextColor); if (savedInstanceState != null) { if (savedInstanceState.containsKey(KEY_SAVED_INSTANCE)) setChartArguments(savedInstanceState.getBundle(KEY_SAVED_INSTANCE)); if (savedInstanceState.containsKey(KEY_DISPLAY_AS_UP_ENABLED)) setDisplayHomeAsUpEnabled(savedInstanceState.getBoolean(KEY_DISPLAY_AS_UP_ENABLED)); } // enabled display as home // ActionBarActivity activity = (ActionBarActivity) getActivity(); AppCompatActivity activity = (AppCompatActivity) getActivity(); if (activity != null && activity.getSupportActionBar() != null) { activity.getSupportActionBar().setDisplayHomeAsUpEnabled(isDisplayHomeAsUpEnabled()); } // set has option menu setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //return buildChart(); mLayout = (LinearLayout) inflater.inflate(R.layout.chart_pie_fragment, container, false); mChart = (PieChart) mLayout.findViewById(R.id.chartPie); mChart.setUsePercentValues(true); // change the color of the center-hole mChart.setHoleColor(Color.TRANSPARENT); mChart.setHoleRadius(30f); mChart.setDescription(""); mChart.setDrawCenterText(true); mChart.setDrawHoleEnabled(true); mChart.setRotationAngle(0); // enable rotation of the chart by touch mChart.setRotationEnabled(true); // mChart.setUnit(" €"); // mChart.setDrawUnitsInChart(true); // add a selection listener mChart.setOnChartValueSelectedListener(this); // mChart.setTouchEnabled(false); //mChart.setCenterText("MPAndroidChart\nLibrary"); mChart.animateXY(1500, 1500); return mLayout; } @Override public void onResume() { super.onResume(); buildChart(); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { getActivity().onBackPressed(); return true; } return super.onOptionsItemSelected(item); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBundle(KEY_SAVED_INSTANCE, getChartArguments()); outState.putBoolean(KEY_DISPLAY_AS_UP_ENABLED, isDisplayHomeAsUpEnabled()); } /** * @return the mArguments */ public Bundle getChartArguments() { return mArguments; } /** * @param mArguments the mArguments to set */ public void setChartArguments(Bundle mArguments) { this.mArguments = mArguments; } /** * @return the mDisplayHomeAsUpEnabled */ public boolean isDisplayHomeAsUpEnabled() { return mDisplayHomeAsUpEnabled; } /** * @param mDisplayHomeAsUpEnabled the mDisplayHomeAsUpEnabled to set */ public void setDisplayHomeAsUpEnabled(boolean mDisplayHomeAsUpEnabled) { this.mDisplayHomeAsUpEnabled = mDisplayHomeAsUpEnabled; } @Override public void onValueSelected(Entry e, int dataSetIndex, Highlight h) { String text; try { text = mPieCharts.get(e.getXIndex()).getText().concat(": ").concat(mPieCharts.get(e.getXIndex()).getValueFormatted()); // Snackbar.with(getActivity().getApplicationContext()) // context // .text(text) // .duration(Snackbar.SnackbarDuration.LENGTH_LONG) // .show(getActivity()); Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show(); } catch (Exception ex) { Timber.e(ex, "showing chart item details"); } } @Override public void onNothingSelected() { } }