package com.fsck.k9.activity.setup; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Vibrator; import android.preference.*; import android.util.Log; import java.util.Iterator; import java.util.Map; import java.util.LinkedList; import java.util.List; import com.fsck.k9.Account; import com.fsck.k9.Account.FolderMode; import com.fsck.k9.Account.QuoteStyle; import com.fsck.k9.Account.ScrollButtons; import com.fsck.k9.K9; import com.fsck.k9.NotificationSetting; import com.fsck.k9.Preferences; import com.fsck.k9.R; import com.fsck.k9.mail.Folder; import com.fsck.k9.activity.ChooseFolder; import com.fsck.k9.activity.ChooseIdentity; import com.fsck.k9.activity.ColorPickerDialog; import com.fsck.k9.activity.K9PreferenceActivity; import com.fsck.k9.activity.ManageIdentities; import com.fsck.k9.crypto.Apg; import com.fsck.k9.mail.Store; import com.fsck.k9.service.MailService; import com.fsck.k9.mail.store.StorageManager; import com.fsck.k9.mail.store.LocalStore.LocalFolder; public class AccountSettings extends K9PreferenceActivity { private static final String EXTRA_ACCOUNT = "account"; private static final int SELECT_AUTO_EXPAND_FOLDER = 1; private static final int ACTIVITY_MANAGE_IDENTITIES = 2; private static final String PREFERENCE_SCREEN_COMPOSING = "composing"; private static final String PREFERENCE_SCREEN_INCOMING = "incoming_prefs"; private static final String PREFERENCE_SCREEN_PUSH_ADVANCED = "push_advanced"; private static final String PREFERENCE_DESCRIPTION = "account_description"; private static final String PREFERENCE_COMPOSITION = "composition"; private static final String PREFERENCE_MANAGE_IDENTITIES = "manage_identities"; private static final String PREFERENCE_FREQUENCY = "account_check_frequency"; private static final String PREFERENCE_DISPLAY_COUNT = "account_display_count"; private static final String PREFERENCE_DEFAULT = "account_default"; private static final String PREFERENCE_HIDE_BUTTONS = "hide_buttons_enum"; private static final String PREFERENCE_HIDE_MOVE_BUTTONS = "hide_move_buttons_enum"; private static final String PREFERENCE_SHOW_PICTURES = "show_pictures_enum"; private static final String PREFERENCE_ENABLE_MOVE_BUTTONS = "enable_move_buttons"; private static final String PREFERENCE_NOTIFY = "account_notify"; private static final String PREFERENCE_NOTIFY_SELF = "account_notify_self"; private static final String PREFERENCE_NOTIFY_SYNC = "account_notify_sync"; private static final String PREFERENCE_VIBRATE = "account_vibrate"; private static final String PREFERENCE_VIBRATE_PATTERN = "account_vibrate_pattern"; private static final String PREFERENCE_VIBRATE_TIMES = "account_vibrate_times"; private static final String PREFERENCE_RINGTONE = "account_ringtone"; private static final String PREFERENCE_NOTIFICATION_LED = "account_led"; private static final String PREFERENCE_INCOMING = "incoming"; private static final String PREFERENCE_OUTGOING = "outgoing"; private static final String PREFERENCE_DISPLAY_MODE = "folder_display_mode"; private static final String PREFERENCE_SYNC_MODE = "folder_sync_mode"; private static final String PREFERENCE_PUSH_MODE = "folder_push_mode"; private static final String PREFERENCE_PUSH_POLL_ON_CONNECT = "push_poll_on_connect"; private static final String PREFERENCE_MAX_PUSH_FOLDERS = "max_push_folders"; private static final String PREFERENCE_IDLE_REFRESH_PERIOD = "idle_refresh_period"; private static final String PREFERENCE_TARGET_MODE = "folder_target_mode"; private static final String PREFERENCE_DELETE_POLICY = "delete_policy"; private static final String PREFERENCE_EXPUNGE_POLICY = "expunge_policy"; private static final String PREFERENCE_AUTO_EXPAND_FOLDER = "account_setup_auto_expand_folder"; private static final String PREFERENCE_SEARCHABLE_FOLDERS = "searchable_folders"; private static final String PREFERENCE_CHIP_COLOR = "chip_color"; private static final String PREFERENCE_LED_COLOR = "led_color"; private static final String PREFERENCE_NOTIFICATION_OPENS_UNREAD = "notification_opens_unread"; private static final String PREFERENCE_NOTIFICATION_UNREAD_COUNT = "notification_unread_count"; private static final String PREFERENCE_MESSAGE_AGE = "account_message_age"; private static final String PREFERENCE_MESSAGE_SIZE = "account_autodownload_size"; private static final String PREFERENCE_SAVE_ALL_HEADERS = "account_save_all_headers"; private static final String PREFERENCE_MESSAGE_FORMAT = "message_format"; private static final String PREFERENCE_MESSAGE_READ_RECEIPT = "message_read_receipt"; private static final String PREFERENCE_QUOTE_PREFIX = "account_quote_prefix"; private static final String PREFERENCE_QUOTE_STYLE = "quote_style"; private static final String PREFERENCE_DEFAULT_QUOTED_TEXT_SHOWN = "default_quoted_text_shown"; private static final String PREFERENCE_REPLY_AFTER_QUOTE = "reply_after_quote"; private static final String PREFERENCE_SYNC_REMOTE_DELETIONS = "account_sync_remote_deletetions"; private static final String PREFERENCE_CRYPTO_APP = "crypto_app"; private static final String PREFERENCE_CRYPTO_AUTO_SIGNATURE = "crypto_auto_signature"; private static final String PREFERENCE_LOCAL_STORAGE_PROVIDER = "local_storage_provider"; private static final String PREFERENCE_ARCHIVE_FOLDER = "archive_folder"; private static final String PREFERENCE_DRAFTS_FOLDER = "drafts_folder"; private static final String PREFERENCE_SENT_FOLDER = "sent_folder"; private static final String PREFERENCE_SPAM_FOLDER = "spam_folder"; private static final String PREFERENCE_TRASH_FOLDER = "trash_folder"; private Account mAccount; private boolean mIsMoveCapable = false; private boolean mIsPushCapable = false; private boolean mIsExpungeCapable = false; private PreferenceScreen mComposingScreen; private EditTextPreference mAccountDescription; private ListPreference mCheckFrequency; private ListPreference mDisplayCount; private ListPreference mMessageAge; private ListPreference mMessageSize; private CheckBoxPreference mAccountDefault; private CheckBoxPreference mAccountNotify; private CheckBoxPreference mAccountNotifySelf; private ListPreference mAccountScrollButtons; private ListPreference mAccountScrollMoveButtons; private ListPreference mAccountShowPictures; private CheckBoxPreference mAccountEnableMoveButtons; private CheckBoxPreference mAccountNotifySync; private CheckBoxPreference mAccountVibrate; private CheckBoxPreference mAccountLed; private ListPreference mAccountVibratePattern; private ListPreference mAccountVibrateTimes; private RingtonePreference mAccountRingtone; private ListPreference mDisplayMode; private ListPreference mSyncMode; private ListPreference mPushMode; private ListPreference mTargetMode; private ListPreference mDeletePolicy; private ListPreference mExpungePolicy; private ListPreference mSearchableFolders; private ListPreference mAutoExpandFolder; private Preference mChipColor; private Preference mLedColor; private boolean mIncomingChanged = false; private CheckBoxPreference mNotificationOpensUnread; private CheckBoxPreference mNotificationUnreadCount; private ListPreference mMessageFormat; private CheckBoxPreference mMessageReadReceipt; private ListPreference mQuoteStyle; private EditTextPreference mAccountQuotePrefix; private CheckBoxPreference mAccountDefaultQuotedTextShown; private CheckBoxPreference mReplyAfterQuote; private CheckBoxPreference mSyncRemoteDeletions; private CheckBoxPreference mSaveAllHeaders; private CheckBoxPreference mPushPollOnConnect; private ListPreference mIdleRefreshPeriod; private ListPreference mMaxPushFolders; private ListPreference mCryptoApp; private CheckBoxPreference mCryptoAutoSignature; private ListPreference mLocalStorageProvider; private ListPreference mArchiveFolder; private ListPreference mDraftsFolder; private ListPreference mSentFolder; private ListPreference mSpamFolder; private ListPreference mTrashFolder; public static void actionSettings(Context context, Account account) { Intent i = new Intent(context, AccountSettings.class); i.putExtra(EXTRA_ACCOUNT, account.getUuid()); context.startActivity(i); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); mAccount = Preferences.getPreferences(this).getAccount(accountUuid); try { final Store store = mAccount.getRemoteStore(); mIsMoveCapable = store.isMoveCapable(); mIsPushCapable = store.isPushCapable(); mIsExpungeCapable = store.isExpungeCapable(); } catch (Exception e) { Log.e(K9.LOG_TAG, "Could not get remote store", e); } addPreferencesFromResource(R.xml.account_settings_preferences); mAccountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION); mAccountDescription.setSummary(mAccount.getDescription()); mAccountDescription.setText(mAccount.getDescription()); mAccountDescription.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); mAccountDescription.setSummary(summary); mAccountDescription.setText(summary); return false; } }); mMessageFormat = (ListPreference) findPreference(PREFERENCE_MESSAGE_FORMAT); mMessageFormat.setValue(mAccount.getMessageFormat().name()); mMessageFormat.setSummary(mMessageFormat.getEntry()); mMessageFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mMessageFormat.findIndexOfValue(summary); mMessageFormat.setSummary(mMessageFormat.getEntries()[index]); mMessageFormat.setValue(summary); return false; } }); mMessageReadReceipt = (CheckBoxPreference) findPreference(PREFERENCE_MESSAGE_READ_RECEIPT); mMessageReadReceipt.setChecked(mAccount.isMessageReadReceiptAlways()); mAccountQuotePrefix = (EditTextPreference) findPreference(PREFERENCE_QUOTE_PREFIX); mAccountQuotePrefix.setSummary(mAccount.getQuotePrefix()); mAccountQuotePrefix.setText(mAccount.getQuotePrefix()); mAccountQuotePrefix.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final String value = newValue.toString(); mAccountQuotePrefix.setSummary(value); mAccountQuotePrefix.setText(value); return false; } }); mAccountDefaultQuotedTextShown = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT_QUOTED_TEXT_SHOWN); mAccountDefaultQuotedTextShown.setChecked(mAccount.isDefaultQuotedTextShown()); mReplyAfterQuote = (CheckBoxPreference) findPreference(PREFERENCE_REPLY_AFTER_QUOTE); mReplyAfterQuote.setChecked(mAccount.isReplyAfterQuote()); mComposingScreen = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_COMPOSING); Preference.OnPreferenceChangeListener quoteStyleListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final QuoteStyle style = QuoteStyle.valueOf(newValue.toString()); int index = mQuoteStyle.findIndexOfValue(newValue.toString()); mQuoteStyle.setSummary(mQuoteStyle.getEntries()[index]); if (style == QuoteStyle.PREFIX) { mComposingScreen.addPreference(mAccountQuotePrefix); mComposingScreen.addPreference(mReplyAfterQuote); } else if (style == QuoteStyle.HEADER) { mComposingScreen.removePreference(mAccountQuotePrefix); mComposingScreen.removePreference(mReplyAfterQuote); } return true; } }; mQuoteStyle = (ListPreference) findPreference(PREFERENCE_QUOTE_STYLE); mQuoteStyle.setValue(mAccount.getQuoteStyle().name()); mQuoteStyle.setSummary(mQuoteStyle.getEntry()); mQuoteStyle.setOnPreferenceChangeListener(quoteStyleListener); // Call the onPreferenceChange() handler on startup to update the Preference dialogue based // upon the existing quote style setting. quoteStyleListener.onPreferenceChange(mQuoteStyle, mAccount.getQuoteStyle().name()); mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY); mCheckFrequency.setValue(String.valueOf(mAccount.getAutomaticCheckIntervalMinutes())); mCheckFrequency.setSummary(mCheckFrequency.getEntry()); mCheckFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mCheckFrequency.findIndexOfValue(summary); mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]); mCheckFrequency.setValue(summary); return false; } }); mDisplayMode = (ListPreference) findPreference(PREFERENCE_DISPLAY_MODE); mDisplayMode.setValue(mAccount.getFolderDisplayMode().name()); mDisplayMode.setSummary(mDisplayMode.getEntry()); mDisplayMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mDisplayMode.findIndexOfValue(summary); mDisplayMode.setSummary(mDisplayMode.getEntries()[index]); mDisplayMode.setValue(summary); return false; } }); mSyncMode = (ListPreference) findPreference(PREFERENCE_SYNC_MODE); mSyncMode.setValue(mAccount.getFolderSyncMode().name()); mSyncMode.setSummary(mSyncMode.getEntry()); mSyncMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mSyncMode.findIndexOfValue(summary); mSyncMode.setSummary(mSyncMode.getEntries()[index]); mSyncMode.setValue(summary); return false; } }); mTargetMode = (ListPreference) findPreference(PREFERENCE_TARGET_MODE); mTargetMode.setValue(mAccount.getFolderTargetMode().name()); mTargetMode.setSummary(mTargetMode.getEntry()); mTargetMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mTargetMode.findIndexOfValue(summary); mTargetMode.setSummary(mTargetMode.getEntries()[index]); mTargetMode.setValue(summary); return false; } }); mDeletePolicy = (ListPreference) findPreference(PREFERENCE_DELETE_POLICY); mDeletePolicy.setValue("" + mAccount.getDeletePolicy()); mDeletePolicy.setSummary(mDeletePolicy.getEntry()); mDeletePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mDeletePolicy.findIndexOfValue(summary); mDeletePolicy.setSummary(mDeletePolicy.getEntries()[index]); mDeletePolicy.setValue(summary); return false; } }); mExpungePolicy = (ListPreference) findPreference(PREFERENCE_EXPUNGE_POLICY); if (mIsExpungeCapable) { mExpungePolicy.setValue(mAccount.getExpungePolicy()); mExpungePolicy.setSummary(mExpungePolicy.getEntry()); mExpungePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mExpungePolicy.findIndexOfValue(summary); mExpungePolicy.setSummary(mExpungePolicy.getEntries()[index]); mExpungePolicy.setValue(summary); return false; } }); } else { ((PreferenceScreen) findPreference(PREFERENCE_SCREEN_INCOMING)).removePreference(mExpungePolicy); } mSyncRemoteDeletions = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_REMOTE_DELETIONS); mSyncRemoteDeletions.setChecked(mAccount.syncRemoteDeletions()); mSaveAllHeaders = (CheckBoxPreference) findPreference(PREFERENCE_SAVE_ALL_HEADERS); mSaveAllHeaders.setChecked(mAccount.saveAllHeaders()); mSearchableFolders = (ListPreference) findPreference(PREFERENCE_SEARCHABLE_FOLDERS); mSearchableFolders.setValue(mAccount.getSearchableFolders().name()); mSearchableFolders.setSummary(mSearchableFolders.getEntry()); mSearchableFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mSearchableFolders.findIndexOfValue(summary); mSearchableFolders.setSummary(mSearchableFolders.getEntries()[index]); mSearchableFolders.setValue(summary); return false; } }); mDisplayCount = (ListPreference) findPreference(PREFERENCE_DISPLAY_COUNT); mDisplayCount.setValue(String.valueOf(mAccount.getDisplayCount())); mDisplayCount.setSummary(mDisplayCount.getEntry()); mDisplayCount.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mDisplayCount.findIndexOfValue(summary); mDisplayCount.setSummary(mDisplayCount.getEntries()[index]); mDisplayCount.setValue(summary); return false; } }); mMessageAge = (ListPreference) findPreference(PREFERENCE_MESSAGE_AGE); if (!mAccount.isSearchByDateCapable()) { ((PreferenceScreen) findPreference(PREFERENCE_SCREEN_INCOMING)).removePreference(mMessageAge); } else { mMessageAge.setValue(String.valueOf(mAccount.getMaximumPolledMessageAge())); mMessageAge.setSummary(mMessageAge.getEntry()); mMessageAge.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mMessageAge.findIndexOfValue(summary); mMessageAge.setSummary(mMessageAge.getEntries()[index]); mMessageAge.setValue(summary); return false; } }); } mMessageSize = (ListPreference) findPreference(PREFERENCE_MESSAGE_SIZE); mMessageSize.setValue(String.valueOf(mAccount.getMaximumAutoDownloadMessageSize())); mMessageSize.setSummary(mMessageSize.getEntry()); mMessageSize.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mMessageSize.findIndexOfValue(summary); mMessageSize.setSummary(mMessageSize.getEntries()[index]); mMessageSize.setValue(summary); return false; } }); mAccountDefault = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT); mAccountDefault.setChecked( mAccount.equals(Preferences.getPreferences(this).getDefaultAccount())); mAccountScrollButtons = (ListPreference) findPreference(PREFERENCE_HIDE_BUTTONS); mAccountScrollButtons.setValue("" + mAccount.getScrollMessageViewButtons()); mAccountScrollButtons.setSummary(mAccountScrollButtons.getEntry()); mAccountScrollButtons.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mAccountScrollButtons.findIndexOfValue(summary); mAccountScrollButtons.setSummary(mAccountScrollButtons.getEntries()[index]); mAccountScrollButtons.setValue(summary); return false; } }); mAccountEnableMoveButtons = (CheckBoxPreference) findPreference(PREFERENCE_ENABLE_MOVE_BUTTONS); mAccountEnableMoveButtons.setEnabled(mIsMoveCapable); mAccountEnableMoveButtons.setChecked(mAccount.getEnableMoveButtons()); mAccountScrollMoveButtons = (ListPreference) findPreference(PREFERENCE_HIDE_MOVE_BUTTONS); mAccountScrollMoveButtons.setEnabled(mIsMoveCapable); mAccountScrollMoveButtons.setValue("" + mAccount.getScrollMessageViewMoveButtons()); mAccountScrollMoveButtons.setSummary(mAccountScrollMoveButtons.getEntry()); mAccountScrollMoveButtons.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mAccountScrollMoveButtons.findIndexOfValue(summary); mAccountScrollMoveButtons.setSummary(mAccountScrollMoveButtons.getEntries()[index]); mAccountScrollMoveButtons.setValue(summary); return false; } }); mAccountShowPictures = (ListPreference) findPreference(PREFERENCE_SHOW_PICTURES); mAccountShowPictures.setValue("" + mAccount.getShowPictures()); mAccountShowPictures.setSummary(mAccountShowPictures.getEntry()); mAccountShowPictures.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mAccountShowPictures.findIndexOfValue(summary); mAccountShowPictures.setSummary(mAccountShowPictures.getEntries()[index]); mAccountShowPictures.setValue(summary); return false; } }); mLocalStorageProvider = (ListPreference) findPreference(PREFERENCE_LOCAL_STORAGE_PROVIDER); { final Map providers; providers = StorageManager.getInstance(K9.app).getAvailableProviders(); int i = 0; final String[] providerLabels = new String[providers.size()]; final String[] providerIds = new String[providers.size()]; for (final Map.Entry entry : providers.entrySet()) { providerIds[i] = entry.getKey(); providerLabels[i] = entry.getValue(); i++; } mLocalStorageProvider.setEntryValues(providerIds); mLocalStorageProvider.setEntries(providerLabels); mLocalStorageProvider.setValue(mAccount.getLocalStorageProviderId()); mLocalStorageProvider.setSummary(providers.get(mAccount.getLocalStorageProviderId())); mLocalStorageProvider.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { mLocalStorageProvider.setSummary(providers.get(newValue)); return true; } }); } // IMAP-specific preferences mPushPollOnConnect = (CheckBoxPreference) findPreference(PREFERENCE_PUSH_POLL_ON_CONNECT); mIdleRefreshPeriod = (ListPreference) findPreference(PREFERENCE_IDLE_REFRESH_PERIOD); mMaxPushFolders = (ListPreference) findPreference(PREFERENCE_MAX_PUSH_FOLDERS); if (mIsPushCapable) { mPushPollOnConnect.setChecked(mAccount.isPushPollOnConnect()); mIdleRefreshPeriod.setValue(String.valueOf(mAccount.getIdleRefreshMinutes())); mIdleRefreshPeriod.setSummary(mIdleRefreshPeriod.getEntry()); mIdleRefreshPeriod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mIdleRefreshPeriod.findIndexOfValue(summary); mIdleRefreshPeriod.setSummary(mIdleRefreshPeriod.getEntries()[index]); mIdleRefreshPeriod.setValue(summary); return false; } }); mMaxPushFolders.setValue(String.valueOf(mAccount.getMaxPushFolders())); mMaxPushFolders.setSummary(mMaxPushFolders.getEntry()); mMaxPushFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mMaxPushFolders.findIndexOfValue(summary); mMaxPushFolders.setSummary(mMaxPushFolders.getEntries()[index]); mMaxPushFolders.setValue(summary); return false; } }); mPushMode = (ListPreference) findPreference(PREFERENCE_PUSH_MODE); mPushMode.setValue(mAccount.getFolderPushMode().name()); mPushMode.setSummary(mPushMode.getEntry()); mPushMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mPushMode.findIndexOfValue(summary); mPushMode.setSummary(mPushMode.getEntries()[index]); mPushMode.setValue(summary); return false; } }); } else { PreferenceScreen incomingPrefs = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_INCOMING); incomingPrefs.removePreference( (PreferenceScreen) findPreference(PREFERENCE_SCREEN_PUSH_ADVANCED)); incomingPrefs.removePreference( (ListPreference) findPreference(PREFERENCE_PUSH_MODE)); } mAccountNotify = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY); mAccountNotify.setChecked(mAccount.isNotifyNewMail()); mAccountNotifySelf = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY_SELF); mAccountNotifySelf.setChecked(mAccount.isNotifySelfNewMail()); mAccountNotifySync = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY_SYNC); mAccountNotifySync.setChecked(mAccount.isShowOngoing()); mAccountRingtone = (RingtonePreference) findPreference(PREFERENCE_RINGTONE); // XXX: The following two lines act as a workaround for the RingtonePreference // which does not let us set/get the value programmatically SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences(); String currentRingtone = (!mAccount.getNotificationSetting().shouldRing() ? null : mAccount.getNotificationSetting().getRingtone()); prefs.edit().putString(PREFERENCE_RINGTONE, currentRingtone).commit(); mAccountVibrate = (CheckBoxPreference) findPreference(PREFERENCE_VIBRATE); mAccountVibrate.setChecked(mAccount.getNotificationSetting().shouldVibrate()); mAccountVibratePattern = (ListPreference) findPreference(PREFERENCE_VIBRATE_PATTERN); mAccountVibratePattern.setValue(String.valueOf(mAccount.getNotificationSetting().getVibratePattern())); mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntry()); mAccountVibratePattern.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String summary = newValue.toString(); int index = mAccountVibratePattern.findIndexOfValue(summary); mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntries()[index]); mAccountVibratePattern.setValue(summary); doVibrateTest(preference); return false; } }); mAccountVibrateTimes = (ListPreference) findPreference(PREFERENCE_VIBRATE_TIMES); mAccountVibrateTimes.setValue(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes())); mAccountVibrateTimes.setSummary(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes())); mAccountVibrateTimes.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final String value = newValue.toString(); mAccountVibrateTimes.setSummary(value); mAccountVibrateTimes.setValue(value); doVibrateTest(preference); return false; } }); mAccountLed = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFICATION_LED); mAccountLed.setChecked(mAccount.getNotificationSetting().isLed()); mNotificationOpensUnread = (CheckBoxPreference)findPreference(PREFERENCE_NOTIFICATION_OPENS_UNREAD); mNotificationOpensUnread.setChecked(mAccount.goToUnreadMessageSearch()); mNotificationUnreadCount = (CheckBoxPreference)findPreference(PREFERENCE_NOTIFICATION_UNREAD_COUNT); mNotificationUnreadCount.setChecked(mAccount.isNotificationShowsUnreadCount()); new PopulateFolderPrefsTask().execute(); mChipColor = findPreference(PREFERENCE_CHIP_COLOR); mChipColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onChooseChipColor(); return false; } }); mLedColor = findPreference(PREFERENCE_LED_COLOR); mLedColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onChooseLedColor(); return false; } }); findPreference(PREFERENCE_COMPOSITION).setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onCompositionSettings(); return true; } }); findPreference(PREFERENCE_MANAGE_IDENTITIES).setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onManageIdentities(); return true; } }); findPreference(PREFERENCE_INCOMING).setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { mIncomingChanged = true; onIncomingSettings(); return true; } }); findPreference(PREFERENCE_OUTGOING).setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onOutgoingSettings(); return true; } }); mCryptoApp = (ListPreference) findPreference(PREFERENCE_CRYPTO_APP); CharSequence cryptoAppEntries[] = mCryptoApp.getEntries(); if (!new Apg().isAvailable(this)) { int apgIndex = mCryptoApp.findIndexOfValue(Apg.NAME); if (apgIndex >= 0) { cryptoAppEntries[apgIndex] = "APG (" + getResources().getString(R.string.account_settings_crypto_app_not_available) + ")"; mCryptoApp.setEntries(cryptoAppEntries); } } mCryptoApp.setValue(String.valueOf(mAccount.getCryptoApp())); mCryptoApp.setSummary(mCryptoApp.getEntry()); mCryptoApp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { String value = newValue.toString(); int index = mCryptoApp.findIndexOfValue(value); mCryptoApp.setSummary(mCryptoApp.getEntries()[index]); mCryptoApp.setValue(value); handleCryptoAppDependencies(); if (Apg.NAME.equals(value)) { Apg.createInstance(null).test(AccountSettings.this); } return false; } }); mCryptoAutoSignature = (CheckBoxPreference) findPreference(PREFERENCE_CRYPTO_AUTO_SIGNATURE); mCryptoAutoSignature.setChecked(mAccount.getCryptoAutoSignature()); handleCryptoAppDependencies(); } private void handleCryptoAppDependencies() { if ("".equals(mCryptoApp.getValue())) { mCryptoAutoSignature.setEnabled(false); } else { mCryptoAutoSignature.setEnabled(true); } } @Override public void onResume() { super.onResume(); } private void saveSettings() { if (mAccountDefault.isChecked()) { Preferences.getPreferences(this).setDefaultAccount(mAccount); } mAccount.setDescription(mAccountDescription.getText()); mAccount.setNotifyNewMail(mAccountNotify.isChecked()); mAccount.setNotifySelfNewMail(mAccountNotifySelf.isChecked()); mAccount.setShowOngoing(mAccountNotifySync.isChecked()); mAccount.setDisplayCount(Integer.parseInt(mDisplayCount.getValue())); mAccount.setMaximumAutoDownloadMessageSize(Integer.parseInt(mMessageSize.getValue())); if (mAccount.isSearchByDateCapable()) { mAccount.setMaximumPolledMessageAge(Integer.parseInt(mMessageAge.getValue())); } mAccount.getNotificationSetting().setVibrate(mAccountVibrate.isChecked()); mAccount.getNotificationSetting().setVibratePattern(Integer.parseInt(mAccountVibratePattern.getValue())); mAccount.getNotificationSetting().setVibrateTimes(Integer.parseInt(mAccountVibrateTimes.getValue())); mAccount.getNotificationSetting().setLed(mAccountLed.isChecked()); mAccount.setGoToUnreadMessageSearch(mNotificationOpensUnread.isChecked()); mAccount.setNotificationShowsUnreadCount(mNotificationUnreadCount.isChecked()); mAccount.setFolderTargetMode(Account.FolderMode.valueOf(mTargetMode.getValue())); mAccount.setDeletePolicy(Integer.parseInt(mDeletePolicy.getValue())); if (mIsExpungeCapable) { mAccount.setExpungePolicy(mExpungePolicy.getValue()); }; mAccount.setSyncRemoteDeletions(mSyncRemoteDeletions.isChecked()); mAccount.setSaveAllHeaders(mSaveAllHeaders.isChecked()); mAccount.setSearchableFolders(Account.Searchable.valueOf(mSearchableFolders.getValue())); mAccount.setMessageFormat(Account.MessageFormat.valueOf(mMessageFormat.getValue())); mAccount.setMessageReadReceipt(mMessageReadReceipt.isChecked()); mAccount.setQuoteStyle(QuoteStyle.valueOf(mQuoteStyle.getValue())); mAccount.setQuotePrefix(mAccountQuotePrefix.getText()); mAccount.setDefaultQuotedTextShown(mAccountDefaultQuotedTextShown.isChecked()); mAccount.setReplyAfterQuote(mReplyAfterQuote.isChecked()); mAccount.setCryptoApp(mCryptoApp.getValue()); mAccount.setCryptoAutoSignature(mCryptoAutoSignature.isChecked()); mAccount.setLocalStorageProviderId(mLocalStorageProvider.getValue()); // In webdav account we use the exact folder name also for inbox, // since it varies because of internationalization if (mAccount.getStoreUri().startsWith("webdav")) mAccount.setAutoExpandFolderName(mAutoExpandFolder.getValue()); else mAccount.setAutoExpandFolderName(reverseTranslateFolder(mAutoExpandFolder.getValue())); mAccount.setArchiveFolderName(mArchiveFolder.getValue()); mAccount.setDraftsFolderName(mDraftsFolder.getValue()); mAccount.setSentFolderName(mSentFolder.getValue()); mAccount.setSpamFolderName(mSpamFolder.getValue()); mAccount.setTrashFolderName(mTrashFolder.getValue()); if (mIsPushCapable) { mAccount.setPushPollOnConnect(mPushPollOnConnect.isChecked()); mAccount.setIdleRefreshMinutes(Integer.parseInt(mIdleRefreshPeriod.getValue())); mAccount.setMaxPushFolders(Integer.parseInt(mMaxPushFolders.getValue())); } if (!mIsMoveCapable) { mAccount.setEnableMoveButtons(false); mAccount.setScrollMessageViewMoveButtons(ScrollButtons.NEVER); } else { mAccount.setEnableMoveButtons(mAccountEnableMoveButtons.isChecked()); mAccount.setScrollMessageViewMoveButtons(Account.ScrollButtons.valueOf(mAccountScrollMoveButtons.getValue())); } boolean needsRefresh = mAccount.setAutomaticCheckIntervalMinutes(Integer.parseInt(mCheckFrequency.getValue())); needsRefresh |= mAccount.setFolderSyncMode(Account.FolderMode.valueOf(mSyncMode.getValue())); boolean displayModeChanged = mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue())); SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences(); String newRingtone = prefs.getString(PREFERENCE_RINGTONE, null); if (newRingtone != null) { mAccount.getNotificationSetting().setRing(true); mAccount.getNotificationSetting().setRingtone(newRingtone); } else { if (mAccount.getNotificationSetting().shouldRing()) { mAccount.getNotificationSetting().setRingtone(null); } } mAccount.setScrollMessageViewButtons(Account.ScrollButtons.valueOf(mAccountScrollButtons.getValue())); mAccount.setShowPictures(Account.ShowPictures.valueOf(mAccountShowPictures.getValue())); mAccount.save(Preferences.getPreferences(this)); if (mIsPushCapable) { boolean needsPushRestart = mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue())); if (mAccount.getFolderPushMode() != FolderMode.NONE) { needsPushRestart |= displayModeChanged; needsPushRestart |= mIncomingChanged; } if (needsRefresh && needsPushRestart) { MailService.actionReset(this, null); } else if (needsRefresh) { MailService.actionReschedulePoll(this, null); } else if (needsPushRestart) { MailService.actionRestartPushers(this, null); } } // TODO: refresh folder list here } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case SELECT_AUTO_EXPAND_FOLDER: mAutoExpandFolder.setSummary(translateFolder(data.getStringExtra(ChooseFolder.EXTRA_NEW_FOLDER))); break; } } super.onActivityResult(requestCode, resultCode, data); } @Override public void onBackPressed() { saveSettings(); super.onBackPressed(); } private void onCompositionSettings() { AccountSetupComposition.actionEditCompositionSettings(this, mAccount); } private void onManageIdentities() { Intent intent = new Intent(this, ManageIdentities.class); intent.putExtra(ChooseIdentity.EXTRA_ACCOUNT, mAccount.getUuid()); startActivityForResult(intent, ACTIVITY_MANAGE_IDENTITIES); } private void onIncomingSettings() { AccountSetupIncoming.actionEditIncomingSettings(this, mAccount); } private void onOutgoingSettings() { AccountSetupOutgoing.actionEditOutgoingSettings(this, mAccount); } public void onChooseChipColor() { new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() { public void colorChanged(int color) { mAccount.setChipColor(color); } }, mAccount.getChipColor()).show(); } public void onChooseLedColor() { new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() { public void colorChanged(int color) { mAccount.getNotificationSetting().setLedColor(color); } }, mAccount.getNotificationSetting().getLedColor()).show(); } public void onChooseAutoExpandFolder() { Intent selectIntent = new Intent(this, ChooseFolder.class); selectIntent.putExtra(ChooseFolder.EXTRA_ACCOUNT, mAccount.getUuid()); selectIntent.putExtra(ChooseFolder.EXTRA_CUR_FOLDER, mAutoExpandFolder.getSummary()); selectIntent.putExtra(ChooseFolder.EXTRA_SHOW_CURRENT, "yes"); selectIntent.putExtra(ChooseFolder.EXTRA_SHOW_FOLDER_NONE, "yes"); selectIntent.putExtra(ChooseFolder.EXTRA_SHOW_DISPLAYABLE_ONLY, "yes"); startActivityForResult(selectIntent, SELECT_AUTO_EXPAND_FOLDER); } private String translateFolder(String in) { if (mAccount.getInboxFolderName().equalsIgnoreCase(in)) { return getString(R.string.special_mailbox_name_inbox); } else { return in; } } private String reverseTranslateFolder(String in) { if (getString(R.string.special_mailbox_name_inbox).equals(in)) { return mAccount.getInboxFolderName(); } else { return in; } } private void doVibrateTest(Preference preference) { // Do the vibration to show the user what it's like. Vibrator vibrate = (Vibrator)preference.getContext().getSystemService(Context.VIBRATOR_SERVICE); vibrate.vibrate(NotificationSetting.getVibration( Integer.parseInt(mAccountVibratePattern.getValue()), Integer.parseInt(mAccountVibrateTimes.getValue())), -1); } private class PopulateFolderPrefsTask extends AsyncTask { List folders = new LinkedList(); String[] allFolderValues; String[] allFolderLabels; @Override protected Void doInBackground(Void... params) { try { folders = mAccount.getLocalStore().getPersonalNamespaces(false); } catch (Exception e) { /// this can't be checked in } // TODO: In the future the call above should be changed to only return remote folders. // For now we just remove the Outbox folder if present. Iterator iter = folders.iterator(); while (iter.hasNext()) { Folder folder = iter.next(); if (mAccount.getOutboxFolderName().equals(folder.getName())) { iter.remove(); } } allFolderValues = new String[folders.size()+1]; allFolderLabels = new String[folders.size()+1]; allFolderValues[0] = K9.FOLDER_NONE; allFolderLabels[0] = K9.FOLDER_NONE; int i = 1; for (Folder folder : folders) { allFolderLabels[i] = folder.getName(); allFolderValues[i] = folder.getName(); i++; } return null; } @Override protected void onPreExecute() { mAutoExpandFolder = (ListPreference)findPreference(PREFERENCE_AUTO_EXPAND_FOLDER); mAutoExpandFolder.setEnabled(false); mArchiveFolder = (ListPreference)findPreference(PREFERENCE_ARCHIVE_FOLDER); mArchiveFolder.setEnabled(false); mDraftsFolder = (ListPreference)findPreference(PREFERENCE_DRAFTS_FOLDER); mDraftsFolder.setEnabled(false); mSentFolder = (ListPreference)findPreference(PREFERENCE_SENT_FOLDER); mSentFolder.setEnabled(false); mSpamFolder = (ListPreference)findPreference(PREFERENCE_SPAM_FOLDER); mSpamFolder.setEnabled(false); mTrashFolder = (ListPreference)findPreference(PREFERENCE_TRASH_FOLDER); mTrashFolder.setEnabled(false); } @Override protected void onPostExecute(Void res) { initListPreference(mAutoExpandFolder, mAccount.getAutoExpandFolderName(), allFolderLabels, allFolderValues); initListPreference(mArchiveFolder, mAccount.getArchiveFolderName(), allFolderLabels, allFolderValues); initListPreference(mDraftsFolder, mAccount.getDraftsFolderName(), allFolderLabels, allFolderValues); initListPreference(mSentFolder, mAccount.getSentFolderName(), allFolderLabels, allFolderValues); initListPreference(mSpamFolder, mAccount.getSpamFolderName(), allFolderLabels, allFolderValues); initListPreference(mTrashFolder, mAccount.getTrashFolderName(), allFolderLabels, allFolderValues); mAutoExpandFolder.setEnabled(true); mArchiveFolder.setEnabled(true); mDraftsFolder.setEnabled(true); mSentFolder.setEnabled(true); mSpamFolder.setEnabled(true); mTrashFolder.setEnabled(true); } } }