diff --git a/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartActionBarView.java b/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartActionBarView.java index 07162eaf..2a027f52 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartActionBarView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartActionBarView.java @@ -55,6 +55,10 @@ public class ChartActionBarView extends HorizontalScrollView { } private void init() { + if (isInEditMode()) { + return; + } + actionBarView = new LinearLayout(getContext()); actionBarView.setOrientation(LinearLayout.HORIZONTAL); actionBarView.setBackgroundColor(ColorUtil.COLOR_BLACK); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartMeasurementView.java index 0c960485..cbab5e72 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/measurement/ChartMeasurementView.java @@ -16,6 +16,8 @@ package com.health.openscale.gui.measurement; +import static java.time.temporal.ChronoUnit.DAYS; + import android.content.Context; import android.content.SharedPreferences; import android.graphics.Color; @@ -53,8 +55,6 @@ import java.util.Date; import java.util.List; import java.util.Stack; -import static java.time.temporal.ChronoUnit.DAYS; - public class ChartMeasurementView extends LineChart { public enum ViewMode { DAY_OF_MONTH, @@ -195,6 +195,10 @@ public class ChartMeasurementView extends LineChart { } private void initChart() { + if (isInEditMode()) { + return; + } + prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); openScale = OpenScale.getInstance(); measurementViews = MeasurementView.getMeasurementList(getContext(), MeasurementView.DateTimeOrder.NONE); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/measurement/FloatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/measurement/FloatMeasurementView.java index cb9ce151..4913b82f 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/measurement/FloatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/measurement/FloatMeasurementView.java @@ -537,9 +537,6 @@ public abstract class FloatMeasurementView extends MeasurementView { return ""; } - @Override - public boolean hasExtraPreferences() { return true; } - private class ListPreferenceWithNeutralButton extends ListPreference { ListPreferenceWithNeutralButton(Context context) { super(context); 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 28444199..7875b809 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 @@ -424,7 +424,6 @@ public abstract class MeasurementView extends TableLayout { } public String getPreferenceSummary() { return ""; } - public boolean hasExtraPreferences() { return true; } public void prepareExtraPreferencesScreen(PreferenceScreen screen) { MeasurementViewSettings settings = getSettings(); 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 373a9950..98543a61 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 @@ -1,12 +1,17 @@ package com.health.openscale.gui.overview; import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TableLayout; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; @@ -16,6 +21,7 @@ import androidx.transition.AutoTransition; import androidx.transition.TransitionManager; import com.health.openscale.R; +import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.gui.measurement.DateMeasurementView; import com.health.openscale.gui.measurement.MeasurementEntryFragment; @@ -36,6 +42,38 @@ class OverviewAdapter extends RecyclerView.Adapter { this.scaleMeasurementList = scaleMeasurementList; } + private void deleteMeasurement(int measurementId) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + boolean deleteConfirmationEnable = prefs.getBoolean("deleteConfirmationEnable", true); + + if (deleteConfirmationEnable) { + AlertDialog.Builder deleteAllDialog = new AlertDialog.Builder(activity); + deleteAllDialog.setMessage(activity.getResources().getString(R.string.question_really_delete)); + + deleteAllDialog.setPositiveButton(activity.getResources().getString(R.string.label_yes), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + doDeleteMeasurement(measurementId); + } + }); + + deleteAllDialog.setNegativeButton(activity.getResources().getString(R.string.label_no), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + } + }); + + deleteAllDialog.show(); + } + else { + doDeleteMeasurement(measurementId); + } + } + + private void doDeleteMeasurement(int measurementId) { + OpenScale.getInstance().deleteScaleMeasurement(measurementId); + Toast.makeText(activity, activity.getResources().getString(R.string.info_data_deleted), Toast.LENGTH_SHORT).show(); + } + @Override public OverviewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_overview, parent, false); @@ -48,13 +86,16 @@ class OverviewAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(@NonNull OverviewAdapter.ViewHolder holder, int position) { ScaleMeasurement scaleMeasurement = scaleMeasurementList.get(position); - ScaleMeasurement prevScaleMeasurement = new ScaleMeasurement(); + ScaleMeasurement prevScaleMeasurement; - if (scaleMeasurementList.size() > 2) { + // for the first measurement no previous measurement are available, use standard measurement instead + if (position == 0) { + prevScaleMeasurement = new ScaleMeasurement(); + } else { prevScaleMeasurement = scaleMeasurementList.get(position - 1); } - holder.itemView.setOnClickListener(new View.OnClickListener() { + holder.showEntry.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { OverviewFragmentDirections.ActionNavOverviewToNavDataentry action = OverviewFragmentDirections.actionNavOverviewToNavDataentry(); @@ -64,6 +105,22 @@ class OverviewAdapter extends RecyclerView.Adapter { } }); + holder.editEntry.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + OverviewFragmentDirections.ActionNavOverviewToNavDataentry action = OverviewFragmentDirections.actionNavOverviewToNavDataentry(); + action.setMeasurementId(scaleMeasurement.getId()); + action.setMode(MeasurementEntryFragment.DATA_ENTRY_MODE.EDIT); + Navigation.findNavController(activity, R.id.nav_host_fragment).navigate(action); + } + }); + holder.deleteEntry.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteMeasurement(scaleMeasurement.getId()); + } + }); + holder.expandMeasurementView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -113,6 +170,9 @@ class OverviewAdapter extends RecyclerView.Adapter { static class ViewHolder extends RecyclerView.ViewHolder { TextView dateView; + ImageView showEntry; + ImageView editEntry; + ImageView deleteEntry; TableLayout measurementHighlightViews; ImageView expandMeasurementView; TableLayout measurementViews; @@ -121,6 +181,9 @@ class OverviewAdapter extends RecyclerView.Adapter { super(itemView); dateView = itemView.findViewById(R.id.dateView); + showEntry = itemView.findViewById(R.id.showEntry); + editEntry = itemView.findViewById(R.id.editEntry); + deleteEntry = itemView.findViewById(R.id.deleteEntry); measurementHighlightViews = itemView.findViewById(R.id.measurementHighlightViews); expandMeasurementView = itemView.findViewById(R.id.expandMoreView); measurementViews = itemView.findViewById(R.id.measurementViews); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewFragment.java index 9cde13c6..336033d7 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewFragment.java @@ -15,8 +15,6 @@ */ package com.health.openscale.gui.overview; -import android.app.AlertDialog; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; @@ -35,14 +33,14 @@ import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.Spinner; import android.widget.TextView; -import android.widget.Toast; import androidx.activity.OnBackPressedCallback; import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; -import androidx.navigation.Navigation; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.transition.ChangeScroll; +import androidx.transition.TransitionManager; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; @@ -54,10 +52,7 @@ import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.utils.DateTimeHelpers; import com.health.openscale.gui.measurement.ChartActionBarView; import com.health.openscale.gui.measurement.ChartMeasurementView; -import com.health.openscale.gui.measurement.MeasurementEntryFragment; -import com.health.openscale.gui.measurement.MeasurementView; import com.health.openscale.gui.measurement.WeightMeasurementView; -import com.health.openscale.gui.utils.ColorUtil; import java.text.DateFormat; import java.util.ArrayList; @@ -69,8 +64,6 @@ public class OverviewFragment extends Fragment { private TextView txtTitleUser; - private List lastMeasurementViews; - private RecyclerView recyclerView; private OverviewAdapter overviewAdapter; private ChartMeasurementView chartView; @@ -80,10 +73,6 @@ public class OverviewFragment extends Fragment { private PopupMenu rangePopupMenu; - private ImageView showEntry; - private ImageView editEntry; - private ImageView deleteEntry; - private TextView differenceWeightView; private TextView initialWeightView; private TextView goalWeightView; @@ -94,6 +83,7 @@ public class OverviewFragment extends Fragment { private SharedPreferences prefs; + private List scaleMeasurementList; private ScaleMeasurement markedMeasurement; @Override @@ -102,8 +92,6 @@ public class OverviewFragment extends Fragment { prefs = PreferenceManager.getDefaultSharedPreferences(overviewView.getContext()); - txtTitleUser = overviewView.findViewById(R.id.txtTitleUser); - differenceWeightView = overviewView.findViewById(R.id.differenceWeightView); initialWeightView = overviewView.findViewById(R.id.initialWeightView); goalWeightView = overviewView.findViewById(R.id.goalWeightView); @@ -203,9 +191,6 @@ public class OverviewFragment extends Fragment { chartActionBarView.setVisibility(View.GONE); } - lastMeasurementViews = MeasurementView.getMeasurementList( - getContext(), MeasurementView.DateTimeOrder.LAST); - recyclerView = overviewView.findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); layoutManager.setInitialPrefetchItemCount(5); @@ -224,39 +209,6 @@ public class OverviewFragment extends Fragment { } }); - showEntry = overviewView.findViewById(R.id.showEntry); - showEntry.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - OverviewFragmentDirections.ActionNavOverviewToNavDataentry action = OverviewFragmentDirections.actionNavOverviewToNavDataentry(); - action.setMeasurementId(markedMeasurement.getId()); - action.setMode(MeasurementEntryFragment.DATA_ENTRY_MODE.VIEW); - Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action); - } - }); - - editEntry = overviewView.findViewById(R.id.editEntry); - editEntry.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - OverviewFragmentDirections.ActionNavOverviewToNavDataentry action = OverviewFragmentDirections.actionNavOverviewToNavDataentry(); - action.setMeasurementId(markedMeasurement.getId()); - action.setMode(MeasurementEntryFragment.DATA_ENTRY_MODE.EDIT); - Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action); - } - }); - deleteEntry = overviewView.findViewById(R.id.deleteEntry); - deleteEntry.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteMeasurement(); - } - }); - - showEntry.setEnabled(false); - editEntry.setEnabled(false); - deleteEntry.setEnabled(false); - chartView.animateY(700); OpenScale.getInstance().getScaleMeasurementsLiveData().observe(getViewLifecycleOwner(), new Observer>() { @@ -279,17 +231,12 @@ public class OverviewFragment extends Fragment { } public void updateOnView(List scaleMeasurementList) { - if (scaleMeasurementList.isEmpty()) { - markedMeasurement = new ScaleMeasurement(); - } else { - markedMeasurement = scaleMeasurementList.get(0); - } + this.scaleMeasurementList = scaleMeasurementList; overviewAdapter = new OverviewAdapter(getActivity(), scaleMeasurementList); recyclerView.setAdapter(overviewAdapter); updateUserSelection(); - updateMesurementViews(markedMeasurement); chartView.updateMeasurementList(scaleMeasurementList); updateChartView(); } @@ -299,15 +246,6 @@ public class OverviewFragment extends Fragment { chartView.setViewRange(selectedRangeMode); } - private void updateMesurementViews(ScaleMeasurement selectedMeasurement) { - ScaleMeasurement[] tupleScaleData = OpenScale.getInstance().getTupleOfScaleMeasurement(selectedMeasurement.getId()); - ScaleMeasurement prevScaleMeasurement = tupleScaleData[0]; - - for (MeasurementView measurement : lastMeasurementViews) { - measurement.loadFrom(selectedMeasurement, prevScaleMeasurement); - } - } - private void updateUserSelection() { currentScaleUser = OpenScale.getInstance().getSelectedScaleUser(); @@ -328,7 +266,6 @@ public class OverviewFragment extends Fragment { // Hide user selector when there is only one user int visibility = spinUserAdapter.getCount() < 2 ? View.GONE : View.VISIBLE; - txtTitleUser.setVisibility(visibility); spinUser.setVisibility(visibility); @@ -409,26 +346,15 @@ public class OverviewFragment extends Fragment { markedMeasurement = (ScaleMeasurement)extraData[0]; //MeasurementView measurementView = (MeasurementView)extraData[1]; - showEntry.setEnabled(true); - editEntry.setEnabled(true); - deleteEntry.setEnabled(true); - - showEntry.setColorFilter(ColorUtil.COLOR_BLUE); - editEntry.setColorFilter(ColorUtil.COLOR_GREEN); - deleteEntry.setColorFilter(ColorUtil.COLOR_RED); - - updateMesurementViews(markedMeasurement); + if (scaleMeasurementList.contains(markedMeasurement)) { + TransitionManager.beginDelayedTransition(recyclerView, new ChangeScroll()); + recyclerView.scrollToPosition(scaleMeasurementList.indexOf(markedMeasurement)); + } } @Override public void onNothingSelected() { - showEntry.setEnabled(false); - editEntry.setEnabled(false); - deleteEntry.setEnabled(false); - - showEntry.setColorFilter(ColorUtil.COLOR_GRAY); - editEntry.setColorFilter(ColorUtil.COLOR_GRAY); - deleteEntry.setColorFilter(ColorUtil.COLOR_GRAY); + // empty } } @@ -454,44 +380,4 @@ public class OverviewFragment extends Fragment { } } - - private void deleteMeasurement() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(overviewView.getContext()); - boolean deleteConfirmationEnable = prefs.getBoolean("deleteConfirmationEnable", true); - - if (deleteConfirmationEnable) { - AlertDialog.Builder deleteAllDialog = new AlertDialog.Builder(overviewView.getContext()); - deleteAllDialog.setMessage(getResources().getString(R.string.question_really_delete)); - - deleteAllDialog.setPositiveButton(getResources().getString(R.string.label_yes), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - doDeleteMeasurement(); - } - }); - - deleteAllDialog.setNegativeButton(getResources().getString(R.string.label_no), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - } - }); - - deleteAllDialog.show(); - } - else { - doDeleteMeasurement(); - } - } - - private void doDeleteMeasurement() { - OpenScale.getInstance().deleteScaleMeasurement(markedMeasurement.getId()); - Toast.makeText(overviewView.getContext(), getResources().getString(R.string.info_data_deleted), Toast.LENGTH_SHORT).show(); - - showEntry.setEnabled(false); - editEntry.setEnabled(false); - deleteEntry.setEnabled(false); - - showEntry.setColorFilter(ColorUtil.COLOR_GRAY); - editEntry.setColorFilter(ColorUtil.COLOR_GRAY); - deleteEntry.setColorFilter(ColorUtil.COLOR_GRAY); - } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java index 2a301710..7e6a09c2 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java @@ -245,13 +245,6 @@ public class MeasurementPreferences extends PreferenceFragmentCompat { public boolean onSingleTapUp(MotionEvent e) { boundView.setPressed(false); - if (!measurement.hasExtraPreferences()) { - if (switchView.getVisibility() == View.VISIBLE) { - switchView.toggle(); - } - return true; - } - // Must be enabled to show extra preferences screen if (!measurement.getSettings().isEnabled()) { return true; diff --git a/android_app/app/src/main/res/layout/fragment_overview.xml b/android_app/app/src/main/res/layout/fragment_overview.xml index c6890c62..770a770c 100644 --- a/android_app/app/src/main/res/layout/fragment_overview.xml +++ b/android_app/app/src/main/res/layout/fragment_overview.xml @@ -1,140 +1,94 @@ - + android:layout_width="match_parent" + android:layout_height="match_parent"> - + - + - + - - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - + - + app:layout_constraintBottom_toBottomOf="@+id/chartView" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/chartActionBar" /> + + diff --git a/android_app/app/src/main/res/layout/item_overview.xml b/android_app/app/src/main/res/layout/item_overview.xml index f204090a..9bc14b2d 100644 --- a/android_app/app/src/main/res/layout/item_overview.xml +++ b/android_app/app/src/main/res/layout/item_overview.xml @@ -25,22 +25,56 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" - android:textSize="12sp" + android:textSize="16sp" + android:textStyle="normal" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + - + android:layout_marginTop="8dp" + app:layout_constraintTop_toBottomOf="@id/dateView"> + android:gravity="center" />