1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-20 20:10:15 +02:00

Add final tweaks to Daily Sessions List Dashboard view

This commit is contained in:
vanous 2020-11-13 14:21:23 +01:00
parent 5f85bba438
commit 71f6fd77cb
4 changed files with 130 additions and 128 deletions

View File

@ -8,10 +8,12 @@ import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.utils.MPPointF;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -29,15 +31,15 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
public class ActivityListingAdapter extends AbstractActivityListingAdapter<ActivitySession> {
public static final String ACTIVE_STEPS_CHART_COLOR = "#3498db";
public static final String DISTANCE_CHART_COLOR = "#f1c40f";
public static final String ACTIVE_TIME_CHART_COLOR = "#e74c3c";
public static final String CHART_COLOR_START = "#e74c3c";
public static final String CHART_COLOR_END = "#2ecc71";
protected static final Logger LOG = LoggerFactory.getLogger(AbstractWeekChartFragment.class);
protected final int ANIM_TIME = 250;
private final int SESSION_SUMMARY = ActivitySession.SESSION_SUMMARY;
ActivityUser activityUser = new ActivityUser();
int stepsGoal = activityUser.getStepsGoal();
int distanceMeters = activityUser.getDistanceMeters();
long activeTimeMillis = activityUser.getActiveTimeMinutes() * 60 * 1000L;
int distanceGoalMeters = activityUser.getDistanceMeters();
long activeTimeGoalTimeMillis = activityUser.getActiveTimeMinutes() * 60 * 1000L;
public ActivityListingAdapter(Context context) {
super(context);
@ -48,53 +50,44 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.activity_list_dashboard_item, parent, false);
PieChart ActiveStepsChart;
PieChart DistanceChart;
PieChart ActiveTimeChart;
ActiveStepsChart = view.findViewById(R.id.activity_dashboard_piechart1);
setUpChart(ActiveStepsChart);
setStepsData(item, ActiveStepsChart, context);
int steps = item.getActiveSteps();
setChartsData(ActiveStepsChart, steps, stepsGoal, context.getString(R.string.activity_list_summary_active_steps), context);
DistanceChart = view.findViewById(R.id.activity_dashboard_piechart2);
setUpChart(DistanceChart);
setDistanceData(item, DistanceChart, context);
float distance = item.getDistance();
setChartsData(DistanceChart, distance, distanceGoalMeters, context.getString(R.string.distance), context);
ActiveTimeChart = view.findViewById(R.id.activity_dashboard_piechart3);
setUpChart(ActiveTimeChart);
setDurationData(item, ActiveTimeChart, context);
long duration = item.getEndTime().getTime() - item.getStartTime().getTime();
setChartsData(ActiveTimeChart, duration, activeTimeGoalTimeMillis, context.getString(R.string.activity_list_summary_active_time), context);
TextView stepLabel = view.findViewById(R.id.line_layout_step_label);
TextView stepTotalLabel = view.findViewById(R.id.line_layout_total_step_label);
TextView distanceLabel = view.findViewById(R.id.line_layout_distance_label);
TextView hrLabel = view.findViewById(R.id.heartrate_widget_label);
TextView intensityLabel = view.findViewById(R.id.intensity_widget_label);
TextView intensity2Label = view.findViewById(R.id.line_layout_intensity2_label);
TextView durationLabel = view.findViewById(R.id.line_layout_duration_label);
TextView sessionCountLabel = view.findViewById(R.id.line_layout_count_label);
LinearLayout durationLayout = view.findViewById(R.id.line_layout_duration);
LinearLayout countLayout = view.findViewById(R.id.line_layout_count);
View hrLayout = view.findViewById(R.id.heartrate_widget_icon);
LinearLayout stepsLayout = view.findViewById(R.id.line_layout_step);
LinearLayout stepsTotalLayout = view.findViewById(R.id.line_layout_total_step);
LinearLayout distanceLayout = view.findViewById(R.id.line_layout_distance);
View intensityLayout = view.findViewById(R.id.intensity_widget_icon);
View intensity2Layout = view.findViewById(R.id.line_layout_intensity2);
stepLabel.setText(getStepLabel(item));
stepTotalLabel.setText(getStepTotalLabel(item));
distanceLabel.setText(getDistanceLabel(item));
hrLabel.setText(getHrLabel(item));
intensityLabel.setText(getIntensityLabel(item));
@ -147,70 +140,38 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
return view;
}
private void setStepsData(ActivitySession item, PieChart DashboardChart, Context context) {
private void setChartsData(PieChart pieChart, float value, float target, String label, Context context) {
ArrayList<PieEntry> entries = new ArrayList<>();
int steps = item.getActiveSteps();
entries.add(new PieEntry((float) steps));
entries.add(new PieEntry((float) value, context.getResources().getDrawable(R.drawable.ic_star_gold)));
if (steps < stepsGoal) {
entries.add(new PieEntry((float) (stepsGoal - steps)));
Easing.EasingFunction animationEffect = Easing.EaseInOutSine;
if (value < target) {
entries.add(new PieEntry((float) (target - value)));
}
DashboardChart.setCenterText(String.format("%d%%\n%s", (int) (steps * 100 / stepsGoal), context.getString(R.string.activity_list_summary_active_steps)));
pieChart.setCenterText(String.format("%d%%\n%s", (int) (value * 100 / target), label));
float colorValue = Math.max(0, Math.min(1, value / target));
int chartColor = interpolateColor(Color.parseColor(CHART_COLOR_START), Color.parseColor(CHART_COLOR_END), colorValue);
PieDataSet dataSet = new PieDataSet(entries, "");
dataSet.setDrawIcons(false);
dataSet.setIconsOffset(new MPPointF(0, -66));
if (colorValue == 1) {
dataSet.setDrawIcons(true);
}
dataSet.setSliceSpace(0f);
dataSet.setSelectionShift(5f);
dataSet.setColors(chartColor, Color.LTGRAY);
dataSet.setColors(Color.parseColor(ACTIVE_STEPS_CHART_COLOR), Color.LTGRAY);
PieData data = new PieData(dataSet);
data.setValueTextSize(0f);
data.setValueTextColor(Color.WHITE);
DashboardChart.setData(data);
DashboardChart.invalidate();
}
private void setDistanceData(ActivitySession item, PieChart DashboardChart, Context context) {
ArrayList<PieEntry> entries = new ArrayList<>();
float distance = item.getDistance();
entries.add(new PieEntry(distance));
if (distance < distanceMeters) {
entries.add(new PieEntry((float) (distanceMeters - distance)));
}
DashboardChart.setCenterText(String.format("%d%%\n%s", (int) (distance * 100 / distanceMeters), context.getString(R.string.distance)));
PieDataSet dataSet = new PieDataSet(entries, "");
dataSet.setSliceSpace(0f);
dataSet.setSelectionShift(5f);
dataSet.setColors(Color.parseColor(DISTANCE_CHART_COLOR), Color.LTGRAY);
PieData data = new PieData(dataSet);
data.setValueTextSize(0f);
data.setValueTextColor(Color.WHITE);
DashboardChart.setData(data);
DashboardChart.invalidate();
}
private void setDurationData(ActivitySession item, PieChart DashboardChart, Context context) {
ArrayList<PieEntry> entries = new ArrayList<>();
long duration = item.getEndTime().getTime() - item.getStartTime().getTime();
entries.add(new PieEntry((float) duration));
if (duration < activeTimeMillis) {
entries.add(new PieEntry((float) (activeTimeMillis - duration)));
}
DashboardChart.setCenterText(String.format("%d%%\n%s", (int) (duration * 100 / activeTimeMillis), context.getString(R.string.activity_list_summary_active_time)));
PieDataSet dataSet = new PieDataSet(entries, "");
dataSet.setSliceSpace(0f);
dataSet.setSelectionShift(5f);
dataSet.setColors(Color.parseColor(ACTIVE_TIME_CHART_COLOR), Color.LTGRAY);
PieData data = new PieData(dataSet);
data.setValueTextSize(0f);
data.setValueTextColor(Color.WHITE);
DashboardChart.setData(data);
DashboardChart.invalidate();
pieChart.setData(data);
pieChart.invalidate();
pieChart.animateY(ANIM_TIME, animationEffect);
}
private void setUpChart(PieChart DashboardChart) {
@ -229,6 +190,21 @@ public class ActivityListingAdapter extends AbstractActivityListingAdapter<Activ
DashboardChart.setCenterTextOffset(0, 0);
}
private float interpolate(float a, float b, float proportion) {
return (a + ((b - a) * proportion));
}
private int interpolateColor(int a, int b, float proportion) {
float[] hsva = new float[3];
float[] hsvb = new float[3];
Color.colorToHSV(a, hsva);
Color.colorToHSV(b, hsvb);
for (int i = 0; i < 3; i++) {
hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
}
return Color.HSVToColor(hsvb);
}
@Override
protected String getDateLabel(ActivitySession item) {
return "";

View File

@ -27,6 +27,7 @@ import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.Chart;
import org.slf4j.Logger;
@ -106,7 +107,7 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
protected void updateChartsnUIThread(ChartsData chartsData) {
MyChartsData mcd = (MyChartsData) chartsData;
if (mcd.getStepSessions().toArray().length == 0) {
getChartsHost().enableSwipeRefresh(true); //try to enable pull to refresh, might be needed
getChartsHost().enableSwipeRefresh(true); //enable pull to refresh, might be needed
} else {
getChartsHost().enableSwipeRefresh(false); //disable pull to refresh as it collides with swipable view
}
@ -117,8 +118,7 @@ public class ActivityListingChartFragment extends AbstractChartFragment {
@Override
protected void renderCharts() {
}
}
@Override
protected void setupLegend(Chart chart) {

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/holo_orange_light"
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z" />
</vector>

View File

@ -16,39 +16,34 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart1"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp"
android:layout_weight="1" />
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart1"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp"
android:layout_weight="1" />
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart2"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp"
android:layout_weight="1" />
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart2"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp"
android:layout_weight="1" />
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart3"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp"
android:layout_weight="1" />
<!--
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart3"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp"
android:layout_weight="1" />
<!--
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/activity_dashboard_piechart4"
android:layout_width="90dp"
@ -56,15 +51,13 @@
android:layout_gravity="bottom|center"
android:layout_marginBottom="0dp" />
-->
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginBottom="5dp"
android:layout_marginBottom="0dp"
android:gravity="center"
android:orientation="horizontal">
@ -99,15 +92,15 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="0dp"
android:layout_marginBottom="10dp"
android:baselineAligned="false"
android:gravity="bottom|center"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/line_layout_step"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginStart="1dp"
@ -132,7 +125,10 @@
android:gravity="center"
android:maxLines="2"
android:scrollHorizontally="false"
android:text="@string/activity_list_summary_active_steps" />
android:text="@string/activity_list_summary_active_steps"
android:textAllCaps="true"
android:textColor="@color/accent"
android:textStyle="bold" />
<TextView
android:id="@+id/line_layout_step_label"
@ -143,14 +139,15 @@
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="false"
android:text="15000" />
android:text="15000"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_layout_distance"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginStart="1dp"
@ -175,7 +172,10 @@
android:gravity="center"
android:maxLines="2"
android:scrollHorizontally="false"
android:text="@string/distance" />
android:text="@string/distance"
android:textAllCaps="true"
android:textColor="@color/accent"
android:textStyle="bold" />
<TextView
android:id="@+id/line_layout_distance_label"
@ -186,14 +186,15 @@
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="false"
android:text="15.1km" />
android:text="15.1km"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_layout_duration"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginStart="1dp"
@ -218,7 +219,10 @@
android:gravity="center"
android:maxLines="2"
android:scrollHorizontally="false"
android:text="@string/activity_list_summary_active_time" />
android:text="@string/activity_list_summary_active_time"
android:textAllCaps="true"
android:textColor="@color/accent"
android:textStyle="bold" />
<TextView
android:id="@+id/line_layout_duration_label"
@ -229,7 +233,8 @@
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="false"
android:text="122" />
android:text="122"
android:textSize="24sp" />
</LinearLayout>
@ -247,7 +252,7 @@
<LinearLayout
android:id="@+id/line_layout_total_step"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginStart="1dp"
@ -272,7 +277,10 @@
android:gravity="center"
android:maxLines="2"
android:scrollHorizontally="false"
android:text="@string/live_activity_total_steps" />
android:text="@string/live_activity_total_steps"
android:textAllCaps="true"
android:textColor="@color/accent"
android:textStyle="bold" />
<TextView
android:id="@+id/line_layout_total_step_label"
@ -283,14 +291,15 @@
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="false"
android:text="15000" />
android:text="15000"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_layout_count"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginStart="1dp"
@ -315,7 +324,10 @@
android:gravity="center"
android:maxLines="2"
android:scrollHorizontally="false"
android:text="@string/activity_list_summary_activities" />
android:text="@string/activity_list_summary_activities"
android:textAllCaps="true"
android:textColor="@color/accent"
android:textStyle="bold" />
<TextView
android:id="@+id/line_layout_count_label"
@ -326,15 +338,16 @@
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="false"
android:text="15" />
android:text="15"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/line_layout_intensity2"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_gravity="center|top"
android:layout_marginStart="1dp"
android:layout_marginEnd="1dp"
android:layout_weight="1"
@ -357,7 +370,10 @@
android:gravity="center"
android:maxLines="2"
android:scrollHorizontally="false"
android:text="@string/activity_list_summary_intensity" />
android:text="@string/activity_list_summary_intensity"
android:textAllCaps="true"
android:textColor="@color/accent"
android:textStyle="bold" />
<TextView
android:id="@+id/line_layout_intensity2_label"
@ -368,7 +384,8 @@
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="false"
android:text="15" />
android:text="15"
android:textSize="24sp" />
</LinearLayout>