From 3bceae364c96198ca6da165a4af066b483ca5f93 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sat, 20 Jan 2018 20:03:39 +0100 Subject: [PATCH 01/10] Use measureText to get text width getTextBounds seems to return incorrect result, possibly due to rounding errors, and makes a small part of the text to the right disappear. --- .../openscale/gui/views/LinearGaugeView.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java index 18b563a7..2b06b8fe 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java @@ -98,17 +98,13 @@ public class LinearGaugeView extends View { return getWidth() / 100.0f * percent; } - private void drawCenteredText(Canvas canvas, String text, float centerX, float y, - Paint paint, Rect textBounds) { - float x = Math.max(0.0f, centerX - textBounds.width() / 2.0f); - x = Math.min(x, getWidth() - textBounds.width()); + private void drawCenteredText(Canvas canvas, String text, float centerX, float y, Paint paint) { + final float textWidth = paint.measureText(text); + float x = Math.max(0.0f, centerX - textWidth / 2.0f); + x = Math.min(x, getWidth() - textWidth); canvas.drawText(text, x, y, paint); } - private void drawCenteredText(Canvas canvas, String text, float centerX, float y, Paint paint) { - paint.getTextBounds(text, 0, text.length(), bounds); - drawCenteredText(canvas, text, centerX, y, paint, bounds); - } @Override protected void onDraw(Canvas canvas) { @@ -204,7 +200,7 @@ public class LinearGaugeView extends View { String valueStr = String.format("%.2f", value); indicatorPaint.getTextBounds(valueStr, 0, valueStr.length(), bounds); drawCenteredText(canvas, valueStr, valuePos, - indicatorBottom + bounds.height() + textOffset, indicatorPaint, bounds); + indicatorBottom + bounds.height() + textOffset, indicatorPaint); } @Override From 78753d8aeef0ebad20d36aca20848a6cae6d290d Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sat, 20 Jan 2018 20:06:48 +0100 Subject: [PATCH 02/10] Use String.format to convert float to strings Otherwise we may get an incorrect decimal point (i.e. dot instead of comma) --- .../openscale/gui/views/LinearGaugeView.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java index 2b06b8fe..ecc91ad6 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java @@ -27,13 +27,13 @@ import android.view.View; import com.health.openscale.R; +import java.util.Locale; + public class LinearGaugeView extends View { public static final int COLOR_BLUE = Color.parseColor("#33B5E5"); - public static final int COLOR_VIOLET = Color.parseColor("#AA66CC"); public static final int COLOR_GREEN = Color.parseColor("#99CC00"); - public static final int COLOR_ORANGE = Color.parseColor("#FFBB33"); public static final int COLOR_RED = Color.parseColor("#FF4444"); private static final float barHeight = 10; @@ -105,6 +105,9 @@ public class LinearGaugeView extends View { canvas.drawText(text, x, y, paint); } + private String toText(float value) { + return String.format(Locale.getDefault(), "%.1f", value); + } @Override protected void onDraw(Canvas canvas) { @@ -177,12 +180,12 @@ public class LinearGaugeView extends View { // Text final float textY = barTop - textOffset; - canvas.drawText(Float.toString(minValue), 0.0f, textY, textPaint); + canvas.drawText(toText(minValue), 0.0f, textY, textPaint); if (firstLimit > 0) { - drawCenteredText(canvas, Float.toString(firstLimit), firstPos, textY, textPaint); + drawCenteredText(canvas, toText(firstLimit), firstPos, textY, textPaint); } - drawCenteredText(canvas, Float.toString(secondLimit), secondPos, textY, textPaint); - drawCenteredText(canvas, Float.toString(maxValue), getWidth(), textY, textPaint); + drawCenteredText(canvas, toText(secondLimit), secondPos, textY, textPaint); + drawCenteredText(canvas, toText(maxValue), getWidth(), textY, textPaint); // Indicator final float indicatorBottom = limitRect.bottom + 10.0f; @@ -197,7 +200,7 @@ public class LinearGaugeView extends View { canvas.drawPath(path, indicatorPaint); // Value text - String valueStr = String.format("%.2f", value); + final String valueStr = String.format(Locale.getDefault(), "%.2f", value); indicatorPaint.getTextBounds(valueStr, 0, valueStr.length(), bounds); drawCenteredText(canvas, valueStr, valuePos, indicatorBottom + bounds.height() + textOffset, indicatorPaint); From bcd6d4ed241fef8770f8f5f7fb13ccaff8cfd796 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 21 Jan 2018 21:15:45 +0100 Subject: [PATCH 03/10] Don't reset measurement when toggling expand/edit mode --- .../openscale/gui/activities/DataEntryActivity.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index bec01283..9a143e8b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -149,11 +149,10 @@ public class DataEntryActivity extends Activity { if (scaleMeasurement == null || scaleMeasurement.getId() != id) { isDirty = false; + scaleMeasurement = null; + previousMeasurement = null; } - scaleMeasurement = null; - previousMeasurement = null; - OpenScale openScale = OpenScale.getInstance(context); boolean doExpand = false; @@ -175,9 +174,11 @@ public class DataEntryActivity extends Activity { } // Show selected scale data - ScaleMeasurement[] tupleScaleData = openScale.getTupleScaleData(id); - previousMeasurement = tupleScaleData[0]; - scaleMeasurement = tupleScaleData[1].clone(); + if (scaleMeasurement == null) { + ScaleMeasurement[] tupleScaleData = openScale.getTupleScaleData(id); + previousMeasurement = tupleScaleData[0]; + scaleMeasurement = tupleScaleData[1].clone(); + } } else { setViewMode(MeasurementView.MeasurementViewMode.ADD); From ca070558e4417ea282115c361f92834baecde3c8 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 21 Jan 2018 22:35:44 +0100 Subject: [PATCH 04/10] Make center gravity work when editing text With MATCH_PARENT, the weight text would jump to the top when editing it while the evaluator row was visisble. --- .../java/com/health/openscale/gui/views/MeasurementView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java index 479b38a0..08839d3d 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java @@ -111,7 +111,7 @@ public abstract class MeasurementView extends TableLayout { valueView.setTextColor(Color.BLACK); valueView.setGravity(Gravity.RIGHT | Gravity.CENTER); valueView.setPadding(0,0,20,0); - valueView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.29f)); + valueView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.29f)); incDecLayout.setOrientation(VERTICAL); incDecLayout.setVisibility(View.GONE); From ad4ad76974ef9d1e9c968e46fb4d8266c5ccc230 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 21 Jan 2018 22:37:14 +0100 Subject: [PATCH 05/10] Add some space to the statistics view --- .../gui/fragments/StatisticsFragment.java | 4 ++++ .../src/main/res/layout/fragment_statistics.xml | 17 ++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java index 54800798..81b8509d 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java @@ -104,6 +104,8 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen viewMeasurementsListWeek.add(new WaistMeasurementView(statisticsView.getContext())); viewMeasurementsListWeek.add(new HipMeasurementView(statisticsView.getContext())); + final int paddingBottom = 10; + int i=0; for (MeasurementView measurement : viewMeasurementsListWeek) { @@ -111,6 +113,7 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen measurement.updatePreferences(prefs); if (measurement.isVisible()) { + measurement.setPadding(-1, -1, -1, paddingBottom); if ((i % 2) == 0) { tableWeekAveragesLayoutColumnA.addView(measurement); } else { @@ -138,6 +141,7 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen measurement.updatePreferences(prefs); if (measurement.isVisible()) { + measurement.setPadding(-1, -1, -1, paddingBottom); if ((i % 2) == 0) { tableMonthAveragesLayoutColumnA.addView(measurement); } else { diff --git a/android_app/app/src/main/res/layout/fragment_statistics.xml b/android_app/app/src/main/res/layout/fragment_statistics.xml index 4c584960..ad81db77 100644 --- a/android_app/app/src/main/res/layout/fragment_statistics.xml +++ b/android_app/app/src/main/res/layout/fragment_statistics.xml @@ -178,29 +178,28 @@ + - + android:stretchColumns="1" /> - + android:stretchColumns="1" /> @@ -213,22 +212,22 @@ + - + android:stretchColumns="1" /> - + android:stretchColumns="1" /> From c9b46bf0b32d0f56be5f1a6a9631b93ac97cb2c2 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 21 Jan 2018 22:45:07 +0100 Subject: [PATCH 06/10] Hide left/right button when reaching first/last measurement --- .../gui/activities/DataEntryActivity.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index 9a143e8b..b10f8d3c 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -178,6 +178,9 @@ public class DataEntryActivity extends Activity { ScaleMeasurement[] tupleScaleData = openScale.getTupleScaleData(id); previousMeasurement = tupleScaleData[0]; scaleMeasurement = tupleScaleData[1].clone(); + + btnLeft.setVisibility(tupleScaleData[0] != null ? View.VISIBLE : View.INVISIBLE); + btnRight.setVisibility(tupleScaleData[2] != null ? View.VISIBLE : View.INVISIBLE); } } else { setViewMode(MeasurementView.MeasurementViewMode.ADD); @@ -214,8 +217,10 @@ public class DataEntryActivity extends Activity { btnOk.setVisibility(View.VISIBLE); btnAdd.setVisibility(View.GONE); imageViewDelete.setVisibility(View.VISIBLE); - btnLeft.setVisibility(View.VISIBLE); - btnRight.setVisibility(View.VISIBLE); + if (scaleMeasurement == null) { + btnLeft.setVisibility(View.VISIBLE); + btnRight.setVisibility(View.VISIBLE); + } expandButton.setVisibility(View.VISIBLE); switchEditMode.setVisibility(View.VISIBLE); dateTimeVisibility = View.GONE; @@ -224,8 +229,10 @@ public class DataEntryActivity extends Activity { btnOk.setVisibility(View.VISIBLE); btnAdd.setVisibility(View.GONE); imageViewDelete.setVisibility(View.VISIBLE); - btnLeft.setVisibility(View.VISIBLE); - btnRight.setVisibility(View.VISIBLE); + if (scaleMeasurement == null) { + btnLeft.setVisibility(View.VISIBLE); + btnRight.setVisibility(View.VISIBLE); + } expandButton.setVisibility(View.VISIBLE); switchEditMode.setVisibility(View.VISIBLE); break; From 1a5e94bb63c3d72004f143cc28bfa6be831f2741 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Mon, 22 Jan 2018 19:58:22 +0100 Subject: [PATCH 07/10] Disable button instead of hiding it --- .../gui/activities/DataEntryActivity.java | 16 ++++++---------- .../app/src/main/res/drawable/flat_selector.xml | 1 + .../app/src/main/res/drawable/rect_disabled.xml | 6 ++++++ .../app/src/main/res/drawable/rect_normal.xml | 13 ++++++------- .../app/src/main/res/drawable/rect_pressed.xml | 4 ++-- android_app/app/src/main/res/values/colors.xml | 5 +++-- 6 files changed, 24 insertions(+), 21 deletions(-) create mode 100644 android_app/app/src/main/res/drawable/rect_disabled.xml diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index b10f8d3c..9f28aa62 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -179,8 +179,8 @@ public class DataEntryActivity extends Activity { previousMeasurement = tupleScaleData[0]; scaleMeasurement = tupleScaleData[1].clone(); - btnLeft.setVisibility(tupleScaleData[0] != null ? View.VISIBLE : View.INVISIBLE); - btnRight.setVisibility(tupleScaleData[2] != null ? View.VISIBLE : View.INVISIBLE); + btnLeft.setEnabled(tupleScaleData[0] != null); + btnRight.setEnabled(tupleScaleData[2] != null); } } else { setViewMode(MeasurementView.MeasurementViewMode.ADD); @@ -217,10 +217,8 @@ public class DataEntryActivity extends Activity { btnOk.setVisibility(View.VISIBLE); btnAdd.setVisibility(View.GONE); imageViewDelete.setVisibility(View.VISIBLE); - if (scaleMeasurement == null) { - btnLeft.setVisibility(View.VISIBLE); - btnRight.setVisibility(View.VISIBLE); - } + btnLeft.setVisibility(View.VISIBLE); + btnRight.setVisibility(View.VISIBLE); expandButton.setVisibility(View.VISIBLE); switchEditMode.setVisibility(View.VISIBLE); dateTimeVisibility = View.GONE; @@ -229,10 +227,8 @@ public class DataEntryActivity extends Activity { btnOk.setVisibility(View.VISIBLE); btnAdd.setVisibility(View.GONE); imageViewDelete.setVisibility(View.VISIBLE); - if (scaleMeasurement == null) { - btnLeft.setVisibility(View.VISIBLE); - btnRight.setVisibility(View.VISIBLE); - } + btnLeft.setVisibility(View.VISIBLE); + btnRight.setVisibility(View.VISIBLE); expandButton.setVisibility(View.VISIBLE); switchEditMode.setVisibility(View.VISIBLE); break; diff --git a/android_app/app/src/main/res/drawable/flat_selector.xml b/android_app/app/src/main/res/drawable/flat_selector.xml index 6e9fe6c4..224c8210 100644 --- a/android_app/app/src/main/res/drawable/flat_selector.xml +++ b/android_app/app/src/main/res/drawable/flat_selector.xml @@ -1,5 +1,6 @@ + diff --git a/android_app/app/src/main/res/drawable/rect_disabled.xml b/android_app/app/src/main/res/drawable/rect_disabled.xml new file mode 100644 index 00000000..61026260 --- /dev/null +++ b/android_app/app/src/main/res/drawable/rect_disabled.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/android_app/app/src/main/res/drawable/rect_normal.xml b/android_app/app/src/main/res/drawable/rect_normal.xml index c5c3b997..ef63741a 100644 --- a/android_app/app/src/main/res/drawable/rect_normal.xml +++ b/android_app/app/src/main/res/drawable/rect_normal.xml @@ -1,11 +1,10 @@ - + - - - - - + + + + - + diff --git a/android_app/app/src/main/res/drawable/rect_pressed.xml b/android_app/app/src/main/res/drawable/rect_pressed.xml index 2cc15774..9fe914a3 100644 --- a/android_app/app/src/main/res/drawable/rect_pressed.xml +++ b/android_app/app/src/main/res/drawable/rect_pressed.xml @@ -1,6 +1,6 @@ - - + diff --git a/android_app/app/src/main/res/values/colors.xml b/android_app/app/src/main/res/values/colors.xml index 243b10a2..98c6296e 100644 --- a/android_app/app/src/main/res/values/colors.xml +++ b/android_app/app/src/main/res/values/colors.xml @@ -1,5 +1,6 @@ - + @android:color/holo_blue_dark @android:color/holo_blue_light - + #ccc + From 5fc0e0f84e72fad66a487c661466fca1042643af Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Mon, 22 Jan 2018 20:15:49 +0100 Subject: [PATCH 08/10] Avoid database access just to get next measurement's id --- .../gui/activities/DataEntryActivity.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index 9f28aa62..afb8759c 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -74,6 +74,7 @@ public class DataEntryActivity extends Activity { private ScaleMeasurement scaleMeasurement; private ScaleMeasurement previousMeasurement; + private ScaleMeasurement nextMeasurement; private boolean isDirty; private Context context; @@ -151,6 +152,7 @@ public class DataEntryActivity extends Activity { isDirty = false; scaleMeasurement = null; previousMeasurement = null; + nextMeasurement = null; } OpenScale openScale = OpenScale.getInstance(context); @@ -178,9 +180,10 @@ public class DataEntryActivity extends Activity { ScaleMeasurement[] tupleScaleData = openScale.getTupleScaleData(id); previousMeasurement = tupleScaleData[0]; scaleMeasurement = tupleScaleData[1].clone(); + nextMeasurement = tupleScaleData[2]; - btnLeft.setEnabled(tupleScaleData[0] != null); - btnRight.setEnabled(tupleScaleData[2] != null); + btnLeft.setEnabled(previousMeasurement != null); + btnRight.setEnabled(nextMeasurement != null); } } else { setViewMode(MeasurementView.MeasurementViewMode.ADD); @@ -271,13 +274,9 @@ public class DataEntryActivity extends Activity { } private boolean moveRight() { - ScaleMeasurement[] tupleScaleData = OpenScale.getInstance(getApplicationContext()) - .getTupleScaleData(scaleMeasurement.getId()); - ScaleMeasurement nextScaleMeasurement = tupleScaleData[2]; - - if (nextScaleMeasurement != null) { + if (nextMeasurement != null) { saveScaleData(); - getIntent().putExtra("id", nextScaleMeasurement.getId()); + getIntent().putExtra("id", nextMeasurement.getId()); updateOnView(); return true; } @@ -387,11 +386,12 @@ public class DataEntryActivity extends Activity { void deleteMeasurement() { int delId = scaleMeasurement.getId(); - boolean hasNext = moveLeft(); - OpenScale.getInstance(getApplicationContext()).deleteScaleData(delId); Toast.makeText(context, getResources().getString(R.string.info_data_deleted), Toast.LENGTH_SHORT).show(); + isDirty = false; + final boolean hasNext = moveLeft() || moveRight(); + if (!hasNext) { finish(); } From c3f5dbf0f64945f7d778ae8d88d91dddd95f2dde Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Mon, 22 Jan 2018 20:29:17 +0100 Subject: [PATCH 09/10] Disable table navigation buttons when they can't be used --- .../java/com/health/openscale/gui/fragments/TableFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java index 090a1513..0d702312 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java @@ -151,6 +151,7 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { moveSubpageLeft.getLayoutParams().height = pxImageDp(20); moveSubpageLeft.getLayoutParams().width = pxImageDp(50); moveSubpageLeft.setOnClickListener(new onClickListenerMoveSubpageLeft()); + moveSubpageLeft.setEnabled(selectedSubpageNr > 0); subpageView.addView(moveSubpageLeft); for (int i=0; i Date: Mon, 22 Jan 2018 21:00:05 +0100 Subject: [PATCH 10/10] Disable graph year buttons when they can't be used --- .../gui/fragments/GraphFragment.java | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java index 4198cfb3..31f61217 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java @@ -30,6 +30,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; @@ -69,6 +70,8 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { private ColumnChartView chartTop; private Viewport defaultTopViewport; private TextView txtYear; + private Button btnLeftYear; + private Button btnRightYear; private FloatingActionButton diagramWeight; private FloatingActionButton diagramFat; private FloatingActionButton diagramWater; @@ -96,6 +99,14 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + openScale = OpenScale.getInstance(getContext()); + + scaleMeasurementList = openScale.getScaleMeasurementList(); + if (!scaleMeasurementList.isEmpty()) { + calYears.setTime(scaleMeasurementList.get(0).getDateTime()); + calLastSelected.setTime(scaleMeasurementList.get(0).getDateTime()); + } + graphView = inflater.inflate(R.layout.fragment_graph, container, false); chartBottom = (LineChartView) graphView.findViewById(R.id.chart_bottom); @@ -163,7 +174,8 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { diagramHip.setVisibility(View.GONE); } - graphView.findViewById(R.id.btnLeftYear).setOnClickListener(new View.OnClickListener() { + btnLeftYear = graphView.findViewById(R.id.btnLeftYear); + btnLeftYear.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { calYears.roll(Calendar.YEAR, false); txtYear.setText(Integer.toString(calYears.get(Calendar.YEAR))); @@ -171,7 +183,8 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { } }); - graphView.findViewById(R.id.btnRightYear).setOnClickListener(new View.OnClickListener() { + btnRightYear = graphView.findViewById(R.id.btnRightYear); + btnRightYear.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { calYears.roll(Calendar.YEAR, true); txtYear.setText(Integer.toString(calYears.get(Calendar.YEAR))); @@ -179,7 +192,6 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { } }); - openScale = OpenScale.getInstance(getContext()); openScale.registerFragment(this); return graphView; @@ -476,13 +488,31 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { } private void generateGraphs() { + final int selectedYear = calYears.get(Calendar.YEAR); + + int firstYear = selectedYear; + int lastYear = selectedYear; + + scaleMeasurementList = openScale.getScaleMeasurementList(); + if (!scaleMeasurementList.isEmpty()) { + Calendar cal = Calendar.getInstance(); + + cal.setTime(scaleMeasurementList.get(scaleMeasurementList.size() - 1).getDateTime()); + firstYear = cal.get(Calendar.YEAR); + + cal.setTime(scaleMeasurementList.get(0).getDateTime()); + lastYear = cal.get(Calendar.YEAR); + } + btnLeftYear.setEnabled(selectedYear > firstYear); + btnRightYear.setEnabled(selectedYear < lastYear); + // show monthly diagram if (prefs.getBoolean(String.valueOf(enableMonth.getId()), true)) { chartTop.setVisibility(View.VISIBLE); chartBottom.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.7f)); generateColumnData(); - scaleMeasurementList = openScale.getScaleDataOfMonth(calYears.get(Calendar.YEAR), calLastSelected.get(Calendar.MONTH)); + scaleMeasurementList = openScale.getScaleDataOfMonth(selectedYear, calLastSelected.get(Calendar.MONTH)); generateLineData(Calendar.DAY_OF_MONTH); // show only yearly diagram and hide monthly diagram @@ -490,7 +520,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { chartTop.setVisibility(View.GONE); chartBottom.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); - scaleMeasurementList = openScale.getScaleDataOfYear(calYears.get(Calendar.YEAR)); + scaleMeasurementList = openScale.getScaleDataOfYear(selectedYear); generateLineData(Calendar.DAY_OF_YEAR); }