Dashboard: Hack horizontal today widget

This commit is contained in:
José Rebelo 2024-08-27 16:49:20 +01:00
parent 7fa0cef1c1
commit 0dfeb378ca
3 changed files with 133 additions and 238 deletions

View File

@ -25,7 +25,7 @@ import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
class SampleXLabelFormatter extends ValueFormatter {
public class SampleXLabelFormatter extends ValueFormatter {
private final TimestampTranslation tsTranslation;
@SuppressLint("SimpleDateFormat")
private final SimpleDateFormat annotationDateFormat = new SimpleDateFormat("HH:mm");

View File

@ -35,6 +35,15 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -49,7 +58,10 @@ import java.util.TreeMap;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment;
import nodomain.freeyourgadget.gadgetbridge.activities.charts.DefaultChartsData;
import nodomain.freeyourgadget.gadgetbridge.activities.charts.SampleXLabelFormatter;
import nodomain.freeyourgadget.gadgetbridge.activities.charts.StepAnalysis;
import nodomain.freeyourgadget.gadgetbridge.activities.charts.TimestampTranslation;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
@ -68,7 +80,7 @@ public class DashboardTodayWidget extends AbstractDashboardWidget {
private static final Logger LOG = LoggerFactory.getLogger(DashboardTodayWidget.class);
private View todayView;
private ImageView todayChart;
private LineChart mActivityChart;
private boolean mode_24h;
@ -94,33 +106,7 @@ public class DashboardTodayWidget extends AbstractDashboardWidget {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
todayView = inflater.inflate(R.layout.dashboard_widget_today, container, false);
todayChart = todayView.findViewById(R.id.dashboard_today_chart);
// Determine whether to draw a single or a double chart. In case 24h mode is selected,
// use just the outer chart (chart_12_24) for all data.
Prefs prefs = GBApplication.getPrefs();
mode_24h = prefs.getBoolean("dashboard_widget_today_24h", false);
// Initialize legend
TextView legend = todayView.findViewById(R.id.dashboard_piechart_legend);
SpannableString l_not_worn = new SpannableString("" + getString(R.string.abstract_chart_fragment_kind_not_worn));
l_not_worn.setSpan(new ForegroundColorSpan(color_not_worn), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString l_worn = new SpannableString("" + getString(R.string.activity_type_worn));
l_worn.setSpan(new ForegroundColorSpan(color_worn), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString l_activity = new SpannableString("" + getString(R.string.activity_type_activity));
l_activity.setSpan(new ForegroundColorSpan(color_activity), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString l_exercise = new SpannableString("" + getString(R.string.activity_type_exercise));
l_exercise.setSpan(new ForegroundColorSpan(color_exercise), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString l_deep_sleep = new SpannableString("" + getString(R.string.activity_type_deep_sleep));
l_deep_sleep.setSpan(new ForegroundColorSpan(color_deep_sleep), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString l_light_sleep = new SpannableString("" + getString(R.string.activity_type_light_sleep));
l_light_sleep.setSpan(new ForegroundColorSpan(color_light_sleep), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString l_rem_sleep = new SpannableString("" + getString(R.string.activity_type_rem_sleep));
l_rem_sleep.setSpan(new ForegroundColorSpan(color_rem_sleep), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableStringBuilder legendBuilder = new SpannableStringBuilder();
legend.setText(legendBuilder.append(l_not_worn).append(" ").append(l_worn).append("\n").append(l_activity).append(" ").append(l_exercise).append("\n").append(l_light_sleep).append(" ").append(l_deep_sleep).append(" ").append(l_rem_sleep));
legend.setVisibility(prefs.getBoolean("dashboard_widget_today_legend", true) ? View.VISIBLE : View.GONE);
mActivityChart = todayView.findViewById(R.id.dashboard_today_horizontal);
if (dashboardData.generalizedActivities.isEmpty()) {
fillData();
@ -134,203 +120,119 @@ public class DashboardTodayWidget extends AbstractDashboardWidget {
@Override
public void onResume() {
super.onResume();
if (todayChart != null) fillData();
if (mActivityChart != null) fillData();
}
private void draw() {
Prefs prefs = GBApplication.getPrefs();
boolean upsideDown24h = prefs.getBoolean("dashboard_widget_today_24h_upside_down", false);
// Prepare circular chart
long midDaySecond = dashboardData.timeFrom + (12 * 60 * 60);
int width = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = width;
int barWidth = Math.round(width * 0.08f);
int hourTextSp = Math.round(width * 0.024f);
float hourTextPixels = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
hourTextSp,
GBApplication.getContext().getResources().getDisplayMetrics()
);
float outerCircleMargin = mode_24h ? barWidth / 2f : barWidth / 2f + hourTextPixels * 1.3f;
float innerCircleMargin = outerCircleMargin + barWidth * 1.3f;
float degreeFactor = mode_24h ? 240 : 120;
Bitmap todayBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(todayBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
// Draw clock stripes
float clockMargin = outerCircleMargin + (mode_24h ? barWidth : barWidth*2.3f);
int clockStripesInterval = mode_24h ? 15 : 30;
float clockStripesWidth = barWidth / 3f;
paint.setStrokeWidth(clockStripesWidth);
paint.setColor(color_worn);
for (int i=0; i<360; i+=clockStripesInterval) {
canvas.drawArc(clockMargin, clockMargin, width - clockMargin, height - clockMargin, i, 1, false, paint);
}
// Draw hours
boolean normalClock = DateFormat.is24HourFormat(GBApplication.getContext());
Map<Integer, String> hours = new HashMap<Integer, String>() {
{
put(0, normalClock ? (mode_24h ? "0" : "12") : "12pm");
put(3, "3");
put(6, normalClock ? "6" : "6am");
put(9, "9");
put(12, normalClock ? (mode_24h ? "12" : "0") : "12am");
put(15, normalClock ? "15" : "3");
put(18, normalClock ? "18" : "6pm");
put(21, normalClock ? "21" : "9");
}
};
Paint textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setColor(color_worn);
textPaint.setTextSize(hourTextPixels);
textPaint.setTextAlign(Paint.Align.CENTER);
Rect textBounds = new Rect();
if (mode_24h && upsideDown24h) {
textPaint.getTextBounds(hours.get(0), 0, hours.get(0).length(), textBounds);
canvas.drawText(hours.get(0), width / 2f, height - (clockMargin + clockStripesWidth), textPaint);
textPaint.getTextBounds(hours.get(6), 0, hours.get(6).length(), textBounds);
canvas.drawText(hours.get(6), clockMargin + clockStripesWidth + textBounds.width() / 2f, height / 2f + textBounds.height() / 2f, textPaint);
textPaint.getTextBounds(hours.get(12), 0, hours.get(12).length(), textBounds);
canvas.drawText(hours.get(12), width / 2f, clockMargin + clockStripesWidth + textBounds.height(), textPaint);
textPaint.getTextBounds(hours.get(18), 0, hours.get(18).length(), textBounds);
canvas.drawText(hours.get(18), width - (clockMargin + clockStripesWidth + textBounds.width()), height / 2f + textBounds.height() / 2f, textPaint);
} else if (mode_24h) {
textPaint.getTextBounds(hours.get(0), 0, hours.get(0).length(), textBounds);
canvas.drawText(hours.get(0), width / 2f, clockMargin + clockStripesWidth + textBounds.height(), textPaint);
textPaint.getTextBounds(hours.get(6), 0, hours.get(6).length(), textBounds);
canvas.drawText(hours.get(6), width - (clockMargin + clockStripesWidth + textBounds.width()), height / 2f + textBounds.height() / 2f, textPaint);
textPaint.getTextBounds(hours.get(12), 0, hours.get(12).length(), textBounds);
canvas.drawText(hours.get(12), width / 2f, height - (clockMargin + clockStripesWidth), textPaint);
textPaint.getTextBounds(hours.get(18), 0, hours.get(18).length(), textBounds);
canvas.drawText(hours.get(18), clockMargin + clockStripesWidth + textBounds.width() / 2f, height / 2f + textBounds.height() / 2f, textPaint);
} else {
textPaint.getTextBounds(hours.get(0), 0, hours.get(0).length(), textBounds);
canvas.drawText(hours.get(0), width / 2f, textBounds.height(), textPaint);
textPaint.getTextBounds(hours.get(3), 0, hours.get(3).length(), textBounds);
canvas.drawText(hours.get(3), width - (clockMargin + clockStripesWidth + textBounds.width()), height / 2f + textBounds.height() / 2f, textPaint);
textPaint.getTextBounds(hours.get(6), 0, hours.get(6).length(), textBounds);
canvas.drawText(hours.get(6), width / 2f, height - (clockMargin + clockStripesWidth), textPaint);
textPaint.getTextBounds(hours.get(9), 0, hours.get(9).length(), textBounds);
canvas.drawText(hours.get(9), clockMargin + clockStripesWidth + textBounds.width() / 2f, height / 2f + textBounds.height() / 2f, textPaint);
textPaint.getTextBounds(hours.get(12), 0, hours.get(12).length(), textBounds);
canvas.drawText(hours.get(12), width / 2f, clockMargin + clockStripesWidth + textBounds.height(), textPaint);
textPaint.getTextBounds(hours.get(15), 0, hours.get(15).length(), textBounds);
canvas.drawText(hours.get(15), (float) (width - Math.ceil(textBounds.width() / 2f)), height / 2f + textBounds.height() / 2f, textPaint);
textPaint.getTextBounds(hours.get(18), 0, hours.get(18).length(), textBounds);
canvas.drawText(hours.get(18), width / 2f, height - textBounds.height() / 2f, textPaint);
textPaint.setTextAlign(Paint.Align.LEFT);
textPaint.getTextBounds(hours.get(21), 0, hours.get(21).length(), textBounds);
canvas.drawText(hours.get(21), 1, height / 2f + textBounds.height() / 2f, textPaint);
}
// Draw generalized activities on circular chart
long secondIndex = dashboardData.timeFrom;
long currentTime = Calendar.getInstance().getTimeInMillis() / 1000;
int startAngle = mode_24h && upsideDown24h ? 90 : 270;
mActivityChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317
//mActivityChart.getXAxis().setValueFormatter(mcd.getChartsData().getXValueFormatter());
mActivityChart.getAxisLeft().setDrawLabels(false);
final Map<ActivityKind, List<Entry>> entries = new HashMap<ActivityKind, List<Entry>>() {{
put(ActivityKind.NOT_MEASURED, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.NOT_WORN, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.LIGHT_SLEEP, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.SLEEP_ANY, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.REM_SLEEP, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.DEEP_SLEEP, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.AWAKE_SLEEP, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.EXERCISE, new ArrayList<>(dashboardData.generalizedActivities.size()));
put(ActivityKind.ACTIVITY, new ArrayList<>(dashboardData.generalizedActivities.size()));
}};
final Map<ActivityKind, Integer> colors = new HashMap<ActivityKind, Integer>() {{
put(ActivityKind.NOT_MEASURED, color_worn);
put(ActivityKind.NOT_WORN, color_not_worn);
put(ActivityKind.LIGHT_SLEEP, color_light_sleep);
put(ActivityKind.SLEEP_ANY, color_light_sleep);
put(ActivityKind.REM_SLEEP, color_rem_sleep);
put(ActivityKind.DEEP_SLEEP, color_deep_sleep);
put(ActivityKind.AWAKE_SLEEP, color_awake_sleep);
put(ActivityKind.EXERCISE, color_exercise);
put(ActivityKind.ACTIVITY, color_activity);
}};
final Map<ActivityKind, String> labels = new HashMap<ActivityKind, String>() {{
put(ActivityKind.NOT_MEASURED, "Worn");
put(ActivityKind.NOT_WORN, "Not Worn");
put(ActivityKind.LIGHT_SLEEP, "Light Sleep");
put(ActivityKind.SLEEP_ANY, "Sleep");
put(ActivityKind.REM_SLEEP, "REM Sleep");
put(ActivityKind.DEEP_SLEEP, "Deep Sleep");
put(ActivityKind.AWAKE_SLEEP, "Awake Sleep");
put(ActivityKind.EXERCISE, "Exercise");
put(ActivityKind.ACTIVITY, "Activity");
}};
final Map<ActivityKind, Integer> height = new HashMap<ActivityKind, Integer>() {{
put(ActivityKind.NOT_MEASURED, 10);
put(ActivityKind.NOT_WORN, 5);
put(ActivityKind.LIGHT_SLEEP, 30);
put(ActivityKind.SLEEP_ANY, 30);
put(ActivityKind.REM_SLEEP, 35);
put(ActivityKind.DEEP_SLEEP, 25);
put(ActivityKind.AWAKE_SLEEP, 40);
put(ActivityKind.EXERCISE, 35);
put(ActivityKind.ACTIVITY, 30);
}};
synchronized (dashboardData.generalizedActivities) {
for (DashboardFragment.DashboardData.GeneralizedActivity activity : dashboardData.generalizedActivities) {
// Determine margin depending on 24h/12h mode
float margin = (mode_24h || activity.timeFrom >= midDaySecond) ? outerCircleMargin : innerCircleMargin;
// Draw inactive slices
if (!mode_24h && secondIndex < midDaySecond && activity.timeFrom >= midDaySecond) {
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(innerCircleMargin, innerCircleMargin, width - innerCircleMargin, height - innerCircleMargin, startAngle + (secondIndex - dashboardData.timeFrom) / degreeFactor, (midDaySecond - secondIndex) / degreeFactor, false, paint);
secondIndex = midDaySecond;
}
if (activity.timeFrom > secondIndex) {
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(margin, margin, width - margin, height - margin, startAngle + (secondIndex - dashboardData.timeFrom) / degreeFactor, (activity.timeFrom - secondIndex) / degreeFactor, false, paint);
}
float start_angle = startAngle + (activity.timeFrom - dashboardData.timeFrom) / degreeFactor;
float sweep_angle = (activity.timeTo - activity.timeFrom) / degreeFactor;
if (activity.activityKind == ActivityKind.NOT_MEASURED) {
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_worn);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else if (activity.activityKind == ActivityKind.NOT_WORN) {
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_not_worn);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else if (activity.activityKind == ActivityKind.LIGHT_SLEEP || activity.activityKind == ActivityKind.SLEEP_ANY) {
paint.setStrokeWidth(barWidth);
paint.setColor(color_light_sleep);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else if (activity.activityKind == ActivityKind.REM_SLEEP) {
paint.setStrokeWidth(barWidth);
paint.setColor(color_rem_sleep);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else if (activity.activityKind == ActivityKind.DEEP_SLEEP) {
paint.setStrokeWidth(barWidth);
paint.setColor(color_deep_sleep);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else if (activity.activityKind == ActivityKind.AWAKE_SLEEP) {
paint.setStrokeWidth(barWidth);
paint.setColor(color_awake_sleep);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else if (activity.activityKind == ActivityKind.EXERCISE) {
paint.setStrokeWidth(barWidth);
paint.setColor(color_exercise);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
} else {
paint.setStrokeWidth(barWidth);
paint.setColor(color_activity);
canvas.drawArc(margin, margin, width - margin, height - margin, start_angle, sweep_angle, false, paint);
}
secondIndex = activity.timeTo;
}
}
// Fill remaining time until current time in 12h mode before midday
if (!mode_24h && currentTime < midDaySecond) {
// Fill inner bar up until current time
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(innerCircleMargin, innerCircleMargin, width - innerCircleMargin, height - innerCircleMargin, startAngle + (secondIndex - dashboardData.timeFrom) / degreeFactor, (currentTime - secondIndex) / degreeFactor, false, paint);
// Fill inner bar up until midday
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(innerCircleMargin, innerCircleMargin, width - innerCircleMargin, height - innerCircleMargin, startAngle + (currentTime - dashboardData.timeFrom) / degreeFactor, (midDaySecond - currentTime) / degreeFactor, false, paint);
// Fill outer bar up until midnight
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(outerCircleMargin, outerCircleMargin, width - outerCircleMargin, height - outerCircleMargin, 0, 360, false, paint);
}
// Fill remaining time until current time in 24h mode or in 12h mode after midday
if ((mode_24h || currentTime >= midDaySecond) && currentTime < dashboardData.timeTo) {
// Fill inner bar up until midday
if (!mode_24h && secondIndex < midDaySecond) {
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(innerCircleMargin, innerCircleMargin, width - innerCircleMargin, height - innerCircleMargin, startAngle + (secondIndex - dashboardData.timeFrom) / degreeFactor, (midDaySecond - secondIndex) / degreeFactor, false, paint);
secondIndex = midDaySecond;
}
// Fill outer bar up until current time
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(outerCircleMargin, outerCircleMargin, width - outerCircleMargin, height - outerCircleMargin, startAngle + (secondIndex - dashboardData.timeFrom) / degreeFactor, (currentTime - secondIndex) / degreeFactor, false, paint);
// Fill outer bar up until midnight
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(outerCircleMargin, outerCircleMargin, width - outerCircleMargin, height - outerCircleMargin, startAngle + (currentTime - dashboardData.timeFrom) / degreeFactor, (dashboardData.timeTo - currentTime) / degreeFactor, false, paint);
}
// Only when displaying a past day
if (secondIndex < dashboardData.timeTo && currentTime > dashboardData.timeTo) {
// Fill outer bar up until midnight
paint.setStrokeWidth(barWidth / 3f);
paint.setColor(color_unknown);
canvas.drawArc(outerCircleMargin, outerCircleMargin, width - outerCircleMargin, height - outerCircleMargin, startAngle + (secondIndex - dashboardData.timeFrom) / degreeFactor, (dashboardData.timeTo - secondIndex) / degreeFactor, false, paint);
}
TimestampTranslation tsTranslation = new TimestampTranslation();
todayChart.setImageBitmap(todayBitmap);
for (DashboardFragment.DashboardData.GeneralizedActivity activity : dashboardData.generalizedActivities) {
if (!entries.containsKey(activity.activityKind)) {
LOG.error("???? {}", activity.activityKind);
continue;
}
int tsFrom = tsTranslation.shorten((int) activity.timeFrom);
int tsTo = tsTranslation.shorten((int) activity.timeTo);
entries.get(activity.activityKind).add(new Entry(tsFrom, height.get(activity.activityKind)));
entries.get(activity.activityKind).add(new Entry(tsTo, height.get(activity.activityKind)));
for (final Map.Entry<ActivityKind, List<Entry>> e : entries.entrySet()) {
if (e.getKey() != activity.activityKind) {
entries.get(e.getKey()).add(new Entry(tsFrom, 0));
entries.get(e.getKey()).add(new Entry(tsTo, 0));
}
}
}
for (final Map.Entry<ActivityKind, List<Entry>> e : entries.entrySet()) {
List<Entry> e2 = entries.get(e.getKey());
e2.add(new Entry(e2.get(e2.size() - 1).getX(), 0));
e2.add(new Entry(tsTranslation.shorten(dashboardData.timeTo), 0));
}
List<ILineDataSet> lineDataSets = new ArrayList<>();
for (final Map.Entry<ActivityKind, List<Entry>> e : entries.entrySet()) {
lineDataSets.add(createDataSet(e.getValue(), colors.get(e.getKey()), labels.get(e.getKey())));
}
LineData lineData = new LineData(lineDataSets);
mActivityChart.setData(lineData);
mActivityChart.setDrawGridBackground(false);
mActivityChart.setDrawBorders(false);
mActivityChart.getAxisRight().setEnabled(false);
mActivityChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
mActivityChart.getXAxis().setDrawGridLines(false);
mActivityChart.getXAxis().setValueFormatter(new SampleXLabelFormatter(tsTranslation));
mActivityChart.getAxisLeft().setDrawGridLines(false);
mActivityChart.getAxisRight().setDrawGridLines(false);
mActivityChart.getLegend().setEnabled(false);
mActivityChart.animateX(250, Easing.EaseInOutQuart);
}
}
protected LineDataSet createDataSet(List<Entry> values, Integer color, String label) {
LineDataSet set1 = new LineDataSet(values, label);
set1.setColor(color);
set1.setDrawFilled(true);
set1.setDrawCircles(false);
set1.setFillColor(color);
set1.setFillAlpha(255);
set1.setDrawValues(false);
//set1.setValueTextColor(CHART_TEXT_COLOR);
set1.setAxisDependency(YAxis.AxisDependency.LEFT);
return set1;
}
protected void fillData() {
if (todayView == null) return;
todayView.post(new Runnable() {

View File

@ -1,35 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_vertical"
android:orientation="vertical"
tools:context=".activities.dashboard.DashboardTodayWidget">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/dashboard_today_chart"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginHorizontal="15dp"
android:layout_marginVertical="5dp"
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/dashboard_today_horizontal"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:layout_marginBottom="25dp"
android:layout_weight="4"
android:gravity="center"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:scaleType="fitXY" />
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/dashboard_piechart_legend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:textAlignment="center" />
</LinearLayout>
</LinearLayout>