From 184e0f2deaa38033526451fd341eebb65b4921aa Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Mon, 20 Jul 2015 23:11:16 +0200 Subject: [PATCH] New dependency to format durations (and use that where applicable) --- app/build.gradle | 1 + .../freeyourgadget/gadgetbridge/GB.java | 13 ++++++++ .../activities/AbstractChartFragment.java | 13 ++++++++ .../activities/SleepChartFragment.java | 30 +++++++++++-------- .../gadgetbridge/miband/MiBandSupport.java | 7 ++++- app/src/main/res/values/strings.xml | 2 +- 6 files changed, 51 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 770827ff0..f74714b01 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,4 +27,5 @@ dependencies { compile 'com.github.tony19:logback-android-classic:1.1.1-3' compile 'org.slf4j:slf4j-api:1.7.7' compile 'com.github.PhilJay:MPAndroidChart:2.1.0' + compile 'com.github.pfichtner:durationformatter:0.1.1' } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GB.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GB.java index 131383dfb..8eac87078 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GB.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GB.java @@ -14,6 +14,8 @@ import android.os.Looper; import android.support.v4.app.NotificationCompat; import android.widget.Toast; +import com.github.pfichtner.durationformatter.DurationFormatter; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,6 +24,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.concurrent.TimeUnit; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventScreenshot; import nodomain.freeyourgadget.gadgetbridge.externalevents.K9Receiver; @@ -248,4 +251,14 @@ public class GB { break; } } + + public static String formatDurationHoursMinutes(long duration, TimeUnit unit) { + DurationFormatter df = DurationFormatter.Builder.SYMBOLS + .maximum(TimeUnit.DAYS) + .minimum(TimeUnit.MINUTES) + .suppressZeros(DurationFormatter.SuppressZeros.LEADING) + .maximumAmountOfUnitsToShow(2) + .build(); + return df.format(duration, unit); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractChartFragment.java index 351fa573b..789e55357 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AbstractChartFragment.java @@ -24,6 +24,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBActivitySample; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBDevice; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind; import nodomain.freeyourgadget.gadgetbridge.charts.SleepUtils; public abstract class AbstractChartFragment extends Fragment { @@ -54,6 +55,18 @@ public abstract class AbstractChartFragment extends Fragment { protected static final int CHART_TEXT_COLOR = Color.WHITE; protected static final int LEGEND_TEXT_COLOR = Color.WHITE; + protected Integer getColorFor(int activityKind) { + switch (activityKind) { + case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_DEEP_SLEEP: + return akDeepSleep.color; + case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_LIGHT_SLEEP: + return akLightSleep.color; + case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_ACTIVITY: + return akActivity.color; + } + return akActivity.color; + } + protected byte getProvider(GBDevice device) { byte provider = -1; switch (device.getType()) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepChartFragment.java index 1ef20c9b2..643f880a8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SleepChartFragment.java @@ -18,14 +18,18 @@ import com.github.mikephil.charting.components.YAxis; 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.ValueFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import nodomain.freeyourgadget.gadgetbridge.ControlCenter; +import nodomain.freeyourgadget.gadgetbridge.GB; import nodomain.freeyourgadget.gadgetbridge.GBActivitySample; import nodomain.freeyourgadget.gadgetbridge.GBDevice; import nodomain.freeyourgadget.gadgetbridge.R; @@ -77,18 +81,25 @@ public class SleepChartFragment extends AbstractChartFragment { private void refreshSleepAmounts(GBDevice mGBDevice, PieChart pieChart, List samples) { ActivityAnalysis analysis = new ActivityAnalysis(); ActivityAmounts amounts = analysis.calculateActivityAmounts(samples); - float hoursOfSleep = amounts.getTotalSeconds() / (float) (60 * 60); - pieChart.setCenterText((int)hoursOfSleep + "h"); // FIXME + String totalSleep = GB.formatDurationHoursMinutes(amounts.getTotalSeconds(), TimeUnit.SECONDS); + pieChart.setCenterText(totalSleep); PieData data = new PieData(); List entries = new ArrayList<>(); List colors = new ArrayList<>(); int index = 0; for (ActivityAmount amount : amounts.getAmounts()) { + long value = amount.getTotalSeconds(); entries.add(new Entry(amount.getTotalSeconds(), index++)); colors.add(getColorFor(amount.getActivityKind())); data.addXValue(amount.getName(getActivity())); } - PieDataSet set = new PieDataSet(entries, "Sleep comparison"); + PieDataSet set = new PieDataSet(entries, ""); + set.setValueFormatter(new ValueFormatter() { + @Override + public String getFormattedValue(float value) { + return GB.formatDurationHoursMinutes((long)value, TimeUnit.SECONDS); + } + }); set.setColors(colors); data.setDataSet(set); pieChart.setData(data); @@ -98,16 +109,6 @@ public class SleepChartFragment extends AbstractChartFragment { pieChart.invalidate(); } - private Integer getColorFor(int activityKind) { - switch (activityKind) { - case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_DEEP_SLEEP: - return akDeepSleep.color; - case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_LIGHT_SLEEP: - return akLightSleep.color; - } - return akActivity.color; - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -138,6 +139,9 @@ public class SleepChartFragment extends AbstractChartFragment { private void setupSleepAmountChart() { mSleepAmountChart.setBackgroundColor(BACKGROUND_COLOR); mSleepAmountChart.setDescriptionColor(DESCRIPTION_COLOR); + mSleepAmountChart.setDescription(""); + mSleepAmountChart.setNoDataTextDescription(""); + mSleepAmountChart.setNoDataText(""); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java index 78a22f738..20dcbef91 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.UUID; +import java.util.concurrent.TimeUnit; import nodomain.freeyourgadget.gadgetbridge.GB; import nodomain.freeyourgadget.gadgetbridge.GBActivitySample; @@ -652,7 +653,11 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { // after dataUntilNextHeader bytes we will get a new packet of 11 bytes that should be parsed // as we just did - GB.toast(getContext().getString(R.string.user_feedback_miband_activity_data_transfer,(dataUntilNextHeader / 3), DateFormat.getDateTimeInstance().format(timestamp.getTime())), Toast.LENGTH_SHORT, GB.INFO); + if (dataUntilNextHeader != 0) { + GB.toast(getContext().getString(R.string.user_feedback_miband_activity_data_transfer, + GB.formatDurationHoursMinutes(dataUntilNextHeader / 3, TimeUnit.MINUTES), + DateFormat.getDateTimeInstance().format(timestamp.getTime())), Toast.LENGTH_LONG, GB.INFO); + } LOG.info("total data to read: " + totalDataToRead + " len: " + (totalDataToRead / 3) + " minute(s)"); LOG.info("data to read until next header: " + dataUntilNextHeader + " len: " + (dataUntilNextHeader / 3) + " minute(s)"); LOG.info("TIMESTAMP: " + DateFormat.getDateTimeInstance().format(timestamp.getTime()).toString() + " magic byte: " + dataUntilNextHeader); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79ffba3ff..950f89e06 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,5 +152,5 @@ There was an error setting the alarms, please try again! Alarms sent to device! No data. Synchronize device? - About to transfer %1$s minute(s) of data starting from %2$s + About to transfer %1$s of data starting from %2$s