package com.amaze.filemanager.services.asynctasks; import android.content.Context; import android.graphics.Color; import android.os.AsyncTask; import android.support.v4.util.Pair; import android.text.SpannableString; import android.text.format.Formatter; import android.view.View; import com.afollestad.materialdialogs.Theme; import com.amaze.filemanager.R; import com.amaze.filemanager.filesystem.BaseFile; import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation; import com.amaze.filemanager.utils.Futils; import com.amaze.filemanager.utils.OnProgressUpdate; import com.amaze.filemanager.utils.theme.AppTheme; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import java.util.ArrayList; import java.util.List; import static com.amaze.filemanager.utils.Utils.getColor; /** * Loads data for chart in Futils.showPropertiesDialog() * * @author Emmanuel Messulam<emmanuelbendavid@gmail.com> * on 12/5/2017, at 00:07. */ public class LoadFolderSpaceData extends AsyncTask<Void, Long, Pair<String, List<PieEntry>>> { private static int[] COLORS; private static String[] LEGENDS; private Context context; private AppTheme appTheme; private PieChart chart; private BaseFile file; public LoadFolderSpaceData(Context c, AppTheme appTheme, PieChart chart, BaseFile f) { context = c; this.appTheme = appTheme; this.chart = chart; file = f; LEGENDS = new String[]{context.getString(R.string.size), context.getString(R.string.used_by_others), context.getString(R.string.free)}; COLORS = new int[]{getColor(c, R.color.piechart_red), getColor(c, R.color.piechart_blue), getColor(c, R.color.piechart_green)}; } @Override protected Pair<String, List<PieEntry>> doInBackground(Void... params) { long[] dataArray = Futils.getSpaces(file, new OnProgressUpdate<Long[]>() { @Override public void onUpdate(Long[] data) { publishProgress(data); } }); if (dataArray[0] != -1 && dataArray[0] != 0) { long totalSpace = dataArray[0]; List<PieEntry> entries = createEntriesFromArray(dataArray, false); return new Pair<>(Formatter.formatFileSize(context, totalSpace), entries); } return null; } @Override protected void onProgressUpdate(Long[] dataArray) { if (dataArray[0] != -1 && dataArray[0] != 0) { long totalSpace = dataArray[0]; List<PieEntry> entries = createEntriesFromArray( new long[]{dataArray[0], dataArray[1], dataArray[2]}, true); updateChart(Formatter.formatFileSize(context, totalSpace), entries); chart.notifyDataSetChanged(); chart.invalidate(); } } @Override protected void onPostExecute(Pair<String, List<PieEntry>> data) { if(data == null) { chart.setVisibility(View.GONE); return; } updateChart(data.first, data.second); chart.notifyDataSetChanged(); chart.invalidate(); } private List<PieEntry> createEntriesFromArray(long[] dataArray, boolean loading) { long usedByFolder = dataArray[2], usedByOther = dataArray[0] - dataArray[1] - dataArray[2], freeSpace = dataArray[1]; List<PieEntry> entries = new ArrayList<>(); entries.add(new PieEntry(usedByFolder, LEGENDS[0], loading? ">":null)); entries.add(new PieEntry(usedByOther, LEGENDS[1], loading? "<":null)); entries.add(new PieEntry(freeSpace, LEGENDS[2])); return entries; } private void updateChart(String totalSpace, List<PieEntry> entries) { boolean isDarkTheme = appTheme.getMaterialDialogTheme() == Theme.DARK; PieDataSet set = new PieDataSet(entries, null); set.setColors(COLORS); set.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); set.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); set.setSliceSpace(5f); set.setAutomaticallyDisableSliceSpacing(true); set.setValueLinePart2Length(1.05f); set.setSelectionShift(0f); PieData pieData = new PieData(set); pieData.setValueFormatter(new GeneralDialogCreation.SizeFormatter(context)); pieData.setValueTextColor(isDarkTheme? Color.WHITE:Color.BLACK); chart.setCenterText(new SpannableString(context.getString(R.string.total) + "\n" + totalSpace)); chart.setData(pieData); } }