/*
* Copyright (C) 2016 Glucosio Foundation
*
* This file is part of Glucosio.
*
* Glucosio 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, version 3.
*
* Glucosio 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 Glucosio. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
package org.glucosio.android.activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.SwitchPreference;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.InputFilter;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
import android.widget.EditText;
import org.glucosio.android.GlucosioApplication;
import org.glucosio.android.R;
import org.glucosio.android.analytics.Analytics;
import org.glucosio.android.db.DatabaseHandler;
import org.glucosio.android.db.User;
import org.glucosio.android.tools.InputFilterMinMax;
import org.glucosio.android.tools.LocaleHelper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
public class PreferencesActivity extends AppCompatActivity {
@NonNull
private static String[] getEntryValues(List<String> list) {
String[] result = new String[list.size()];
return list.toArray(result);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences);
getFragmentManager().beginTransaction()
.replace(R.id.preferencesFrame, new MyPreferenceFragment()).commit();
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayHomeAsUpEnabled(true);
supportActionBar.setTitle(getString(R.string.action_settings));
}
// Obtain the Analytics shared Tracker instance.
GlucosioApplication application = (GlucosioApplication) getApplication();
Analytics analytics = application.getAnalytics();
Log.i("PreferencesActivity", "Setting screen name: preferences");
analytics.reportScreen("Preferences");
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
return true;
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
public static class MyPreferenceFragment extends PreferenceFragment {
private DatabaseHandler dB;
private User user;
private ListPreference languagePref;
private ListPreference countryPref;
private ListPreference genderPref;
private ListPreference diabetesTypePref;
private ListPreference unitPrefGlucose;
private ListPreference unitPrefA1c;
private ListPreference unitPrefWeight;
private ListPreference rangePref;
private EditText ageEditText;
private EditText minEditText;
private EditText maxEditText;
private EditTextPreference agePref;
private EditTextPreference minRangePref;
private EditTextPreference maxRangePref;
private SwitchPreference dyslexiaModePref;
private SwitchPreference freestyleLibrePref;
private User updatedUser;
private LocaleHelper localeHelper;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
final GlucosioApplication app = (GlucosioApplication) getActivity().getApplicationContext();
dB = app.getDBHandler();
localeHelper = app.getLocaleHelper();
user = dB.getUser(1);
updatedUser = new User(user.getId(), user.getName(), user.getPreferred_language(),
user.getCountry(), user.getAge(), user.getGender(), user.getD_type(),
user.getPreferred_unit(), user.getPreferred_unit_a1c(),
user.getPreferred_unit_weight(), user.getPreferred_range(),
user.getCustom_range_min(), user.getCustom_range_max());
agePref = (EditTextPreference) findPreference("pref_age");
countryPref = (ListPreference) findPreference("pref_country");
languagePref = (ListPreference) findPreference("pref_language");
genderPref = (ListPreference) findPreference("pref_gender");
diabetesTypePref = (ListPreference) findPreference("pref_diabetes_type");
unitPrefGlucose = (ListPreference) findPreference("pref_unit_glucose");
unitPrefA1c = (ListPreference) findPreference("pref_unit_a1c");
unitPrefWeight = (ListPreference) findPreference("pref_unit_weight");
rangePref = (ListPreference) findPreference("pref_range");
minRangePref = (EditTextPreference) findPreference("pref_range_min");
maxRangePref = (EditTextPreference) findPreference("pref_range_max");
dyslexiaModePref = (SwitchPreference) findPreference("pref_font_dyslexia");
freestyleLibrePref = (SwitchPreference) findPreference("pref_freestyle_libre");
agePref.setDefaultValue(user.getAge());
countryPref.setValue(user.getCountry());
genderPref.setValue(user.getGender());
diabetesTypePref.setValue(user.getD_type() + "");
unitPrefGlucose.setValue(getGlucoseUnitValue(user.getPreferred_unit()));
unitPrefA1c.setValue(getA1CUnitValue(user.getPreferred_unit_a1c()));
unitPrefWeight.setValue(getUnitWeight(user.getPreferred_unit_weight()));
rangePref.setValue(user.getPreferred_range());
minRangePref.setDefaultValue(user.getCustom_range_min() + "");
maxRangePref.setDefaultValue(user.getCustom_range_max() + "");
minRangePref.setDefaultValue(user.getCustom_range_min() + "");
maxRangePref.setDefaultValue(user.getCustom_range_max() + "");
if (!"custom".equals(rangePref.getValue())) {
minRangePref.setEnabled(false);
maxRangePref.setEnabled(false);
} else {
minRangePref.setEnabled(true);
maxRangePref.setEnabled(true);
}
final Preference aboutPref = findPreference("about_settings");
countryPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatedUser.setCountry(newValue.toString());
updateDB();
return false;
}
});
agePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue.toString().trim().equals("")) {
return false;
}
updatedUser.setAge(Integer.parseInt(newValue.toString()));
updateDB();
return true;
}
});
genderPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatedUser.setGender(newValue.toString());
updateDB();
return true;
}
});
diabetesTypePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String[] typesArray = getResources().getStringArray(R.array.helloactivity_diabetes_type);
String selectedType = newValue.toString();
if (selectedType.equals(typesArray[0])) {
updatedUser.setD_type(1);
updateDB();
} else if (selectedType.equals(typesArray[1])) {
updatedUser.setD_type(2);
updateDB();
} else if (selectedType.equals(typesArray[2])) {
updatedUser.setD_type(3);
updateDB();
} else {
updatedUser.setD_type(4);
updateDB();
}
return true;
}
});
unitPrefGlucose.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue.toString().equals(getResources().getString(R.string.helloactivity_spinner_preferred_glucose_unit_1))) {
updatedUser.setPreferred_unit("mg/dL");
} else {
updatedUser.setPreferred_unit("mmol/L");
}
updateDB();
return true;
}
});
unitPrefA1c.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue.toString().equals(getResources().getString(R.string.preferences_spinner_preferred_a1c_unit_1))) {
updatedUser.setPreferred_unit_a1c("percentage");
} else {
updatedUser.setPreferred_unit_a1c("mmol/mol");
}
updateDB();
return true;
}
});
unitPrefWeight.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue.toString().equals(getResources().getString(R.string.preferences_spinner_preferred_weight_unit_1))) {
updatedUser.setPreferred_unit_weight("kilograms");
} else {
updatedUser.setPreferred_unit_weight("pounds");
}
updateDB();
return true;
}
});
rangePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatedUser.setPreferred_range(newValue.toString());
updateDB();
return true;
}
});
minRangePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (TextUtils.isEmpty(newValue.toString().trim())) {
return false;
}
updatedUser.setCustom_range_min(Integer.parseInt(newValue.toString()));
updateDB();
return true;
}
});
maxRangePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (TextUtils.isEmpty(newValue.toString().trim())) {
return false;
}
updatedUser.setCustom_range_max(Integer.parseInt(newValue.toString()));
updateDB();
return true;
}
});
dyslexiaModePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// EXPERIMENTAL PREFERENCE
// Display Alert
showExperimentalDialog(true);
return true;
}
});
freestyleLibrePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (!((SwitchPreference) preference).isChecked()) {
// EXPERIMENTAL PREFERENCE
// Display Alert
showExperimentalDialog(false);
return true;
}
return true;
}
});
ageEditText = agePref.getEditText();
minEditText = minRangePref.getEditText();
maxEditText = maxRangePref.getEditText();
ageEditText.setFilters(new InputFilter[]{new InputFilterMinMax(1, 110)});
minEditText.setFilters(new InputFilter[]{new InputFilterMinMax(1, 1500)});
maxEditText.setFilters(new InputFilter[]{new InputFilterMinMax(1, 1500)});
// Get countries list from locale
ArrayList<String> countriesArray = new ArrayList<>();
Locale[] locales = Locale.getAvailableLocales();
for (Locale locale : locales) {
String country = locale.getDisplayCountry();
if (country.trim().length() > 0 && !countriesArray.contains(country)) {
countriesArray.add(country);
}
}
Collections.sort(countriesArray);
CharSequence[] countries = countriesArray.toArray(new CharSequence[countriesArray.size()]);
countryPref.setEntryValues(countries);
countryPref.setEntries(countries);
initLanguagePreference();
updateDB();
aboutPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent aboutActivity = new Intent(getActivity(), AboutActivity.class);
getActivity().startActivity(aboutActivity);
return false;
}
});
}
private String getA1CUnitValue(final String a1CUnit) {
@StringRes int unitResId = "percentage".equals(a1CUnit) ?
R.string.preferences_spinner_preferred_a1c_unit_1 :
R.string.preferences_spinner_preferred_a1c_unit_2;
return getResources().getString(unitResId);
}
private String getGlucoseUnitValue(final String glucoseUnit) {
@StringRes int unitResId = "mg/dL".equals(glucoseUnit) ?
R.string.helloactivity_spinner_preferred_glucose_unit_1 :
R.string.helloactivity_spinner_preferred_glucose_unit_2;
return getResources().getString(unitResId);
}
private String getUnitWeight(final String unit_weight) {
@StringRes int unitResId = "kilograms".equals(unit_weight) ?
R.string.preferences_spinner_preferred_weight_unit_1 :
R.string.preferences_spinner_preferred_weight_unit_2;
return getResources().getString(unitResId);
}
private void initLanguagePreference() {
List<String> valuesLanguages = localeHelper.getLocalesWithTranslation(getResources());
List<String> displayLanguages = new ArrayList<>(valuesLanguages.size());
for (String language : valuesLanguages) {
if (language.length() > 0) {
displayLanguages.add(localeHelper.getDisplayLanguage(language));
}
}
languagePref.setEntryValues(getEntryValues(valuesLanguages));
languagePref.setEntries(getEntryValues(displayLanguages));
String languageValue = user.getPreferred_language();
if (languageValue != null) {
languagePref.setValue(languageValue);
String displayLanguage = localeHelper.getDisplayLanguage(languageValue);
languagePref.setSummary(displayLanguage);
}
languagePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String language = (String) newValue;
updatedUser.setPreferred_language(language);
languagePref.setSummary(localeHelper.getDisplayLanguage(language));
languagePref.setValue(language);
updateDB();
localeHelper.updateLanguage(getActivity(), language);
getActivity().recreate();
return true;
}
});
}
private void updateDB() {
dB.updateUser(updatedUser);
agePref.setSummary(user.getAge() + "");
genderPref.setSummary(user.getGender() + "");
diabetesTypePref.setSummary(getResources().getStringArray(R.array.helloactivity_diabetes_type)[user.getD_type() - 1]);
unitPrefGlucose.setSummary(getGlucoseUnitValue(user.getPreferred_unit()));
unitPrefA1c.setSummary(getA1CUnitValue(user.getPreferred_unit_a1c()));
unitPrefWeight.setSummary(getUnitWeight(user.getPreferred_unit_weight()));
countryPref.setSummary(user.getCountry());
minRangePref.setSummary(user.getCustom_range_min() + "");
maxRangePref.setSummary(user.getCustom_range_max() + "");
countryPref.setValue(user.getCountry());
genderPref.setValue(user.getGender());
diabetesTypePref.setValue(user.getD_type() + "");
unitPrefGlucose.setValue(user.getPreferred_unit());
genderPref.setValue(user.getGender());
unitPrefGlucose.setValue(user.getPreferred_unit());
rangePref.setValue(user.getPreferred_range());
if (!user.getPreferred_range().equals("Custom range")) {
minRangePref.setEnabled(false);
maxRangePref.setEnabled(false);
} else {
minRangePref.setEnabled(true);
maxRangePref.setEnabled(true);
}
}
private void showExperimentalDialog(final boolean restartRequired) {
new AlertDialog.Builder(getActivity())
.setTitle(getResources().getString(R.string.preferences_experimental_title))
.setMessage(R.string.preferences_experimental)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (restartRequired) {
rebootApp();
}
}
})
.show();
}
private void rebootApp() {
Intent mStartActivity = new Intent(getActivity().getApplicationContext(), MainActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(getActivity().getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);
}
}
}