1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-16 13:44:26 +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:
OliE
2017-05-05 15:33:09 +02:00
parent 2dcf6931e8
commit df711df7f3
5 changed files with 161 additions and 159 deletions

View File

@@ -194,7 +194,7 @@ public class ScaleDatabase extends SQLiteOpenHelper {
cursorScaleDB.moveToFirst(); cursorScaleDB.moveToFirst();
tupleScaleData[1] = readAtCursor(cursorScaleDB); tupleScaleData[1] = readAtCursor(cursorScaleDB);
} else { } else {
tupleScaleData[1] = null; tupleScaleData[1] = new ScaleData();
} }
// previous scale entry // previous scale entry

View File

@@ -34,10 +34,13 @@ import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TableLayout; import android.widget.TableLayout;
import android.widget.TableRow; import android.widget.TableRow;
import android.widget.TextView; import android.widget.TextView;
@@ -63,6 +66,7 @@ import com.health.openscale.gui.views.WeightMeasurementView;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import lecho.lib.hellocharts.util.ChartUtils; 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 { public class TableFragment extends Fragment implements FragmentUpdateListener {
private View tableView; private View tableView;
private TableLayout tableDataView; private ListView tableDataView;
private LinearLayout tableHeaderView;
private SharedPreferences prefs; private SharedPreferences prefs;
private LinearLayout subpageView; private LinearLayout subpageView;
@@ -89,7 +94,8 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
subpageView = (LinearLayout) tableView.findViewById(R.id.subpageView); 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.btnImportData).setOnClickListener(new onClickListenerImport());
tableView.findViewById(R.id.btnExportData).setOnClickListener(new onClickListenerExport()); tableView.findViewById(R.id.btnExportData).setOnClickListener(new onClickListenerExport());
@@ -150,10 +156,11 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
subpageView.addView(subpageNrView); subpageView.addView(subpageNrView);
} }
if (subpageView.getChildCount() > 1) {
TextView selectedSubpageNrView = (TextView) subpageView.getChildAt(selectedSubpageNr+1); TextView selectedSubpageNrView = (TextView) subpageView.getChildAt(selectedSubpageNr + 1);
selectedSubpageNrView.setTypeface(null, Typeface.BOLD); selectedSubpageNrView.setTypeface(null, Typeface.BOLD);
selectedSubpageNrView.setTextColor(ChartUtils.COLOR_BLUE); selectedSubpageNrView.setTextColor(ChartUtils.COLOR_BLUE);
}
Button moveSubpageRight = new Button(tableView.getContext()); Button moveSubpageRight = new Button(tableView.getContext());
moveSubpageRight.setText(">"); moveSubpageRight.setText(">");
@@ -166,15 +173,7 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
moveSubpageRight.setOnClickListener(new onClickListenerMoveSubpageRight()); moveSubpageRight.setOnClickListener(new onClickListenerMoveSubpageRight());
subpageView.addView(moveSubpageRight); subpageView.addView(moveSubpageRight);
tableDataView.removeAllViews(); tableHeaderView.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);
for (MeasurementView measurement : measurementsList) { for (MeasurementView measurement : measurementsList) {
measurement.updatePreferences(prefs); measurement.updatePreferences(prefs);
@@ -182,26 +181,16 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
if (measurement.isVisible()) { if (measurement.isVisible()) {
ImageView headerIcon = new ImageView(tableView.getContext()); ImageView headerIcon = new ImageView(tableView.getContext());
headerIcon.setImageDrawable(measurement.getIcon()); 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.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
headerIcon.getLayoutParams().height = pxImageDp(20); headerIcon.getLayoutParams().height = pxImageDp(20);
tableHeader.addView(headerIcon); tableHeaderView.addView(headerIcon);
} }
} }
Button deleteAll = new Button(tableView.getContext()); ArrayList<HashMap<Integer,String>> dataRowList = new ArrayList<>();
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);
int displayCount = 0; int displayCount = 0;
@@ -216,75 +205,48 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
prevScaleData = scaleDataList.get(i+1); prevScaleData = scaleDataList.get(i+1);
} }
TableRow dataRow = new TableRow(tableView.getContext());
idView = new TextView(tableView.getContext()); HashMap<Integer,String> dataRow = new HashMap<>();
idView.setVisibility(View.GONE);
idView.setText(Long.toString(scaleData.getId()));
dataRow.addView(idView);
for (MeasurementView measurement : measurementsList) { dataRow.put(0, Long.toString(scaleData.getId()));
measurement.updateValue(scaleData);
measurement.updateDiff(scaleData, prevScaleData); for (int j=0; j< measurementsList.size(); j++) {
MeasurementView measurement = measurementsList.get(j);
measurement.updateValue(scaleData);
measurement.updateDiff(scaleData, prevScaleData);
if (measurement.isVisible()) { if (measurement.isVisible()) {
TextView measurementView = new TextView(tableView.getContext()); dataRow.put(j+1,measurement.getValueAsString() + "<br>" + measurement.getDiffValue());
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);
} }
} }
ImageView deleteImageView = new ImageView(tableView.getContext()); dataRowList.add(dataRow);
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);
displayCount++; displayCount++;
if (maxSize <= displayCount) { if (maxSize <= displayCount) {
break; break;
} }
} }
tableDataView.setAdapter(new ListViewAdapter(dataRowList));
tableDataView.setOnItemClickListener(new onClickListenerRow());
} }
private int pxImageDp(float dp) { private int pxImageDp(float dp) {
return (int)(dp * getResources().getDisplayMetrics().density + 0.5f); return (int)(dp * getResources().getDisplayMetrics().density + 0.5f);
} }
private class onClickListenerRow implements View.OnClickListener { private class onClickListenerRow implements AdapterView.OnItemClickListener {
@Override @Override
public void onClick(View v) { public void onItemClick(AdapterView<?> parent, View view, int position, long click_id) {
TableRow dataRow = (TableRow)v; LinearLayout dataRow = (LinearLayout)view;
TextView idTextView = (TextView) dataRow.getChildAt(0); TextView idTextView = (TextView) dataRow.getChildAt(0);
long id = Long.parseLong(idTextView.getText().toString()); long id = Long.parseLong(idTextView.getText().toString());
Intent intent = new Intent(tableView.getContext(), DataEntryActivity.class); Intent intent = new Intent(tableView.getContext(), DataEntryActivity.class);
intent.putExtra("id", id); intent.putExtra("id", id);
startActivityForResult(intent, 1); startActivityForResult(intent, 1); }
}
} }
private class onClickListenerImport implements View.OnClickListener { 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 { private class onClickListenerMoveSubpageLeft implements View.OnClickListener {
@Override @Override
public void onClick(View v) { 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); 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;
}
}
} }

View File

@@ -15,16 +15,61 @@
*/ */
package com.health.openscale.gui.preferences; package com.health.openscale.gui.preferences;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.widget.Toast;
import com.health.openscale.R; import com.health.openscale.R;
import com.health.openscale.core.OpenScale;
public class MeasurementPreferences extends PreferenceFragment { public class MeasurementPreferences extends PreferenceFragment {
public static final String PREFERENCE_KEY_DELETE_ALL = "deleteAll";
private Preference deleteAll;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.measurement_preferences); 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;
}
} }
} }

View File

@@ -14,6 +14,13 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/tableHeaderView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@@ -21,22 +28,11 @@
android:gravity="bottom" android:gravity="bottom"
android:orientation="horizontal"> android:orientation="horizontal">
<HorizontalScrollView <ListView
android:id="@+id/tableDataView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
</ListView>
<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>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

View File

@@ -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_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_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"/> <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> </PreferenceScreen>