/** * SettingsPrefrenceActivity.java * * Ver 1.0, 2012-12-9, alex_yh, Create file. */ package com.flounder.fishDiary; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.flounder.fishDiary.data.Constants; import com.flounder.fishDiary.image.ImageUtil; import com.flounder.fishDiary.view.BaseStyleDialog; import com.flounder.fishDiary.view.BaseStyleDialog.ICallBack; import com.flounder.fishDiary.view.ImageViewPreference; import com.flounder.fishDiary.view.PasswordDialog; import com.flounder.fishDiary.view.PasswordDialog.IPasswdCallBack; public class FishSettingsActivity extends PreferenceActivity { private ImageViewPreference mImagePref; private Preference mAuthorPref; private CheckBoxPreference mLinedPref; private Preference mBackgroundPref; private CheckBoxPreference mPasswdPref; private Preference mRestorePref; private Preference mAboutPref; private String mPassword; private Context mContext; /** The launch code when picking a photo and the raw data is returned */ private static final int REQUEST_PICK_HEAD = 100; private static final int REQUEST_PICK_BG = 200; private static final int ICON_SIZE_HEAD = 96; private static final int ICON_SIZE_BG = 640; private static final String HEAD_FILENAME = "icon.dat"; private static final String BG_FILENAME = "bg.dat"; private int mFlag; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); initPrefs(); } private void initPrefs() { mContext = this; mAuthorPref = (Preference) findPreference(getString(R.string.pref_author_key)); mAuthorPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { promptAuthorDialog(); return true; } }); mImagePref = (ImageViewPreference) findPreference(getString(R.string.pref_image_key)); mImagePref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { ImageUtil.doPickPhotoFromGallery((Activity) mContext, REQUEST_PICK_HEAD, ICON_SIZE_HEAD, HEAD_FILENAME); return true; } }); mLinedPref = (CheckBoxPreference) findPreference(getString(R.string.pref_underline_enable_key)); mLinedPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { SharedPreferences.Editor editor = FishPreferences .getEditor(mContext); editor.putBoolean(FishPreferences.KEY_ENABLE_UNDERLINE, (Boolean) newValue); editor.commit(); return true; } }); mBackgroundPref = (Preference) findPreference(getString(R.string.pref_background_key)); mBackgroundPref .setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { promptBackgroundDialog(); return true; } }); mPasswdPref = (CheckBoxPreference) findPreference(getString(R.string.pref_passwd_key)); mPasswdPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { promptPasswdDialog((Boolean) newValue); return true; } }); mRestorePref = (Preference) findPreference(getString(R.string.pref_restore_key)); mRestorePref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { restoreSettingsDialog(); return true; } }); mAboutPref = (Preference) findPreference(getString(R.string.pref_about_key)); mAboutPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { Intent intent = new Intent(mContext, FishDiaryActivity.class); intent.setAction(Constants.ACTION_CONTENT); intent.putExtra(Constants.ACTION_CONTENT, Constants.CONTENT_ABOUT); startActivity(intent); return true; } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) return; if (requestCode == REQUEST_PICK_HEAD) { Uri uri = ImageUtil.getImageUri(HEAD_FILENAME); if (uri != null) mImagePref.setImageUri(uri); } if (requestCode == REQUEST_PICK_BG) { SharedPreferences.Editor editor = FishPreferences .getEditor(mContext); editor.putString(FishPreferences.KEY_BACKGROUND_IMAGE, ImageUtil.getImageUri(BG_FILENAME).toString()); editor.commit(); } } private void promptBackgroundDialog() { mFlag = FishPreferences.getBgImageEffect(mContext); AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle(R.string.text_effect); builder.setSingleChoiceItems(R.array.text_effect_choices, mFlag, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mFlag = which; } }); builder.setPositiveButton(R.string.button_ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { SharedPreferences.Editor editor = FishPreferences .getEditor(mContext); editor.putInt(FishPreferences.KEY_BG_EFFECT, mFlag); editor.commit(); ImageUtil.doPickPhotoFromGallery((Activity) mContext, REQUEST_PICK_BG, ICON_SIZE_BG, BG_FILENAME); } }); builder.setNegativeButton(R.string.button_cancel, null); builder.show(); } private void promptAuthorDialog() { LayoutInflater inflater = LayoutInflater.from(this); View view = inflater.inflate(R.layout.dialog_input_text, null); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(view); builder.setTitle(R.string.tv_input_author); final EditText etAuthor = (EditText) view.findViewById(R.id.et_dialog); etAuthor.setHint(FishPreferences.getAuthorName(mContext)); builder.setNegativeButton(R.string.button_cancel, null); builder.setPositiveButton(R.string.button_ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (etAuthor.getText().toString().trim().equals("")) { SharedPreferences.Editor editor = FishPreferences .getEditor(mContext); editor.putString(FishPreferences.KEY_AUTHOR, etAuthor.getText() .toString()); editor.commit(); } Toast.makeText(mContext, R.string.text_author_saved, Toast.LENGTH_SHORT).show(); } }); builder.show(); } /** * TODO: Well, these junk codes work and pass tests... * * @param checked * the new checked state */ private void promptPasswdDialog(final boolean checked) { PasswordDialog.IPasswdCallBack callback = new IPasswdCallBack() { @Override public void posButtonClicked() { // Set password if (checked) { // the common "are you sure?" routine: think twice, stupid user confirmPasswdSave(); } // Remove password if (!checked) { if (mPassword.equals(FishPreferences.getPassword(mContext))) { mPasswdPref.setChecked(false); // password reset to null mPassword = null; SharedPreferences.Editor editor = FishPreferences .getEditor(mContext); editor.putString(FishPreferences.KEY_PASSWORD, mPassword); editor.commit(); } else { // incorrect password PasswordDialog.prompPasswdErrDialog(mContext); mPasswdPref.setChecked(true); } } } @Override public void negButtonClicked() { // Keep the preview state mPasswdPref.setChecked(!checked); } @Override public void getPassword(String password) { mPassword = password; } }; new PasswordDialog(this, callback); } /** You have a second chance. */ private void confirmPasswdSave() { String msg = getResources().getString(R.string.text_passwd_confirm) + mPassword; BaseStyleDialog.ICallBack callback = new ICallBack() { @Override public void posButtonClicked() { SharedPreferences.Editor editor = FishPreferences .getEditor(mContext); editor.putString(FishPreferences.KEY_PASSWORD, mPassword); editor.commit(); } @Override public void negButtonClicked() { mPasswdPref.setChecked(false); } }; BaseStyleDialog.buildInfoDialog(this, msg, callback); } /** * Prompt the restore settings dialog. * Still, are you sure? */ private void restoreSettingsDialog() { BaseStyleDialog.ICallBack callback = new ICallBack() { String _passwd = ""; @Override public void posButtonClicked() { // If user has set password, prompt password dialog if (FishPreferences.getPassword(mContext) != null) { PasswordDialog.IPasswdCallBack callback = new IPasswdCallBack() { @Override public void posButtonClicked() { // password correct, reset everything including password if (_passwd .equals(FishPreferences.getPassword(mContext))) { restoreSettings(); } else { PasswordDialog.prompPasswdErrDialog(mContext); } } @Override public void negButtonClicked() { // user cancel } @Override public void getPassword(String password) { _passwd = password; } }; new PasswordDialog(mContext, callback); } else { restoreSettings(); Toast.makeText(mContext, R.string.text_restored_success, Toast.LENGTH_SHORT).show(); } } @Override public void negButtonClicked() { // user cancel } }; BaseStyleDialog.buildInfoDialog(this, R.string.pref_restore_text, callback); } /** Restore everything */ private void restoreSettings() { String tagStr = FishPreferences.getNoteTag(mContext); boolean firstTime = FishPreferences.isFirstTime(mContext); SharedPreferences.Editor editor = FishPreferences.getEditor(mContext); editor.clear(); editor.apply(); editor.putString(FishPreferences.KEY_NOTE_TAG, tagStr); // keep note tag [fix] editor.putBoolean(FishPreferences.KEY_FIRST_TIME, firstTime); // keep firstTime editor.commit(); refreshPrefs(); } /** Refresh the UI */ private void refreshPrefs() { getPreferenceScreen().removeAll(); addPreferencesFromResource(R.xml.preferences); initPrefs(); } }