From 2dc40e4bc45adcfd867b4f9e14ac60e4da2c662a Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 28 Jan 2018 15:27:20 +0100 Subject: [PATCH] added an option to select a light or a dark app theme. --- android_app/app/src/main/AndroidManifest.xml | 2 +- .../health/openscale/gui/MainActivity.java | 10 +- .../gui/activities/SettingsActivity.java | 20 +++ .../gui/fragments/GraphFragment.java | 11 +- .../gui/fragments/OverviewFragment.java | 7 +- .../gui/preferences/GeneralPreferences.java | 128 ++++++++++++++++++ .../openscale/gui/views/MeasurementView.java | 14 +- .../res/drawable-hdpi/ic_noteeditable.png | Bin 1329 -> 0 bytes .../res/drawable-ldpi/ic_noteeditable.png | Bin 672 -> 0 bytes .../res/drawable-mdpi/ic_noteeditable.png | Bin 792 -> 0 bytes .../res/drawable-xhdpi/ic_noteeditable.png | Bin 1137 -> 0 bytes .../res/drawable-xxhdpi/ic_noteeditable.png | Bin 1928 -> 0 bytes .../res/drawable-xxxhdpi/ic_noteeditable.png | Bin 2046 -> 0 bytes .../src/main/res/layout/fragment_graph.xml | 82 +++++------ .../main/res/layout/fragment_statistics.xml | 10 +- .../app/src/main/res/values-ca/strings.xml | 1 - .../app/src/main/res/values-de/strings.xml | 4 +- .../app/src/main/res/values-es/strings.xml | 1 - .../app/src/main/res/values-nl/strings.xml | 1 - .../app/src/main/res/values-sv/strings.xml | 1 - .../app/src/main/res/values-tr/strings.xml | 1 - .../app/src/main/res/values/strings.xml | 5 +- .../app/src/main/res/values/styles.xml | 5 +- .../app/src/main/res/values/type_themes.xml | 12 ++ .../src/main/res/xml/general_preferences.xml | 5 + .../src/main/res/xml/graph_preferences.xml | 17 +-- .../src/main/res/xml/header_preferences.xml | 6 +- 27 files changed, 270 insertions(+), 73 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java delete mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_noteeditable.png delete mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_noteeditable.png delete mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_noteeditable.png delete mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_noteeditable.png delete mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_noteeditable.png delete mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_noteeditable.png create mode 100644 android_app/app/src/main/res/values/type_themes.xml create mode 100644 android_app/app/src/main/res/xml/general_preferences.xml diff --git a/android_app/app/src/main/AndroidManifest.xml b/android_app/app/src/main/AndroidManifest.xml index 76d58a74..4747e06f 100644 --- a/android_app/app/src/main/AndroidManifest.xml +++ b/android_app/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:allowBackup="true" android:icon="@drawable/ic_launcher_openscale" android:label="@string/app_name" - android:theme="@style/AppTheme" > + android:theme="@style/AppTheme_Light" > diff --git a/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java index 919a219f..613499ac 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java @@ -73,6 +73,12 @@ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + String app_theme = PreferenceManager.getDefaultSharedPreferences(this).getString("app_theme", "Light"); + + if (app_theme.equals("Dark")) { + setTheme(R.style.AppTheme_Dark); + } + super.onCreate(savedInstanceState); CaocConfig.Builder.create() @@ -245,7 +251,9 @@ public class MainActivity extends AppCompatActivity { fragmentClass = StatisticsFragment.class; break; case R.id.nav_settings: - startActivityForResult(new Intent(this, SettingsActivity.class), 1); + Intent settingsIntent = new Intent(this, SettingsActivity.class); + settingsIntent.putExtra("tintColor", navDrawer.getItemTextColor().getDefaultColor()); + startActivityForResult(settingsIntent, 1); return; default: fragmentClass = OverviewFragment.class; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/SettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/SettingsActivity.java index e8e103bd..05159197 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/SettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/SettingsActivity.java @@ -15,7 +15,11 @@ */ package com.health.openscale.gui.activities; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.preference.PreferenceActivity; +import android.preference.PreferenceManager; import com.health.openscale.R; @@ -25,12 +29,28 @@ import java.util.List; public class SettingsActivity extends PreferenceActivity { private static List fragments = new ArrayList(); + @Override + public void onCreate(Bundle savedInstanceState) { + String app_theme = PreferenceManager.getDefaultSharedPreferences(this).getString("app_theme", "Light"); + + if (app_theme.equals("Dark")) { + setTheme(R.style.AppTheme_Dark); + } + + super.onCreate(savedInstanceState); + } + @Override public void onBuildHeaders(List
target) { loadHeadersFromResource(R.xml.header_preferences, target); + int tintColor = getIntent().getIntExtra("tintColor", 0); + fragments.clear(); for (Header header : target) { + Drawable icon = getResources().getDrawable(header.iconRes); + icon.setColorFilter(tintColor, PorterDuff.Mode.SRC_IN); + fragments.add(header.fragment); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java index 4ea56bcb..c4d7f935 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java @@ -83,6 +83,8 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { private FloatingActionButton enableMonth; private SharedPreferences prefs; + private int textColor; + private OpenScale openScale; private Calendar calYears; @@ -124,6 +126,9 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { chartBottom.setOnValueTouchListener(new chartBottomValueTouchListener()); chartTop.setOnValueTouchListener(new chartTopValueTouchListener()); + // HACK: get default text color from hidden text view to set the correct axis colors + textColor = ((TextView)graphView.findViewById(R.id.colorHack)).getCurrentTextColor(); + txtYear = (TextView) graphView.findViewById(R.id.txtYear); txtYear.setText(Integer.toString(calYears.get(Calendar.YEAR))); @@ -421,13 +426,13 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { LineChartData lineData = new LineChartData(lines); lineData.setAxisXBottom(new Axis(axisValues). setHasLines(true). - setTextColor(Color.BLACK) + setTextColor(textColor) ); lineData.setAxisYLeft(new Axis(). setHasLines(true). setMaxLabelChars(5). - setTextColor(Color.BLACK) + setTextColor(textColor) ); chartBottom.setLineChartData(lineData); @@ -507,7 +512,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { ColumnChartData columnData = new ColumnChartData(columns); - columnData.setAxisXBottom(new Axis(axisValues).setHasLines(true).setTextColor(Color.BLACK)); + columnData.setAxisXBottom(new Axis(axisValues).setHasLines(true).setTextColor(textColor)); chartTop.setColumnChartData(columnData); chartTop.setValueSelectionEnabled(true); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java index 8896d292..9b01235f 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java @@ -359,13 +359,13 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener LineChartData lineData = new LineChartData(lines); lineData.setAxisXBottom(new Axis(axisValues). setHasLines(true). - setTextColor(Color.BLACK) + setTextColor(txtTitleLastMeasurement.getCurrentTextColor()) ); lineData.setAxisYLeft(new Axis(). setHasLines(true). setMaxLabelChars(5). - setTextColor(Color.BLACK) + setTextColor(txtTitleLastMeasurement.getCurrentTextColor()) ); lineChartLast.setLineChartData(lineData); @@ -405,7 +405,8 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener pieChartData.setHasCenterCircle(true); pieChartData.setCenterText1(String.format("%.2f %s", lastScaleMeasurement.getConvertedWeight(unit), unit.toString())); pieChartData.setCenterText2(DateFormat.getDateInstance(DateFormat.MEDIUM).format(lastScaleMeasurement.getDateTime())); - + pieChartData.setCenterText1Color(txtTitleLastMeasurement.getCurrentTextColor()); + pieChartData.setCenterText2Color(txtTitleLastMeasurement.getCurrentTextColor()); if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE || (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java new file mode 100644 index 00000000..6ca949fd --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java @@ -0,0 +1,128 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.preferences; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.EditTextPreference; +import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceGroup; +import android.widget.Toast; + +import com.health.openscale.R; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class GeneralPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + private static final String PREFERENCE_KEY_APP_THEME = "app_theme"; + + private ListPreference appThemeList; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.general_preferences); + + appThemeList = (ListPreference)findPreference(PREFERENCE_KEY_APP_THEME); + + appThemeList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object o) { + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.info_app_restart_required), Toast.LENGTH_LONG).show(); + + return true; + } + }); + + + initSummary(getPreferenceScreen()); + } + + private void initSummary(Preference p) { + if (p instanceof PreferenceGroup) { + PreferenceGroup pGrp = (PreferenceGroup) p; + for (int i = 0; i < pGrp.getPreferenceCount(); i++) { + initSummary(pGrp.getPreference(i)); + } + } else { + updatePrefSummary(p); + } + } + + private void updatePrefSummary(Preference p) + { + if (p instanceof ListPreference) + { + ListPreference listPref = (ListPreference) p; + p.setSummary(listPref.getEntry()); + } + + if (p instanceof EditTextPreference) + { + EditTextPreference editTextPref = (EditTextPreference) p; + if (p.getTitle().toString().contains("assword")) + { + p.setSummary("******"); + } + else + { + p.setSummary(editTextPref.getText()); + } + } + + if (p instanceof MultiSelectListPreference) + { + MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p; + + CharSequence[] entries = editMultiListPref.getEntries(); + CharSequence[] entryValues = editMultiListPref.getEntryValues(); + List currentEntries = new ArrayList<>(); + Set currentEntryValues = editMultiListPref.getValues(); + + for (int i = 0; i < entries.length; i++) + { + if (currentEntryValues.contains(entryValues[i].toString())) currentEntries.add(entries[i].toString()); + } + + p.setSummary(currentEntries.toString()); + } + } + + @Override + public void onResume() + { + super.onResume(); + getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + } + + @Override + public void onPause() + { + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + updatePrefSummary(findPreference(key)); + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java index 296e445e..830da970 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java @@ -102,14 +102,13 @@ public abstract class MeasurementView extends TableLayout { iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); iconView.setPadding(20,0,20,0); + iconView.setColorFilter(nameView.getCurrentTextColor()); nameView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15); - nameView.setTextColor(Color.BLACK); nameView.setLines(2); nameView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.55f)); valueView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15); - valueView.setTextColor(Color.BLACK); valueView.setGravity(Gravity.RIGHT | Gravity.CENTER); valueView.setPadding(0,0,20,0); valueView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.29f)); @@ -122,6 +121,7 @@ public abstract class MeasurementView extends TableLayout { editModeView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_editable)); editModeView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); editModeView.setVisibility(View.GONE); + editModeView.setColorFilter(nameView.getCurrentTextColor()); indicatorView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.01f)); indicatorView.setBackgroundColor(Color.GRAY); @@ -185,8 +185,14 @@ public abstract class MeasurementView extends TableLayout { valueView.setGravity(Gravity.RIGHT | Gravity.CENTER); if (!isEditable()) { - editModeView.setImageDrawable(ContextCompat.getDrawable(getContext(), - R.drawable.ic_noteeditable)); + // if measurement is not editable, darken the icon color + float[] hsv = new float[3]; + int color = nameView.getCurrentTextColor(); + Color.colorToHSV(color, hsv); + hsv[2] *= 0.4f; // value component + color = Color.HSVToColor(hsv); + + editModeView.setColorFilter(color); } showEvaluatorRow(false); diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_noteeditable.png b/android_app/app/src/main/res/drawable-hdpi/ic_noteeditable.png deleted file mode 100644 index 33556939e248afb08787ac914a98a76ad42db8cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 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 DBD5HZ diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_noteeditable.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_noteeditable.png deleted file mode 100644 index 0d3226110454bfa88120abc015cbc9e03e35a4c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1928 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 diff --git a/android_app/app/src/main/res/layout/fragment_graph.xml b/android_app/app/src/main/res/layout/fragment_graph.xml index f7183348..69baa54c 100644 --- a/android_app/app/src/main/res/layout/fragment_graph.xml +++ b/android_app/app/src/main/res/layout/fragment_graph.xml @@ -114,48 +114,54 @@ - - -