/*
Montréal Just in Case
Copyright (C) 2011 Mudar Noufal <mn@mudar.ca>
Geographic locations of public safety services. A Montréal Open Data
project.
This file is part of Montréal Just in Case.
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 <http://www.gnu.org/licenses/>.
*/
package ca.mudar.mtlaucasou.ui.fragment;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import java.util.Locale;
import ca.mudar.mtlaucasou.Const;
import ca.mudar.mtlaucasou.R;
import ca.mudar.mtlaucasou.util.PermissionUtils;
import static ca.mudar.mtlaucasou.Const.PrefsNames.LANGUAGE;
import static ca.mudar.mtlaucasou.Const.PrefsNames.PERMISSIONS;
import static ca.mudar.mtlaucasou.Const.PrefsNames.PERMISSION_DENIED_FOR_EVER;
import static ca.mudar.mtlaucasou.Const.PrefsNames.UNITS_SYSTEM;
import static ca.mudar.mtlaucasou.Const.PrefsValues.LANG_EN;
import static ca.mudar.mtlaucasou.Const.PrefsValues.LANG_FR;
import static ca.mudar.mtlaucasou.Const.PrefsValues.UNITS_IMP;
import static ca.mudar.mtlaucasou.Const.PrefsValues.UNITS_ISO;
import static ca.mudar.mtlaucasou.util.LogUtils.makeLogTag;
public class SettingsFragment extends PreferenceFragment implements
SharedPreferences.OnSharedPreferenceChangeListener,
Preference.OnPreferenceClickListener {
private static final String TAG = makeLogTag("SettingsFragment");
private SharedPreferences mSharedPrefs;
private Preference mPrefUnits;
private Preference mPrefLanguage;
private OnConfigChangeListener mListener;
public static SettingsFragment newInstance() {
return new SettingsFragment();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (OnConfigChangeListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement OnConfigChangeListener");
}
}
/**
* preference-v7 support still has many issues, so this extends android.app.Fragment
* Pre-API 24 will call onAttach(Activity) instead of onAttach(Context)
*
* @param activity The Activity
*/
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnConfigChangeListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnConfigChangeListener");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final PreferenceManager pm = this.getPreferenceManager();
pm.setSharedPreferencesName(Const.APP_PREFS_NAME);
pm.setSharedPreferencesMode(Context.MODE_PRIVATE);
mSharedPrefs = pm.getSharedPreferences();
/**
* Easiest way to hide a
*/
if (mSharedPrefs.getBoolean(PERMISSION_DENIED_FOR_EVER, false)) {
addPreferencesFromResource(R.xml.prefs_settings_permissions);
} else {
addPreferencesFromResource(R.xml.prefs_settings);
}
mPrefUnits = findPreference(UNITS_SYSTEM);
mPrefLanguage = findPreference(LANGUAGE);
final Preference mPrefPermissions = findPreference(PERMISSIONS);
if (mPrefPermissions != null) {
mPrefPermissions.setOnPreferenceClickListener(this);
}
}
@Override
public void onResume() {
super.onResume();
setupSummaries();
/**
* Set up a listener whenever a key changes
*/
mSharedPrefs.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
/**
* Remove the listener onPause
*/
mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
}
/**
* Implements SharedPreferences.OnSharedPreferenceChangeListener
* Update summary for changed prefs
*
* @param prefs The SharedPreferences that received the change.
* @param key The key of the preference that was changed, added, or removed
*/
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (UNITS_SYSTEM.equals(key)) {
mPrefUnits.setSummary(getUnitsSummary(prefs.getString(key, UNITS_ISO)));
} else if (LANGUAGE.equals(key)) {
final String lg = prefs.getString(key, Locale.getDefault().getLanguage());
mPrefLanguage.setSummary(getLanguageSummary(lg));
mListener.onConfigurationChanged(lg);
}
}
/**
* Implements Preference.OnPreferenceClickListener
* Show Android's app settings, to re-enable permissions previously denied forever.
*
* @param preference The Preference that was clicked
* @return True if the click was handled.
*/
@Override
public boolean onPreferenceClick(Preference preference) {
if (PERMISSIONS.equals(preference.getKey())) {
startActivity(PermissionUtils.newAppSettingsIntent(getActivity()));
return true;
}
return false;
}
private void setupSummaries() {
/**
* Default units system is ISO
*/
mPrefUnits.setSummary(getUnitsSummary(
mSharedPrefs.getString(UNITS_SYSTEM, UNITS_ISO)));
/**
* The app's Default language is the phone's language. If not supported,
* we default to English.
*/
String lg = mSharedPrefs.getString(LANGUAGE, Locale.getDefault().getLanguage());
if (!LANG_EN.equals(lg) && !LANG_FR.equals(lg)) {
lg = LANG_EN;
}
mPrefLanguage.setSummary(getLanguageSummary(lg));
}
private String getUnitsSummary(String index) {
if (UNITS_ISO.equals(index)) {
return getResources().getString(R.string.prefs_units_iso);
} else if (UNITS_IMP.equals(index)) {
return getResources().getString(R.string.prefs_units_imperial);
}
return "";
}
private String getLanguageSummary(String index) {
if (LANG_FR.equals(index)) {
return getResources().getString(R.string.prefs_language_french);
} else if (LANG_EN.equals(index)) {
return getResources().getString(R.string.prefs_language_english);
}
return "";
}
public interface OnConfigChangeListener {
void onConfigurationChanged(String lang);
}
}