From 4f152ba7ec66a1d6bd0b098b91dda80b8f183e96 Mon Sep 17 00:00:00 2001 From: oliexdev Date: Sun, 29 Jan 2023 17:53:46 +0100 Subject: [PATCH] - some optimization to speed the table view calculation - added progress bar to table view --- .../health/openscale/gui/MainActivity.java | 30 +++++++++++ .../gui/measurement/FloatMeasurementView.java | 53 +++++++++++-------- .../gui/measurement/MeasurementView.java | 3 +- .../gui/overview/OverviewAdapter.java | 3 ++ .../gui/table/StickyHeaderTableView.java | 23 ++++---- .../openscale/gui/table/TableFragment.java | 34 +++++++----- .../src/main/res/layout/fragment_table.xml | 13 ++++- 7 files changed, 110 insertions(+), 49 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java index d5ef1ffc..3f010b70 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java @@ -85,8 +85,10 @@ import com.health.openscale.gui.preferences.UserSettingsFragment; import com.health.openscale.gui.slides.AppIntroActivity; import java.io.File; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; @@ -1069,4 +1071,32 @@ public class MainActivity extends AppCompatActivity connectToBluetooth(); } }); + + // Generate random dummy measurements - ONLY FOR TESTING PURPOSE + private void generateDummyMeasurements(int measurementCount) { + for (int i=0; i 0.0f) { - color = (value > getScaleUser().getGoalWeight()) ? Color.RED : Color.GREEN; - } else if (diff < 0.0f) { - color = (value < getScaleUser().getGoalWeight()) ? Color.RED : Color.GREEN; + // skip evaluation to speed the calculation up (e.g. not needed for table view) + if (isEvalOn) { + // change color depending on if you are going towards or away from your weight goal + if (this instanceof WeightMeasurementView) { + if (diff > 0.0f) { + color = (value > getScaleUser().getGoalWeight()) ? Color.RED : Color.GREEN; + } else if (diff < 0.0f) { + color = (value < getScaleUser().getGoalWeight()) ? Color.RED : Color.GREEN; + } } - } - final float evalValue = maybeConvertToOriginalValue(value); + final float evalValue = maybeConvertToOriginalValue(value); - EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); - evaluationResult = evaluateSheet(evalSheet, evalValue); + EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); + evaluationResult = evaluateSheet(evalSheet, evalValue); - if (evaluationResult != null) { - switch (evaluationResult.eval_state) { - case LOW: - color = (diff > 0.0f) ? Color.GREEN : Color.RED; - break; - case HIGH: - color = (diff < 0.0f) ? Color.GREEN : Color.RED; - break; - case NORMAL: - color = Color.GREEN; - break; + if (evaluationResult != null) { + switch (evaluationResult.eval_state) { + case LOW: + color = (diff > 0.0f) ? Color.GREEN : Color.RED; + break; + case HIGH: + color = (diff < 0.0f) ? Color.GREEN : Color.RED; + break; + case NORMAL: + color = Color.GREEN; + break; + } } } @@ -490,6 +493,12 @@ public abstract class FloatMeasurementView extends MeasurementView { Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } + + @Override + public void appendDiffValue(final SpannableStringBuilder text, boolean newLine) { + appendDiffValue(text, newLine, true); + } + @Override protected boolean isEditable() { if (useAutoValue()) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/measurement/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/measurement/MeasurementView.java index 942bfd4b..c4d972b5 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/measurement/MeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/measurement/MeasurementView.java @@ -286,7 +286,8 @@ public abstract class MeasurementView extends TableLayout { public CharSequence getName() { return nameView.getText(); } public abstract String getValueAsString(boolean withUnit); - public void appendDiffValue(SpannableStringBuilder builder, boolean newLine) { } + public void appendDiffValue(final SpannableStringBuilder builder, boolean newLine, boolean isEvalOn) { } + public void appendDiffValue(final SpannableStringBuilder builder, boolean newLine) { } public Drawable getIcon() { return iconView.getDrawable(); } public int getIconResource() { return iconId; } public void setBackgroundIconColor(int color) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewAdapter.java b/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewAdapter.java index 98543a61..6b0a4f49 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewAdapter.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewAdapter.java @@ -85,6 +85,9 @@ class OverviewAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(@NonNull OverviewAdapter.ViewHolder holder, int position) { + holder.measurementHighlightViews.removeAllViews(); + holder.measurementViews.removeAllViews(); + ScaleMeasurement scaleMeasurement = scaleMeasurementList.get(position); ScaleMeasurement prevScaleMeasurement; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/table/StickyHeaderTableView.java b/android_app/app/src/main/java/com/health/openscale/gui/table/StickyHeaderTableView.java index 22326791..10c6aecb 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/table/StickyHeaderTableView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/table/StickyHeaderTableView.java @@ -36,7 +36,6 @@ import com.health.openscale.gui.utils.ColorUtil; */ public class StickyHeaderTableView extends View implements NestedScrollingChild { - private final Paint paintStrokeRect = new Paint(); private final Paint paintHeaderCellFillRect = new Paint(); private final Paint paintContentCellFillRect = new Paint(); @@ -45,6 +44,9 @@ public class StickyHeaderTableView extends View implements NestedScrollingChild private final TextPaint paintHeaderText = new TextPaint(); private final Rect textRectBounds = new Rect(); + + private int maxMeasure = 0; + /** * Visible rect size of view which is displayed on screen */ @@ -483,11 +485,16 @@ public class StickyHeaderTableView extends View implements NestedScrollingChild * Required for onMeasure() method */ private void updateMaxWidthHeightOfCell() { + // call only once otherwise it is very cpu time consuming + if (maxMeasure > 0) { + return; + } + maxMeasure++; maxWidthOfCell = 0; maxHeightOfCell = 0; - maxHeightSparseIntArray = new SparseIntArray(); - maxWidthSparseIntArray = new SparseIntArray(); + maxHeightSparseIntArray.clear(); + maxWidthSparseIntArray.clear(); final int doubleCellPadding = cellPadding + cellPadding; @@ -542,7 +549,6 @@ public class StickyHeaderTableView extends View implements NestedScrollingChild if (maxHeightSparseIntArray.get(i, 0) < textRectBounds.height()) { maxHeightSparseIntArray.put(i, textRectBounds.height()); } - } else if (j == 0) { // Left headers cells if (data[i][j] instanceof String) { @@ -557,10 +563,6 @@ public class StickyHeaderTableView extends View implements NestedScrollingChild } } paintHeaderText.getTextBounds(str, 0, str.length(), textRectBounds); - StaticLayout staticLayout = StaticLayout.Builder.obtain(str, 0, str.length(), paintHeaderText, textRectBounds.width()).build(); - - //textRectBounds.right = 50; - textRectBounds.bottom = staticLayout.getHeight(); } else if (data[i][j] instanceof Drawable) { Drawable icon = (Drawable) data[i][j]; textRectBounds.set(0,0,icon.getIntrinsicWidth(), icon.getIntrinsicHeight() / 2); @@ -613,9 +615,6 @@ public class StickyHeaderTableView extends View implements NestedScrollingChild } } paintLabelText.getTextBounds(str, 0, str.length(), textRectBounds); - StaticLayout staticLayout = StaticLayout.Builder.obtain(str, 0, str.length(), paintLabelText, textRectBounds.width()).build(); - - textRectBounds.bottom = staticLayout.getHeight(); } else if (data[i][j] instanceof Drawable) { Drawable icon = (Drawable) data[i][j]; textRectBounds.set(0,0,icon.getIntrinsicWidth(), icon.getIntrinsicHeight() / 2); @@ -659,10 +658,12 @@ public class StickyHeaderTableView extends View implements NestedScrollingChild @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); + if (data == null) { return; } + int cellLeftX; int cellTopY = scrolledRect.top; int cellRightX; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/table/TableFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/table/TableFragment.java index b7727475..7a8ac115 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/table/TableFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/table/TableFragment.java @@ -22,6 +22,7 @@ import android.text.SpannableStringBuilder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ProgressBar; import androidx.activity.OnBackPressedCallback; import androidx.fragment.app.Fragment; @@ -45,11 +46,16 @@ import java.util.List; public class TableFragment extends Fragment { private View tableView; + private ProgressBar progressBar; private StickyHeaderTableView tableDataView; private List measurementViews; private List scaleMeasurementList; private ArrayList iconList; + private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT); + private final DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT); + private final DateFormat dayFormat = new SimpleDateFormat("EE"); + private final SpannableStringBuilder contentFormat = new SpannableStringBuilder(); public TableFragment() { @@ -59,7 +65,9 @@ public class TableFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { tableView = inflater.inflate(R.layout.fragment_table, container, false); + progressBar = tableView.findViewById(R.id.progressBarTable); tableDataView = tableView.findViewById(R.id.tableDataView); + progressBar.setVisibility(View.VISIBLE); tableDataView.setOnTableCellClickListener(new StickyHeaderTableView.OnTableCellClickListener() { @Override @@ -83,7 +91,7 @@ public class TableFragment extends Fragment { continue; } - // measurementView.setUpdateViews(false); + measurementView.setUpdateViews(false); measurementView.getIcon().setColorFilter(measurementView.getColor(), PorterDuff.Mode.SRC_ATOP); iconList.add(measurementView.getIcon()); @@ -105,7 +113,6 @@ public class TableFragment extends Fragment { requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), onBackPressedCallback); - return tableView; } @@ -120,9 +127,8 @@ public class TableFragment extends Fragment { tableData[0][j] = iconList.get(j); } - int i = 0; - for (ScaleMeasurement scaleMeasurement : scaleMeasurementList) { - int j=0; + for (int i = 0; i + +