package edu.berkeley.cs.amplab.carat.android.fragments; import java.util.ArrayList; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.FrameLayout; import android.widget.TextView; import com.github.mikephil.charting.charts.PieChart; 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.utils.Legend; import com.github.mikephil.charting.utils.Legend.LegendPosition; import edu.berkeley.cs.amplab.carat.android.CaratApplication; import edu.berkeley.cs.amplab.carat.android.Constants; import edu.berkeley.cs.amplab.carat.android.MainActivity; import edu.berkeley.cs.amplab.carat.android.R; import edu.berkeley.cs.amplab.carat.android.storage.SimpleHogBug; /** * * @author Javad Sadeqzadeh * */ public class SummaryFragment extends ExtendedTitleFragment { // private final String TAG = "SummaryFragment"; private MainActivity mMainActivity = CaratApplication.getMainActivity(); private PieChart mChart; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /* * Handling orientation change manually (to prevent destroying and * recreating the activity (by Android)). We have threads and AsyncTasks * (e.g. for retrieving statistics from server) which try to change the * activity's view, and if the activity is already killed, they might * cause a application crash (or simply continue their work). We might * need to use the RoboSpice library (instead of AysncTasks) in future) * http://www.youtube.com/watch?v=ONaD1mB8r-A */ FrameLayout frameLayout = new FrameLayout(getActivity()); populateViewForOrientation(inflater, frameLayout); return frameLayout; } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); LayoutInflater inflater = LayoutInflater.from(getActivity()); populateViewForOrientation(inflater, (ViewGroup) getView()); } private void populateViewForOrientation(LayoutInflater inflater, ViewGroup viewGroup) { viewGroup.removeAllViewsInLayout(); View subview = inflater.inflate(R.layout.summary, viewGroup); scheduleRefresh(subview); setClickableUserStatsText(subview); } @Override public void onResume() { super.onResume(); Log.d("SummaryFragment", "onResume called"); scheduleRefresh(); } public void scheduleRefresh() { getActivity().runOnUiThread(new Runnable() { public void run() { View v = getView(); if (v != null){ String batteryLife = CaratApplication.myDeviceData.getBatteryLife(); Button green = (Button) v.findViewById(R.id.active_bl); green.setText(batteryLife); } if (mMainActivity.isStatsDataAvailable() && v != null) { drawPieChart(v); } int hogsCount = 0; int bugsCount = 0; if (CaratApplication.storage != null && v != null) { SimpleHogBug[] h = CaratApplication.storage.getHogReport(); SimpleHogBug[] b = CaratApplication.storage.getBugReport(); if (h != null) hogsCount = h.length; if (b != null) bugsCount = b.length; Button hogsCountTv = (Button) v.findViewById(R.id.summary_hogs_count); hogsCountTv.setText(hogsCount + " " + getString(R.string.hogs)); Button bugsCountTv = (Button) v.findViewById(R.id.summary_bugs_count); bugsCountTv.setText(bugsCount + " " + getString(R.string.bugs)); } } }); } public void scheduleRefresh(final View inflatedView) { getActivity().runOnUiThread(new Runnable() { public void run() { if (mMainActivity.isStatsDataAvailable()) { drawPieChart(inflatedView); } int hogsCount = 0; int bugsCount = 0; if (CaratApplication.storage != null) { SimpleHogBug[] h = CaratApplication.storage.getHogReport(); SimpleHogBug[] b = CaratApplication.storage.getBugReport(); if (h != null) hogsCount = h.length; if (b != null) bugsCount = b.length; } Button hogsCountTv = (Button) inflatedView.findViewById(R.id.summary_hogs_count); hogsCountTv.setText(hogsCount + " " + getString(R.string.hogs)); Button bugsCountTv = (Button) inflatedView.findViewById(R.id.summary_bugs_count); bugsCountTv.setText(bugsCount + " " + getString(R.string.bugs)); } }); } private void setClickableUserStatsText(final View inflatedView) { CountClickListener l = new CountClickListener(); Button hogsCount = (Button) inflatedView.findViewById(R.id.summary_hogs_count); hogsCount.setOnClickListener(l); Button bugsCount = (Button) inflatedView.findViewById(R.id.summary_bugs_count); bugsCount.setOnClickListener(l); Button green = (Button) inflatedView.findViewById(R.id.active_bl); green.setOnClickListener(l); /* Open Carat Statistics website on click: */ TextView morestats = (TextView) inflatedView.findViewById(R.id.morestats); morestats.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent browserIntent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(getString(R.string.statsurl))); startActivity(browserIntent); } }); } /** * Concisely handle clicks on the hogs/bugs text items. * * @author Eemil Lagerspetz * */ private class CountClickListener implements OnClickListener { @Override public void onClick(View v) { if (v == v.getRootView().findViewById(R.id.summary_hogs_count)) { mMainActivity.replaceFragment(mMainActivity.getHogsFragment(), mMainActivity.getFragmentTag(4), true); } else if (v == v.getRootView().findViewById(R.id.active_bl)) { mMainActivity.replaceFragment(mMainActivity.getMydeviceFragment(), mMainActivity.getFragmentTag(2), true); }else mMainActivity.replaceFragment(mMainActivity.getBugsFragment(), mMainActivity.getFragmentTag(3), true); } } private void drawPieChart(final View inflatedView) { // This fixes a crash I got 2015-02-11: View v = inflatedView; if (v == null) v = getView(); if (v == null) return; mChart = (PieChart) inflatedView.findViewById(R.id.chart1); mChart.setDescription(""); // int orientation = getResources().getConfiguration().orientation; // switch (orientation) { // case (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE): // mChart.setValueTextSize(9); // break; // case (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT): // mChart.setValueTextSize(15); // break; // } Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/OpenSans-Regular.ttf"); mChart.setValueTypeface(tf); mChart.setCenterTextTypeface(Typeface.createFromAsset(getActivity().getAssets(), "fonts/OpenSans-Light.ttf")); mChart.setUsePercentValues(true); mChart.setCenterText(getString(R.string.summary_chart_center_text)); mChart.setCenterTextSize(22f); // radius of the center hole in percent of maximum radius mChart.setHoleRadius(40f); mChart.setTransparentCircleRadius(50f); // disable click / touch / tap on the chart mChart.setTouchEnabled(false); // enable / disable drawing of x- and y-values // mChart.setDrawYValues(false); // mChart.setDrawXValues(false); mChart.setData(generatePieData()); Legend l = mChart.getLegend(); l.setPosition(LegendPosition.NONE); } protected PieData generatePieData() { ArrayList<Entry> entries = new ArrayList<Entry>(); ArrayList<String> xVals = new ArrayList<String>(); xVals.add(getString(R.string.chart_wellbehaved)); xVals.add(getString(R.string.chart_hogs)); xVals.add(getString(R.string.chart_bugs)); int wellbehaved = mMainActivity.mWellbehaved; int hogs = mMainActivity.mHogs; int bugs = mMainActivity.mBugs; entries.add(new Entry((float) (wellbehaved), 1)); entries.add(new Entry((float) (hogs), 2)); entries.add(new Entry((float) (bugs), 3)); PieDataSet ds1 = new PieDataSet(entries, getString(R.string.summary_chart_center_text)); ds1.setColors(Constants.CARAT_COLORS); ds1.setSliceSpace(2f); PieData d = new PieData(xVals, ds1); return d; } }