mirror of
https://github.com/oliexdev/openScale.git
synced 2025-08-15 05:04:22 +02:00
reformatted layout
This commit is contained in:
@@ -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'
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
10
android_app/app/src/main/res/drawable/ic_expand_more.xml
Normal file
10
android_app/app/src/main/res/drawable/ic_expand_more.xml
Normal 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>
|
@@ -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"
|
||||
|
30
android_app/app/src/main/res/layout/item_measurement.xml
Normal file
30
android_app/app/src/main/res/layout/item_measurement.xml
Normal 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>
|
64
android_app/app/src/main/res/layout/item_overview.xml
Normal file
64
android_app/app/src/main/res/layout/item_overview.xml
Normal 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>
|
Reference in New Issue
Block a user