blob: 2fb651203e689706d1d9835c2e7c3bd63dc6c0bc [file] [log] [blame]
package org.wordpress.android.ui.prefs;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.text.TextUtils;
import android.util.Pair;
import android.view.MenuItem;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.analytics.AnalyticsTracker.Stat;
import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.LanguageUtils;
import org.wordpress.android.util.WPPrefUtils;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
public class AppSettingsFragment extends PreferenceFragment implements OnPreferenceClickListener, Preference.OnPreferenceChangeListener {
public static final String LANGUAGE_PREF_KEY = "language-pref";
public static final int LANGUAGE_CHANGED = 1000;
private DetailListPreference mLanguagePreference;
private SharedPreferences mSettings;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
addPreferencesFromResource(R.xml.app_settings);
mLanguagePreference = (DetailListPreference) findPreference(getString(R.string.pref_key_language));
mLanguagePreference.setOnPreferenceChangeListener(this);
findPreference(getString(R.string.pref_key_language))
.setOnPreferenceClickListener(this);
findPreference(getString(R.string.pref_key_app_about))
.setOnPreferenceClickListener(this);
findPreference(getString(R.string.pref_key_oss_licenses))
.setOnPreferenceClickListener(this);
mSettings = PreferenceManager.getDefaultSharedPreferences(getActivity());
updateVisualEditorSettings();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
updateLanguagePreference(getResources().getConfiguration().locale.toString());
}
@Override
public boolean onPreferenceClick(Preference preference) {
String preferenceKey = preference != null ? preference.getKey() : "";
if (preferenceKey.equals(getString(R.string.pref_key_app_about))) {
return handleAboutPreferenceClick();
} else if (preferenceKey.equals(getString(R.string.pref_key_oss_licenses))) {
return handleOssPreferenceClick();
}
return false;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue == null) return false;
if (preference == mLanguagePreference) {
changeLanguage(newValue.toString());
return false;
}
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getActivity().finish();
}
return super.onOptionsItemSelected(item);
}
private void updateVisualEditorSettings() {
if (!AppPrefs.isVisualEditorAvailable()) {
PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference(getActivity()
.getString(R.string.pref_key_account_settings_root));
PreferenceCategory editor = (PreferenceCategory) findPreference(getActivity()
.getString(R.string.pref_key_editor));
if (preferenceScreen != null && editor != null) {
preferenceScreen.removePreference(editor);
}
} else {
final SwitchPreference visualEditorSwitch = (SwitchPreference) findPreference(getActivity()
.getString(R.string.pref_key_visual_editor_enabled));
visualEditorSwitch.setChecked(AppPrefs.isVisualEditorEnabled());
visualEditorSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(final Preference preference, final Object newValue) {
visualEditorSwitch.setChecked(!visualEditorSwitch.isChecked());
AppPrefs.setVisualEditorEnabled(visualEditorSwitch.isChecked());
return false;
}
});
}
}
private void changeLanguage(String languageCode) {
if (mLanguagePreference == null || TextUtils.isEmpty(languageCode)) return;
Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale currentLocale = conf.locale != null ? conf.locale : LanguageUtils.getCurrentDeviceLanguage(WordPress.getContext());
if (currentLocale.toString().equals(languageCode)) return;
updateLanguagePreference(languageCode);
// update configuration
Locale newLocale = WPPrefUtils.languageLocale(languageCode);
conf.locale = newLocale;
res.updateConfiguration(conf, res.getDisplayMetrics());
if (LanguageUtils.getCurrentDeviceLanguage(WordPress.getContext()).equals(newLocale)) {
// remove custom locale key when original device locale is selected
mSettings.edit().remove(LANGUAGE_PREF_KEY).apply();
} else {
mSettings.edit().putString(LANGUAGE_PREF_KEY, newLocale.toString()).apply();
}
// Track language change on Mixpanel because we have both the device language and app selected language
// data in Tracks metadata.
Map<String, Object> properties = new HashMap<>();
properties.put("app_locale", conf.locale.toString());
AnalyticsTracker.track(Stat.ACCOUNT_SETTINGS_LANGUAGE_CHANGED, properties);
// Language is now part of metadata, so we need to refresh them
AnalyticsUtils.refreshMetadata();
// Refresh the app
Intent refresh = new Intent(getActivity(), getActivity().getClass());
startActivity(refresh);
getActivity().setResult(LANGUAGE_CHANGED);
getActivity().finish();
}
private void updateLanguagePreference(String languageCode) {
if (mLanguagePreference == null || TextUtils.isEmpty(languageCode)) return;
Locale languageLocale = WPPrefUtils.languageLocale(languageCode);
String[] availableLocales = getResources().getStringArray(R.array.available_languages);
Pair<String[], String[]> pair = WPPrefUtils.createSortedLanguageDisplayStrings(availableLocales, languageLocale);
// check for a possible NPE
if (pair == null) return;
String[] sortedEntries = pair.first;
String[] sortedValues = pair.second;
mLanguagePreference.setEntries(sortedEntries);
mLanguagePreference.setEntryValues(sortedValues);
mLanguagePreference.setDetails(WPPrefUtils.createLanguageDetailDisplayStrings(sortedValues));
mLanguagePreference.setValue(languageCode);
mLanguagePreference.setSummary(WPPrefUtils.getLanguageString(languageCode, languageLocale));
mLanguagePreference.refreshAdapter();
}
private boolean handleAboutPreferenceClick() {
startActivity(new Intent(getActivity(), AboutActivity.class));
return true;
}
private boolean handleOssPreferenceClick() {
startActivity(new Intent(getActivity(), LicensesActivity.class));
return true;
}
}