From 1e464f5b8a58c774f13c3f1415406895f0946d69 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sat, 24 Mar 2018 23:15:09 +0100 Subject: [PATCH 1/4] Use class member prefs consistently --- .../com/health/openscale/gui/MainActivity.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) 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 62de40e7..1a583c69 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 @@ -101,8 +101,7 @@ public class MainActivity extends AppCompatActivity super.onCreate(savedInstanceState); - PreferenceManager.getDefaultSharedPreferences(this) - .registerOnSharedPreferenceChangeListener(this); + prefs.registerOnSharedPreferenceChangeListener(this); CaocConfig.Builder.create() .trackActivities(true) @@ -203,8 +202,7 @@ public class MainActivity extends AppCompatActivity @Override public void onDestroy() { - PreferenceManager.getDefaultSharedPreferences(this) - .unregisterOnSharedPreferenceChangeListener(this); + prefs.unregisterOnSharedPreferenceChangeListener(this); super.onDestroy(); } @@ -317,7 +315,6 @@ public class MainActivity extends AppCompatActivity return; } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.edit().putInt("lastFragmentId", menuItemId).commit(); FragmentManager fragmentManager = getSupportFragmentManager(); @@ -416,8 +413,6 @@ public class MainActivity extends AppCompatActivity bluetoothStatus = menu.findItem(R.id.action_bluetooth_status); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - // Just search for a bluetooth device just once at the start of the app and if start preference enabled if (firstAppStart && prefs.getBoolean("btEnable", false)) { invokeSearchBluetoothDevice(); @@ -448,8 +443,6 @@ public class MainActivity extends AppCompatActivity return; } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - String deviceName = prefs.getString("btDeviceName", "-"); boolean permGrantedCoarseLocation = false; @@ -597,8 +590,6 @@ public class MainActivity extends AppCompatActivity OpenScale openScale = OpenScale.getInstance(getApplicationContext()); final ScaleUser selectedScaleUser = openScale.getSelectedScaleUser(); - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - Uri uri; try { String exportUri = prefs.getString(getExportPreferenceKey(selectedScaleUser), ""); @@ -686,7 +677,6 @@ public class MainActivity extends AppCompatActivity break; case EXPORT_DATA_REQUEST: if (doExportData(data.getData())) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = prefs.edit(); String key = getExportPreferenceKey(openScale.getSelectedScaleUser()); From c9e541e262ad6de16e1a4590d74a8b590faadeec Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 25 Mar 2018 00:26:01 +0100 Subject: [PATCH 2/4] Add language preference Make it possible to select a language that differs from the system default. This can be useful when doing translations (as hinted in issue #186), or if you just want to use openScale in a different language from the system one. Also moved theme setting to a new common base class for activities. --- .../health/openscale/gui/MainActivity.java | 13 +--- .../gui/activities/BaseAppCompatActivity.java | 77 +++++++++++++++++++ .../gui/activities/DataEntryActivity.java | 9 +-- .../gui/activities/SettingsActivity.java | 16 ++-- .../gui/activities/UserSettingsActivity.java | 11 +-- .../gui/preferences/BluetoothPreferences.java | 4 +- .../gui/preferences/UsersPreferences.java | 4 +- .../openscale/gui/views/MeasurementView.java | 7 -- .../app/src/main/res/values/arrays.xml | 36 +++++++++ .../app/src/main/res/values/strings.xml | 15 ++++ .../src/main/res/xml/general_preferences.xml | 6 ++ 11 files changed, 153 insertions(+), 45 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/activities/BaseAppCompatActivity.java create mode 100644 android_app/app/src/main/res/values/arrays.xml 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 1a583c69..9d1276f3 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 @@ -41,7 +41,6 @@ import android.support.v4.content.FileProvider; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; @@ -55,6 +54,7 @@ import com.health.openscale.core.OpenScale; import com.health.openscale.core.bluetooth.BluetoothCommunication; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleUser; +import com.health.openscale.gui.activities.BaseAppCompatActivity; import com.health.openscale.gui.activities.DataEntryActivity; import com.health.openscale.gui.activities.SettingsActivity; import com.health.openscale.gui.activities.UserSettingsActivity; @@ -70,7 +70,7 @@ import java.util.List; import cat.ereza.customactivityoncrash.config.CaocConfig; -public class MainActivity extends AppCompatActivity +public class MainActivity extends BaseAppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener{ private SharedPreferences prefs; private static boolean firstAppStart = true; @@ -91,16 +91,9 @@ public class MainActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { - prefs = PreferenceManager.getDefaultSharedPreferences(this); - - String app_theme = prefs.getString("app_theme", "Light"); - - if (app_theme.equals("Dark")) { - setTheme(R.style.AppTheme_Dark); - } - super.onCreate(savedInstanceState); + prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); CaocConfig.Builder.create() diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/BaseAppCompatActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/BaseAppCompatActivity.java new file mode 100644 index 00000000..9262727f --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/BaseAppCompatActivity.java @@ -0,0 +1,77 @@ +/* Copyright (C) 2018 Erik Johansson +* +* 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.activities; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; + +import com.health.openscale.R; + +import java.util.Locale; + +public class BaseAppCompatActivity extends AppCompatActivity { + public static final String PREFERENCE_APP_THEME = "app_theme"; + public static final String PREFERENCE_LANGUAGE = "language"; + + public static Context createBaseContext(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + String language = prefs.getString(PREFERENCE_LANGUAGE, ""); + if (language.isEmpty()) { + return context; + } + + Locale locale; + String[] localeParts = TextUtils.split(language, "-"); + if (localeParts.length == 2) { + locale = new Locale(localeParts[0], localeParts[1]); + } + else { + locale = new Locale(localeParts[0]); + } + Locale.setDefault(locale); + + Configuration config = context.getResources().getConfiguration(); + config.setLocale(locale); + + return context.createConfigurationContext(config); + } + + public static void applyTheme(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + if (prefs.getString(PREFERENCE_APP_THEME, "").equals("Dark")) { + context.setTheme(R.style.AppTheme_Dark); + } + } + + @Override + protected void attachBaseContext(Context context) { + super.attachBaseContext(createBaseContext(context)); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + applyTheme(this); + super.onCreate(savedInstanceState); + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index 5fa221e7..6f7fac94 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -24,7 +24,6 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuInflater; @@ -49,7 +48,7 @@ import java.text.DateFormat; import java.util.Date; import java.util.List; -public class DataEntryActivity extends AppCompatActivity { +public class DataEntryActivity extends BaseAppCompatActivity { public static String EXTRA_ID = "id"; private static String PREF_EXPAND = "expandEvaluator"; @@ -80,12 +79,6 @@ public class DataEntryActivity 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); setContentView(R.layout.activity_dataentry); 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 623311d4..af6c4590 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 @@ -16,6 +16,7 @@ package com.health.openscale.gui.activities; import android.app.Fragment; +import android.content.Context; import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -37,14 +38,14 @@ public class SettingsActivity extends PreferenceActivity private static List fragments = new ArrayList(); private Fragment currentFragment; + @Override + protected void attachBaseContext(Context context) { + super.attachBaseContext(BaseAppCompatActivity.createBaseContext(context)); + } + @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); - } - + BaseAppCompatActivity.applyTheme(this); super.onCreate(savedInstanceState); } @@ -65,7 +66,8 @@ public class SettingsActivity extends PreferenceActivity @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { - if (key.equals("app_theme")) { + if (key.equals(BaseAppCompatActivity.PREFERENCE_APP_THEME) + || key.equals(BaseAppCompatActivity.PREFERENCE_LANGUAGE)) { recreate(); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java index 623137b2..4299beb6 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java @@ -23,9 +23,7 @@ import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuInflater; @@ -46,7 +44,7 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -public class UserSettingsActivity extends AppCompatActivity { +public class UserSettingsActivity extends BaseAppCompatActivity { public static String EXTRA_ID = "id"; public static String EXTRA_MODE = "mode"; @@ -74,13 +72,8 @@ public class UserSettingsActivity 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); + setContentView(R.layout.activity_usersettings); context = this; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java index 008c234f..41d073a1 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java @@ -97,11 +97,11 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr for (Map.Entry entry : foundDevices.entrySet()) { if (getActivity() != null) { - Preference prefBtDevice = new Preference(getActivity().getBaseContext()); + Preference prefBtDevice = new Preference(getActivity()); prefBtDevice.setSummary(entry.getKey()); for (BluetoothCommunication.BT_DEVICE_ID btScaleID : BluetoothCommunication.BT_DEVICE_ID.values()) { - BluetoothCommunication btDevice = BluetoothCommunication.getBtDevice(getActivity().getBaseContext(), btScaleID); + BluetoothCommunication btDevice = BluetoothCommunication.getBtDevice(getActivity(), btScaleID); if (btDevice.checkDeviceName(entry.getValue())) { prefBtDevice.setOnPreferenceClickListener(new onClickListenerDeviceSelect()); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java index 2459ff32..76599b0a 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/UsersPreferences.java @@ -50,7 +50,7 @@ public class UsersPreferences extends PreferenceFragment { for (ScaleUser scaleUser : scaleUserList) { - Preference prefUser = new Preference(getActivity().getBaseContext()); + Preference prefUser = new Preference(getActivity()); prefUser.setOnPreferenceClickListener(new onClickListenerUserSelect()); if (scaleUser.getId() == selectedUserId) { @@ -66,7 +66,7 @@ public class UsersPreferences extends PreferenceFragment { } - Preference prefAddUser = new Preference(getActivity().getBaseContext()); + Preference prefAddUser = new Preference(getActivity()); prefAddUser.setOnPreferenceClickListener(new onClickListenerAddUser()); prefAddUser.setTitle("+ " + getResources().getString(R.string.label_add_user)); 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 2f01024f..c1a759d8 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 @@ -81,13 +81,6 @@ public abstract class MeasurementView extends TableLayout { public MeasurementView(Context context, String text, Drawable icon) { super(context); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - String app_theme = prefs.getString("app_theme", "Light"); - - if (app_theme.equals("Dark")) { - context.setTheme(R.style.AppTheme_Dark); - } - initView(context); nameView.setText(text); diff --git a/android_app/app/src/main/res/values/arrays.xml b/android_app/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..10bbc433 --- /dev/null +++ b/android_app/app/src/main/res/values/arrays.xml @@ -0,0 +1,36 @@ + + + + @string/language_default + @string/language_brazilian_portuguese + @string/language_catalan + @string/language_czech + @string/language_dutch + @string/language_english + @string/language_french + @string/language_german + @string/language_japanese + @string/language_polish + @string/language_slovak + @string/language_spanish + @string/language_swedish + @string/language_turkish + + + + + pt-BR + ca + cs + nl + en + fr + de + ja + pl + sk + es + sv + tr + + \ No newline at end of file diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index 9160ad12..db993dc7 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -200,4 +200,19 @@ Measurement in % Estimate measurement Estimation formula + System default + Language + Brazilian Portuguese + Catalan (català) + Czech (čeština) + Dutch (Nederlands) + English + French (français) + German (Deutsch) + Japanese (日本語 (にほんご)) + Polish (język polski) + Slovak (Slovenčina) + Spanish (Español) + Swedish (Svenska) + Turkish (Türkçe) diff --git a/android_app/app/src/main/res/xml/general_preferences.xml b/android_app/app/src/main/res/xml/general_preferences.xml index c1a22025..95760210 100644 --- a/android_app/app/src/main/res/xml/general_preferences.xml +++ b/android_app/app/src/main/res/xml/general_preferences.xml @@ -1,5 +1,11 @@ + \ No newline at end of file From d310ddadd78fa3f460402b2f76e3b0b4dcf546f2 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 25 Mar 2018 00:33:27 +0100 Subject: [PATCH 3/4] Make theme name translatable --- android_app/app/src/main/res/values/arrays.xml | 10 ++++++++++ android_app/app/src/main/res/values/strings.xml | 2 ++ .../app/src/main/res/values/type_themes.xml | 12 ------------ .../app/src/main/res/xml/general_preferences.xml | 14 ++++++++++++-- 4 files changed, 24 insertions(+), 14 deletions(-) delete mode 100644 android_app/app/src/main/res/values/type_themes.xml diff --git a/android_app/app/src/main/res/values/arrays.xml b/android_app/app/src/main/res/values/arrays.xml index 10bbc433..1114541c 100644 --- a/android_app/app/src/main/res/values/arrays.xml +++ b/android_app/app/src/main/res/values/arrays.xml @@ -33,4 +33,14 @@ sv tr + + + @string/theme_light + @string/theme_dark + + + + Light + Dark + \ No newline at end of file diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index db993dc7..c55067b3 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -215,4 +215,6 @@ Spanish (Español) Swedish (Svenska) Turkish (Türkçe) + Light + Dark diff --git a/android_app/app/src/main/res/values/type_themes.xml b/android_app/app/src/main/res/values/type_themes.xml deleted file mode 100644 index 7c8e4265..00000000 --- a/android_app/app/src/main/res/values/type_themes.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Light - Dark - - - - Light - Dark - - \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/general_preferences.xml b/android_app/app/src/main/res/xml/general_preferences.xml index 95760210..1050599d 100644 --- a/android_app/app/src/main/res/xml/general_preferences.xml +++ b/android_app/app/src/main/res/xml/general_preferences.xml @@ -6,6 +6,16 @@ android:entryValues="@array/language_values" android:key="language" android:title="@string/label_language" /> - - + + \ No newline at end of file From 156c6fa00646722275c3b7b19fac138abd3a2f39 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 25 Mar 2018 00:43:20 +0100 Subject: [PATCH 4/4] Add quick link to weblate directly from preferences --- android_app/app/src/main/res/values/strings.xml | 2 ++ android_app/app/src/main/res/xml/general_preferences.xml | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index c55067b3..8960d12d 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -217,4 +217,6 @@ Turkish (Türkçe) Light Dark + Contribute translation + Add new or fix existing diff --git a/android_app/app/src/main/res/xml/general_preferences.xml b/android_app/app/src/main/res/xml/general_preferences.xml index 1050599d..d89e5218 100644 --- a/android_app/app/src/main/res/xml/general_preferences.xml +++ b/android_app/app/src/main/res/xml/general_preferences.xml @@ -6,6 +6,11 @@ android:entryValues="@array/language_values" android:key="language" android:title="@string/label_language" /> + + +