mirror of
https://github.com/oliexdev/openScale.git
synced 2025-08-14 04:34:18 +02:00
- refactoring table fragment (using list view instead of table view)
- bug fix if no data is available - move delete all button from table fragment to measurement settings
This commit is contained in:
@@ -194,7 +194,7 @@ public class ScaleDatabase extends SQLiteOpenHelper {
|
||||
cursorScaleDB.moveToFirst();
|
||||
tupleScaleData[1] = readAtCursor(cursorScaleDB);
|
||||
} else {
|
||||
tupleScaleData[1] = null;
|
||||
tupleScaleData[1] = new ScaleData();
|
||||
}
|
||||
|
||||
// previous scale entry
|
||||
|
@@ -34,10 +34,13 @@ import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TableLayout;
|
||||
import android.widget.TableRow;
|
||||
import android.widget.TextView;
|
||||
@@ -63,6 +66,7 @@ import com.health.openscale.gui.views.WeightMeasurementView;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import lecho.lib.hellocharts.util.ChartUtils;
|
||||
|
||||
@@ -70,7 +74,8 @@ import static android.util.TypedValue.COMPLEX_UNIT_DIP;
|
||||
|
||||
public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
private View tableView;
|
||||
private TableLayout tableDataView;
|
||||
private ListView tableDataView;
|
||||
private LinearLayout tableHeaderView;
|
||||
private SharedPreferences prefs;
|
||||
private LinearLayout subpageView;
|
||||
|
||||
@@ -89,7 +94,8 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
|
||||
subpageView = (LinearLayout) tableView.findViewById(R.id.subpageView);
|
||||
|
||||
tableDataView = (TableLayout) tableView.findViewById(R.id.tableDataView);
|
||||
tableDataView = (ListView) tableView.findViewById(R.id.tableDataView);
|
||||
tableHeaderView = (LinearLayout) tableView.findViewById(R.id.tableHeaderView);
|
||||
|
||||
tableView.findViewById(R.id.btnImportData).setOnClickListener(new onClickListenerImport());
|
||||
tableView.findViewById(R.id.btnExportData).setOnClickListener(new onClickListenerExport());
|
||||
@@ -150,10 +156,11 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
|
||||
subpageView.addView(subpageNrView);
|
||||
}
|
||||
|
||||
TextView selectedSubpageNrView = (TextView) subpageView.getChildAt(selectedSubpageNr+1);
|
||||
selectedSubpageNrView.setTypeface(null, Typeface.BOLD);
|
||||
selectedSubpageNrView.setTextColor(ChartUtils.COLOR_BLUE);
|
||||
if (subpageView.getChildCount() > 1) {
|
||||
TextView selectedSubpageNrView = (TextView) subpageView.getChildAt(selectedSubpageNr + 1);
|
||||
selectedSubpageNrView.setTypeface(null, Typeface.BOLD);
|
||||
selectedSubpageNrView.setTextColor(ChartUtils.COLOR_BLUE);
|
||||
}
|
||||
|
||||
Button moveSubpageRight = new Button(tableView.getContext());
|
||||
moveSubpageRight.setText(">");
|
||||
@@ -166,15 +173,7 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
moveSubpageRight.setOnClickListener(new onClickListenerMoveSubpageRight());
|
||||
subpageView.addView(moveSubpageRight);
|
||||
|
||||
tableDataView.removeAllViews();
|
||||
|
||||
TableRow tableHeader = new TableRow(tableView.getContext());
|
||||
tableHeader.setPadding(0, 10, 0, 10);
|
||||
|
||||
// inside dummy id in table header to have the same amount of table columns for header and data
|
||||
TextView idView = new TextView(tableView.getContext());
|
||||
idView.setVisibility(View.GONE);
|
||||
tableHeader.addView(idView);
|
||||
tableHeaderView.removeAllViews();
|
||||
|
||||
for (MeasurementView measurement : measurementsList) {
|
||||
measurement.updatePreferences(prefs);
|
||||
@@ -182,26 +181,16 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
if (measurement.isVisible()) {
|
||||
ImageView headerIcon = new ImageView(tableView.getContext());
|
||||
headerIcon.setImageDrawable(measurement.getIcon());
|
||||
headerIcon.setLayoutParams(new TableRow.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
|
||||
headerIcon.setLayoutParams(new TableRow.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT, 1));
|
||||
headerIcon.getLayoutParams().width = 0;
|
||||
headerIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
|
||||
headerIcon.getLayoutParams().height = pxImageDp(20);
|
||||
|
||||
tableHeader.addView(headerIcon);
|
||||
tableHeaderView.addView(headerIcon);
|
||||
}
|
||||
}
|
||||
|
||||
Button deleteAll = new Button(tableView.getContext());
|
||||
deleteAll.setOnClickListener(new onClickListenerDeleteAll());
|
||||
deleteAll.setText(tableView.getContext().getResources().getString(R.string.label_delete_all));
|
||||
deleteAll.setBackground(ContextCompat.getDrawable(tableView.getContext(), R.drawable.flat_selector));
|
||||
deleteAll.setLayoutParams(new TableRow.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
|
||||
deleteAll.getLayoutParams().height = pxImageDp(24);
|
||||
deleteAll.setTextColor(Color.WHITE);
|
||||
deleteAll.setPadding(0,0,0,0);
|
||||
deleteAll.setTextSize(COMPLEX_UNIT_DIP, 8);
|
||||
tableHeader.addView(deleteAll);
|
||||
|
||||
tableDataView.addView(tableHeader);
|
||||
ArrayList<HashMap<Integer,String>> dataRowList = new ArrayList<>();
|
||||
|
||||
int displayCount = 0;
|
||||
|
||||
@@ -216,75 +205,48 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
prevScaleData = scaleDataList.get(i+1);
|
||||
}
|
||||
|
||||
TableRow dataRow = new TableRow(tableView.getContext());
|
||||
|
||||
idView = new TextView(tableView.getContext());
|
||||
idView.setVisibility(View.GONE);
|
||||
idView.setText(Long.toString(scaleData.getId()));
|
||||
dataRow.addView(idView);
|
||||
HashMap<Integer,String> dataRow = new HashMap<>();
|
||||
|
||||
for (MeasurementView measurement : measurementsList) {
|
||||
measurement.updateValue(scaleData);
|
||||
measurement.updateDiff(scaleData, prevScaleData);
|
||||
dataRow.put(0, Long.toString(scaleData.getId()));
|
||||
|
||||
for (int j=0; j< measurementsList.size(); j++) {
|
||||
MeasurementView measurement = measurementsList.get(j);
|
||||
measurement.updateValue(scaleData);
|
||||
measurement.updateDiff(scaleData, prevScaleData);
|
||||
|
||||
if (measurement.isVisible()) {
|
||||
TextView measurementView = new TextView(tableView.getContext());
|
||||
measurementView.setGravity(Gravity.CENTER);
|
||||
|
||||
measurementView.setText(Html.fromHtml(measurement.getValueAsString() + "<br>" + measurement.getDiffValue()));
|
||||
|
||||
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_XLARGE &&
|
||||
(getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_LARGE) {
|
||||
measurementView.setTextSize(COMPLEX_UNIT_DIP, 10);
|
||||
}
|
||||
|
||||
dataRow.addView(measurementView);
|
||||
dataRow.put(j+1,measurement.getValueAsString() + "<br>" + measurement.getDiffValue());
|
||||
}
|
||||
}
|
||||
|
||||
ImageView deleteImageView = new ImageView(tableView.getContext());
|
||||
deleteImageView.setImageDrawable(ContextCompat.getDrawable(tableView.getContext(), R.drawable.delete));
|
||||
deleteImageView.setLayoutParams(new TableRow.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
|
||||
deleteImageView.getLayoutParams().height = pxImageDp(16);
|
||||
deleteImageView.setOnClickListener(new onClickListenerDelete());
|
||||
dataRow.addView(deleteImageView);
|
||||
|
||||
dataRow.setOnClickListener(new onClickListenerRow());
|
||||
dataRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
|
||||
dataRow.setPadding(0,0,0,10);
|
||||
|
||||
// doesn't work if we use a horizontal scroll view
|
||||
/*for (int i=1; i<dataRow.getChildCount()-1; i++) {
|
||||
tableDataView.setColumnStretchable(i, true);
|
||||
}*/
|
||||
|
||||
tableDataView.addView(dataRow);
|
||||
dataRowList.add(dataRow);
|
||||
|
||||
displayCount++;
|
||||
|
||||
if (maxSize <= displayCount) {
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
tableDataView.setAdapter(new ListViewAdapter(dataRowList));
|
||||
tableDataView.setOnItemClickListener(new onClickListenerRow());
|
||||
}
|
||||
|
||||
private int pxImageDp(float dp) {
|
||||
return (int)(dp * getResources().getDisplayMetrics().density + 0.5f);
|
||||
}
|
||||
|
||||
private class onClickListenerRow implements View.OnClickListener {
|
||||
|
||||
private class onClickListenerRow implements AdapterView.OnItemClickListener {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
TableRow dataRow = (TableRow)v;
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long click_id) {
|
||||
LinearLayout dataRow = (LinearLayout)view;
|
||||
TextView idTextView = (TextView) dataRow.getChildAt(0);
|
||||
long id = Long.parseLong(idTextView.getText().toString());
|
||||
|
||||
Intent intent = new Intent(tableView.getContext(), DataEntryActivity.class);
|
||||
intent.putExtra("id", id);
|
||||
startActivityForResult(intent, 1);
|
||||
}
|
||||
startActivityForResult(intent, 1); }
|
||||
}
|
||||
|
||||
private class onClickListenerImport implements View.OnClickListener {
|
||||
@@ -385,78 +347,6 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
}
|
||||
}
|
||||
|
||||
private class onClickListenerDeleteAll implements View.OnClickListener {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
AlertDialog.Builder deleteAllDialog = new AlertDialog.Builder(getActivity());
|
||||
|
||||
deleteAllDialog.setMessage(getResources().getString(R.string.question_really_delete_all));
|
||||
|
||||
deleteAllDialog.setPositiveButton(getResources().getString(R.string.label_yes), new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(tableView.getContext());
|
||||
int selectedUserId = prefs.getInt("selectedUserId", -1);
|
||||
|
||||
OpenScale.getInstance(getContext()).clearScaleData(selectedUserId);
|
||||
|
||||
Toast.makeText(tableView.getContext(), getResources().getString(R.string.info_data_all_deleted), Toast.LENGTH_SHORT).show();
|
||||
updateOnView(OpenScale.getInstance(getContext()).getScaleDataList());
|
||||
}
|
||||
});
|
||||
|
||||
deleteAllDialog.setNegativeButton(getResources().getString(R.string.label_no), new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
deleteAllDialog.show();
|
||||
}
|
||||
}
|
||||
|
||||
private class onClickListenerDelete implements View.OnClickListener {
|
||||
private long row_id;
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
TableRow dataRow = (TableRow)v.getParent();
|
||||
TextView idTextView = (TextView) dataRow.getChildAt(0);
|
||||
row_id = Long.parseLong(idTextView.getText().toString());
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(v.getContext());
|
||||
boolean deleteConfirmationEnable = prefs.getBoolean("deleteConfirmationEnable", true);
|
||||
|
||||
if (deleteConfirmationEnable) {
|
||||
AlertDialog.Builder deleteAllDialog = new AlertDialog.Builder(getActivity());
|
||||
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) {
|
||||
deleteMeasurement();
|
||||
}
|
||||
});
|
||||
|
||||
deleteAllDialog.setNegativeButton(getResources().getString(R.string.label_no), new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
deleteAllDialog.show();
|
||||
}
|
||||
else {
|
||||
deleteMeasurement();
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteMeasurement() {
|
||||
OpenScale.getInstance(getContext()).deleteScaleData(row_id);
|
||||
|
||||
Toast.makeText(tableView.getContext(), getResources().getString(R.string.info_data_deleted), Toast.LENGTH_SHORT).show();
|
||||
updateOnView(OpenScale.getInstance(getContext()).getScaleDataList());
|
||||
}
|
||||
}
|
||||
|
||||
private class onClickListenerMoveSubpageLeft implements View.OnClickListener {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -495,4 +385,74 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
|
||||
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
|
||||
}
|
||||
}
|
||||
|
||||
private class ListViewAdapter extends BaseAdapter {
|
||||
|
||||
private ArrayList<HashMap<Integer, String>> dataList;
|
||||
private LinearLayout row;
|
||||
|
||||
public ListViewAdapter(ArrayList<HashMap<Integer, String>> list){
|
||||
super();
|
||||
this.dataList =list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return dataList.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return dataList.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
if (dataList.isEmpty()) {
|
||||
return convertView;
|
||||
}
|
||||
|
||||
if(convertView == null){
|
||||
row = new LinearLayout(getContext());
|
||||
row.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
|
||||
|
||||
convertView = row;
|
||||
|
||||
for (int i = 0; i< dataList.get(0).size(); i++) {
|
||||
TextView column = new TextView(getContext());
|
||||
column.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
|
||||
column.getLayoutParams().width = 0;
|
||||
column.setGravity(Gravity.CENTER);
|
||||
|
||||
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_XLARGE &&
|
||||
(getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_LARGE) {
|
||||
column.setTextSize(COMPLEX_UNIT_DIP, 9);
|
||||
}
|
||||
|
||||
if (i == 0) {
|
||||
column.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
row.addView(column);
|
||||
}
|
||||
}
|
||||
|
||||
LinearLayout convView = (LinearLayout)convertView;
|
||||
|
||||
HashMap<Integer, String> map = dataList.get(position);
|
||||
|
||||
for (int i = 0; i< dataList.get(0).size(); i++) {
|
||||
TextView column = (TextView)convView.getChildAt(i);
|
||||
column.setText(Html.fromHtml(map.get(i)));
|
||||
}
|
||||
|
||||
return convertView;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -15,16 +15,61 @@
|
||||
*/
|
||||
package com.health.openscale.gui.preferences;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.health.openscale.R;
|
||||
import com.health.openscale.core.OpenScale;
|
||||
|
||||
public class MeasurementPreferences extends PreferenceFragment {
|
||||
public static final String PREFERENCE_KEY_DELETE_ALL = "deleteAll";
|
||||
|
||||
private Preference deleteAll;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.measurement_preferences);
|
||||
|
||||
deleteAll = (Preference) findPreference(PREFERENCE_KEY_DELETE_ALL);
|
||||
deleteAll.setOnPreferenceClickListener(new onClickListenerDeleteAll());
|
||||
}
|
||||
|
||||
private class onClickListenerDeleteAll implements Preference.OnPreferenceClickListener {
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
|
||||
AlertDialog.Builder deleteAllDialog = new AlertDialog.Builder(getActivity());
|
||||
|
||||
deleteAllDialog.setMessage(getResources().getString(R.string.question_really_delete_all));
|
||||
|
||||
deleteAllDialog.setPositiveButton(getResources().getString(R.string.label_yes), new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
|
||||
int selectedUserId = prefs.getInt("selectedUserId", -1);
|
||||
|
||||
OpenScale.getInstance(getActivity().getApplicationContext()).clearScaleData(selectedUserId);
|
||||
|
||||
Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.info_data_all_deleted), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
|
||||
deleteAllDialog.setNegativeButton(getResources().getString(R.string.label_no), new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
deleteAllDialog.show();
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -14,6 +14,13 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/tableHeaderView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@@ -21,22 +28,11 @@
|
||||
android:gravity="bottom"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<HorizontalScrollView
|
||||
<ListView
|
||||
android:id="@+id/tableDataView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center">
|
||||
|
||||
<TableLayout
|
||||
android:id="@+id/tableDataView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"></TableLayout>
|
||||
|
||||
</ScrollView>
|
||||
</HorizontalScrollView>
|
||||
</ListView>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
|
@@ -5,4 +5,5 @@
|
||||
<CheckBoxPreference android:title="@string/label_muscle" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="muscleEnable" android:defaultValue="true"/>
|
||||
<CheckBoxPreference android:title="@string/label_waist" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="waistEnable" android:defaultValue="false"/>
|
||||
<CheckBoxPreference android:title="@string/label_hip" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="hipEnable" android:defaultValue="false"/>
|
||||
<Preference android:title="@string/label_delete_all" android:key="deleteAll"></Preference>
|
||||
</PreferenceScreen>
|
Reference in New Issue
Block a user