Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.53 KB | None | 0 0
  1. package com.appdev.schoudhary.wittylife.ui.main;
  2.  
  3. import android.annotation.SuppressLint;
  4. import android.app.AlertDialog;
  5. import android.arch.lifecycle.ViewModelProviders;
  6. import android.content.Intent;
  7. import android.graphics.Color;
  8. import android.graphics.Typeface;
  9. import android.os.Bundle;
  10. import android.support.annotation.Nullable;
  11. import android.support.v7.app.ActionBar;
  12. import android.support.v7.app.AppCompatActivity;
  13. import android.support.v7.widget.Toolbar;
  14. import android.text.SpannableString;
  15. import android.text.style.ForegroundColorSpan;
  16. import android.text.style.RelativeSizeSpan;
  17. import android.text.style.StyleSpan;
  18. import android.util.Log;
  19. import android.view.Menu;
  20. import android.view.MenuInflater;
  21. import android.view.MenuItem;
  22. import android.view.View;
  23. import android.widget.AdapterView;
  24. import android.widget.ArrayAdapter;
  25. import android.widget.ProgressBar;
  26. import android.widget.SeekBar;
  27. import android.widget.Spinner;
  28. import android.widget.TextView;
  29.  
  30. import com.appdev.schoudhary.wittylife.BuildConfig;
  31. import com.appdev.schoudhary.wittylife.R;
  32. import com.appdev.schoudhary.wittylife.database.AppDatabase;
  33. import com.appdev.schoudhary.wittylife.model.City;
  34. import com.appdev.schoudhary.wittylife.model.CityIndices;
  35. import com.appdev.schoudhary.wittylife.model.CityRecords;
  36. import com.appdev.schoudhary.wittylife.network.ApiService;
  37. import com.appdev.schoudhary.wittylife.network.RetroClient;
  38. import com.appdev.schoudhary.wittylife.viewmodel.CityIndicesViewModel;
  39. import com.appdev.schoudhary.wittylife.viewmodel.CityIndicesViewModelFactory;
  40. import com.appdev.schoudhary.wittylife.viewmodel.MainViewModel;
  41. import com.github.mikephil.charting.charts.BarChart;
  42. import com.github.mikephil.charting.charts.PieChart;
  43. import com.github.mikephil.charting.components.Legend;
  44. import com.github.mikephil.charting.components.XAxis;
  45. import com.github.mikephil.charting.components.YAxis;
  46. import com.github.mikephil.charting.data.BarData;
  47. import com.github.mikephil.charting.data.BarDataSet;
  48. import com.github.mikephil.charting.data.BarEntry;
  49. import com.github.mikephil.charting.data.Entry;
  50. import com.github.mikephil.charting.data.PieData;
  51. import com.github.mikephil.charting.data.PieDataSet;
  52. import com.github.mikephil.charting.data.PieEntry;
  53. import com.github.mikephil.charting.formatter.StackedValueFormatter;
  54. import com.github.mikephil.charting.highlight.Highlight;
  55. import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
  56. import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
  57. import com.github.mikephil.charting.utils.ColorTemplate;
  58. import com.github.mikephil.charting.utils.MPPointF;
  59.  
  60. import java.util.ArrayList;
  61. import java.util.List;
  62.  
  63. import io.reactivex.Observable;
  64. import io.reactivex.Observer;
  65. import io.reactivex.Single;
  66. import io.reactivex.android.schedulers.AndroidSchedulers;
  67. import io.reactivex.disposables.CompositeDisposable;
  68. import io.reactivex.disposables.Disposable;
  69. import io.reactivex.schedulers.Schedulers;
  70.  
  71. public class MPAndroidChartActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, SeekBar.OnSeekBarChangeListener, OnChartValueSelectedListener {
  72. private static final String TAG = ComparisonActivity.class.getSimpleName();
  73. private ActionBar actionBar;
  74. private ProgressBar mLoadingIndicator;
  75. private Spinner spinner;
  76.  
  77. private MenuItem spinnerItem;
  78.  
  79. private String sourceCity;
  80.  
  81. private static AppDatabase mDB;
  82. private List<String> cityRecords;
  83.  
  84. private PieChart piechart;
  85. private BarChart barChart;
  86.  
  87. private SeekBar seekBarX, seekBarY;
  88. private TextView tvX, tvY;
  89.  
  90. private CompositeDisposable disposables = new CompositeDisposable();
  91.  
  92. private Typeface tfLight;
  93. private Typeface tfRegular;
  94.  
  95.  
  96.  
  97. @Override
  98. protected void onCreate(Bundle savedInstanceState) {
  99. super.onCreate(savedInstanceState);
  100. setContentView(R.layout.activity_comparison);
  101.  
  102. Toolbar comparetoolbar = findViewById(R.id.toolbar);
  103. setSupportActionBar(comparetoolbar);
  104.  
  105. actionBar = getSupportActionBar();
  106. actionBar.setDisplayHomeAsUpEnabled(true);
  107. actionBar.setDisplayShowTitleEnabled(false);
  108.  
  109. tfLight = Typeface.createFromAsset(getApplicationContext().getAssets(), "OpenSans-Light.ttf");
  110. tfRegular = Typeface.createFromAsset(getApplicationContext().getAssets(), "Roboto-Regular.ttf");
  111.  
  112.  
  113. piechart = findViewById(R.id.piechart);
  114.  
  115. barChart = findViewById(R.id.stackbar);
  116. barChart.setOnChartValueSelectedListener(this);
  117.  
  118. tvX = findViewById(R.id.tvXMax);
  119. tvY = findViewById(R.id.tvYMax);
  120.  
  121. seekBarX = findViewById(R.id.seekBar1);
  122. seekBarY = findViewById(R.id.seekBar2);
  123.  
  124. seekBarX.setOnSeekBarChangeListener(this);
  125. seekBarY.setOnSeekBarChangeListener(this);
  126.  
  127.  
  128.  
  129. mLoadingIndicator = findViewById(R.id.pb_loading_indicator);
  130.  
  131. mDB = AppDatabase.getsInstance(getApplicationContext());
  132.  
  133. cityRecords = new ArrayList<>();
  134. invalidateOptionsMenu();
  135.  
  136. /**
  137. * Setup pie chart with data
  138. */
  139. bindViewPieChart();
  140.  
  141.  
  142. /**
  143. * Setup stack bar chart with data
  144. */
  145. bindViewStackBarChart();
  146.  
  147. }
  148.  
  149. private void bindViewStackBarChart() {
  150.  
  151. barChart.getDescription().setEnabled(false);
  152.  
  153. // if more than 60 entries are displayed in the piechart, no values will be
  154. // drawn
  155. barChart.setMaxVisibleValueCount(40);
  156.  
  157. // scaling can now only be done on x- and y-axis separately
  158. barChart.setPinchZoom(false);
  159.  
  160. barChart.setDrawGridBackground(false);
  161. barChart.setDrawBarShadow(false);
  162.  
  163. barChart.setDrawValueAboveBar(false);
  164. barChart.setHighlightFullBarEnabled(false);
  165.  
  166. // change the position of the y-labels
  167. YAxis leftAxis = barChart.getAxisLeft();
  168. leftAxis.setEnabled(false);
  169. // leftAxis.setValueFormatter(new MyValueFormatter("K"));
  170. leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
  171. barChart.getAxisRight().setEnabled(false);
  172.  
  173. XAxis xLabels = barChart.getXAxis();
  174. xLabels.setEnabled(false);
  175. // xLabels.setPosition(XAxis.XAxisPosition.TOP);
  176.  
  177. // barChart.setDrawXLabels(false);
  178. // barChart.setDrawYLabels(false);
  179.  
  180. // setting data
  181. seekBarX.setProgress(12);
  182. seekBarY.setProgress(100);
  183.  
  184. Legend l = barChart.getLegend();
  185. l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
  186. l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
  187. l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
  188. l.setDrawInside(false);
  189. l.setFormSize(8f);
  190. l.setFormToTextSpace(4f);
  191. l.setXEntrySpace(6f);
  192. }
  193.  
  194. private void bindViewPieChart() {
  195.  
  196. piechart.setUsePercentValues(true);
  197. piechart.getDescription().setEnabled(false);
  198. piechart.setExtraOffsets(10, 20, 10, 10);
  199.  
  200. piechart.setDragDecelerationFrictionCoef(0.95f);
  201.  
  202.  
  203. piechart.setCenterTextTypeface(tfLight);
  204. // piechart.setCenterText(generateCenterSpannableText());
  205.  
  206. piechart.setDrawHoleEnabled(false);
  207. piechart.setHoleColor(Color.GRAY);
  208.  
  209. piechart.setTransparentCircleColor(Color.WHITE);
  210. piechart.setTransparentCircleAlpha(110);
  211.  
  212. piechart.setHoleRadius(0f);
  213. piechart.setTransparentCircleRadius(0f);
  214.  
  215. piechart.setDrawCenterText(false);
  216.  
  217. piechart.setRotationAngle(0);
  218. // enable rotation of the piechart by touch
  219. piechart.setRotationEnabled(true);
  220. piechart.setHighlightPerTapEnabled(true);
  221.  
  222. // piechart.setUnit(" €");
  223. // piechart.setDrawUnitsInChart(true);
  224.  
  225. // add a selection listener
  226. piechart.setOnChartValueSelectedListener(this);
  227.  
  228.  
  229. seekBarX.setProgress(4);
  230. seekBarY.setProgress(10);
  231.  
  232. piechart.animateXY(1400, 1400);
  233. // piechart.spin(2000, 0, 360);
  234.  
  235. Legend l = piechart.getLegend();
  236. l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
  237. l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
  238. l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
  239. l.setDrawInside(false);
  240. l.setXEntrySpace(7f);
  241. l.setYEntrySpace(5f);
  242. l.setYOffset(0f);
  243. l.setXOffset(5f);
  244.  
  245. // entry label styling
  246. piechart.setEntryLabelColor(Color.BLACK);
  247. piechart.setEntryLabelTypeface(tfRegular);
  248. piechart.setEntryLabelTextSize(12f);
  249. }
  250.  
  251. @Override
  252. protected void onSaveInstanceState(Bundle outState) {
  253. outState.putStringArrayList("cityRecords", (ArrayList<String>) cityRecords);
  254. super.onSaveInstanceState(outState);
  255. Log.d(TAG, "Saving cityRecords in bundle during orientation change");
  256.  
  257. }
  258.  
  259. @Override
  260. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  261. super.onRestoreInstanceState(savedInstanceState);
  262. cityRecords = savedInstanceState.getStringArrayList("cityRecords");
  263. Log.d(TAG, "Restoring rankingData from bundle during orientation change");
  264. }
  265.  
  266.  
  267.  
  268. @Override
  269. public boolean onPrepareOptionsMenu(Menu menu) {
  270. return true;
  271. }
  272.  
  273. @Override
  274. public boolean onCreateOptionsMenu(Menu menu) {
  275.  
  276. MenuInflater inflater = getMenuInflater();
  277. inflater.inflate(R.menu.comparison_spinner, menu);
  278.  
  279. spinnerItem = menu.findItem(R.id.compare_menu);
  280. spinner = (Spinner) spinnerItem.getActionView();
  281.  
  282. spinner.setFitsSystemWindows(true);
  283.  
  284. // spinnerItem.expandActionView();
  285. spinnerItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
  286. @Override
  287. public boolean onMenuItemActionExpand(MenuItem item) {
  288. return true;
  289. }
  290.  
  291. @Override
  292. public boolean onMenuItemActionCollapse(MenuItem item) {
  293. return true;
  294. }
  295. });
  296.  
  297. //FIXME Hack to avoid NPE on spinner object on config change
  298. if (!cityRecords.isEmpty()) {
  299. populateSpinnerData();
  300. }
  301.  
  302. return true;
  303. }
  304.  
  305.  
  306.  
  307. @Override
  308. public void onNothingSelected(AdapterView<?> parent) {
  309. //TODO Do something better
  310. parent.setSelection(0);
  311. }
  312.  
  313. //FIXME Implement Repository and network bound resource
  314. private void fetchAndUpdateSpinner() {
  315. if (mDB.cityDao().getRowCount() > 0) {
  316. populateSpinnerFromDB(null);
  317. } else {
  318. fetchAndUpdateSpinnerFromAPI();
  319. }
  320. }
  321.  
  322. private void showErrorMessage() {
  323. new AlertDialog.Builder(this)
  324. .setTitle(R.string.network_error)
  325. .setMessage(R.string.network_error_msg)
  326. .setNegativeButton(R.string.error_dismiss_button, (dialog, which) -> dialog.dismiss()).create().show();
  327. }
  328.  
  329. @Override
  330. protected void onRestart() {
  331. super.onRestart();
  332. populateSpinnerFromDB(null);
  333.  
  334. }
  335.  
  336. @Override
  337. protected void onPause() {
  338. disposables.dispose();
  339. super.onPause();
  340. }
  341.  
  342. @Override
  343. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  344. tvX.setText(String.valueOf(seekBarX.getProgress()));
  345. tvY.setText(String.valueOf(seekBarY.getProgress()));
  346.  
  347. // Setup piechart data
  348. setData(seekBarX.getProgress(), seekBarY.getProgress());
  349.  
  350. // Setup stackbarchart data
  351. ArrayList<BarEntry> values = new ArrayList<>();
  352.  
  353. for (int i = 0; i < seekBarX.getProgress(); i++) {
  354. float mul = (seekBarY.getProgress() + 1);
  355. float val1 = (float) (Math.random() * mul) + mul / 3;
  356. float val2 = (float) (Math.random() * mul) + mul / 3;
  357. float val3 = (float) (Math.random() * mul) + mul / 3;
  358.  
  359. values.add(new BarEntry(
  360. i,
  361. new float[]{val1, val2, val3}));
  362. }
  363.  
  364. BarDataSet set1;
  365.  
  366. if (barChart.getData() != null &&
  367. barChart.getData().getDataSetCount() > 0) {
  368. set1 = (BarDataSet) barChart.getData().getDataSetByIndex(0);
  369. set1.setValues(values);
  370. barChart.getData().notifyDataChanged();
  371. barChart.notifyDataSetChanged();
  372. } else {
  373. set1 = new BarDataSet(values, "Statistics Vienna 2014");
  374. set1.setDrawIcons(false);
  375. set1.setColors(getColors());
  376. set1.setStackLabels(new String[]{"Births", "Divorces", "Marriages"});
  377.  
  378. ArrayList<IBarDataSet> dataSets = new ArrayList<>();
  379. dataSets.add(set1);
  380.  
  381. BarData data = new BarData(dataSets);
  382. data.setValueFormatter(new StackedValueFormatter(true, "", 1));
  383. data.setValueTextColor(Color.WHITE);
  384.  
  385. barChart.setData(data);
  386. }
  387.  
  388. barChart.setFitBars(true);
  389. barChart.invalidate();
  390. }
  391.  
  392. @Override
  393. public void onStartTrackingTouch(SeekBar seekBar) {
  394.  
  395. }
  396.  
  397. @Override
  398. public void onStopTrackingTouch(SeekBar seekBar) {
  399.  
  400. }
  401.  
  402. private SpannableString generateCenterSpannableText() {
  403.  
  404. SpannableString s = new SpannableString("MPAndroidChart\ndeveloped by Philipp Jahoda");
  405. s.setSpan(new RelativeSizeSpan(1.7f), 0, 14, 0);
  406. s.setSpan(new StyleSpan(Typeface.NORMAL), 14, s.length() - 15, 0);
  407. s.setSpan(new ForegroundColorSpan(Color.GRAY), 14, s.length() - 15, 0);
  408. s.setSpan(new RelativeSizeSpan(.8f), 14, s.length() - 15, 0);
  409. s.setSpan(new StyleSpan(Typeface.ITALIC), s.length() - 14, s.length(), 0);
  410. s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), s.length() - 14, s.length(), 0);
  411. return s;
  412. }
  413.  
  414. @Override
  415. public void onValueSelected(Entry e, Highlight h) {
  416. if (e == null)
  417. return;
  418. Log.i("VAL SELECTED",
  419. "Value: " + e.getY() + ", index: " + h.getX()
  420. + ", DataSet index: " + h.getDataSetIndex());
  421. }
  422.  
  423. @Override
  424. public void onNothingSelected() {
  425. }
  426.  
  427. private void setData(int count, float range) {
  428. ArrayList<PieEntry> entries = new ArrayList<>();
  429.  
  430. entries.add(new PieEntry(18.5f, "Green"));
  431. entries.add(new PieEntry(26.7f, "Yellow"));
  432. entries.add(new PieEntry(24.0f, "Red"));
  433. entries.add(new PieEntry(30.8f, "Blue"));
  434.  
  435. PieDataSet dataSet = new PieDataSet(entries, "Election Results");
  436.  
  437. dataSet.setDrawIcons(false);
  438.  
  439. dataSet.setSliceSpace(3f);
  440. dataSet.setIconsOffset(new MPPointF(0, 40));
  441. dataSet.setSelectionShift(5f);
  442.  
  443. // add a lot of colors
  444.  
  445. ArrayList<Integer> colors = new ArrayList<>();
  446.  
  447. for (int c : ColorTemplate.VORDIPLOM_COLORS)
  448. colors.add(c);
  449.  
  450. for (int c : ColorTemplate.JOYFUL_COLORS)
  451. colors.add(c);
  452.  
  453. for (int c : ColorTemplate.COLORFUL_COLORS)
  454. colors.add(c);
  455.  
  456. for (int c : ColorTemplate.LIBERTY_COLORS)
  457. colors.add(c);
  458.  
  459. for (int c : ColorTemplate.PASTEL_COLORS)
  460. colors.add(c);
  461.  
  462. colors.add(ColorTemplate.getHoloBlue());
  463.  
  464. dataSet.setColors(colors);
  465. //dataSet.setSelectionShift(0f);
  466.  
  467. PieData data = new PieData(dataSet);
  468. // data.setValueFormatter(new PercentFormatter(piechart));
  469. data.setValueTextSize(11f);
  470. data.setValueTextColor(Color.WHITE);
  471. data.setValueTypeface(tfLight);
  472. piechart.setData(data);
  473.  
  474. // undo all highlights
  475. piechart.highlightValues(null);
  476.  
  477. piechart.invalidate();
  478. }
  479.  
  480.  
  481. private int[] getColors() {
  482.  
  483. // have as many colors as stack-values per entry
  484. int[] colors = new int[3];
  485.  
  486. System.arraycopy(ColorTemplate.MATERIAL_COLORS, 0, colors, 0, 3);
  487.  
  488. return colors;
  489. }
  490.  
  491. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement