diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java new file mode 100644 index 000000000..2fb651203 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java @@ -0,0 +1,194 @@ +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; + } +} |