From 9965e7900ca88fac91abededfcb4cc7ce88a2d0f Mon Sep 17 00:00:00 2001 From: oliexdev Date: Sat, 19 Sep 2020 14:11:37 +0200 Subject: [PATCH] reformatted layout --- android_app/app/build.gradle | 6 +- .../gui/overview/MeasurementAdapter.java | 104 ++++++++++++++++ .../gui/overview/OverviewAdapter.java | 112 ++++++++++++++++++ .../gui/overview/OverviewFragment.java | 25 +++- .../src/main/res/drawable/ic_expand_more.xml | 10 ++ .../src/main/res/layout/fragment_overview.xml | 14 +-- .../src/main/res/layout/item_measurement.xml | 30 +++++ .../app/src/main/res/layout/item_overview.xml | 64 ++++++++++ 8 files changed, 345 insertions(+), 20 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/overview/MeasurementAdapter.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewAdapter.java create mode 100644 android_app/app/src/main/res/drawable/ic_expand_more.xml create mode 100644 android_app/app/src/main/res/layout/item_measurement.xml create mode 100644 android_app/app/src/main/res/layout/item_overview.xml diff --git a/android_app/app/build.gradle b/android_app/app/build.gradle index 2f648e6f..46e53312 100644 --- a/android_app/app/build.gradle +++ b/android_app/app/build.gradle @@ -128,14 +128,14 @@ android { } dependencies { - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' - implementation 'com.google.android.material:material:1.3.0-alpha02' implementation 'com.google.android.material:material:1.3.0-alpha02' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android:flexbox:0.3.2' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.navigation:navigation-fragment:2.3.0' implementation 'androidx.navigation:navigation-ui:2.3.0' diff --git a/android_app/app/src/main/java/com/health/openscale/gui/overview/MeasurementAdapter.java b/android_app/app/src/main/java/com/health/openscale/gui/overview/MeasurementAdapter.java new file mode 100644 index 00000000..5c3e2204 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/overview/MeasurementAdapter.java @@ -0,0 +1,104 @@ +package com.health.openscale.gui.overview; + +import android.content.Context; +import android.graphics.drawable.GradientDrawable; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.gui.measurement.FloatMeasurementView; +import com.health.openscale.gui.measurement.MeasurementView; +import com.health.openscale.gui.measurement.WeightMeasurementView; +import com.health.openscale.gui.utils.ColorUtil; + +import java.util.ArrayList; +import java.util.List; + +class MeasurementAdapter extends RecyclerView.Adapter { + private Context context; + private ScaleMeasurement scaleMeasurement; + private ScaleMeasurement prevScaleMeasurement; + private List measurementViewList; + + public MeasurementAdapter(Context aContext, ScaleMeasurement scaleMeasurement, ScaleMeasurement prevScaleMeasurement) { + context = aContext; + this.scaleMeasurement = scaleMeasurement; + this.prevScaleMeasurement = prevScaleMeasurement; + measurementViewList = new ArrayList<>(); + List measurementDefaultViewList = MeasurementView.getMeasurementList(context, MeasurementView.DateTimeOrder.LAST); + + for (MeasurementView measurementView : measurementDefaultViewList) { + if (measurementView instanceof FloatMeasurementView && measurementView.isVisible() && !(measurementView instanceof WeightMeasurementView)) { + measurementViewList.add((FloatMeasurementView)measurementView); + } + } + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_measurement, parent, false); + + MeasurementAdapter.ViewHolder viewHolder = new MeasurementAdapter.ViewHolder(view); + + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + FloatMeasurementView measurementView = measurementViewList.get(position); + + measurementView.loadFrom(scaleMeasurement, prevScaleMeasurement); + + GradientDrawable iconViewBackground = new GradientDrawable(); + iconViewBackground.setColor(((FloatMeasurementView) measurementView).getColor()); + iconViewBackground.setShape(GradientDrawable.OVAL); + iconViewBackground.setGradientRadius(holder.iconView.getWidth()); + holder.iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + holder.iconView.setColorFilter(ColorUtil.COLOR_BLACK); + holder.iconView.setBackground(iconViewBackground); + holder.iconView.setImageDrawable(measurementView.getIcon()); + + SpannableStringBuilder value = new SpannableStringBuilder(); + value.append("◆ "); + value.setSpan(new ForegroundColorSpan(measurementView.getIndicatorColor()), 0, 1, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + value.append(measurementView.getValueAsString(true)); + measurementView.appendDiffValue(value, true); + + holder.valueView.setText(value); + } + + @Override + public long getItemId(int position) { + return measurementViewList.get(position).getId(); + } + + @Override + public int getItemCount() { + return measurementViewList.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView valueView; + ImageView iconView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + + valueView = itemView.findViewById(R.id.valueView); + iconView = itemView.findViewById(R.id.iconView); + } + } +} 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 new file mode 100644 index 00000000..c52ad573 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/overview/OverviewAdapter.java @@ -0,0 +1,112 @@ +package com.health.openscale.gui.overview; + +import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.text.style.RelativeSizeSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.flexbox.AlignItems; +import com.google.android.flexbox.FlexDirection; +import com.google.android.flexbox.FlexboxLayoutManager; +import com.google.android.flexbox.JustifyContent; +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.gui.measurement.WeightMeasurementView; + +import java.text.DateFormat; +import java.util.List; + +class OverviewAdapter extends RecyclerView.Adapter { + private Context context; + private List scaleMeasurementList; + + public OverviewAdapter(Context aContext, List scaleMeasurementList) { + this.context = aContext; + this.scaleMeasurementList = scaleMeasurementList; + } + + @Override + public OverviewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_overview, parent, false); + + ViewHolder viewHolder = new ViewHolder(view); + + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull OverviewAdapter.ViewHolder holder, int position) { + ScaleMeasurement scaleMeasurement = scaleMeasurementList.get(position); + ScaleMeasurement prevScaleMeasurement = scaleMeasurementList.get(position-1); + + holder.expandMoreView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (holder.measurementRecyclerView.getVisibility() == View.GONE) { + holder.measurementRecyclerView.setVisibility(View.VISIBLE); + } else { + holder.measurementRecyclerView.setVisibility(View.GONE); + } + } + }); + + FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(context); + layoutManager.setFlexDirection(FlexDirection.ROW); + layoutManager.setJustifyContent(JustifyContent.SPACE_AROUND); + layoutManager.setAlignItems(AlignItems.CENTER); + holder.measurementRecyclerView.setLayoutManager(layoutManager); + holder.measurementRecyclerView.setHasFixedSize(true); + holder.measurementRecyclerView.setNestedScrollingEnabled(false); + holder.measurementRecyclerView.setAdapter(new MeasurementAdapter(context, scaleMeasurement, prevScaleMeasurement)); + + WeightMeasurementView weightMeasurementView = new WeightMeasurementView(context); + weightMeasurementView.loadFrom(scaleMeasurement, prevScaleMeasurement); + SpannableStringBuilder weightValue = new SpannableStringBuilder(); + weightValue.append("◆ "); + weightValue.setSpan(new ForegroundColorSpan(weightMeasurementView.getIndicatorColor()), 0, 1, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + weightValue.append(weightMeasurementView.getValueAsString(true)); + int start = weightValue.length(); + weightMeasurementView.appendDiffValue(weightValue, true); + weightValue.setSpan(new RelativeSizeSpan(0.9f), start, weightValue.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + holder.weightView.setText(weightValue); + holder.dateView.setText(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT).format(scaleMeasurement.getDateTime())); + } + + @Override + public long getItemId(int position) { + return scaleMeasurementList.get(position).getId(); + } + + @Override + public int getItemCount() { + return scaleMeasurementList.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView dateView; + TextView weightView; + ImageView expandMoreView; + RecyclerView measurementRecyclerView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + + dateView = itemView.findViewById(R.id.dateView); + weightView = itemView.findViewById(R.id.weightView); + expandMoreView = itemView.findViewById(R.id.expandMoreView); + measurementRecyclerView = itemView.findViewById(R.id.measurementRecyclerView); + } + } +} 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 3d683066..f783cfcc 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 @@ -30,7 +30,6 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.Spinner; -import android.widget.TableLayout; import android.widget.TextView; import android.widget.Toast; @@ -38,6 +37,8 @@ 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 com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; @@ -62,6 +63,8 @@ public class OverviewFragment extends Fragment { private List lastMeasurementViews; + private RecyclerView recyclerView; + private OverviewAdapter overviewAdapter; private ChartMeasurementView chartView; private ChartActionBarView chartActionBarView; @@ -93,6 +96,12 @@ public class OverviewFragment extends Fragment { chartView.setOnChartValueSelectedListener(new onChartSelectedListener()); chartView.setProgressBar(overviewView.findViewById(R.id.progressBar)); chartView.setIsInGraphKey(false); + chartView.getLegend().setEnabled(false); + chartView.getAxisRight().setDrawLabels(false); + chartView.getAxisRight().setDrawGridLines(false); + chartView.getAxisLeft().setDrawGridLines(false); + chartView.getAxisLeft().setDrawLabels(false); + chartView.getXAxis().setDrawGridLines(false); chartActionBarView = overviewView.findViewById(R.id.chartActionBar); chartActionBarView.setIsInGraphKey(false); @@ -181,11 +190,12 @@ public class OverviewFragment extends Fragment { lastMeasurementViews = MeasurementView.getMeasurementList( getContext(), MeasurementView.DateTimeOrder.LAST); - TableLayout tableOverviewLayout = overviewView.findViewById(R.id.tableLayoutMeasurements); - - for (MeasurementView measurement : lastMeasurementViews) { - tableOverviewLayout.addView(measurement); - } + recyclerView = overviewView.findViewById(R.id.recyclerView); + LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); + layoutManager.setInitialPrefetchItemCount(5); + layoutManager.setReverseLayout(true); + layoutManager.setStackFromEnd(true); + recyclerView.setLayoutManager(layoutManager); spinUserAdapter = new ArrayAdapter<>(overviewView.getContext(), R.layout.spinner_item, new ArrayList()); spinUser.setAdapter(spinUserAdapter); @@ -259,6 +269,9 @@ public class OverviewFragment extends Fragment { markedMeasurement = scaleMeasurementList.get(0); } + overviewAdapter = new OverviewAdapter(getContext(), scaleMeasurementList); + recyclerView.setAdapter(overviewAdapter); + updateUserSelection(); updateMesurementViews(markedMeasurement); chartView.updateMeasurementList(scaleMeasurementList); diff --git a/android_app/app/src/main/res/drawable/ic_expand_more.xml b/android_app/app/src/main/res/drawable/ic_expand_more.xml new file mode 100644 index 00000000..adc215c4 --- /dev/null +++ b/android_app/app/src/main/res/drawable/ic_expand_more.xml @@ -0,0 +1,10 @@ + + + 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 41c7f9e0..98bcc9c0 100644 --- a/android_app/app/src/main/res/layout/fragment_overview.xml +++ b/android_app/app/src/main/res/layout/fragment_overview.xml @@ -8,13 +8,6 @@ android:orientation="vertical" android:weightSum="100"> - - - - - + + + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/layout/item_overview.xml b/android_app/app/src/main/res/layout/item_overview.xml new file mode 100644 index 00000000..d5092739 --- /dev/null +++ b/android_app/app/src/main/res/layout/item_overview.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file