diff --git a/app/build.gradle b/app/build.gradle index 770827ff..f74714b0 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 131383df..8eac8707 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 351fa573..789e5535 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 1ef20c9b..643f880a 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 78a22f73..20dcbef9 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 79ffba3f..950f89e0 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