package com.muzima.view.preferences.settings; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment;; import com.muzima.MuzimaApplication; import com.muzima.R; import com.muzima.scheduler.RealTimeFormUploader; import com.muzima.tasks.ValidateURLTask; import com.muzima.utils.NetworkUtils; import com.muzima.utils.StringUtils; import com.muzima.view.preferences.SettingsActivity; import java.util.HashMap; import java.util.Map; public class SettingsPreferenceFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private String serverPreferenceKey; private String usernamePreferenceKey; private String timeoutPreferenceKey; private String passwordPreferenceKey; private String autoSavePreferenceKey; private String realTimeSyncPreferenceKey; private String encounterProviderPreferenceKey; private String duplicateFormDataPreferenceKey; private String fontSizePreferenceKey; private EditTextPreference serverPreference; private EditTextPreference usernamePreference; private EditTextPreference timeoutPreference; private EditTextPreference passwordPreference; private EditTextPreference autoSaveIntervalPreference; private CheckBoxPreference encounterProviderPreference; //Disabling duplicate form data preference until a better workflow of flagging duplicates is thought out. See MUZIMA-488 // private CheckBoxPreference duplicateFormDataPreference; private CheckBoxPreference realTimeSyncPreference; private ListPreference fontSizePreference; private String newURL; private Map<String, SettingsPreferenceFragment.PreferenceChangeHandler> actions = new HashMap<String, SettingsPreferenceFragment.PreferenceChangeHandler>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); serverPreferenceKey = getResources().getString(R.string.preference_server); serverPreference = (EditTextPreference) getPreferenceScreen().findPreference(serverPreferenceKey); serverPreference.setSummary(serverPreference.getText()); serverPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(final Preference preference, final Object newValue) { newURL = newValue.toString(); if (!serverPreference.getText().equalsIgnoreCase(newURL)) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder .setCancelable(true) .setIcon(getResources().getDrawable(R.drawable.ic_warning)) .setTitle(getResources().getString(R.string.general_caution)) .setMessage(getResources().getString(R.string.warning_switch_server)) .setPositiveButton("Yes", positiveClickListener()) .setNegativeButton("No", null).create().show(); } return false; } }); usernamePreferenceKey = getResources().getString(R.string.preference_username); usernamePreference = (EditTextPreference) getPreferenceScreen().findPreference(usernamePreferenceKey); usernamePreference.setSummary(usernamePreference.getText()); usernamePreference.setEnabled(false); usernamePreference.setSelectable(false); timeoutPreferenceKey = getResources().getString(R.string.preference_timeout); timeoutPreference = (EditTextPreference) getPreferenceScreen().findPreference(timeoutPreferenceKey); timeoutPreference.setSummary(timeoutPreference.getText()); timeoutPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object o) { Integer timeOutInMin = Integer.valueOf(o.toString()); ((MuzimaApplication) getActivity().getApplication()).resetTimer(timeOutInMin); return true; } }); autoSavePreferenceKey = getResources().getString(R.string.preference_auto_save_interval); autoSaveIntervalPreference = (EditTextPreference) getPreferenceScreen().findPreference(autoSavePreferenceKey); autoSaveIntervalPreference.setSummary(autoSaveIntervalPreference.getText()); passwordPreferenceKey = getResources().getString(R.string.preference_password); passwordPreference = (EditTextPreference) getPreferenceScreen().findPreference(passwordPreferenceKey); if (passwordPreference.getText() != null) { passwordPreference.setSummary(passwordPreference.getText().replaceAll(".", "*")); } passwordPreference.setEnabled(false); passwordPreference.setSelectable(false); realTimeSyncPreferenceKey = getResources().getString(R.string.preference_real_time_sync); realTimeSyncPreference = (CheckBoxPreference) getPreferenceScreen().findPreference(realTimeSyncPreferenceKey); realTimeSyncPreference.setSummary(realTimeSyncPreference.getSummary()); realTimeSyncPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { if (realTimeSyncPreference.isChecked()) { RealTimeFormUploader.getInstance().uploadAllCompletedForms(getActivity().getApplicationContext()); } return false; } }); registerTextPreferenceChangeHandler(serverPreferenceKey, serverPreference); registerTextPreferenceChangeHandler(usernamePreferenceKey, usernamePreference); registerTextPreferenceChangeHandler(passwordPreferenceKey, passwordPreference); registerTextPreferenceChangeHandler(autoSavePreferenceKey, autoSaveIntervalPreference); registerTextPreferenceChangeHandler(timeoutPreferenceKey, timeoutPreference); registerCheckboxPreferenceChangeHandler(realTimeSyncPreferenceKey, realTimeSyncPreference); encounterProviderPreferenceKey = getResources().getString(R.string.preference_encounter_provider_key); encounterProviderPreference = (CheckBoxPreference) getPreferenceScreen().findPreference(encounterProviderPreferenceKey); encounterProviderPreference.setSummary(encounterProviderPreference.getSummary()); encounterProviderPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object o) { if (o.equals(Boolean.TRUE)) { String loggedInUserSystemId = ((MuzimaApplication) getActivity().getApplication()).getAuthenticatedUser().getSystemId(); if (((MuzimaApplication) getActivity().getApplication()).getProviderController().getProviderBySystemId(loggedInUserSystemId) == null) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder .setCancelable(true) .setIcon(getResources().getDrawable(R.drawable.ic_warning)) .setTitle(getResources().getString(R.string.title_provider_not_set)) .setMessage(getResources().getString(R.string.hint_provider_not_set)) .setPositiveButton("Ok", null).create().show(); return false; } else { return true; } } return true; } }); /* duplicateFormDataPreferenceKey = getResources().getString(R.string.preference_duplicate_form_data_key); duplicateFormDataPreference = (CheckBoxPreference)getPreferenceScreen().findPreference(duplicateFormDataPreferenceKey); duplicateFormDataPreference.setSummary(duplicateFormDataPreference.getSummary()); */ fontSizePreferenceKey = getResources().getString(R.string.preference_font_size); fontSizePreference = (ListPreference) getPreferenceScreen().findPreference(fontSizePreferenceKey); fontSizePreference.setSummary(fontSizePreference.getValue()); registerListPreferenceChangeHandler(fontSizePreferenceKey, fontSizePreference); } @Override public void onResume() { super.onResume(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); resetEncounterProviderPreference(); } @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { if (key.equalsIgnoreCase("wizardFinished") || key.equalsIgnoreCase("encounterProviderPreference")) { return; } PreferenceChangeHandler preferenceChangeHandler = actions.get(key); if(preferenceChangeHandler!=null) { preferenceChangeHandler.handle(sharedPreferences); } } private static interface PreferenceChangeHandler { public void handle(SharedPreferences sharedPreferences); } private void registerTextPreferenceChangeHandler(final String key, final EditTextPreference preference) { actions.put(key, new PreferenceChangeHandler() { @Override public void handle(SharedPreferences sharedPreferences) { preference.setSummary(sharedPreferences.getString(key, StringUtils.EMPTY)); } }); } private void registerListPreferenceChangeHandler(final String key, final ListPreference preference) { actions.put(key, new PreferenceChangeHandler() { @Override public void handle(SharedPreferences sharedPreferences) { preference.setSummary(sharedPreferences.getString(key, StringUtils.EMPTY)); } }); } private void registerCheckboxPreferenceChangeHandler(final String key, final CheckBoxPreference preference) { actions.put(key, new PreferenceChangeHandler() { @Override public void handle(SharedPreferences sharedPreferences) { preference.setChecked(sharedPreferences.getBoolean(key, false)); } }); } private Dialog.OnClickListener positiveClickListener() { return new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { changeServerURL(dialog); } }; } private void changeServerURL(DialogInterface dialog) { dialog.dismiss(); if (NetworkUtils.isConnectedToNetwork(getActivity())) { new ValidateURLTask(this).execute(newURL); } } private void resetEncounterProviderPreference() { if(encounterProviderPreference.isChecked()){ String loggedInUserSystemId = ((MuzimaApplication) getActivity().getApplication()).getAuthenticatedUser().getSystemId(); if (((MuzimaApplication) getActivity().getApplication()).getProviderController().getProviderBySystemId(loggedInUserSystemId) == null){ encounterProviderPreference.setChecked(false); } } } public void validationURLResult(boolean result) { if (result) { new SyncFormDataTask(this).execute(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder .setCancelable(true) .setIcon(getResources().getDrawable(R.drawable.ic_warning)) .setTitle("Invalid") .setMessage("The URL you have provided is invalid") .setPositiveButton("Ok", null); builder.create().show(); } } public void syncedFormData(boolean result) { if (result) { new ResetDataTask((SettingsActivity)getActivity(), newURL).execute(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder .setCancelable(true) .setIcon(getResources().getDrawable(R.drawable.ic_warning)) .setTitle("Failure") .setMessage(getString(R.string.info_form_data_upload_fail)) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new ResetDataTask((SettingsActivity)getActivity(), newURL).execute(); } }) .setNegativeButton("No", null); builder.create().show(); } } }