From 01e99d2809d51e63ad38d40d3200aec0bbf79e21 Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 7 Mar 2021 19:25:04 +0100 Subject: [PATCH] Add chart to each item in Activity list --- .../ActivitySummariesChartFragment.java | 89 ++++++++++--------- .../charts/ActivityListingChartFragment.java | 30 +++++-- .../charts/ActivityListingDetail.java | 61 +++++++++++++ .../main/res/layout/activity_list_detail.xml | 18 ++++ 4 files changed, 149 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingDetail.java create mode 100644 app/src/main/res/layout/activity_list_detail.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesChartFragment.java index 356ed29aa..e4f1caee3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesChartFragment.java @@ -17,11 +17,14 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.activities; +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.Nullable; + import com.github.mikephil.charting.charts.Chart; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.Legend; @@ -37,11 +40,11 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; -import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.charts.AbstractChartFragment; import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsData; import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsHost; +import nodomain.freeyourgadget.gadgetbridge.database.DBAccess; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; @@ -54,63 +57,41 @@ public class ActivitySummariesChartFragment extends AbstractChartFragment { private int startTime; private int endTime; private GBDevice gbDevice; + private View view; public void setDateAndGetData(GBDevice gbDevice, long startTime, long endTime) { this.startTime = (int) startTime; this.endTime = (int) endTime; this.gbDevice = gbDevice; - try { - populate_charts_data(); - } catch (Exception e) { - LOG.debug("Unable to fill charts data right now:", e); + if (this.view != null) { + createLocalRefreshTask("Visualizing data", getActivity()).execute(); } } - - - private void populate_charts_data() { - int LEGEND_TEXT_COLOR = 0; - - try (DBHandler handler = GBApplication.acquireDB()) { - try { - LEGEND_TEXT_COLOR = GBApplication.getTextColor(getContext()); - } catch (Exception e) { - LOG.debug("Unable to get color right now:", e); - } - - List samples = getSamples(handler, gbDevice, startTime, endTime); - DefaultChartsData dcd=null; - try { - dcd = refresh(gbDevice, samples); - }catch(Exception e){ - LOG.debug("Unable to get charts data right now:", e); - } - if (dcd != null) { - mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR); - mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317 - mChart.getXAxis().setValueFormatter(dcd.getXValueFormatter()); - mChart.setData((LineData) dcd.getData()); - mChart.invalidate(); - } - } catch (Exception e) { - LOG.error("Unable to get charts data:", e); - } - + protected RefreshTask createLocalRefreshTask(String task, Context context) { + return new RefreshTask(task, context); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - init(); View rootView = inflater.inflate(R.layout.fragment_charts, container, false); mChart = rootView.findViewById(R.id.activitysleepchart); - if (this.gbDevice != null) { - setupChart(); - populate_charts_data(); - } return rootView; } + @Override + public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + init(); + this.view = view; + if (this.gbDevice != null) { + setupChart(); + createLocalRefreshTask("Visualizing data", getActivity()).execute(); + } + } + + @Override public String getTitle() { return ""; @@ -194,4 +175,32 @@ public class ActivitySummariesChartFragment extends AbstractChartFragment { protected void updateChartsnUIThread(ChartsData chartsData) { } + public class RefreshTask extends DBAccess { + + public RefreshTask(String task, Context context) { + super(task, context); + } + + @Override + protected void doInBackground(DBHandler handler) { + List samples = getAllSamples(handler, gbDevice, startTime, endTime); + + DefaultChartsData dcd = null; + try { + dcd = refresh(gbDevice, samples); + } catch (Exception e) { + LOG.debug("Unable to get charts data right now:", e); + } + if (dcd != null) { + mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317 + mChart.getXAxis().setValueFormatter(dcd.getXValueFormatter()); + mChart.setData((LineData) dcd.getData()); + } + } + + @Override + protected void onPostExecute(Object o) { + mChart.invalidate(); + } + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java index d3747c4a0..da7cca19d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; @@ -64,6 +65,19 @@ public class ActivityListingChartFragment extends AbstractChartFragment { ListView stepsList = rootView.findViewById(R.id.itemListView); stepListAdapter = new ActivityListingAdapter(getContext()); stepsList.setAdapter(stepListAdapter); + + stepsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + ActivitySession item = stepListAdapter.getItem(i); + if (item.getSessionType() != ActivitySession.SESSION_SUMMARY) { + int tsFrom = (int) (item.getStartTime().getTime() / 1000); + int tsTo = (int) (item.getEndTime().getTime() / 1000); + showDetail(tsFrom, tsTo, getChartsHost().getDevice()); + } + } + }); + stepsDateView = rootView.findViewById(R.id.stepsDateView); FloatingActionButton fab; fab = rootView.findViewById(R.id.fab); @@ -169,7 +183,6 @@ public class ActivityListingChartFragment extends AbstractChartFragment { String activityName = stepListAdapter.getActivityName(ongoingSession); int icon = stepListAdapter.getIcon(ongoingSession); - String text = String.format("%s:\u00A0%s, %s:\u00A0%s, %s:\u00A0%s, %s:\u00A0%s", activityName, durationLabel, getString(R.string.heart_rate), hrLabel, getString(R.string.steps), stepLabel, getString(R.string.distance), distanceLabel); final Snackbar snackbar = Snackbar.make(rootView, text, 1000 * 8); @@ -181,7 +194,6 @@ public class ActivityListingChartFragment extends AbstractChartFragment { @Override public void onClick(View view) { snackbar.dismiss(); - } } ); @@ -189,11 +201,15 @@ public class ActivityListingChartFragment extends AbstractChartFragment { } private void showDashboard(int date, GBDevice device) { - FragmentManager fm = getActivity().getSupportFragmentManager(); - ActivityListingDashboard editNameDialogFragment = ActivityListingDashboard.newInstance(date, device); - editNameDialogFragment.show(fm, "activity_list_total_dashboard"); + ActivityListingDashboard listingDashboardFragment = ActivityListingDashboard.newInstance(date, device); + listingDashboardFragment.show(fm, "activity_list_total_dashboard"); + } + private void showDetail(int tsFrom, int tsTo, GBDevice device) { + FragmentManager fm = getActivity().getSupportFragmentManager(); + ActivityListingDetail listingDetailFragment = ActivityListingDetail.newInstance(tsFrom, tsTo, device); + listingDetailFragment.show(fm, "activity_list_detail"); } private static class MyChartsData extends ChartsData { @@ -203,7 +219,6 @@ public class ActivityListingChartFragment extends AbstractChartFragment { MyChartsData(List stepSessions, ActivitySession ongoingSession) { this.stepSessions = stepSessions; this.ongoingSession = ongoingSession; - } public List getStepSessions() { @@ -213,8 +228,5 @@ public class ActivityListingChartFragment extends AbstractChartFragment { public ActivitySession getOngoingSession() { return this.ongoingSession; } - } - - } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingDetail.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingDetail.java new file mode 100644 index 000000000..0efbb6410 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingDetail.java @@ -0,0 +1,61 @@ +package nodomain.freeyourgadget.gadgetbridge.activities.charts; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.ActivitySummariesChartFragment; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; + +public class ActivityListingDetail extends DialogFragment { + protected static final Logger LOG = LoggerFactory.getLogger(ActivityListingDetail.class); + + public ActivityListingDetail() { + + } + + public static ActivityListingDetail newInstance(int tsFrom, int tsTo, GBDevice device) { + ActivityListingDetail frag = new ActivityListingDetail(); + Bundle args = new Bundle(); + args.putInt("tsFrom", tsFrom); + args.putInt("tsTo", tsTo); + args.putParcelable(GBDevice.EXTRA_DEVICE, device); + frag.setArguments(args); + return frag; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.activity_list_detail, container); + } + + @Override + public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { + + super.onViewCreated(view, savedInstanceState); + + int tsFrom = getArguments().getInt("tsFrom"); + int tsTo = getArguments().getInt("tsTo"); + GBDevice gbDevice; + gbDevice = getArguments().getParcelable(GBDevice.EXTRA_DEVICE); + if (gbDevice == null) { + throw new IllegalArgumentException("Must provide a device when invoking this activity"); + } + + final ActivitySummariesChartFragment activitySummariesChartFragment = new ActivitySummariesChartFragment(); + getChildFragmentManager() + .beginTransaction() + .replace(R.id.chartsFragmentHolder, activitySummariesChartFragment) + .commit(); + activitySummariesChartFragment.setDateAndGetData(gbDevice, tsFrom, tsTo); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_list_detail.xml b/app/src/main/res/layout/activity_list_detail.xml new file mode 100644 index 000000000..f4a489990 --- /dev/null +++ b/app/src/main/res/layout/activity_list_detail.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file