1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-15 05:04:22 +02:00

reformatted layout

This commit is contained in:
oliexdev
2020-09-19 14:11:37 +02:00
parent cf196a7e50
commit 9965e7900c
8 changed files with 345 additions and 20 deletions

View File

@@ -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'

View File

@@ -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<MeasurementAdapter.ViewHolder> {
private Context context;
private ScaleMeasurement scaleMeasurement;
private ScaleMeasurement prevScaleMeasurement;
private List<FloatMeasurementView> measurementViewList;
public MeasurementAdapter(Context aContext, ScaleMeasurement scaleMeasurement, ScaleMeasurement prevScaleMeasurement) {
context = aContext;
this.scaleMeasurement = scaleMeasurement;
this.prevScaleMeasurement = prevScaleMeasurement;
measurementViewList = new ArrayList<>();
List<MeasurementView> 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);
}
}
}

View File

@@ -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<OverviewAdapter.ViewHolder> {
private Context context;
private List<ScaleMeasurement> scaleMeasurementList;
public OverviewAdapter(Context aContext, List<ScaleMeasurement> 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);
}
}
}

View File

@@ -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<MeasurementView> 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<String>());
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);

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z"/>
</vector>

View File

@@ -8,13 +8,6 @@
android:orientation="vertical"
android:weightSum="100">
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="100">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -93,15 +86,14 @@
<com.health.openscale.gui.measurement.ChartMeasurementView
android:id="@+id/chartView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_height="200dp"
android:layout_gravity="center" />
<TableLayout
android:id="@+id/tableLayoutMeasurements"
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
<ProgressBar
android:id="@+id/progressBar"

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<ImageView
android:id="@+id/iconView"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:paddingRight="5dp"
android:paddingBottom="5dp"
android:scaleType="centerInside"
app:srcCompat="@drawable/ic_tdee" />
<TextView
android:id="@+id/valueView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:lineSpacingExtra="-5dp"
android:text="TextView"
android:textSize="12sp" />
</LinearLayout>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="10dp"
app:contentPadding="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/dateView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/weightView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lineSpacingExtra="-5dp"
android:text="TextView"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dateView" />
<ImageView
android:id="@+id/expandMoreView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:tint="?attr/colorControlNormal"
app:layout_constraintBottom_toBottomOf="@+id/weightView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/weightView"
app:srcCompat="@drawable/ic_expand_more" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/measurementRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/weightView" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>