From 7a46d39193034cb888d5def3e895a67052a64bd0 Mon Sep 17 00:00:00 2001 From: vanous Date: Fri, 7 Aug 2020 09:21:14 +0200 Subject: [PATCH] ActivityDetail with steps --- app/src/main/AndroidManifest.xml | 5 + .../activities/ActivitySummariesActivity.java | 24 ++- .../activities/ActivitySummaryDetail.java | 125 ++++++++++++++++ .../adapter/ActivitySummariesAdapter.java | 22 ++- .../gadgetbridge/model/DailyTotals.java | 4 +- .../res/layout/activity_summary_details.xml | 138 ++++++++++++++++++ 6 files changed, 307 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummaryDetail.java create mode 100644 app/src/main/res/layout/activity_summary_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1cb642424..7120882de 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -419,6 +419,11 @@ android:parentActivityName=".activities.ControlCenterv2" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden" /> + { - + private static final Logger LOG = LoggerFactory.getLogger(ActivitySummariesActivity.class); private GBDevice mGBDevice; private SwipeRefreshLayout swipeLayout; @@ -129,13 +133,12 @@ public class ActivitySummariesActivity extends AbstractListActivity. */ +package nodomain.freeyourgadget.gadgetbridge.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.charts.ActivityAnalysis; +import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmounts; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummary; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityTrack; +import nodomain.freeyourgadget.gadgetbridge.model.DailyTotals; +import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils; +import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + +public class ActivitySummaryDetail extends AbstractGBActivity { + private static final Logger LOG = LoggerFactory.getLogger(ActivitySummaryDetail.class); + private GBDevice mGBDevice; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_summary_details); + + Intent intent = getIntent(); + ActivitySummary summary = (ActivitySummary) intent.getSerializableExtra("summary"); + GBDevice device = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE); + mGBDevice = device; + + final String gpxTrack = summary.getGpxTrack(); + Button show_track_btn = (Button) findViewById(R.id.showTrack); + show_track_btn.setVisibility(View.GONE); + + if (gpxTrack != null) { + ActivityTrack activityTrack = new ActivityTrack(); + + show_track_btn.setVisibility(View.VISIBLE); + show_track_btn.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + try { + AndroidUtils.viewFile(gpxTrack, Intent.ACTION_VIEW, getApplicationContext()); + } catch (IOException e) { + GB.toast(getApplicationContext(), "Unable to display GPX track: " + e.getMessage(), Toast.LENGTH_LONG, GB.ERROR, e); + } + } + }); + } + String activitykind = ActivityKind.asString(summary.getActivityKind(), getApplicationContext()); + + String starttime = DateTimeUtils.formatDateTime(summary.getStartTime()); + String endtime = DateTimeUtils.formatDateTime(summary.getEndTime()); + Long startTs = summary.getStartTime().getTime() / 1000; + Long endTs = summary.getEndTime().getTime() / 1000; + Long durationms = (summary.getEndTime().getTime() - summary.getStartTime().getTime()); + String durationhms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(durationms), + TimeUnit.MILLISECONDS.toMinutes(durationms) % TimeUnit.HOURS.toMinutes(1), + TimeUnit.MILLISECONDS.toSeconds(durationms) % TimeUnit.MINUTES.toSeconds(1)); + + int steps = getSteps(startTs.intValue(), endTs.intValue()); + + ImageView activity_icon = (ImageView) findViewById(R.id.item_image); + activity_icon.setImageResource(ActivityKind.getIconId(summary.getActivityKind())); + TextView activity_kind = (TextView) findViewById(R.id.activitykind); + activity_kind.setText(activitykind); + TextView start_time = (TextView) findViewById(R.id.starttime); + start_time.setText(starttime); + TextView end_time = (TextView) findViewById(R.id.endtime); + end_time.setText(endtime); + TextView activity_duration = (TextView) findViewById(R.id.duration); + activity_duration.setText(durationhms); + TextView activity_steps = (TextView) findViewById(R.id.steps); + activity_steps.setText(String.valueOf(steps)); + } + + + private int getSteps(int tsStart, int tsEnd) { + + try (DBHandler handler = GBApplication.acquireDB()) { + DailyTotals dt = new DailyTotals(); + ActivityAnalysis analysis = new ActivityAnalysis(); + ActivityAmounts amountsSteps; + amountsSteps = analysis.calculateActivityAmounts(dt.getSamples(handler, mGBDevice, tsStart, tsEnd)); + return (int) dt.getTotalsStepsForActivityAmounts(amountsSteps); + + } catch (Exception e) { + + GB.toast("Error loading activity steps.", Toast.LENGTH_SHORT, GB.ERROR, e); + } + return 0; + + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java index 6ead88b06..b7d9d2e0a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/ActivitySummariesAdapter.java @@ -21,6 +21,7 @@ import android.widget.Toast; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; import de.greenrobot.dao.query.QueryBuilder; import nodomain.freeyourgadget.gadgetbridge.GBApplication; @@ -60,21 +61,38 @@ public class ActivitySummariesAdapter extends AbstractItemAdapter 0) { return name; } Date startTime = item.getStartTime(); + Long duration = (item.getEndTime().getTime() - item.getStartTime().getTime()); + String durationhms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(duration), + TimeUnit.MILLISECONDS.toMinutes(duration) % TimeUnit.HOURS.toMinutes(1), + TimeUnit.MILLISECONDS.toSeconds(duration) % TimeUnit.MINUTES.toSeconds(1)); + if (startTime != null) { - return DateTimeUtils.formatDateTime(startTime); + return DateTimeUtils.formatDateTime(startTime) + " (" + durationhms + ")"; } + + + return "Unknown activity"; } @Override protected String getDetails(BaseActivitySummary item) { - return ActivityKind.asString(item.getActivityKind(), getContext()); + String gpxTrack = item.getGpxTrack(); + String hasGps = ""; + if (gpxTrack != null) { + hasGps=" 🛰️"; + } + return ActivityKind.asString(item.getActivityKind(), getContext())+ hasGps; } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java index 2b35eabb4..6c203593d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java @@ -104,7 +104,7 @@ public class DailyTotals { } - private long getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) { + public long getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) { long totalSteps = 0; for (ActivityAmount amount : activityAmounts.getAmounts()) { @@ -131,7 +131,7 @@ public class DailyTotals { } - protected List getSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) { + public List getSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) { return getAllSamples(db, device, tsFrom, tsTo); } diff --git a/app/src/main/res/layout/activity_summary_details.xml b/app/src/main/res/layout/activity_summary_details.xml new file mode 100644 index 000000000..7eff705e3 --- /dev/null +++ b/app/src/main/res/layout/activity_summary_details.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +