package com.fsck.k9.activity.setup;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import android.app.Dialog;
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.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceScreen;
import android.preference.RingtonePreference;
import android.widget.Toast;
import com.fsck.k9.Account;
import com.fsck.k9.Account.DeletePolicy;
import com.fsck.k9.Account.Expunge;
import com.fsck.k9.Account.FolderMode;
import com.fsck.k9.Account.MessageFormat;
import com.fsck.k9.Account.QuoteStyle;
import com.fsck.k9.Account.Searchable;
import com.fsck.k9.Account.ShowPictures;
import com.fsck.k9.K9;
import com.fsck.k9.NotificationSetting;
import com.fsck.k9.Preferences;
import com.fsck.k9.R;
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.OpenPgpApiHelper;
import com.fsck.k9.mail.Folder;
import com.fsck.k9.mail.Store;
import com.fsck.k9.mailstore.StorageManager;
import com.fsck.k9.service.MailService;
import org.openintents.openpgp.util.OpenPgpKeyPreference;
import timber.log.Timber;
public class AccountSettings extends K9PreferenceActivity {
private static final String EXTRA_ACCOUNT = "account";
private static final int DIALOG_COLOR_PICKER_ACCOUNT = 1;
private static final int DIALOG_COLOR_PICKER_LED = 2;
private static final int SELECT_AUTO_EXPAND_FOLDER = 1;
private static final int ACTIVITY_MANAGE_IDENTITIES = 2;
private static final String PREFERENCE_SCREEN_MAIN = "main";
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_SCREEN_SEARCH = "search";
private static final String PREFERENCE_DESCRIPTION = "account_description";
private static final String PREFERENCE_MARK_MESSAGE_AS_READ_ON_VIEW = "mark_message_as_read_on_view";
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_SHOW_PICTURES = "show_pictures_enum";
private static final String PREFERENCE_NOTIFY = "account_notify";
private static final String PREFERENCE_NOTIFY_NEW_MAIL_MODE = "folder_notify_new_mail_mode";
private static final String PREFERENCE_NOTIFY_SELF = "account_notify_self";
private static final String PREFERENCE_NOTIFY_CONTACTS_MAIL_ONLY = "account_notify_contacts_mail_only";
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_MESSAGE_AGE = "account_message_age";
private static final String PREFERENCE_MESSAGE_SIZE = "account_autodownload_size";
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_STRIP_SIGNATURE = "strip_signature";
private static final String PREFERENCE_SYNC_REMOTE_DELETIONS = "account_sync_remote_deletetions";
private static final String PREFERENCE_CRYPTO = "crypto";
private static final String PREFERENCE_CRYPTO_KEY = "crypto_key";
private static final String PREFERENCE_CLOUD_SEARCH_ENABLED = "remote_search_enabled";
private static final String PREFERENCE_REMOTE_SEARCH_NUM_RESULTS = "account_remote_search_num_results";
private static final String PREFERENCE_REMOTE_SEARCH_FULL_TEXT = "account_remote_search_full_text";
private static final String PREFERENCE_LOCAL_STORAGE_PROVIDER = "local_storage_provider";
private static final String PREFERENCE_CATEGORY_FOLDERS = "folders";
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 static final String PREFERENCE_ALWAYS_SHOW_CC_BCC = "always_show_cc_bcc";
private Account account;
private boolean isMoveCapable = false;
private boolean isPushCapable = false;
private boolean isExpungeCapable = false;
private boolean isSeenFlagSupported = false;
private PreferenceScreen mainScreen;
private PreferenceScreen composingScreen;
private EditTextPreference accountDescription;
private CheckBoxPreference markMessageAsReadOnView;
private ListPreference checkFrequency;
private ListPreference displayCount;
private ListPreference messageAge;
private ListPreference messageSize;
private CheckBoxPreference accountDefault;
private CheckBoxPreference accountNotify;
private ListPreference accountNotifyNewMailMode;
private CheckBoxPreference accountNotifySelf;
private CheckBoxPreference accountNotifyContactsMailOnly;
private ListPreference accountShowPictures;
private CheckBoxPreference accountNotifySync;
private CheckBoxPreference accountVibrateEnabled;
private CheckBoxPreference accountLedEnabled;
private ListPreference accountVibratePattern;
private ListPreference accountVibrateTimes;
private RingtonePreference accountRingtone;
private ListPreference displayMode;
private ListPreference syncMode;
private ListPreference pushMode;
private ListPreference targetMode;
private ListPreference deletePolicy;
private ListPreference expungePolicy;
private ListPreference searchableFolders;
private ListPreference autoExpandFolder;
private Preference chipColor;
private Preference ledColor;
private boolean incomingChanged = false;
private CheckBoxPreference notificationOpensUnread;
private ListPreference messageFormat;
private CheckBoxPreference messageReadReceipt;
private ListPreference quoteStyle;
private EditTextPreference accountQuotePrefix;
private CheckBoxPreference accountDefaultQuotedTextShown;
private CheckBoxPreference replyAfterQuote;
private CheckBoxPreference stripSignature;
private CheckBoxPreference syncRemoteDeletions;
private CheckBoxPreference pushPollOnConnect;
private ListPreference idleRefreshPeriod;
private ListPreference mMaxPushFolders;
private boolean hasPgpCrypto = false;
private OpenPgpKeyPreference pgpCryptoKey;
private CheckBoxPreference pgpSupportSignOnly;
private PreferenceScreen searchScreen;
private CheckBoxPreference cloudSearchEnabled;
private ListPreference remoteSearchNumResults;
/*
* Temporarily removed because search results aren't displayed to the user.
* So this feature is useless.
*/
//private CheckBoxPreference mRemoteSearchFullText;
private ListPreference localStorageProvider;
private ListPreference archiveFolder;
private ListPreference draftsFolder;
private ListPreference sentFolder;
private ListPreference spamFolder;
private ListPreference trashFolder;
private CheckBoxPreference alwaysShowCcBcc;
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);
account = Preferences.getPreferences(this).getAccount(accountUuid);
try {
final Store store = account.getRemoteStore();
isMoveCapable = store.isMoveCapable();
isPushCapable = store.isPushCapable();
isExpungeCapable = store.isExpungeCapable();
isSeenFlagSupported = store.isSeenFlagSupported();
} catch (Exception e) {
Timber.e(e, "Could not get remote store");
}
addPreferencesFromResource(R.xml.account_settings_preferences);
mainScreen = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_MAIN);
accountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION);
accountDescription.setSummary(account.getDescription());
accountDescription.setText(account.getDescription());
accountDescription.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
accountDescription.setSummary(summary);
accountDescription.setText(summary);
return false;
}
});
markMessageAsReadOnView = (CheckBoxPreference) findPreference(PREFERENCE_MARK_MESSAGE_AS_READ_ON_VIEW);
markMessageAsReadOnView.setChecked(account.isMarkMessageAsReadOnView());
messageFormat = (ListPreference) findPreference(PREFERENCE_MESSAGE_FORMAT);
messageFormat.setValue(account.getMessageFormat().name());
messageFormat.setSummary(messageFormat.getEntry());
messageFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = messageFormat.findIndexOfValue(summary);
messageFormat.setSummary(messageFormat.getEntries()[index]);
messageFormat.setValue(summary);
return false;
}
});
alwaysShowCcBcc = (CheckBoxPreference) findPreference(PREFERENCE_ALWAYS_SHOW_CC_BCC);
alwaysShowCcBcc.setChecked(account.isAlwaysShowCcBcc());
messageReadReceipt = (CheckBoxPreference) findPreference(PREFERENCE_MESSAGE_READ_RECEIPT);
messageReadReceipt.setChecked(account.isMessageReadReceiptAlways());
accountQuotePrefix = (EditTextPreference) findPreference(PREFERENCE_QUOTE_PREFIX);
accountQuotePrefix.setSummary(account.getQuotePrefix());
accountQuotePrefix.setText(account.getQuotePrefix());
accountQuotePrefix.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String value = newValue.toString();
accountQuotePrefix.setSummary(value);
accountQuotePrefix.setText(value);
return false;
}
});
accountDefaultQuotedTextShown = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT_QUOTED_TEXT_SHOWN);
accountDefaultQuotedTextShown.setChecked(account.isDefaultQuotedTextShown());
replyAfterQuote = (CheckBoxPreference) findPreference(PREFERENCE_REPLY_AFTER_QUOTE);
replyAfterQuote.setChecked(account.isReplyAfterQuote());
stripSignature = (CheckBoxPreference) findPreference(PREFERENCE_STRIP_SIGNATURE);
stripSignature.setChecked(account.isStripSignature());
composingScreen = (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 = quoteStyle.findIndexOfValue(newValue.toString());
quoteStyle.setSummary(quoteStyle.getEntries()[index]);
if (style == QuoteStyle.PREFIX) {
composingScreen.addPreference(accountQuotePrefix);
composingScreen.addPreference(replyAfterQuote);
} else if (style == QuoteStyle.HEADER) {
composingScreen.removePreference(accountQuotePrefix);
composingScreen.removePreference(replyAfterQuote);
}
return true;
}
};
quoteStyle = (ListPreference) findPreference(PREFERENCE_QUOTE_STYLE);
quoteStyle.setValue(account.getQuoteStyle().name());
quoteStyle.setSummary(quoteStyle.getEntry());
quoteStyle.setOnPreferenceChangeListener(quoteStyleListener);
// Call the onPreferenceChange() handler on startup to update the Preference dialogue based
// upon the existing quote style setting.
quoteStyleListener.onPreferenceChange(quoteStyle, account.getQuoteStyle().name());
checkFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY);
checkFrequency.setValue(String.valueOf(account.getAutomaticCheckIntervalMinutes()));
checkFrequency.setSummary(checkFrequency.getEntry());
checkFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = checkFrequency.findIndexOfValue(summary);
checkFrequency.setSummary(checkFrequency.getEntries()[index]);
checkFrequency.setValue(summary);
return false;
}
});
displayMode = (ListPreference) findPreference(PREFERENCE_DISPLAY_MODE);
displayMode.setValue(account.getFolderDisplayMode().name());
displayMode.setSummary(displayMode.getEntry());
displayMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = displayMode.findIndexOfValue(summary);
displayMode.setSummary(displayMode.getEntries()[index]);
displayMode.setValue(summary);
return false;
}
});
syncMode = (ListPreference) findPreference(PREFERENCE_SYNC_MODE);
syncMode.setValue(account.getFolderSyncMode().name());
syncMode.setSummary(syncMode.getEntry());
syncMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = syncMode.findIndexOfValue(summary);
syncMode.setSummary(syncMode.getEntries()[index]);
syncMode.setValue(summary);
return false;
}
});
targetMode = (ListPreference) findPreference(PREFERENCE_TARGET_MODE);
targetMode.setValue(account.getFolderTargetMode().name());
targetMode.setSummary(targetMode.getEntry());
targetMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = targetMode.findIndexOfValue(summary);
targetMode.setSummary(targetMode.getEntries()[index]);
targetMode.setValue(summary);
return false;
}
});
deletePolicy = (ListPreference) findPreference(PREFERENCE_DELETE_POLICY);
if (!isSeenFlagSupported) {
removeListEntry(deletePolicy, DeletePolicy.MARK_AS_READ.preferenceString());
}
deletePolicy.setValue(account.getDeletePolicy().preferenceString());
deletePolicy.setSummary(deletePolicy.getEntry());
deletePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = deletePolicy.findIndexOfValue(summary);
deletePolicy.setSummary(deletePolicy.getEntries()[index]);
deletePolicy.setValue(summary);
return false;
}
});
expungePolicy = (ListPreference) findPreference(PREFERENCE_EXPUNGE_POLICY);
if (isExpungeCapable) {
expungePolicy.setValue(account.getExpungePolicy().name());
expungePolicy.setSummary(expungePolicy.getEntry());
expungePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = expungePolicy.findIndexOfValue(summary);
expungePolicy.setSummary(expungePolicy.getEntries()[index]);
expungePolicy.setValue(summary);
return false;
}
});
} else {
((PreferenceScreen) findPreference(PREFERENCE_SCREEN_INCOMING)).removePreference(expungePolicy);
}
syncRemoteDeletions = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_REMOTE_DELETIONS);
syncRemoteDeletions.setChecked(account.syncRemoteDeletions());
searchableFolders = (ListPreference) findPreference(PREFERENCE_SEARCHABLE_FOLDERS);
searchableFolders.setValue(account.getSearchableFolders().name());
searchableFolders.setSummary(searchableFolders.getEntry());
searchableFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = searchableFolders.findIndexOfValue(summary);
searchableFolders.setSummary(searchableFolders.getEntries()[index]);
searchableFolders.setValue(summary);
return false;
}
});
displayCount = (ListPreference) findPreference(PREFERENCE_DISPLAY_COUNT);
displayCount.setValue(String.valueOf(account.getDisplayCount()));
displayCount.setSummary(displayCount.getEntry());
displayCount.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = displayCount.findIndexOfValue(summary);
displayCount.setSummary(displayCount.getEntries()[index]);
displayCount.setValue(summary);
return false;
}
});
messageAge = (ListPreference) findPreference(PREFERENCE_MESSAGE_AGE);
if (!account.isSearchByDateCapable()) {
((PreferenceScreen) findPreference(PREFERENCE_SCREEN_INCOMING)).removePreference(messageAge);
} else {
messageAge.setValue(String.valueOf(account.getMaximumPolledMessageAge()));
messageAge.setSummary(messageAge.getEntry());
messageAge.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = messageAge.findIndexOfValue(summary);
messageAge.setSummary(messageAge.getEntries()[index]);
messageAge.setValue(summary);
return false;
}
});
}
messageSize = (ListPreference) findPreference(PREFERENCE_MESSAGE_SIZE);
messageSize.setValue(String.valueOf(account.getMaximumAutoDownloadMessageSize()));
messageSize.setSummary(messageSize.getEntry());
messageSize.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = messageSize.findIndexOfValue(summary);
messageSize.setSummary(messageSize.getEntries()[index]);
messageSize.setValue(summary);
return false;
}
});
accountDefault = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT);
accountDefault.setChecked(
account.equals(Preferences.getPreferences(this).getDefaultAccount()));
accountShowPictures = (ListPreference) findPreference(PREFERENCE_SHOW_PICTURES);
accountShowPictures.setValue("" + account.getShowPictures());
accountShowPictures.setSummary(accountShowPictures.getEntry());
accountShowPictures.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = accountShowPictures.findIndexOfValue(summary);
accountShowPictures.setSummary(accountShowPictures.getEntries()[index]);
accountShowPictures.setValue(summary);
return false;
}
});
localStorageProvider = (ListPreference) findPreference(PREFERENCE_LOCAL_STORAGE_PROVIDER);
{
final Map<String, String> providers;
providers = StorageManager.getInstance(this).getAvailableProviders();
int i = 0;
final String[] providerLabels = new String[providers.size()];
final String[] providerIds = new String[providers.size()];
for (final Map.Entry<String, String> entry : providers.entrySet()) {
providerIds[i] = entry.getKey();
providerLabels[i] = entry.getValue();
i++;
}
localStorageProvider.setEntryValues(providerIds);
localStorageProvider.setEntries(providerLabels);
localStorageProvider.setValue(account.getLocalStorageProviderId());
localStorageProvider.setSummary(providers.get(account.getLocalStorageProviderId()));
localStorageProvider.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
localStorageProvider.setSummary(providers.get(newValue));
return true;
}
});
}
// IMAP-specific preferences
searchScreen = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_SEARCH);
cloudSearchEnabled = (CheckBoxPreference) findPreference(PREFERENCE_CLOUD_SEARCH_ENABLED);
remoteSearchNumResults = (ListPreference) findPreference(PREFERENCE_REMOTE_SEARCH_NUM_RESULTS);
remoteSearchNumResults.setOnPreferenceChangeListener(
new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference pref, Object newVal) {
updateRemoteSearchLimit((String)newVal);
return true;
}
}
);
//mRemoteSearchFullText = (CheckBoxPreference) findPreference(PREFERENCE_REMOTE_SEARCH_FULL_TEXT);
pushPollOnConnect = (CheckBoxPreference) findPreference(PREFERENCE_PUSH_POLL_ON_CONNECT);
idleRefreshPeriod = (ListPreference) findPreference(PREFERENCE_IDLE_REFRESH_PERIOD);
mMaxPushFolders = (ListPreference) findPreference(PREFERENCE_MAX_PUSH_FOLDERS);
if (isPushCapable) {
pushPollOnConnect.setChecked(account.isPushPollOnConnect());
cloudSearchEnabled.setChecked(account.allowRemoteSearch());
String searchNumResults = Integer.toString(account.getRemoteSearchNumResults());
remoteSearchNumResults.setValue(searchNumResults);
updateRemoteSearchLimit(searchNumResults);
//mRemoteSearchFullText.setChecked(account.isRemoteSearchFullText());
idleRefreshPeriod.setValue(String.valueOf(account.getIdleRefreshMinutes()));
idleRefreshPeriod.setSummary(idleRefreshPeriod.getEntry());
idleRefreshPeriod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = idleRefreshPeriod.findIndexOfValue(summary);
idleRefreshPeriod.setSummary(idleRefreshPeriod.getEntries()[index]);
idleRefreshPeriod.setValue(summary);
return false;
}
});
mMaxPushFolders.setValue(String.valueOf(account.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;
}
});
pushMode = (ListPreference) findPreference(PREFERENCE_PUSH_MODE);
pushMode.setValue(account.getFolderPushMode().name());
pushMode.setSummary(pushMode.getEntry());
pushMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = pushMode.findIndexOfValue(summary);
pushMode.setSummary(pushMode.getEntries()[index]);
pushMode.setValue(summary);
return false;
}
});
} else {
PreferenceScreen incomingPrefs = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_INCOMING);
incomingPrefs.removePreference(findPreference(PREFERENCE_SCREEN_PUSH_ADVANCED));
incomingPrefs.removePreference(findPreference(PREFERENCE_PUSH_MODE));
mainScreen.removePreference(searchScreen);
}
accountNotify = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY);
accountNotify.setChecked(account.isNotifyNewMail());
accountNotifyNewMailMode = (ListPreference) findPreference(PREFERENCE_NOTIFY_NEW_MAIL_MODE);
accountNotifyNewMailMode.setValue(account.getFolderNotifyNewMailMode().name());
accountNotifyNewMailMode.setSummary(accountNotifyNewMailMode.getEntry());
accountNotifyNewMailMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = accountNotifyNewMailMode.findIndexOfValue(summary);
accountNotifyNewMailMode.setSummary(accountNotifyNewMailMode.getEntries()[index]);
accountNotifyNewMailMode.setValue(summary);
return false;
}
});
accountNotifySelf = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY_SELF);
accountNotifySelf.setChecked(account.isNotifySelfNewMail());
accountNotifyContactsMailOnly = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY_CONTACTS_MAIL_ONLY);
accountNotifyContactsMailOnly.setChecked(account.isNotifyContactsMailOnly());
accountNotifySync = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY_SYNC);
accountNotifySync.setChecked(account.isShowOngoing());
accountRingtone = (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 = accountRingtone.getPreferenceManager().getSharedPreferences();
String currentRingtone = (!account.getNotificationSetting().isRingEnabled() ? null : account.getNotificationSetting().getRingtone());
prefs.edit().putString(PREFERENCE_RINGTONE, currentRingtone).commit();
accountVibrateEnabled = (CheckBoxPreference) findPreference(PREFERENCE_VIBRATE);
accountVibrateEnabled.setChecked(account.getNotificationSetting().isVibrateEnabled());
accountVibratePattern = (ListPreference) findPreference(PREFERENCE_VIBRATE_PATTERN);
accountVibratePattern.setValue(String.valueOf(account.getNotificationSetting().getVibratePattern()));
accountVibratePattern.setSummary(accountVibratePattern.getEntry());
accountVibratePattern.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = accountVibratePattern.findIndexOfValue(summary);
accountVibratePattern.setSummary(accountVibratePattern.getEntries()[index]);
accountVibratePattern.setValue(summary);
doVibrateTest(preference);
return false;
}
});
accountVibrateTimes = (ListPreference) findPreference(PREFERENCE_VIBRATE_TIMES);
accountVibrateTimes.setValue(String.valueOf(account.getNotificationSetting().getVibrateTimes()));
accountVibrateTimes.setSummary(String.valueOf(account.getNotificationSetting().getVibrateTimes()));
accountVibrateTimes.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String value = newValue.toString();
accountVibrateTimes.setSummary(value);
accountVibrateTimes.setValue(value);
doVibrateTest(preference);
return false;
}
});
accountLedEnabled = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFICATION_LED);
accountLedEnabled.setChecked(account.getNotificationSetting().isLedEnabled());
notificationOpensUnread = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFICATION_OPENS_UNREAD);
notificationOpensUnread.setChecked(account.goToUnreadMessageSearch());
new PopulateFolderPrefsTask().execute();
chipColor = findPreference(PREFERENCE_CHIP_COLOR);
chipColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
onChooseChipColor();
return false;
}
});
ledColor = findPreference(PREFERENCE_LED_COLOR);
ledColor.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) {
incomingChanged = true;
onIncomingSettings();
return true;
}
});
findPreference(PREFERENCE_OUTGOING).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
onOutgoingSettings();
return true;
}
});
hasPgpCrypto = K9.isOpenPgpProviderConfigured();
PreferenceScreen cryptoMenu = (PreferenceScreen) findPreference(PREFERENCE_CRYPTO);
if (hasPgpCrypto) {
pgpCryptoKey = (OpenPgpKeyPreference) findPreference(PREFERENCE_CRYPTO_KEY);
pgpCryptoKey.setValue(account.getCryptoKey());
pgpCryptoKey.setOpenPgpProvider(K9.getOpenPgpProvider());
// TODO: other identities?
pgpCryptoKey.setDefaultUserId(OpenPgpApiHelper.buildUserId(account.getIdentity(0)));
pgpCryptoKey.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
long value = (Long) newValue;
pgpCryptoKey.setValue(value);
return false;
}
});
cryptoMenu.setOnPreferenceClickListener(null);
} else {
cryptoMenu.setSummary(R.string.account_settings_no_openpgp_provider_configured);
cryptoMenu.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Dialog dialog = ((PreferenceScreen) preference).getDialog();
if (dialog != null) {
dialog.dismiss();
}
Toast.makeText(AccountSettings.this,
R.string.no_crypto_provider_see_global, Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
private void removeListEntry(ListPreference listPreference, String remove) {
CharSequence[] entryValues = listPreference.getEntryValues();
CharSequence[] entries = listPreference.getEntries();
CharSequence[] newEntryValues = new String[entryValues.length - 1];
CharSequence[] newEntries = new String[entryValues.length - 1];
for (int i = 0, out = 0; i < entryValues.length; i++) {
CharSequence value = entryValues[i];
if (!value.equals(remove)) {
newEntryValues[out] = value;
newEntries[out] = entries[i];
out++;
}
}
listPreference.setEntryValues(newEntryValues);
listPreference.setEntries(newEntries);
}
private void saveSettings() {
if (accountDefault.isChecked()) {
Preferences.getPreferences(this).setDefaultAccount(account);
}
account.setDescription(accountDescription.getText());
account.setMarkMessageAsReadOnView(markMessageAsReadOnView.isChecked());
account.setNotifyNewMail(accountNotify.isChecked());
account.setFolderNotifyNewMailMode(FolderMode.valueOf(accountNotifyNewMailMode.getValue()));
account.setNotifySelfNewMail(accountNotifySelf.isChecked());
account.setNotifyContactsMailOnly(accountNotifyContactsMailOnly.isChecked());
account.setShowOngoing(accountNotifySync.isChecked());
account.setDisplayCount(Integer.parseInt(displayCount.getValue()));
account.setMaximumAutoDownloadMessageSize(Integer.parseInt(messageSize.getValue()));
if (account.isSearchByDateCapable()) {
account.setMaximumPolledMessageAge(Integer.parseInt(messageAge.getValue()));
}
account.getNotificationSetting().setVibrate(accountVibrateEnabled.isChecked());
account.getNotificationSetting().setVibratePattern(Integer.parseInt(accountVibratePattern.getValue()));
account.getNotificationSetting().setVibrateTimes(Integer.parseInt(accountVibrateTimes.getValue()));
account.getNotificationSetting().setLed(accountLedEnabled.isChecked());
account.setGoToUnreadMessageSearch(notificationOpensUnread.isChecked());
account.setFolderTargetMode(FolderMode.valueOf(targetMode.getValue()));
account.setDeletePolicy(DeletePolicy.fromInt(Integer.parseInt(deletePolicy.getValue())));
if (isExpungeCapable) {
account.setExpungePolicy(Expunge.valueOf(expungePolicy.getValue()));
}
account.setSyncRemoteDeletions(syncRemoteDeletions.isChecked());
account.setSearchableFolders(Searchable.valueOf(searchableFolders.getValue()));
account.setMessageFormat(MessageFormat.valueOf(messageFormat.getValue()));
account.setAlwaysShowCcBcc(alwaysShowCcBcc.isChecked());
account.setMessageReadReceipt(messageReadReceipt.isChecked());
account.setQuoteStyle(QuoteStyle.valueOf(quoteStyle.getValue()));
account.setQuotePrefix(accountQuotePrefix.getText());
account.setDefaultQuotedTextShown(accountDefaultQuotedTextShown.isChecked());
account.setReplyAfterQuote(replyAfterQuote.isChecked());
account.setStripSignature(stripSignature.isChecked());
account.setLocalStorageProviderId(localStorageProvider.getValue());
if (hasPgpCrypto) {
account.setCryptoKey(pgpCryptoKey.getValue());
} else {
account.setCryptoKey(Account.NO_OPENPGP_KEY);
}
// In webdav account we use the exact folder name also for inbox,
// since it varies because of internationalization
if (account.getStoreUri().startsWith("webdav"))
account.setAutoExpandFolderName(autoExpandFolder.getValue());
else
account.setAutoExpandFolderName(reverseTranslateFolder(autoExpandFolder.getValue()));
if (isMoveCapable) {
account.setArchiveFolderName(archiveFolder.getValue());
account.setDraftsFolderName(draftsFolder.getValue());
account.setSentFolderName(sentFolder.getValue());
account.setSpamFolderName(spamFolder.getValue());
account.setTrashFolderName(trashFolder.getValue());
}
//IMAP stuff
if (isPushCapable) {
account.setPushPollOnConnect(pushPollOnConnect.isChecked());
account.setIdleRefreshMinutes(Integer.parseInt(idleRefreshPeriod.getValue()));
account.setMaxPushFolders(Integer.parseInt(mMaxPushFolders.getValue()));
account.setAllowRemoteSearch(cloudSearchEnabled.isChecked());
account.setRemoteSearchNumResults(Integer.parseInt(remoteSearchNumResults.getValue()));
//account.setRemoteSearchFullText(mRemoteSearchFullText.isChecked());
}
boolean needsRefresh = account.setAutomaticCheckIntervalMinutes(Integer.parseInt(checkFrequency.getValue()));
needsRefresh |= account.setFolderSyncMode(FolderMode.valueOf(syncMode.getValue()));
boolean displayModeChanged = account.setFolderDisplayMode(FolderMode.valueOf(displayMode.getValue()));
SharedPreferences prefs = accountRingtone.getPreferenceManager().getSharedPreferences();
String newRingtone = prefs.getString(PREFERENCE_RINGTONE, null);
if (newRingtone != null) {
account.getNotificationSetting().setRingEnabled(true);
account.getNotificationSetting().setRingtone(newRingtone);
} else {
if (account.getNotificationSetting().isRingEnabled()) {
account.getNotificationSetting().setRingtone(null);
}
}
account.setShowPictures(ShowPictures.valueOf(accountShowPictures.getValue()));
//IMAP specific stuff
if (isPushCapable) {
boolean needsPushRestart = account.setFolderPushMode(FolderMode.valueOf(pushMode.getValue()));
if (account.getFolderPushMode() != FolderMode.NONE) {
needsPushRestart |= displayModeChanged;
needsPushRestart |= incomingChanged;
}
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
account.save(Preferences.getPreferences(this));
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (pgpCryptoKey != null && pgpCryptoKey.handleOnActivityResult(requestCode, resultCode, data)) {
return;
}
if (resultCode == RESULT_OK) {
switch (requestCode) {
case SELECT_AUTO_EXPAND_FOLDER:
autoExpandFolder.setSummary(translateFolder(data.getStringExtra(ChooseFolder.EXTRA_NEW_FOLDER)));
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onPause() {
saveSettings();
super.onPause();
}
private void onCompositionSettings() {
AccountSetupComposition.actionEditCompositionSettings(this, account);
}
private void onManageIdentities() {
Intent intent = new Intent(this, ManageIdentities.class);
intent.putExtra(ChooseIdentity.EXTRA_ACCOUNT, account.getUuid());
startActivityForResult(intent, ACTIVITY_MANAGE_IDENTITIES);
}
private void onIncomingSettings() {
AccountSetupIncoming.actionEditIncomingSettings(this, account);
}
private void onOutgoingSettings() {
AccountSetupOutgoing.actionEditOutgoingSettings(this, account);
}
public void onChooseChipColor() {
showDialog(DIALOG_COLOR_PICKER_ACCOUNT);
}
public void onChooseLedColor() {
showDialog(DIALOG_COLOR_PICKER_LED);
}
@Override
public Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case DIALOG_COLOR_PICKER_ACCOUNT: {
dialog = new ColorPickerDialog(this,
new ColorPickerDialog.OnColorChangedListener() {
public void colorChanged(int color) {
account.setChipColor(color);
}
},
account.getChipColor());
break;
}
case DIALOG_COLOR_PICKER_LED: {
dialog = new ColorPickerDialog(this,
new ColorPickerDialog.OnColorChangedListener() {
public void colorChanged(int color) {
account.getNotificationSetting().setLedColor(color);
}
},
account.getNotificationSetting().getLedColor());
break;
}
}
return dialog;
}
@Override
public void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case DIALOG_COLOR_PICKER_ACCOUNT: {
ColorPickerDialog colorPicker = (ColorPickerDialog) dialog;
colorPicker.setColor(account.getChipColor());
break;
}
case DIALOG_COLOR_PICKER_LED: {
ColorPickerDialog colorPicker = (ColorPickerDialog) dialog;
colorPicker.setColor(account.getNotificationSetting().getLedColor());
break;
}
}
}
public void onChooseAutoExpandFolder() {
Intent selectIntent = new Intent(this, ChooseFolder.class);
selectIntent.putExtra(ChooseFolder.EXTRA_ACCOUNT, account.getUuid());
selectIntent.putExtra(ChooseFolder.EXTRA_CUR_FOLDER, autoExpandFolder.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 (account.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 account.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(accountVibratePattern.getValue()),
Integer.parseInt(accountVibrateTimes.getValue())), -1);
}
/**
* Remote search result limit summary contains the current limit. On load or change, update this value.
* @param maxResults Search limit to update the summary with.
*/
private void updateRemoteSearchLimit(String maxResults) {
if (maxResults != null) {
if (maxResults.equals("0")) {
maxResults = getString(R.string.account_settings_remote_search_num_results_entries_all);
}
remoteSearchNumResults
.setSummary(String.format(getString(R.string.account_settings_remote_search_num_summary), maxResults));
}
}
private class PopulateFolderPrefsTask extends AsyncTask<Void, Void, Void> {
List <? extends Folder > folders = new LinkedList<>();
String[] allFolderValues;
String[] allFolderLabels;
@Override
protected Void doInBackground(Void... params) {
try {
folders = account.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 <? extends Folder > iter = folders.iterator();
while (iter.hasNext()) {
Folder folder = iter.next();
if (account.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() {
autoExpandFolder = (ListPreference) findPreference(PREFERENCE_AUTO_EXPAND_FOLDER);
autoExpandFolder.setEnabled(false);
archiveFolder = (ListPreference) findPreference(PREFERENCE_ARCHIVE_FOLDER);
archiveFolder.setEnabled(false);
draftsFolder = (ListPreference) findPreference(PREFERENCE_DRAFTS_FOLDER);
draftsFolder.setEnabled(false);
sentFolder = (ListPreference) findPreference(PREFERENCE_SENT_FOLDER);
sentFolder.setEnabled(false);
spamFolder = (ListPreference) findPreference(PREFERENCE_SPAM_FOLDER);
spamFolder.setEnabled(false);
trashFolder = (ListPreference) findPreference(PREFERENCE_TRASH_FOLDER);
trashFolder.setEnabled(false);
if (!isMoveCapable) {
PreferenceScreen foldersCategory =
(PreferenceScreen) findPreference(PREFERENCE_CATEGORY_FOLDERS);
foldersCategory.removePreference(archiveFolder);
foldersCategory.removePreference(spamFolder);
foldersCategory.removePreference(draftsFolder);
foldersCategory.removePreference(sentFolder);
foldersCategory.removePreference(trashFolder);
}
}
@Override
protected void onPostExecute(Void res) {
initListPreference(autoExpandFolder, account.getAutoExpandFolderName(), allFolderLabels, allFolderValues);
autoExpandFolder.setEnabled(true);
if (isMoveCapable) {
initListPreference(archiveFolder, account.getArchiveFolderName(), allFolderLabels, allFolderValues);
initListPreference(draftsFolder, account.getDraftsFolderName(), allFolderLabels, allFolderValues);
initListPreference(sentFolder, account.getSentFolderName(), allFolderLabels, allFolderValues);
initListPreference(spamFolder, account.getSpamFolderName(), allFolderLabels, allFolderValues);
initListPreference(trashFolder, account.getTrashFolderName(), allFolderLabels, allFolderValues);
archiveFolder.setEnabled(true);
spamFolder.setEnabled(true);
draftsFolder.setEnabled(true);
sentFolder.setEnabled(true);
trashFolder.setEnabled(true);
}
}
}
}