1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-13 20:24:14 +02:00

in the statistics page added a dialog for setting four different ranges (all days, last 7 days, last 30 days, reference day, custom range)

This commit is contained in:
oliexdev
2023-02-11 21:04:43 +01:00
parent c160e120e7
commit d635ef0be0
4 changed files with 179 additions and 72 deletions

View File

@@ -16,6 +16,7 @@
package com.health.openscale.gui.statistic;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Parcel;
@@ -28,6 +29,7 @@ import android.widget.TextView;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.util.Pair;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
@@ -72,59 +74,46 @@ public class StatisticsFragment extends Fragment {
datePickerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<CalendarConstraints.DateValidator> dateValidatorList = new ArrayList<>();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.label_time_period)
.setItems(R.array.range_options_entries, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0: // all days
setAllDaysRange();
break;
case 1: // last 7 days
setLast7DaysRange();
break;
case 2: // last 30 days
setLast30DaysRange();
break;
case 3: // set reference day
MaterialDatePicker materialDatePicker = MaterialDatePicker.Builder.datePicker().setCalendarConstraints(getCalendarConstraints()).build();
materialDatePicker.show(getActivity().getSupportFragmentManager(), "MATERIAL_DATE_PICKER");
CalendarConstraints.DateValidator selectedDateValidator = new CalendarConstraints.DateValidator() {
@Override
public boolean isValid(long date) {
Calendar dateCalendar = Calendar.getInstance();
dateCalendar.setTime(new Date(date));
materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
@Override
public void onPositiveButtonClick(Long selection) {
setReferenceDay(new Date(selection));
}
});
break;
case 4: // custom range
MaterialDatePicker<Pair<Long, Long>> materialDateRangePicker = MaterialDatePicker.Builder.dateRangePicker().setCalendarConstraints(getCalendarConstraints()).build();
materialDateRangePicker.show(getActivity().getSupportFragmentManager(), "MATERIAL_DATE_RANGE_PICKER");
List<ScaleMeasurement> dateScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfDay(dateCalendar.get(Calendar.YEAR), dateCalendar.get(Calendar.MONTH), dateCalendar.get(Calendar.DAY_OF_MONTH));
if (!dateScaleMeasurementList.isEmpty()) {
return true;
}
return false;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel parcel, int i) {
}
};
dateValidatorList.add(DateValidatorPointForward.from(scaleMeasurementList.get(scaleMeasurementList.size()-1).getDateTime().getTime()));
dateValidatorList.add(DateValidatorPointBackward.before(scaleMeasurementList.get(0).getDateTime().getTime()));
dateValidatorList.add(selectedDateValidator);
CalendarConstraints constraintsBuilderRange = new CalendarConstraints.Builder().setValidator(CompositeDateValidator.allOf(dateValidatorList)).build();
MaterialDatePicker<Pair<Long, Long>> materialDate = MaterialDatePicker.Builder.dateRangePicker().setCalendarConstraints(constraintsBuilderRange).build();
materialDate.show(getActivity().getSupportFragmentManager(), "MATERIAL_DATE_PICKER");
materialDate.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>() {
@Override public void onPositiveButtonClick(Pair<Long,Long> selection) {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(new Date(selection.first));
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(new Date(selection.second));
setDiffDateText(startCalendar.getTime(), endCalendar.getTime());
List<ScaleMeasurement> rangeScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfRangeDates(startCalendar.get(Calendar.YEAR), startCalendar.get(Calendar.MONTH), startCalendar.get(Calendar.DAY_OF_MONTH),
endCalendar.get(Calendar.YEAR), endCalendar.get(Calendar.MONTH), endCalendar.get(Calendar.DAY_OF_MONTH));
prefs.edit().putLong("statistic_range_start_date", startCalendar.getTime().getTime()).commit();
updateStatistic(rangeScaleMeasurementList);
}
});
materialDateRangePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>() {
@Override public void onPositiveButtonClick(Pair<Long,Long> selection) {
setCustomRange(new Date(selection.first), new Date(selection.second));
}
});
break;
}
}
});
builder.create();
builder.show();
}
});
@@ -156,6 +145,92 @@ public class StatisticsFragment extends Fragment {
compareRecyclerView.setAdapter(statisticAdapter);
countMeasurementTextView.setText(rangeScaleMeasurementList.size() + " " + getResources().getString(R.string.label_measurements));
}
public void setDiffDateText(Date firstDate, Date secondDate) {
String diffDateText = DateFormat.getDateInstance(DateFormat.MEDIUM).format(firstDate) + " - " +
DateFormat.getDateInstance(DateFormat.MEDIUM).format(secondDate);
diffDateTextView.setText(diffDateText);
}
public void updateOnView(List<ScaleMeasurement> scaleMeasurementList) {
this.scaleMeasurementList = scaleMeasurementList;
Long prefStartDate = prefs.getLong("statistic_range_start_date", -1);
Long prefEndDate = prefs.getLong("statistic_range_end_date", -1);
if (prefStartDate == -1) {
setAllDaysRange();
} else if (prefStartDate == -7) {
setLast7DaysRange();
} else if (prefStartDate == -30) {
setLast30DaysRange();
} else if (prefEndDate == -1 && prefStartDate > 0) {
setReferenceDay(new Date(prefStartDate));
}else if (prefEndDate > 0 && prefStartDate > 0) {
setCustomRange(new Date(prefStartDate), new Date(prefEndDate));
}
}
private void setAllDaysRange() {
diffDateTextView.setText(getResources().getString(R.string.label_time_period_all_days));
prefs.edit().putLong("statistic_range_start_date", -1).commit();
updateStatistic(scaleMeasurementList);
}
private void setLast7DaysRange() {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(new Date());
startCalendar.add(Calendar.DAY_OF_YEAR, -7);
prefs.edit().putLong("statistic_range_start_date", -7).commit();
diffDateTextView.setText(getResources().getString(R.string.label_time_period_last_7_days));
List<ScaleMeasurement> rangeScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfStartDate(startCalendar.get(Calendar.YEAR), startCalendar.get(Calendar.MONTH), startCalendar.get(Calendar.DAY_OF_MONTH));
updateStatistic(rangeScaleMeasurementList);
}
private void setLast30DaysRange() {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(new Date());
startCalendar.add(Calendar.DAY_OF_YEAR, -30);
prefs.edit().putLong("statistic_range_start_date", -30).commit();
diffDateTextView.setText(getResources().getString(R.string.label_time_period_last_30_days));
List<ScaleMeasurement> rangeScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfStartDate(startCalendar.get(Calendar.YEAR), startCalendar.get(Calendar.MONTH), startCalendar.get(Calendar.DAY_OF_MONTH));
updateStatistic(rangeScaleMeasurementList);
}
private void setReferenceDay(Date selectionDate) {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(selectionDate);
List<ScaleMeasurement> rangeScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfStartDate(startCalendar.get(Calendar.YEAR), startCalendar.get(Calendar.MONTH), startCalendar.get(Calendar.DAY_OF_MONTH));
prefs.edit().putLong("statistic_range_start_date", startCalendar.getTime().getTime()).commit();
prefs.edit().putLong("statistic_range_end_date", -1).commit();
diffDateTextView.setText(DateFormat.getDateInstance(DateFormat.MEDIUM).format(startCalendar.getTime()));
updateStatistic(rangeScaleMeasurementList);
}
private void setCustomRange(Date begin, Date end) {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(begin);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(end);
setDiffDateText(startCalendar.getTime(), endCalendar.getTime());
List<ScaleMeasurement> rangeScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfRangeDates(startCalendar.get(Calendar.YEAR), startCalendar.get(Calendar.MONTH), startCalendar.get(Calendar.DAY_OF_MONTH),
endCalendar.get(Calendar.YEAR), endCalendar.get(Calendar.MONTH), endCalendar.get(Calendar.DAY_OF_MONTH));
prefs.edit().putLong("statistic_range_start_date", startCalendar.getTime().getTime()).commit();
prefs.edit().putLong("statistic_range_end_date", endCalendar.getTime().getTime()).commit();
ScaleMeasurement firstMeasurement;
ScaleMeasurement lastMeasurement;
@@ -172,35 +247,44 @@ public class StatisticsFragment extends Fragment {
}
setDiffDateText(firstMeasurement.getDateTime(), lastMeasurement.getDateTime());
updateStatistic(rangeScaleMeasurementList);
}
public void setDiffDateText(Date firstDate, Date secondDate) {
String diffDateText = DateFormat.getDateInstance(DateFormat.MEDIUM).format(firstDate) + " - " +
DateFormat.getDateInstance(DateFormat.MEDIUM).format(secondDate);
private final CalendarConstraints getCalendarConstraints() {
List<CalendarConstraints.DateValidator> dateValidatorList = new ArrayList<>();
diffDateTextView.setText(diffDateText);
}
CalendarConstraints.DateValidator selectedDateValidator = new CalendarConstraints.DateValidator() {
@Override
public boolean isValid(long date) {
Calendar dateCalendar = Calendar.getInstance();
dateCalendar.setTime(new Date(date));
public void updateOnView(List<ScaleMeasurement> scaleMeasurementList) {
this.scaleMeasurementList = scaleMeasurementList;
List<ScaleMeasurement> dateScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfDay(dateCalendar.get(Calendar.YEAR), dateCalendar.get(Calendar.MONTH), dateCalendar.get(Calendar.DAY_OF_MONTH));
Long prefDate = prefs.getLong("statistic_range_start_date", 0);
if (!dateScaleMeasurementList.isEmpty()) {
return true;
}
if (prefDate != 0) {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(new Date(prefDate));
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(new Date());
return false;
}
setDiffDateText(startCalendar.getTime(), endCalendar.getTime());
@Override
public int describeContents() {
return 0;
}
List<ScaleMeasurement> rangeScaleMeasurementList = OpenScale.getInstance().getScaleMeasurementOfRangeDates(startCalendar.get(Calendar.YEAR), startCalendar.get(Calendar.MONTH), startCalendar.get(Calendar.DAY_OF_MONTH),
endCalendar.get(Calendar.YEAR), endCalendar.get(Calendar.MONTH), endCalendar.get(Calendar.DAY_OF_MONTH));
@Override
public void writeToParcel(@NonNull Parcel parcel, int i) {
updateStatistic(rangeScaleMeasurementList);
} else {
updateStatistic(scaleMeasurementList);
}
}
};
dateValidatorList.add(DateValidatorPointForward.from(scaleMeasurementList.get(scaleMeasurementList.size()-1).getDateTime().getTime()));
dateValidatorList.add(DateValidatorPointBackward.before(scaleMeasurementList.get(0).getDateTime().getTime()));
dateValidatorList.add(selectedDateValidator);
CalendarConstraints constraintsBuilderRange = new CalendarConstraints.Builder().setValidator(CompositeDateValidator.allOf(dateValidatorList)).build();
return constraintsBuilderRange;
}
}

View File

@@ -1,5 +1,6 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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">
@@ -42,14 +43,23 @@
app:layout_constraintStart_toStartOf="@+id/diffDateTextView"
app:layout_constraintTop_toBottomOf="@+id/diffDateTextView" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="right"
app:constraint_referenced_ids="countMeasurementTextView,withTextView,diffDateTextView,timePeriodView"
tools:layout_editor_absoluteX="264dp" />
<ImageView
android:id="@+id/datePickerView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
app:layout_constraintBottom_toTopOf="@+id/compareRecyclerView"
app:layout_constraintStart_toEndOf="@+id/diffDateTextView"
app:layout_constraintStart_toEndOf="@+id/barrier"
app:layout_constraintTop_toTopOf="parent"
android:tint="?attr/colorControlNormal"
app:srcCompat="@drawable/ic_calendar" />
<androidx.recyclerview.widget.RecyclerView

View File

@@ -110,4 +110,12 @@
<item>@string/amputation_level_lower_leg_foot</item>
<item>@string/amputation_level_leg</item>
</string-array>
<string-array name="range_options_entries">
<item>@string/label_time_period_all_days</item>
<item>@string/label_time_period_last_7_days</item>
<item>@string/label_time_period_last_30_days</item>
<item>@string/label_time_period_set_reference_day</item>
<item>@string/label_time_period_set_custom_range</item>
</string-array>
</resources>

View File

@@ -54,6 +54,11 @@
<string name="label_date">Date</string>
<string name="label_time">Time</string>
<string name="label_time_period">Time period</string>
<string name="label_time_period_all_days">all days</string>
<string name="label_time_period_last_7_days">last 7 days</string>
<string name="label_time_period_last_30_days">last 30 days</string>
<string name="label_time_period_set_reference_day">set reference day</string>
<string name="label_time_period_set_custom_range">set custom range</string>
<string name="label_with">with</string>
<string name="label_birthday">Birthday</string>
<string name="label_user_name">Name</string>