1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-30 13:12:25 -05:00
This commit is contained in:
danapple 2011-02-26 18:39:06 -06:00
parent 6dc94fb78e
commit ad3dd07a7a
170 changed files with 11554 additions and 21128 deletions

View File

@ -151,6 +151,11 @@
<arg path="${out-debug-package}" /> <arg path="${out-debug-package}" />
</exec> </exec>
</target> </target>
<target name="astyle">
<exec executable="astyle" failonerror="true">
<arg line="--style=java --indent=spaces=4 --brackets=attach --convert-tabs --unpad-paren --pad-header --pad-oper --suffix=none --recursive 'src/com/fsck/k9/*.java'"/>
</exec>
</target>
<target name="help"> <target name="help">
<!-- displays starts at col 13 <!-- displays starts at col 13
@ -170,6 +175,7 @@
<echo> device.</echo> <echo> device.</echo>
<echo> bump-version: ant -Dversion-name=3.123</echo> <echo> bump-version: ant -Dversion-name=3.123</echo>
<echo> Bumps the project version to 3.123,tags and commits it</echo> <echo> Bumps the project version to 3.123,tags and commits it</echo>
<echo> astyle: Make K-9's source look like it's supposed to</echo>
</target> </target>
</project> </project>

File diff suppressed because it is too large Load Diff

View File

@ -5,8 +5,7 @@ package com.fsck.k9;
import java.io.Serializable; import java.io.Serializable;
public class AccountStats implements Serializable public class AccountStats implements Serializable {
{
private static final long serialVersionUID = -5706839923710842234L; private static final long serialVersionUID = -5706839923710842234L;
public long size = -1; public long size = -1;
public int unreadMessageCount = 0; public int unreadMessageCount = 0;

View File

@ -1,7 +1,6 @@
package com.fsck.k9; package com.fsck.k9;
public interface BaseAccount public interface BaseAccount {
{
public String getEmail(); public String getEmail();
public void setEmail(String email); public void setEmail(String email);
public String getDescription(); public String getDescription();

View File

@ -24,14 +24,11 @@ import android.view.View;
import android.widget.ResourceCursorAdapter; import android.widget.ResourceCursorAdapter;
import android.widget.TextView; import android.widget.TextView;
public class EmailAddressAdapter extends ResourceCursorAdapter public class EmailAddressAdapter extends ResourceCursorAdapter {
{
private static EmailAddressAdapter sInstance; private static EmailAddressAdapter sInstance;
public static EmailAddressAdapter getInstance(Context context) public static EmailAddressAdapter getInstance(Context context) {
{ if (sInstance == null) {
if (sInstance == null)
{
sInstance = new EmailAddressAdapter(context); sInstance = new EmailAddressAdapter(context);
} }
@ -41,15 +38,13 @@ public class EmailAddressAdapter extends ResourceCursorAdapter
private final Contacts mContacts; private final Contacts mContacts;
private EmailAddressAdapter(Context context) private EmailAddressAdapter(Context context) {
{
super(context, R.layout.recipient_dropdown_item, null); super(context, R.layout.recipient_dropdown_item, null);
mContacts = Contacts.getInstance(context); mContacts = Contacts.getInstance(context);
} }
@Override @Override
public final String convertToString(final Cursor cursor) public final String convertToString(final Cursor cursor) {
{
final String name = mContacts.getName(cursor); final String name = mContacts.getName(cursor);
final String address = mContacts.getEmail(cursor); final String address = mContacts.getEmail(cursor);
@ -57,8 +52,7 @@ public class EmailAddressAdapter extends ResourceCursorAdapter
} }
@Override @Override
public final void bindView(final View view, final Context context, final Cursor cursor) public final void bindView(final View view, final Context context, final Cursor cursor) {
{
final TextView text1 = (TextView) view.findViewById(R.id.text1); final TextView text1 = (TextView) view.findViewById(R.id.text1);
final TextView text2 = (TextView) view.findViewById(R.id.text2); final TextView text2 = (TextView) view.findViewById(R.id.text2);
text1.setText(mContacts.getName(cursor)); text1.setText(mContacts.getName(cursor));
@ -66,8 +60,7 @@ public class EmailAddressAdapter extends ResourceCursorAdapter
} }
@Override @Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
{
return mContacts.searchContacts(constraint); return mContacts.searchContacts(constraint);
} }
} }

View File

@ -4,20 +4,16 @@ package com.fsck.k9;
import android.text.util.Rfc822Tokenizer; import android.text.util.Rfc822Tokenizer;
import android.widget.AutoCompleteTextView.Validator; import android.widget.AutoCompleteTextView.Validator;
public class EmailAddressValidator implements Validator public class EmailAddressValidator implements Validator {
{ public CharSequence fixText(CharSequence invalidText) {
public CharSequence fixText(CharSequence invalidText)
{
return ""; return "";
} }
public boolean isValid(CharSequence text) public boolean isValid(CharSequence text) {
{
return Rfc822Tokenizer.tokenize(text).length > 0; return Rfc822Tokenizer.tokenize(text).length > 0;
} }
public boolean isValidAddressOnly(CharSequence text) public boolean isValidAddressOnly(CharSequence text) {
{
return com.fsck.k9.helper.Regex.EMAIL_ADDRESS_PATTERN.matcher(text).matches(); return com.fsck.k9.helper.Regex.EMAIL_ADDRESS_PATTERN.matcher(text).matches();
} }
} }

View File

@ -1,7 +1,6 @@
package com.fsck.k9; package com.fsck.k9;
public class EmailReceivedIntent public class EmailReceivedIntent {
{
public static final String ACTION_EMAIL_RECEIVED = "com.fsck.k9.intent.action.EMAIL_RECEIVED"; public static final String ACTION_EMAIL_RECEIVED = "com.fsck.k9.intent.action.EMAIL_RECEIVED";
public static final String EXTRA_ACCOUNT = "com.fsck.k9.intent.extra.ACCOUNT"; public static final String EXTRA_ACCOUNT = "com.fsck.k9.intent.extra.ACCOUNT";

View File

@ -7,8 +7,7 @@ import android.webkit.WebSettings.TextSize;
* Manage font size of the information displayed in the account list, folder * Manage font size of the information displayed in the account list, folder
* list, message list and in the message view. * list, message list and in the message view.
*/ */
public class FontSizes public class FontSizes {
{
/* /*
* Keys for the preference storage. * Keys for the preference storage.
*/ */
@ -126,8 +125,7 @@ public class FontSizes
/** /**
* Create a <code>FontSizes</code> object with default values. * Create a <code>FontSizes</code> object with default values.
*/ */
public FontSizes() public FontSizes() {
{
accountName = MEDIUM; accountName = MEDIUM;
accountDescription = SMALL; accountDescription = SMALL;
@ -153,8 +151,7 @@ public class FontSizes
* *
* @param editor Used to save the font size settings. * @param editor Used to save the font size settings.
*/ */
public void save(SharedPreferences.Editor editor) public void save(SharedPreferences.Editor editor) {
{
editor.putInt(ACCOUNT_NAME, accountName); editor.putInt(ACCOUNT_NAME, accountName);
editor.putInt(ACCOUNT_DESCRIPTION, accountDescription); editor.putInt(ACCOUNT_DESCRIPTION, accountDescription);
@ -181,8 +178,7 @@ public class FontSizes
* *
* @param prefs Used to load the font size settings. * @param prefs Used to load the font size settings.
*/ */
public void load(SharedPreferences prefs) public void load(SharedPreferences prefs) {
{
accountName = prefs.getInt(ACCOUNT_NAME, accountName); accountName = prefs.getInt(ACCOUNT_NAME, accountName);
accountDescription = prefs.getInt(ACCOUNT_DESCRIPTION, accountDescription); accountDescription = prefs.getInt(ACCOUNT_DESCRIPTION, accountDescription);
@ -204,165 +200,132 @@ public class FontSizes
setMessageViewContent(prefs.getInt(MESSAGE_VIEW_CONTENT, 3)); setMessageViewContent(prefs.getInt(MESSAGE_VIEW_CONTENT, 3));
} }
public int getAccountName() public int getAccountName() {
{
return accountName; return accountName;
} }
public void setAccountName(int accountName) public void setAccountName(int accountName) {
{
this.accountName = accountName; this.accountName = accountName;
} }
public int getAccountDescription() public int getAccountDescription() {
{
return accountDescription; return accountDescription;
} }
public void setAccountDescription(int accountDescription) public void setAccountDescription(int accountDescription) {
{
this.accountDescription = accountDescription; this.accountDescription = accountDescription;
} }
public int getFolderName() public int getFolderName() {
{
return folderName; return folderName;
} }
public void setFolderName(int folderName) public void setFolderName(int folderName) {
{
this.folderName = folderName; this.folderName = folderName;
} }
public int getFolderStatus() public int getFolderStatus() {
{
return folderStatus; return folderStatus;
} }
public void setFolderStatus(int folderStatus) public void setFolderStatus(int folderStatus) {
{
this.folderStatus = folderStatus; this.folderStatus = folderStatus;
} }
public int getMessageListSubject() public int getMessageListSubject() {
{
return messageListSubject; return messageListSubject;
} }
public void setMessageListSubject(int messageListSubject) public void setMessageListSubject(int messageListSubject) {
{
this.messageListSubject = messageListSubject; this.messageListSubject = messageListSubject;
} }
public int getMessageListSender() public int getMessageListSender() {
{
return messageListSender; return messageListSender;
} }
public void setMessageListSender(int messageListSender) public void setMessageListSender(int messageListSender) {
{
this.messageListSender = messageListSender; this.messageListSender = messageListSender;
} }
public int getMessageListDate() public int getMessageListDate() {
{
return messageListDate; return messageListDate;
} }
public void setMessageListDate(int messageListDate) public void setMessageListDate(int messageListDate) {
{
this.messageListDate = messageListDate; this.messageListDate = messageListDate;
} }
public int getMessageListPreview() public int getMessageListPreview() {
{
return messageListPreview; return messageListPreview;
} }
public void setMessageListPreview(int messageListPreview) public void setMessageListPreview(int messageListPreview) {
{
this.messageListPreview = messageListPreview; this.messageListPreview = messageListPreview;
} }
public int getMessageViewSender() public int getMessageViewSender() {
{
return messageViewSender; return messageViewSender;
} }
public void setMessageViewSender(int messageViewSender) public void setMessageViewSender(int messageViewSender) {
{
this.messageViewSender = messageViewSender; this.messageViewSender = messageViewSender;
} }
public int getMessageViewTo() public int getMessageViewTo() {
{
return messageViewTo; return messageViewTo;
} }
public void setMessageViewTo(int messageViewTo) public void setMessageViewTo(int messageViewTo) {
{
this.messageViewTo = messageViewTo; this.messageViewTo = messageViewTo;
} }
public int getMessageViewCC() public int getMessageViewCC() {
{
return messageViewCC; return messageViewCC;
} }
public void setMessageViewCC(int messageViewCC) public void setMessageViewCC(int messageViewCC) {
{
this.messageViewCC = messageViewCC; this.messageViewCC = messageViewCC;
} }
public int getMessageViewAdditionalHeaders() public int getMessageViewAdditionalHeaders() {
{
return messageViewAdditionalHeaders; return messageViewAdditionalHeaders;
} }
public void setMessageViewAdditionalHeaders(int messageViewAdditionalHeaders) public void setMessageViewAdditionalHeaders(int messageViewAdditionalHeaders) {
{
this.messageViewAdditionalHeaders = messageViewAdditionalHeaders; this.messageViewAdditionalHeaders = messageViewAdditionalHeaders;
} }
public int getMessageViewSubject() public int getMessageViewSubject() {
{
return messageViewSubject; return messageViewSubject;
} }
public void setMessageViewSubject(int messageViewSubject) public void setMessageViewSubject(int messageViewSubject) {
{
this.messageViewSubject = messageViewSubject; this.messageViewSubject = messageViewSubject;
} }
public int getMessageViewTime() public int getMessageViewTime() {
{
return messageViewTime; return messageViewTime;
} }
public void setMessageViewTime(int messageViewTime) public void setMessageViewTime(int messageViewTime) {
{
this.messageViewTime = messageViewTime; this.messageViewTime = messageViewTime;
} }
public int getMessageViewDate() public int getMessageViewDate() {
{
return messageViewDate; return messageViewDate;
} }
public void setMessageViewDate(int messageViewDate) public void setMessageViewDate(int messageViewDate) {
{
this.messageViewDate = messageViewDate; this.messageViewDate = messageViewDate;
} }
public TextSize getMessageViewContent() public TextSize getMessageViewContent() {
{
return messageViewContent; return messageViewContent;
} }
public int getMessageViewContentAsInt() public int getMessageViewContentAsInt() {
{ switch (messageViewContent) {
switch (messageViewContent)
{
case SMALLEST: case SMALLEST:
return 1; return 1;
case SMALLER: case SMALLER:
@ -377,10 +340,8 @@ public class FontSizes
} }
} }
public void setMessageViewContent(int size) public void setMessageViewContent(int size) {
{ switch (size) {
switch (size)
{
case 1: case 1:
messageViewContent = TextSize.SMALLEST; messageViewContent = TextSize.SMALLEST;
break; break;

View File

@ -2,8 +2,7 @@ package com.fsck.k9;
import java.io.Serializable; import java.io.Serializable;
public class Identity implements Serializable public class Identity implements Serializable {
{
private static final long serialVersionUID = -1666669071480985760L; private static final long serialVersionUID = -1666669071480985760L;
private String mDescription; private String mDescription;
private String mName; private String mName;
@ -12,69 +11,56 @@ public class Identity implements Serializable
private boolean mSignatureUse; private boolean mSignatureUse;
private String replyTo; private String replyTo;
public synchronized String getName() public synchronized String getName() {
{
return mName; return mName;
} }
public synchronized void setName(String name) public synchronized void setName(String name) {
{
mName = name; mName = name;
} }
public synchronized String getEmail() public synchronized String getEmail() {
{
return mEmail; return mEmail;
} }
public synchronized void setEmail(String email) public synchronized void setEmail(String email) {
{
mEmail = email; mEmail = email;
} }
public synchronized boolean getSignatureUse() public synchronized boolean getSignatureUse() {
{
return mSignatureUse; return mSignatureUse;
} }
public synchronized void setSignatureUse(boolean signatureUse) public synchronized void setSignatureUse(boolean signatureUse) {
{
mSignatureUse = signatureUse; mSignatureUse = signatureUse;
} }
public synchronized String getSignature() public synchronized String getSignature() {
{
return mSignature; return mSignature;
} }
public synchronized void setSignature(String signature) public synchronized void setSignature(String signature) {
{
mSignature = signature; mSignature = signature;
} }
public synchronized String getDescription() public synchronized String getDescription() {
{
return mDescription; return mDescription;
} }
public synchronized void setDescription(String description) public synchronized void setDescription(String description) {
{
mDescription = description; mDescription = description;
} }
public synchronized String getReplyTo() public synchronized String getReplyTo() {
{
return replyTo; return replyTo;
} }
public synchronized void setReplyTo(String replyTo) public synchronized void setReplyTo(String replyTo) {
{
this.replyTo = replyTo; this.replyTo = replyTo;
} }
@Override @Override
public synchronized String toString() public synchronized String toString() {
{
return "Account.Identity(description=" + mDescription + ", name=" + mName + ", email=" + mEmail + ", replyTo=" + replyTo + ", signature=" + mSignature; return "Account.Identity(description=" + mDescription + ", name=" + mName + ", email=" + mEmail + ", replyTo=" + replyTo + ", signature=" + mSignature;
} }
} }

View File

@ -35,16 +35,14 @@ import com.fsck.k9.service.MailService;
import com.fsck.k9.service.ShutdownReceiver; import com.fsck.k9.service.ShutdownReceiver;
import com.fsck.k9.service.StorageGoneReceiver; import com.fsck.k9.service.StorageGoneReceiver;
public class K9 extends Application public class K9 extends Application {
{
/** /**
* Components that are interested in knowing when the K9 instance is * Components that are interested in knowing when the K9 instance is
* available and ready (Android invokes Application.onCreate() after other * available and ready (Android invokes Application.onCreate() after other
* components') should implement this interface and register using * components') should implement this interface and register using
* {@link K9#registerApplicationAware(ApplicationAware)}. * {@link K9#registerApplicationAware(ApplicationAware)}.
*/ */
public static interface ApplicationAware public static interface ApplicationAware {
{
/** /**
* Called when the Application instance is available and ready. * Called when the Application instance is available and ready.
* *
@ -68,8 +66,7 @@ public class K9 extends Application
private static List<ApplicationAware> observers = new ArrayList<ApplicationAware>(); private static List<ApplicationAware> observers = new ArrayList<ApplicationAware>();
public enum BACKGROUND_OPS public enum BACKGROUND_OPS {
{
WHEN_CHECKED, ALWAYS, NEVER, WHEN_CHECKED_AUTO_SYNC WHEN_CHECKED, ALWAYS, NEVER, WHEN_CHECKED_AUTO_SYNC
} }
@ -187,31 +184,27 @@ public class K9 extends Application
/** /**
* The MIME type(s) of attachments we're willing to view. * The MIME type(s) of attachments we're willing to view.
*/ */
public static final String[] ACCEPTABLE_ATTACHMENT_VIEW_TYPES = new String[] public static final String[] ACCEPTABLE_ATTACHMENT_VIEW_TYPES = new String[] {
{
"*/*", "*/*",
}; };
/** /**
* The MIME type(s) of attachments we're not willing to view. * The MIME type(s) of attachments we're not willing to view.
*/ */
public static final String[] UNACCEPTABLE_ATTACHMENT_VIEW_TYPES = new String[] public static final String[] UNACCEPTABLE_ATTACHMENT_VIEW_TYPES = new String[] {
{
}; };
/** /**
* The MIME type(s) of attachments we're willing to download to SD. * The MIME type(s) of attachments we're willing to download to SD.
*/ */
public static final String[] ACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] public static final String[] ACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] {
{
"*/*", "*/*",
}; };
/** /**
* The MIME type(s) of attachments we're not willing to download to SD. * The MIME type(s) of attachments we're not willing to download to SD.
*/ */
public static final String[] UNACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] public static final String[] UNACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] {
{
}; };
/** /**
@ -283,11 +276,9 @@ public class K9 extends Application
public static final int CONNECTIVITY_ID = -3; public static final int CONNECTIVITY_ID = -3;
public static class Intents public static class Intents {
{
public static class EmailReceived public static class EmailReceived {
{
public static final String ACTION_EMAIL_RECEIVED = "com.fsck.k9.intent.action.EMAIL_RECEIVED"; public static final String ACTION_EMAIL_RECEIVED = "com.fsck.k9.intent.action.EMAIL_RECEIVED";
public static final String ACTION_EMAIL_DELETED = "com.fsck.k9.intent.action.EMAIL_DELETED"; public static final String ACTION_EMAIL_DELETED = "com.fsck.k9.intent.action.EMAIL_DELETED";
public static final String ACTION_REFRESH_OBSERVER = "com.fsck.k9.intent.action.REFRESH_OBSERVER"; public static final String ACTION_REFRESH_OBSERVER = "com.fsck.k9.intent.action.REFRESH_OBSERVER";
@ -309,27 +300,23 @@ public class K9 extends Application
* enables or disables the Compose activity, the boot receiver and the service based on * enables or disables the Compose activity, the boot receiver and the service based on
* whether any accounts are configured. * whether any accounts are configured.
*/ */
public static void setServicesEnabled(Context context) public static void setServicesEnabled(Context context) {
{
int acctLength = Preferences.getPreferences(context).getAvailableAccounts().size(); int acctLength = Preferences.getPreferences(context).getAvailableAccounts().size();
setServicesEnabled(context, acctLength > 0, null); setServicesEnabled(context, acctLength > 0, null);
} }
public static void setServicesEnabled(Context context, Integer wakeLockId) public static void setServicesEnabled(Context context, Integer wakeLockId) {
{
setServicesEnabled(context, Preferences.getPreferences(context).getAvailableAccounts().size() > 0, wakeLockId); setServicesEnabled(context, Preferences.getPreferences(context).getAvailableAccounts().size() > 0, wakeLockId);
} }
public static void setServicesEnabled(Context context, boolean enabled, Integer wakeLockId) public static void setServicesEnabled(Context context, boolean enabled, Integer wakeLockId) {
{
PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager();
if (!enabled && pm.getComponentEnabledSetting(new ComponentName(context, MailService.class)) == if (!enabled && pm.getComponentEnabledSetting(new ComponentName(context, MailService.class)) ==
PackageManager.COMPONENT_ENABLED_STATE_ENABLED) PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
{
/* /*
* If no accounts now exist but the service is still enabled we're about to disable it * If no accounts now exist but the service is still enabled we're about to disable it
* so we'll reschedule to kill off any existing alarms. * so we'll reschedule to kill off any existing alarms.
@ -338,14 +325,12 @@ public class K9 extends Application
} }
Class<?>[] classes = { MessageCompose.class, BootReceiver.class, MailService.class }; Class<?>[] classes = { MessageCompose.class, BootReceiver.class, MailService.class };
for (Class<?> clazz : classes) for (Class<?> clazz : classes) {
{
boolean alreadyEnabled = pm.getComponentEnabledSetting(new ComponentName(context, clazz)) == boolean alreadyEnabled = pm.getComponentEnabledSetting(new ComponentName(context, clazz)) ==
PackageManager.COMPONENT_ENABLED_STATE_ENABLED; PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
if (enabled != alreadyEnabled) if (enabled != alreadyEnabled) {
{
pm.setComponentEnabledSetting( pm.setComponentEnabledSetting(
new ComponentName(context, clazz), new ComponentName(context, clazz),
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
@ -355,8 +340,7 @@ public class K9 extends Application
} }
if (enabled && pm.getComponentEnabledSetting(new ComponentName(context, MailService.class)) == if (enabled && pm.getComponentEnabledSetting(new ComponentName(context, MailService.class)) ==
PackageManager.COMPONENT_ENABLED_STATE_ENABLED) PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
{
/* /*
* And now if accounts do exist then we've just enabled the service and we want to * And now if accounts do exist then we've just enabled the service and we want to
* schedule alarms for the new accounts. * schedule alarms for the new accounts.
@ -371,8 +355,7 @@ public class K9 extends Application
* would make K-9 auto-start. We don't want auto-start because the initialization * would make K-9 auto-start. We don't want auto-start because the initialization
* sequence isn't safe while some events occur (SD card unmount). * sequence isn't safe while some events occur (SD card unmount).
*/ */
protected void registerReceivers() protected void registerReceivers() {
{
final StorageGoneReceiver receiver = new StorageGoneReceiver(); final StorageGoneReceiver receiver = new StorageGoneReceiver();
final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_EJECT); filter.addAction(Intent.ACTION_MEDIA_EJECT);
@ -382,18 +365,13 @@ public class K9 extends Application
final BlockingQueue<Handler> queue = new SynchronousQueue<Handler>(); final BlockingQueue<Handler> queue = new SynchronousQueue<Handler>();
// starting a new thread to handle unmount events // starting a new thread to handle unmount events
new Thread(new Runnable() new Thread(new Runnable() {
{
@Override @Override
public void run() public void run() {
{
Looper.prepare(); Looper.prepare();
try try {
{
queue.put(new Handler()); queue.put(new Handler());
} } catch (InterruptedException e) {
catch (InterruptedException e)
{
Log.e(K9.LOG_TAG, "", e); Log.e(K9.LOG_TAG, "", e);
} }
Looper.loop(); Looper.loop();
@ -401,14 +379,11 @@ public class K9 extends Application
}, "Unmount-thread").start(); }, "Unmount-thread").start();
try try {
{
final Handler storageGoneHandler = queue.take(); final Handler storageGoneHandler = queue.take();
registerReceiver(receiver, filter, null, storageGoneHandler); registerReceiver(receiver, filter, null, storageGoneHandler);
Log.i(K9.LOG_TAG, "Registered: unmount receiver"); Log.i(K9.LOG_TAG, "Registered: unmount receiver");
} } catch (InterruptedException e) {
catch (InterruptedException e)
{
Log.e(K9.LOG_TAG, "Unable to register unmount receiver", e); Log.e(K9.LOG_TAG, "Unable to register unmount receiver", e);
} }
@ -416,8 +391,7 @@ public class K9 extends Application
Log.i(K9.LOG_TAG, "Registered: shutdown receiver"); Log.i(K9.LOG_TAG, "Registered: shutdown receiver");
} }
public static void save(SharedPreferences.Editor editor) public static void save(SharedPreferences.Editor editor) {
{
editor.putBoolean("enableDebugLogging", K9.DEBUG); editor.putBoolean("enableDebugLogging", K9.DEBUG);
editor.putBoolean("enableSensitiveLogging", K9.DEBUG_SENSITIVE); editor.putBoolean("enableSensitiveLogging", K9.DEBUG_SENSITIVE);
editor.putString("backgroundOperations", K9.backgroundOps.toString()); editor.putString("backgroundOperations", K9.backgroundOps.toString());
@ -426,7 +400,7 @@ public class K9 extends Application
editor.putBoolean("useVolumeKeysForNavigation", mUseVolumeKeysForNavigation); editor.putBoolean("useVolumeKeysForNavigation", mUseVolumeKeysForNavigation);
editor.putBoolean("useVolumeKeysForListNavigation", mUseVolumeKeysForListNavigation); editor.putBoolean("useVolumeKeysForListNavigation", mUseVolumeKeysForListNavigation);
editor.putBoolean("manageBack", mManageBack); editor.putBoolean("manageBack", mManageBack);
editor.putBoolean("zoomControlsEnabled",mZoomControlsEnabled); editor.putBoolean("zoomControlsEnabled", mZoomControlsEnabled);
editor.putBoolean("mobileOptimizedLayout", mMobileOptimizedLayout); editor.putBoolean("mobileOptimizedLayout", mMobileOptimizedLayout);
editor.putBoolean("quietTimeEnabled", mQuietTimeEnabled); editor.putBoolean("quietTimeEnabled", mQuietTimeEnabled);
editor.putString("quietTimeStarts", mQuietTimeStarts); editor.putString("quietTimeStarts", mQuietTimeStarts);
@ -435,16 +409,16 @@ public class K9 extends Application
editor.putBoolean("startIntegratedInbox", mStartIntegratedInbox); editor.putBoolean("startIntegratedInbox", mStartIntegratedInbox);
editor.putBoolean("measureAccounts", mMeasureAccounts); editor.putBoolean("measureAccounts", mMeasureAccounts);
editor.putBoolean("countSearchMessages", mCountSearchMessages); editor.putBoolean("countSearchMessages", mCountSearchMessages);
editor.putBoolean("messageListStars",mMessageListStars); editor.putBoolean("messageListStars", mMessageListStars);
editor.putBoolean("messageListCheckboxes",mMessageListCheckboxes); editor.putBoolean("messageListCheckboxes", mMessageListCheckboxes);
editor.putBoolean("messageListTouchable",mMessageListTouchable); editor.putBoolean("messageListTouchable", mMessageListTouchable);
editor.putInt("messageListPreviewLines",mMessageListPreviewLines); editor.putInt("messageListPreviewLines", mMessageListPreviewLines);
editor.putBoolean("showCorrespondentNames",mShowCorrespondentNames); editor.putBoolean("showCorrespondentNames", mShowCorrespondentNames);
editor.putBoolean("showContactName",mShowContactName); editor.putBoolean("showContactName", mShowContactName);
editor.putBoolean("changeRegisteredNameColor",mChangeContactNameColor); editor.putBoolean("changeRegisteredNameColor", mChangeContactNameColor);
editor.putInt("registeredNameColor",mContactNameColor); editor.putInt("registeredNameColor", mContactNameColor);
editor.putBoolean("messageViewFixedWidthFont",mMessageViewFixedWidthFont); editor.putBoolean("messageViewFixedWidthFont", mMessageViewFixedWidthFont);
editor.putBoolean("messageViewReturnToList", mMessageViewReturnToList); editor.putBoolean("messageViewReturnToList", mMessageViewReturnToList);
editor.putString("language", language); editor.putString("language", language);
@ -460,18 +434,9 @@ public class K9 extends Application
fontSizes.save(editor); fontSizes.save(editor);
} }
@Override public static void loadPrefs(Preferences prefs) {
public void onCreate()
{
maybeSetupStrictMode();
super.onCreate();
app = this;
galleryBuggy = checkForBuggyGallery();
Preferences prefs = Preferences.getPreferences(this);
SharedPreferences sprefs = prefs.getPreferences(); SharedPreferences sprefs = prefs.getPreferences();
DEBUG = sprefs.getBoolean("enableDebugLogging", false); DEBUG = sprefs.getBoolean("enableDebugLogging", false);
DEBUG_SENSITIVE = sprefs.getBoolean("enableSensitiveLogging", false); DEBUG_SENSITIVE = sprefs.getBoolean("enableSensitiveLogging", false);
mAnimations = sprefs.getBoolean("animations", true); mAnimations = sprefs.getBoolean("animations", true);
@ -482,17 +447,17 @@ public class K9 extends Application
mStartIntegratedInbox = sprefs.getBoolean("startIntegratedInbox", false); mStartIntegratedInbox = sprefs.getBoolean("startIntegratedInbox", false);
mMeasureAccounts = sprefs.getBoolean("measureAccounts", true); mMeasureAccounts = sprefs.getBoolean("measureAccounts", true);
mCountSearchMessages = sprefs.getBoolean("countSearchMessages", true); mCountSearchMessages = sprefs.getBoolean("countSearchMessages", true);
mMessageListStars = sprefs.getBoolean("messageListStars",true); mMessageListStars = sprefs.getBoolean("messageListStars", true);
mMessageListCheckboxes = sprefs.getBoolean("messageListCheckboxes",false); mMessageListCheckboxes = sprefs.getBoolean("messageListCheckboxes", false);
mMessageListTouchable = sprefs.getBoolean("messageListTouchable",false); mMessageListTouchable = sprefs.getBoolean("messageListTouchable", false);
mMessageListPreviewLines = sprefs.getInt("messageListPreviewLines", 2); mMessageListPreviewLines = sprefs.getInt("messageListPreviewLines", 2);
mMobileOptimizedLayout = sprefs.getBoolean("mobileOptimizedLayout", false); mMobileOptimizedLayout = sprefs.getBoolean("mobileOptimizedLayout", false);
mZoomControlsEnabled = sprefs.getBoolean("zoomControlsEnabled",false); mZoomControlsEnabled = sprefs.getBoolean("zoomControlsEnabled", false);
mQuietTimeEnabled = sprefs.getBoolean("quietTimeEnabled", false); mQuietTimeEnabled = sprefs.getBoolean("quietTimeEnabled", false);
mQuietTimeStarts = sprefs.getString("quietTimeStarts", "21:00" ); mQuietTimeStarts = sprefs.getString("quietTimeStarts", "21:00");
mQuietTimeEnds= sprefs.getString("quietTimeEnds", "7:00"); mQuietTimeEnds = sprefs.getString("quietTimeEnds", "7:00");
mShowCorrespondentNames = sprefs.getBoolean("showCorrespondentNames", true); mShowCorrespondentNames = sprefs.getBoolean("showCorrespondentNames", true);
mShowContactName = sprefs.getBoolean("showContactName", false); mShowContactName = sprefs.getBoolean("showContactName", false);
@ -511,18 +476,26 @@ public class K9 extends Application
fontSizes.load(sprefs); fontSizes.load(sprefs);
try try {
{
setBackgroundOps(BACKGROUND_OPS.valueOf(sprefs.getString("backgroundOperations", "WHEN_CHECKED"))); setBackgroundOps(BACKGROUND_OPS.valueOf(sprefs.getString("backgroundOperations", "WHEN_CHECKED")));
} } catch (Exception e) {
catch (Exception e)
{
setBackgroundOps(BACKGROUND_OPS.WHEN_CHECKED); setBackgroundOps(BACKGROUND_OPS.WHEN_CHECKED);
} }
K9.setK9Language(sprefs.getString("language", "")); K9.setK9Language(sprefs.getString("language", ""));
K9.setK9Theme(sprefs.getInt("theme", android.R.style.Theme_Light)); K9.setK9Theme(sprefs.getInt("theme", android.R.style.Theme_Light));
}
@Override
public void onCreate() {
maybeSetupStrictMode();
super.onCreate();
app = this;
galleryBuggy = checkForBuggyGallery();
loadPrefs(Preferences.getPreferences(this));
/* /*
* We have to give MimeMessage a temp directory because File.createTempFile(String, String) * We have to give MimeMessage a temp directory because File.createTempFile(String, String)
* doesn't work in Android and MimeMessage does not have access to a Context. * doesn't work in Android and MimeMessage does not have access to a Context.
@ -536,12 +509,9 @@ public class K9 extends Application
setServicesEnabled(this); setServicesEnabled(this);
registerReceivers(); registerReceivers();
MessagingController.getInstance(this).addListener(new MessagingListener() MessagingController.getInstance(this).addListener(new MessagingListener() {
{ private void broadcastIntent(String action, Account account, String folder, Message message) {
private void broadcastIntent(String action, Account account, String folder, Message message) try {
{
try
{
Uri uri = Uri.parse("email://messages/" + account.getAccountNumber() + "/" + Uri.encode(folder) + "/" + Uri.encode(message.getUid())); Uri uri = Uri.parse("email://messages/" + account.getAccountNumber() + "/" + Uri.encode(folder) + "/" + Uri.encode(message.getUid()));
Intent intent = new Intent(action, uri); Intent intent = new Intent(action, uri);
intent.putExtra(K9.Intents.EmailReceived.EXTRA_ACCOUNT, account.getDescription()); intent.putExtra(K9.Intents.EmailReceived.EXTRA_ACCOUNT, account.getDescription());
@ -561,9 +531,7 @@ public class K9 extends Application
+ " message uid=" + message.getUid() + " message uid=" + message.getUid()
); );
} } catch (MessagingException e) {
catch (MessagingException e)
{
Log.w(K9.LOG_TAG, "Error: action=" + action Log.w(K9.LOG_TAG, "Error: action=" + action
+ " account=" + account.getDescription() + " account=" + account.getDescription()
+ " folder=" + folder + " folder=" + folder
@ -573,26 +541,22 @@ public class K9 extends Application
} }
@Override @Override
public void synchronizeMailboxRemovedMessage(Account account, String folder, Message message) public void synchronizeMailboxRemovedMessage(Account account, String folder, Message message) {
{
broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_DELETED, account, folder, message); broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_DELETED, account, folder, message);
} }
@Override @Override
public void messageDeleted(Account account, String folder, Message message) public void messageDeleted(Account account, String folder, Message message) {
{
broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_DELETED, account, folder, message); broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_DELETED, account, folder, message);
} }
@Override @Override
public void synchronizeMailboxNewMessage(Account account, String folder, Message message) public void synchronizeMailboxNewMessage(Account account, String folder, Message message) {
{
broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_RECEIVED, account, folder, message); broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_RECEIVED, account, folder, message);
} }
@Override @Override
public void searchStats(final AccountStats stats) public void searchStats(final AccountStats stats) {
{
// let observers know a fetch occured // let observers know a fetch occured
K9.this.sendBroadcast(new Intent(K9.Intents.EmailReceived.ACTION_REFRESH_OBSERVER, null)); K9.this.sendBroadcast(new Intent(K9.Intents.EmailReceived.ACTION_REFRESH_OBSERVER, null));
} }
@ -602,22 +566,19 @@ public class K9 extends Application
notifyObservers(); notifyObservers();
} }
private void maybeSetupStrictMode() private void maybeSetupStrictMode() {
{
if (!K9.DEVELOPER_MODE) if (!K9.DEVELOPER_MODE)
return; return;
try try {
{
Class<?> strictMode = Class.forName("android.os.StrictMode"); Class<?> strictMode = Class.forName("android.os.StrictMode");
Method enableDefaults = strictMode.getMethod("enableDefaults"); Method enableDefaults = strictMode.getMethod("enableDefaults");
enableDefaults.invoke(strictMode); enableDefaults.invoke(strictMode);
} }
catch (Exception e) catch (Exception e) {
{
// Discard , as it means we're not running on a device with strict mode // Discard , as it means we're not running on a device with strict mode
Log.v(K9.LOG_TAG, "Failed to turn on strict mode "+e); Log.v(K9.LOG_TAG, "Failed to turn on strict mode " + e);
} }
} }
@ -628,20 +589,14 @@ public class K9 extends Application
* other components' onCreate(), here is a way to notify interested * other components' onCreate(), here is a way to notify interested
* component that the application is available and ready * component that the application is available and ready
*/ */
protected void notifyObservers() protected void notifyObservers() {
{ for (final ApplicationAware aware : observers) {
for (final ApplicationAware aware : observers) if (K9.DEBUG) {
{
if (K9.DEBUG)
{
Log.v(K9.LOG_TAG, "Initializing observer: " + aware); Log.v(K9.LOG_TAG, "Initializing observer: " + aware);
} }
try try {
{
aware.initializeComponent(this); aware.initializeComponent(this);
} } catch (Exception e) {
catch (Exception e)
{
Log.w(K9.LOG_TAG, "Failure when notifying " + aware, e); Log.w(K9.LOG_TAG, "Failure when notifying " + aware, e);
} }
} }
@ -653,147 +608,118 @@ public class K9 extends Application
* @param component * @param component
* Never <code>null</code>. * Never <code>null</code>.
*/ */
public static void registerApplicationAware(final ApplicationAware component) public static void registerApplicationAware(final ApplicationAware component) {
{ if (!observers.contains(component)) {
if (!observers.contains(component))
{
observers.add(component); observers.add(component);
} }
} }
public static String getK9Language() public static String getK9Language() {
{
return language; return language;
} }
public static void setK9Language(String nlanguage) public static void setK9Language(String nlanguage) {
{
language = nlanguage; language = nlanguage;
} }
public static int getK9Theme() public static int getK9Theme() {
{
return theme; return theme;
} }
public static void setK9Theme(int ntheme) public static void setK9Theme(int ntheme) {
{
theme = ntheme; theme = ntheme;
} }
public static BACKGROUND_OPS getBackgroundOps() public static BACKGROUND_OPS getBackgroundOps() {
{
return backgroundOps; return backgroundOps;
} }
public static boolean setBackgroundOps(BACKGROUND_OPS backgroundOps) public static boolean setBackgroundOps(BACKGROUND_OPS backgroundOps) {
{
BACKGROUND_OPS oldBackgroundOps = K9.backgroundOps; BACKGROUND_OPS oldBackgroundOps = K9.backgroundOps;
K9.backgroundOps = backgroundOps; K9.backgroundOps = backgroundOps;
return backgroundOps != oldBackgroundOps; return backgroundOps != oldBackgroundOps;
} }
public static boolean setBackgroundOps(String nbackgroundOps) public static boolean setBackgroundOps(String nbackgroundOps) {
{
return setBackgroundOps(BACKGROUND_OPS.valueOf(nbackgroundOps)); return setBackgroundOps(BACKGROUND_OPS.valueOf(nbackgroundOps));
} }
public static boolean gesturesEnabled() public static boolean gesturesEnabled() {
{
return mGesturesEnabled; return mGesturesEnabled;
} }
public static void setGesturesEnabled(boolean gestures) public static void setGesturesEnabled(boolean gestures) {
{
mGesturesEnabled = gestures; mGesturesEnabled = gestures;
} }
public static boolean useVolumeKeysForNavigationEnabled() public static boolean useVolumeKeysForNavigationEnabled() {
{
return mUseVolumeKeysForNavigation; return mUseVolumeKeysForNavigation;
} }
public static void setUseVolumeKeysForNavigation(boolean volume) public static void setUseVolumeKeysForNavigation(boolean volume) {
{
mUseVolumeKeysForNavigation = volume; mUseVolumeKeysForNavigation = volume;
} }
public static boolean useVolumeKeysForListNavigationEnabled() public static boolean useVolumeKeysForListNavigationEnabled() {
{
return mUseVolumeKeysForListNavigation; return mUseVolumeKeysForListNavigation;
} }
public static void setUseVolumeKeysForListNavigation(boolean enabled) public static void setUseVolumeKeysForListNavigation(boolean enabled) {
{
mUseVolumeKeysForListNavigation = enabled; mUseVolumeKeysForListNavigation = enabled;
} }
public static boolean manageBack() public static boolean manageBack() {
{
return mManageBack; return mManageBack;
} }
public static void setManageBack(boolean manageBack) public static void setManageBack(boolean manageBack) {
{
mManageBack = manageBack; mManageBack = manageBack;
} }
public static boolean zoomControlsEnabled() public static boolean zoomControlsEnabled() {
{
return mZoomControlsEnabled; return mZoomControlsEnabled;
} }
public static void setZoomControlsEnabled(boolean zoomControlsEnabled) public static void setZoomControlsEnabled(boolean zoomControlsEnabled) {
{
mZoomControlsEnabled = zoomControlsEnabled; mZoomControlsEnabled = zoomControlsEnabled;
} }
public static boolean mobileOptimizedLayout() public static boolean mobileOptimizedLayout() {
{
return mMobileOptimizedLayout; return mMobileOptimizedLayout;
} }
public static void setMobileOptimizedLayout(boolean mobileOptimizedLayout) public static void setMobileOptimizedLayout(boolean mobileOptimizedLayout) {
{
mMobileOptimizedLayout = mobileOptimizedLayout; mMobileOptimizedLayout = mobileOptimizedLayout;
} }
public static boolean getQuietTimeEnabled() public static boolean getQuietTimeEnabled() {
{
return mQuietTimeEnabled; return mQuietTimeEnabled;
} }
public static void setQuietTimeEnabled(boolean quietTimeEnabled) public static void setQuietTimeEnabled(boolean quietTimeEnabled) {
{
mQuietTimeEnabled = quietTimeEnabled; mQuietTimeEnabled = quietTimeEnabled;
} }
public static String getQuietTimeStarts() public static String getQuietTimeStarts() {
{
return mQuietTimeStarts; return mQuietTimeStarts;
} }
public static void setQuietTimeStarts(String quietTimeStarts) public static void setQuietTimeStarts(String quietTimeStarts) {
{
mQuietTimeStarts = quietTimeStarts; mQuietTimeStarts = quietTimeStarts;
} }
public static String getQuietTimeEnds() public static String getQuietTimeEnds() {
{
return mQuietTimeEnds; return mQuietTimeEnds;
} }
public static void setQuietTimeEnds(String quietTimeEnds) public static void setQuietTimeEnds(String quietTimeEnds) {
{
mQuietTimeEnds = quietTimeEnds; mQuietTimeEnds = quietTimeEnds;
} }
public static boolean isQuietTime() public static boolean isQuietTime() {
{ if (!mQuietTimeEnabled) {
if (!mQuietTimeEnabled)
{
return false; return false;
} }
@ -804,34 +730,29 @@ public class K9 extends Application
Integer endHour = Integer.parseInt(mQuietTimeEnds.split(":")[0]); Integer endHour = Integer.parseInt(mQuietTimeEnds.split(":")[0]);
Integer endMinute = Integer.parseInt(mQuietTimeEnds.split(":")[1]); Integer endMinute = Integer.parseInt(mQuietTimeEnds.split(":")[1]);
Integer now = (time.hour * 60 ) + time.minute; Integer now = (time.hour * 60) + time.minute;
Integer quietStarts = startHour * 60 + startMinute; Integer quietStarts = startHour * 60 + startMinute;
Integer quietEnds = endHour * 60 +endMinute; Integer quietEnds = endHour * 60 + endMinute;
// If start and end times are the same, we're never quiet // If start and end times are the same, we're never quiet
if (quietStarts.equals(quietEnds)) if (quietStarts.equals(quietEnds)) {
{
return false; return false;
} }
// 21:00 - 05:00 means we want to be quiet if it's after 9 or before 5 // 21:00 - 05:00 means we want to be quiet if it's after 9 or before 5
if (quietStarts > quietEnds) if (quietStarts > quietEnds) {
{
// if it's 22:00 or 03:00 but not 8:00 // if it's 22:00 or 03:00 but not 8:00
if ( now >= quietStarts || now <= quietEnds) if (now >= quietStarts || now <= quietEnds) {
{
return true; return true;
} }
} }
// 01:00 - 05:00 // 01:00 - 05:00
else else {
{
// if it' 2:00 or 4:00 but not 8:00 or 0:00 // if it' 2:00 or 4:00 but not 8:00 or 0:00
if ( now >= quietStarts && now <= quietEnds) if (now >= quietStarts && now <= quietEnds) {
{
return true; return true;
} }
} }
@ -841,214 +762,170 @@ public class K9 extends Application
public static boolean startIntegratedInbox() public static boolean startIntegratedInbox() {
{
return mStartIntegratedInbox; return mStartIntegratedInbox;
} }
public static void setStartIntegratedInbox(boolean startIntegratedInbox) public static void setStartIntegratedInbox(boolean startIntegratedInbox) {
{
mStartIntegratedInbox = startIntegratedInbox; mStartIntegratedInbox = startIntegratedInbox;
} }
public static boolean showAnimations() public static boolean showAnimations() {
{
return mAnimations; return mAnimations;
} }
public static void setAnimations(boolean animations) public static void setAnimations(boolean animations) {
{
mAnimations = animations; mAnimations = animations;
} }
public static boolean messageListTouchable() public static boolean messageListTouchable() {
{
return mMessageListTouchable; return mMessageListTouchable;
} }
public static void setMessageListTouchable(boolean touchy) public static void setMessageListTouchable(boolean touchy) {
{
mMessageListTouchable = touchy; mMessageListTouchable = touchy;
} }
public static int messageListPreviewLines() public static int messageListPreviewLines() {
{
return mMessageListPreviewLines; return mMessageListPreviewLines;
} }
public static void setMessageListPreviewLines(int lines) public static void setMessageListPreviewLines(int lines) {
{
mMessageListPreviewLines = lines; mMessageListPreviewLines = lines;
} }
public static boolean messageListStars() public static boolean messageListStars() {
{
return mMessageListStars; return mMessageListStars;
} }
public static void setMessageListStars(boolean stars) public static void setMessageListStars(boolean stars) {
{
mMessageListStars = stars; mMessageListStars = stars;
} }
public static boolean messageListCheckboxes() public static boolean messageListCheckboxes() {
{
return mMessageListCheckboxes; return mMessageListCheckboxes;
} }
public static void setMessageListCheckboxes(boolean checkboxes) public static void setMessageListCheckboxes(boolean checkboxes) {
{
mMessageListCheckboxes = checkboxes; mMessageListCheckboxes = checkboxes;
} }
public static boolean showCorrespondentNames() public static boolean showCorrespondentNames() {
{
return mShowCorrespondentNames; return mShowCorrespondentNames;
} }
public static void setShowCorrespondentNames(boolean showCorrespondentNames) public static void setShowCorrespondentNames(boolean showCorrespondentNames) {
{
mShowCorrespondentNames = showCorrespondentNames; mShowCorrespondentNames = showCorrespondentNames;
} }
public static boolean showContactName() public static boolean showContactName() {
{
return mShowContactName; return mShowContactName;
} }
public static void setShowContactName(boolean showContactName) public static void setShowContactName(boolean showContactName) {
{
mShowContactName = showContactName; mShowContactName = showContactName;
} }
public static boolean changeContactNameColor() public static boolean changeContactNameColor() {
{
return mChangeContactNameColor; return mChangeContactNameColor;
} }
public static void setChangeContactNameColor(boolean changeContactNameColor) public static void setChangeContactNameColor(boolean changeContactNameColor) {
{
mChangeContactNameColor = changeContactNameColor; mChangeContactNameColor = changeContactNameColor;
} }
public static int getContactNameColor() public static int getContactNameColor() {
{
return mContactNameColor; return mContactNameColor;
} }
public static void setContactNameColor(int contactNameColor) public static void setContactNameColor(int contactNameColor) {
{
mContactNameColor = contactNameColor; mContactNameColor = contactNameColor;
} }
public static boolean messageViewFixedWidthFont() public static boolean messageViewFixedWidthFont() {
{
return mMessageViewFixedWidthFont; return mMessageViewFixedWidthFont;
} }
public static void setMessageViewFixedWidthFont(boolean fixed) public static void setMessageViewFixedWidthFont(boolean fixed) {
{
mMessageViewFixedWidthFont = fixed; mMessageViewFixedWidthFont = fixed;
} }
public static boolean messageViewReturnToList() public static boolean messageViewReturnToList() {
{
return mMessageViewReturnToList; return mMessageViewReturnToList;
} }
public static void setMessageViewReturnToList(boolean messageViewReturnToList) public static void setMessageViewReturnToList(boolean messageViewReturnToList) {
{
mMessageViewReturnToList = messageViewReturnToList; mMessageViewReturnToList = messageViewReturnToList;
} }
public static Method getMethod(Class<?> classObject, String methodName) public static Method getMethod(Class<?> classObject, String methodName) {
{ try {
try
{
return classObject.getMethod(methodName, boolean.class); return classObject.getMethod(methodName, boolean.class);
} } catch (NoSuchMethodException e) {
catch (NoSuchMethodException e)
{
Log.i(K9.LOG_TAG, "Can't get method " + Log.i(K9.LOG_TAG, "Can't get method " +
classObject.toString() + "." + methodName); classObject.toString() + "." + methodName);
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Error while using reflection to get method " + Log.e(K9.LOG_TAG, "Error while using reflection to get method " +
classObject.toString() + "." + methodName, e); classObject.toString() + "." + methodName, e);
} }
return null; return null;
} }
public static FontSizes getFontSizes() public static FontSizes getFontSizes() {
{
return fontSizes; return fontSizes;
} }
public static boolean measureAccounts() public static boolean measureAccounts() {
{
return mMeasureAccounts; return mMeasureAccounts;
} }
public static void setMeasureAccounts(boolean measureAccounts) public static void setMeasureAccounts(boolean measureAccounts) {
{
mMeasureAccounts = measureAccounts; mMeasureAccounts = measureAccounts;
} }
public static boolean countSearchMessages() public static boolean countSearchMessages() {
{
return mCountSearchMessages; return mCountSearchMessages;
} }
public static void setCountSearchMessages(boolean countSearchMessages) public static void setCountSearchMessages(boolean countSearchMessages) {
{
mCountSearchMessages = countSearchMessages; mCountSearchMessages = countSearchMessages;
} }
public static boolean useGalleryBugWorkaround() public static boolean useGalleryBugWorkaround() {
{
return useGalleryBugWorkaround; return useGalleryBugWorkaround;
} }
public static void setUseGalleryBugWorkaround(boolean useGalleryBugWorkaround) public static void setUseGalleryBugWorkaround(boolean useGalleryBugWorkaround) {
{
K9.useGalleryBugWorkaround = useGalleryBugWorkaround; K9.useGalleryBugWorkaround = useGalleryBugWorkaround;
} }
public static boolean isGalleryBuggy() public static boolean isGalleryBuggy() {
{
return galleryBuggy; return galleryBuggy;
} }
public static boolean confirmDelete() public static boolean confirmDelete() {
{
return mConfirmDelete; return mConfirmDelete;
} }
public static void setConfirmDelete(final boolean confirm) public static void setConfirmDelete(final boolean confirm) {
{
mConfirmDelete = confirm; mConfirmDelete = confirm;
} }
/** /**
* @return Whether privacy rules should be applied when system is locked * @return Whether privacy rules should be applied when system is locked
*/ */
public static boolean keyguardPrivacy() public static boolean keyguardPrivacy() {
{
return mKeyguardPrivacy; return mKeyguardPrivacy;
} }
public static void setKeyguardPrivacy(final boolean state) public static void setKeyguardPrivacy(final boolean state) {
{
mKeyguardPrivacy = state; mKeyguardPrivacy = state;
} }
public static boolean useCompactLayouts() public static boolean useCompactLayouts() {
{
return compactLayouts; return compactLayouts;
} }
public static void setCompactLayouts(boolean compactLayouts) public static void setCompactLayouts(boolean compactLayouts) {
{
K9.compactLayouts = compactLayouts; K9.compactLayouts = compactLayouts;
} }
@ -1061,16 +938,12 @@ public class K9 extends Application
* *
* @return true, if a buggy Gallery 3D package was found. False, otherwise. * @return true, if a buggy Gallery 3D package was found. False, otherwise.
*/ */
private boolean checkForBuggyGallery() private boolean checkForBuggyGallery() {
{ try {
try
{
PackageInfo pi = getPackageManager().getPackageInfo("com.cooliris.media", 0); PackageInfo pi = getPackageManager().getPackageInfo("com.cooliris.media", 0);
return (pi.versionCode == 30682); return (pi.versionCode == 30682);
} } catch (NameNotFoundException e) {
catch (NameNotFoundException e)
{
return false; return false;
} }
} }

View File

@ -3,8 +3,7 @@ package com.fsck.k9;
/** /**
* Describes how a notification should behave. * Describes how a notification should behave.
*/ */
public class NotificationSetting public class NotificationSetting {
{
/** /**
* Ring notification kill switch. Allow disabling ringtones without losing * Ring notification kill switch. Allow disabling ringtones without losing
@ -38,8 +37,7 @@ public class NotificationSetting
* <code>true</code> to allow ringtones, <code>false</code> * <code>true</code> to allow ringtones, <code>false</code>
* otherwise. * otherwise.
*/ */
public synchronized void setRing(boolean ring) public synchronized void setRing(boolean ring) {
{
mRing = ring; mRing = ring;
} }
@ -47,68 +45,55 @@ public class NotificationSetting
* @return <code>true</code> if ringtone is allowed to play, * @return <code>true</code> if ringtone is allowed to play,
* <code>false</code> otherwise. * <code>false</code> otherwise.
*/ */
public synchronized boolean shouldRing() public synchronized boolean shouldRing() {
{
return mRing; return mRing;
} }
public synchronized String getRingtone() public synchronized String getRingtone() {
{
return mRingtoneUri; return mRingtoneUri;
} }
public synchronized void setRingtone(String ringtoneUri) public synchronized void setRingtone(String ringtoneUri) {
{
mRingtoneUri = ringtoneUri; mRingtoneUri = ringtoneUri;
} }
public synchronized boolean isLed() public synchronized boolean isLed() {
{
return mLed; return mLed;
} }
public synchronized void setLed(final boolean led) public synchronized void setLed(final boolean led) {
{
mLed = led; mLed = led;
} }
public synchronized int getLedColor() public synchronized int getLedColor() {
{
return mLedColor; return mLedColor;
} }
public synchronized void setLedColor(int color) public synchronized void setLedColor(int color) {
{
mLedColor = color; mLedColor = color;
} }
public synchronized boolean shouldVibrate() public synchronized boolean shouldVibrate() {
{
return mVibrate; return mVibrate;
} }
public synchronized void setVibrate(boolean vibrate) public synchronized void setVibrate(boolean vibrate) {
{
mVibrate = vibrate; mVibrate = vibrate;
} }
public synchronized int getVibratePattern() public synchronized int getVibratePattern() {
{
return mVibratePattern; return mVibratePattern;
} }
public synchronized int getVibrateTimes() public synchronized int getVibrateTimes() {
{
return mVibrateTimes; return mVibrateTimes;
} }
public synchronized void setVibratePattern(int pattern) public synchronized void setVibratePattern(int pattern) {
{
mVibratePattern = pattern; mVibratePattern = pattern;
} }
public synchronized void setVibrateTimes(int times) public synchronized void setVibrateTimes(int times) {
{
mVibrateTimes = times; mVibrateTimes = times;
} }
@ -122,25 +107,22 @@ public class NotificationSetting
* @return Pattern multiplied by the number of times requested. * @return Pattern multiplied by the number of times requested.
*/ */
public long[] getVibration() public long[] getVibration() {
{
return getVibration(mVibratePattern, mVibrateTimes); return getVibration(mVibratePattern, mVibrateTimes);
} }
public static long[] getVibration(int pattern, int times) public static long[] getVibration(int pattern, int times) {
{
// These are "off, on" patterns, specified in milliseconds // These are "off, on" patterns, specified in milliseconds
long[] pattern0 = new long[] {300,200}; // like the default pattern long[] pattern0 = new long[] {300, 200}; // like the default pattern
long[] pattern1 = new long[] {100,200}; long[] pattern1 = new long[] {100, 200};
long[] pattern2 = new long[] {100,500}; long[] pattern2 = new long[] {100, 500};
long[] pattern3 = new long[] {200,200}; long[] pattern3 = new long[] {200, 200};
long[] pattern4 = new long[] {200,500}; long[] pattern4 = new long[] {200, 500};
long[] pattern5 = new long[] {500,500}; long[] pattern5 = new long[] {500, 500};
long[] selectedPattern = pattern0; //default pattern long[] selectedPattern = pattern0; //default pattern
switch (pattern) switch (pattern) {
{
case 1: case 1:
selectedPattern = pattern1; selectedPattern = pattern1;
break; break;
@ -159,8 +141,7 @@ public class NotificationSetting
} }
long[] repeatedPattern = new long[selectedPattern.length * times]; long[] repeatedPattern = new long[selectedPattern.length * times];
for (int n = 0; n < times; n++) for (int n = 0; n < times; n++) {
{
System.arraycopy(selectedPattern, 0, repeatedPattern, n * selectedPattern.length, selectedPattern.length); System.arraycopy(selectedPattern, 0, repeatedPattern, n * selectedPattern.length, selectedPattern.length);
} }
// Do not wait before starting the vibration pattern. // Do not wait before starting the vibration pattern.

View File

@ -16,8 +16,7 @@ import android.util.Log;
import com.fsck.k9.preferences.Editor; import com.fsck.k9.preferences.Editor;
import com.fsck.k9.preferences.Storage; import com.fsck.k9.preferences.Storage;
public class Preferences public class Preferences {
{
/** /**
* Immutable empty {@link Account} array * Immutable empty {@link Account} array
@ -26,10 +25,8 @@ public class Preferences
private static Preferences preferences; private static Preferences preferences;
public static synchronized Preferences getPreferences(Context context) public static synchronized Preferences getPreferences(Context context) {
{ if (preferences == null) {
if (preferences == null)
{
preferences = new Preferences(context); preferences = new Preferences(context);
} }
return preferences; return preferences;
@ -42,12 +39,10 @@ public class Preferences
private Account newAccount; private Account newAccount;
private Context mContext; private Context mContext;
private Preferences(Context context) private Preferences(Context context) {
{
mStorage = Storage.getStorage(context); mStorage = Storage.getStorage(context);
mContext = context; mContext = context;
if (mStorage.size() == 0) if (mStorage.size() == 0) {
{
Log.i(K9.LOG_TAG, "Preferences storage is zero-size, importing from Android-style preferences"); Log.i(K9.LOG_TAG, "Preferences storage is zero-size, importing from Android-style preferences");
Editor editor = mStorage.edit(); Editor editor = mStorage.edit();
editor.copy(context.getSharedPreferences("AndroidMail.Main", Context.MODE_PRIVATE)); editor.copy(context.getSharedPreferences("AndroidMail.Main", Context.MODE_PRIVATE));
@ -55,38 +50,30 @@ public class Preferences
} }
} }
private synchronized void loadAccounts() private synchronized void loadAccounts() {
{
accounts = new HashMap<String, Account>(); accounts = new HashMap<String, Account>();
refreshAccounts(); refreshAccounts();
} }
public synchronized void refreshAccounts() public synchronized void refreshAccounts() {
{
Map<String, Account> newAccountMap = new HashMap<String, Account>(); Map<String, Account> newAccountMap = new HashMap<String, Account>();
accountsInOrder = new LinkedList<Account>(); accountsInOrder = new LinkedList<Account>();
String accountUuids = getPreferences().getString("accountUuids", null); String accountUuids = getPreferences().getString("accountUuids", null);
if ((accountUuids != null) && (accountUuids.length() != 0)) if ((accountUuids != null) && (accountUuids.length() != 0)) {
{
String[] uuids = accountUuids.split(","); String[] uuids = accountUuids.split(",");
for (String uuid : uuids) for (String uuid : uuids) {
{
Account account = accounts.get(uuid); Account account = accounts.get(uuid);
if (account != null) if (account != null) {
{
newAccountMap.put(uuid, account); newAccountMap.put(uuid, account);
accountsInOrder.add(account); accountsInOrder.add(account);
} } else {
else
{
Account newAccount = new Account(this, uuid); Account newAccount = new Account(this, uuid);
newAccountMap.put(uuid, newAccount); newAccountMap.put(uuid, newAccount);
accountsInOrder.add(newAccount); accountsInOrder.add(newAccount);
} }
} }
} }
if ((newAccount != null) && newAccount.getAccountNumber() != -1) if ((newAccount != null) && newAccount.getAccountNumber() != -1) {
{
newAccountMap.put(newAccount.getUuid(), newAccount); newAccountMap.put(newAccount.getUuid(), newAccount);
accountsInOrder.add(newAccount); accountsInOrder.add(newAccount);
newAccount = null; newAccount = null;
@ -100,10 +87,8 @@ public class Preferences
* registered the method returns an empty array. * registered the method returns an empty array.
* @return all accounts * @return all accounts
*/ */
public synchronized Account[] getAccounts() public synchronized Account[] getAccounts() {
{ if (accounts == null) {
if (accounts == null)
{
loadAccounts(); loadAccounts();
} }
@ -115,14 +100,11 @@ public class Preferences
* registered the method returns an empty array. * registered the method returns an empty array.
* @return all accounts with {@link Account#isAvailable(Context)} * @return all accounts with {@link Account#isAvailable(Context)}
*/ */
public synchronized Collection<Account> getAvailableAccounts() public synchronized Collection<Account> getAvailableAccounts() {
{
Account[] allAccounts = getAccounts(); Account[] allAccounts = getAccounts();
Collection<Account> retval = new ArrayList<Account>(accounts.size()); Collection<Account> retval = new ArrayList<Account>(accounts.size());
for (Account account : allAccounts) for (Account account : allAccounts) {
{ if (account.isAvailable(mContext)) {
if (account.isAvailable(mContext))
{
retval.add(account); retval.add(account);
} }
} }
@ -130,10 +112,8 @@ public class Preferences
return retval; return retval;
} }
public synchronized Account getAccount(String uuid) public synchronized Account getAccount(String uuid) {
{ if (accounts == null) {
if (accounts == null)
{
loadAccounts(); loadAccounts();
} }
Account account = accounts.get(uuid); Account account = accounts.get(uuid);
@ -141,8 +121,7 @@ public class Preferences
return account; return account;
} }
public synchronized Account newAccount() public synchronized Account newAccount() {
{
newAccount = new Account(K9.app); newAccount = new Account(K9.app);
accounts.put(newAccount.getUuid(), newAccount); accounts.put(newAccount.getUuid(), newAccount);
accountsInOrder.add(newAccount); accountsInOrder.add(newAccount);
@ -150,14 +129,12 @@ public class Preferences
return newAccount; return newAccount;
} }
public synchronized void deleteAccount(Account account) public synchronized void deleteAccount(Account account) {
{
accounts.remove(account.getUuid()); accounts.remove(account.getUuid());
accountsInOrder.remove(account); accountsInOrder.remove(account);
account.delete(this); account.delete(this);
if (newAccount == account) if (newAccount == account) {
{
newAccount = null; newAccount = null;
} }
} }
@ -167,16 +144,13 @@ public class Preferences
* the first account in the list is marked as default and then returned. If * the first account in the list is marked as default and then returned. If
* there are no accounts on the system the method returns null. * there are no accounts on the system the method returns null.
*/ */
public Account getDefaultAccount() public Account getDefaultAccount() {
{
String defaultAccountUuid = getPreferences().getString("defaultAccountUuid", null); String defaultAccountUuid = getPreferences().getString("defaultAccountUuid", null);
Account defaultAccount = getAccount(defaultAccountUuid); Account defaultAccount = getAccount(defaultAccountUuid);
if (defaultAccount == null) if (defaultAccount == null) {
{
Collection<Account> accounts = getAvailableAccounts(); Collection<Account> accounts = getAvailableAccounts();
if (accounts.size() > 0) if (accounts.size() > 0) {
{
defaultAccount = accounts.iterator().next(); defaultAccount = accounts.iterator().next();
setDefaultAccount(defaultAccount); setDefaultAccount(defaultAccount);
} }
@ -185,24 +159,19 @@ public class Preferences
return defaultAccount; return defaultAccount;
} }
public void setDefaultAccount(Account account) public void setDefaultAccount(Account account) {
{
getPreferences().edit().putString("defaultAccountUuid", account.getUuid()).commit(); getPreferences().edit().putString("defaultAccountUuid", account.getUuid()).commit();
} }
public void dump() public void dump() {
{ if (Config.LOGV) {
if (Config.LOGV) for (String key : getPreferences().getAll().keySet()) {
{
for (String key : getPreferences().getAll().keySet())
{
Log.v(K9.LOG_TAG, key + " = " + getPreferences().getAll().get(key)); Log.v(K9.LOG_TAG, key + " = " + getPreferences().getAll().get(key));
} }
} }
} }
public SharedPreferences getPreferences() public SharedPreferences getPreferences() {
{
return mStorage; return mStorage;
} }
} }

View File

@ -10,8 +10,7 @@ import android.content.Context;
import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Flag;
public class SearchAccount implements BaseAccount, SearchSpecification, Serializable public class SearchAccount implements BaseAccount, SearchSpecification, Serializable {
{
private static final long serialVersionUID = -4388420303235543976L; private static final long serialVersionUID = -4388420303235543976L;
private Flag[] mRequiredFlags = null; private Flag[] mRequiredFlags = null;
private Flag[] mForbiddenFlags = null; private Flag[] mForbiddenFlags = null;
@ -24,116 +23,93 @@ public class SearchAccount implements BaseAccount, SearchSpecification, Serializ
private String[] accountUuids = null; private String[] accountUuids = null;
private String[] folderNames = null; private String[] folderNames = null;
public SearchAccount(Preferences preferences) public SearchAccount(Preferences preferences) {
{
} }
protected synchronized void delete(Preferences preferences) protected synchronized void delete(Preferences preferences) {
{
} }
public synchronized void save(Preferences preferences) public synchronized void save(Preferences preferences) {
{
} }
public SearchAccount(Context context, boolean nintegrate, Flag[] requiredFlags, Flag[] forbiddenFlags) public SearchAccount(Context context, boolean nintegrate, Flag[] requiredFlags, Flag[] forbiddenFlags) {
{
mRequiredFlags = requiredFlags; mRequiredFlags = requiredFlags;
mForbiddenFlags = forbiddenFlags; mForbiddenFlags = forbiddenFlags;
integrate = nintegrate; integrate = nintegrate;
} }
@Override @Override
public synchronized String getEmail() public synchronized String getEmail() {
{
return email; return email;
} }
@Override @Override
public synchronized void setEmail(String email) public synchronized void setEmail(String email) {
{
this.email = email; this.email = email;
} }
public Flag[] getRequiredFlags() public Flag[] getRequiredFlags() {
{
return mRequiredFlags; return mRequiredFlags;
} }
public Flag[] getForbiddenFlags() public Flag[] getForbiddenFlags() {
{
return mForbiddenFlags; return mForbiddenFlags;
} }
public boolean isIntegrate() public boolean isIntegrate() {
{
return integrate; return integrate;
} }
public String getDescription() public String getDescription() {
{
return description; return description;
} }
public void setDescription(String description) public void setDescription(String description) {
{
this.description = description; this.description = description;
} }
public String getQuery() public String getQuery() {
{
return query; return query;
} }
public void setQuery(String query) public void setQuery(String query) {
{
this.query = query; this.query = query;
} }
public String getUuid() public String getUuid() {
{ if (mUuid == null) {
if(mUuid == null ) setUuid(UUID.randomUUID().toString());
{
setUuid( UUID.randomUUID().toString());
} }
return mUuid; return mUuid;
} }
public void setUuid(String nUuid) public void setUuid(String nUuid) {
{
mUuid = nUuid; mUuid = nUuid;
} }
public void setIntegrate(boolean integrate) public void setIntegrate(boolean integrate) {
{
this.integrate = integrate; this.integrate = integrate;
} }
public boolean isBuiltin() public boolean isBuiltin() {
{
return builtin; return builtin;
} }
public void setBuiltin(boolean builtin) public void setBuiltin(boolean builtin) {
{
this.builtin = builtin; this.builtin = builtin;
} }
public String[] getAccountUuids() public String[] getAccountUuids() {
{
return accountUuids; return accountUuids;
} }
public void setAccountUuids(String[] accountUuids) public void setAccountUuids(String[] accountUuids) {
{
this.accountUuids = accountUuids; this.accountUuids = accountUuids;
} }
@Override @Override
public String[] getFolderNames() public String[] getFolderNames() {
{
return folderNames; return folderNames;
} }
public void setFolderNames(String[] folderNames) public void setFolderNames(String[] folderNames) {
{
this.folderNames = folderNames; this.folderNames = folderNames;
} }
} }

View File

@ -3,8 +3,7 @@ package com.fsck.k9;
import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Flag;
public interface SearchSpecification public interface SearchSpecification {
{
public Flag[] getRequiredFlags(); public Flag[] getRequiredFlags();

View File

@ -23,8 +23,7 @@ import android.text.Html;
import android.text.Spanned; import android.text.Spanned;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
public class AccessibleEmailContentActivity extends ListActivity public class AccessibleEmailContentActivity extends ListActivity {
{
/** /**
* Immutable empty String array * Immutable empty String array
*/ */
@ -34,8 +33,7 @@ public class AccessibleEmailContentActivity extends ListActivity
* Called when the activity is first created. * Called when the activity is first created.
*/ */
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String htmlSource = getIntent().getStringExtra("content"); String htmlSource = getIntent().getStringExtra("content");
@ -43,10 +41,8 @@ public class AccessibleEmailContentActivity extends ListActivity
String[] rawListItems = parsedHtml.toString().split("\n"); String[] rawListItems = parsedHtml.toString().split("\n");
ArrayList<String> cleanedList = new ArrayList<String>(); ArrayList<String> cleanedList = new ArrayList<String>();
for (String rawListItem : rawListItems) for (String rawListItem : rawListItems) {
{ if (rawListItem.trim().length() > 0) {
if (rawListItem.trim().length() > 0)
{
addToCleanedList(cleanedList, rawListItem); addToCleanedList(cleanedList, rawListItem);
} }
} }
@ -57,30 +53,21 @@ public class AccessibleEmailContentActivity extends ListActivity
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems)); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems));
} }
private void addToCleanedList(ArrayList<String> cleanedList, String line) private void addToCleanedList(ArrayList<String> cleanedList, String line) {
{ if (line.length() < 80) {
if (line.length() < 80)
{
cleanedList.add(line); cleanedList.add(line);
} } else {
else while (line.length() > 80) {
{
while (line.length() > 80)
{
int cutPoint = line.indexOf(" ", 80); int cutPoint = line.indexOf(" ", 80);
if ((cutPoint > 0) && (cutPoint < line.length())) if ((cutPoint > 0) && (cutPoint < line.length())) {
{
cleanedList.add(line.substring(0, cutPoint)); cleanedList.add(line.substring(0, cutPoint));
line = line.substring(cutPoint).trim(); line = line.substring(cutPoint).trim();
} } else {
else
{
cleanedList.add(line); cleanedList.add(line);
line = ""; line = "";
} }
} }
if (line.length() > 0) if (line.length() > 0) {
{
cleanedList.add(line); cleanedList.add(line);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,7 @@ import com.fsck.k9.R;
import com.fsck.k9.controller.MessagingListener; import com.fsck.k9.controller.MessagingListener;
import com.fsck.k9.service.MailService; import com.fsck.k9.service.MailService;
public class ActivityListener extends MessagingListener public class ActivityListener extends MessagingListener {
{
private String mLoadingFolderName = null; private String mLoadingFolderName = null;
private String mLoadingHeaderFolderName = null; private String mLoadingHeaderFolderName = null;
private String mLoadingAccountDescription = null; private String mLoadingAccountDescription = null;
@ -22,61 +21,44 @@ public class ActivityListener extends MessagingListener
private String mProcessingCommandTitle = null; private String mProcessingCommandTitle = null;
public String formatHeader(Context context, String activityPrefix, int unreadMessageCount, DateFormat timeFormat) public String formatHeader(Context context, String activityPrefix, int unreadMessageCount, DateFormat timeFormat) {
{
String operation = null; String operation = null;
String progress = null; String progress = null;
if (mLoadingAccountDescription != null if (mLoadingAccountDescription != null
|| mSendingAccountDescription != null || mSendingAccountDescription != null
|| mLoadingHeaderFolderName != null || mLoadingHeaderFolderName != null
|| mProcessingAccountDescription != null) || mProcessingAccountDescription != null) {
{
progress = (mFolderTotal > 0 ? progress = (mFolderTotal > 0 ?
context.getString(R.string.folder_progress, mFolderCompleted, mFolderTotal) : ""); context.getString(R.string.folder_progress, mFolderCompleted, mFolderTotal) : "");
if (mLoadingFolderName != null || mLoadingHeaderFolderName != null) if (mLoadingFolderName != null || mLoadingHeaderFolderName != null) {
{
String displayName = mLoadingFolderName; String displayName = mLoadingFolderName;
if (K9.INBOX.equalsIgnoreCase(displayName)) if (K9.INBOX.equalsIgnoreCase(displayName)) {
{
displayName = context.getString(R.string.special_mailbox_name_inbox); displayName = context.getString(R.string.special_mailbox_name_inbox);
} }
if (mLoadingHeaderFolderName != null) if (mLoadingHeaderFolderName != null) {
{
operation = context.getString(R.string.status_loading_account_folder_headers, mLoadingAccountDescription, displayName, progress); operation = context.getString(R.string.status_loading_account_folder_headers, mLoadingAccountDescription, displayName, progress);
} } else {
else
{
operation = context.getString(R.string.status_loading_account_folder, mLoadingAccountDescription, displayName, progress); operation = context.getString(R.string.status_loading_account_folder, mLoadingAccountDescription, displayName, progress);
} }
} }
else if (mSendingAccountDescription != null) else if (mSendingAccountDescription != null) {
{
operation = context.getString(R.string.status_sending_account, mSendingAccountDescription, progress); operation = context.getString(R.string.status_sending_account, mSendingAccountDescription, progress);
} } else if (mProcessingAccountDescription != null) {
else if (mProcessingAccountDescription != null)
{
operation = context.getString(R.string.status_processing_account, mProcessingAccountDescription, operation = context.getString(R.string.status_processing_account, mProcessingAccountDescription,
mProcessingCommandTitle != null ? mProcessingCommandTitle : "", mProcessingCommandTitle != null ? mProcessingCommandTitle : "",
progress); progress);
} }
} } else {
else
{
long nextPollTime = MailService.getNextPollTime(); long nextPollTime = MailService.getNextPollTime();
if (nextPollTime != -1) if (nextPollTime != -1) {
{
operation = context.getString(R.string.status_next_poll, timeFormat.format(nextPollTime)); operation = context.getString(R.string.status_next_poll, timeFormat.format(nextPollTime));
} } else if (MailService.isSyncDisabled()) {
else if (MailService.isSyncDisabled())
{
operation = context.getString(R.string.status_syncing_off); operation = context.getString(R.string.status_syncing_off);
} } else {
else
{
operation = ""; operation = "";
} }
} }
@ -93,15 +75,13 @@ public class ActivityListener extends MessagingListener
Account account, Account account,
String folder, String folder,
int totalMessagesInMailbox, int totalMessagesInMailbox,
int numNewMessages) int numNewMessages) {
{
mLoadingAccountDescription = null; mLoadingAccountDescription = null;
mLoadingFolderName = null; mLoadingFolderName = null;
} }
@Override @Override
public void synchronizeMailboxStarted(Account account, String folder) public void synchronizeMailboxStarted(Account account, String folder) {
{
mLoadingAccountDescription = account.getDescription(); mLoadingAccountDescription = account.getDescription();
mLoadingFolderName = folder; mLoadingFolderName = folder;
mFolderCompleted = 0; mFolderCompleted = 0;
@ -110,23 +90,20 @@ public class ActivityListener extends MessagingListener
@Override @Override
public void synchronizeMailboxHeadersStarted(Account account, String folder) public void synchronizeMailboxHeadersStarted(Account account, String folder) {
{
mLoadingHeaderFolderName = folder; mLoadingHeaderFolderName = folder;
} }
@Override @Override
public void synchronizeMailboxHeadersProgress(Account account, String folder, int completed, int total) public void synchronizeMailboxHeadersProgress(Account account, String folder, int completed, int total) {
{
mFolderCompleted = completed; mFolderCompleted = completed;
mFolderTotal = total; mFolderTotal = total;
} }
@Override @Override
public void synchronizeMailboxHeadersFinished(Account account, String folder, public void synchronizeMailboxHeadersFinished(Account account, String folder,
int total, int completed) int total, int completed) {
{
mLoadingHeaderFolderName = null; mLoadingHeaderFolderName = null;
mFolderCompleted = 0; mFolderCompleted = 0;
mFolderTotal = 0; mFolderTotal = 0;
@ -134,72 +111,61 @@ public class ActivityListener extends MessagingListener
@Override @Override
public void synchronizeMailboxProgress(Account account, String folder, int completed, int total) public void synchronizeMailboxProgress(Account account, String folder, int completed, int total) {
{
mFolderCompleted = completed; mFolderCompleted = completed;
mFolderTotal = total; mFolderTotal = total;
} }
@Override @Override
public void synchronizeMailboxFailed(Account account, String folder, public void synchronizeMailboxFailed(Account account, String folder,
String message) String message) {
{
mLoadingAccountDescription = null; mLoadingAccountDescription = null;
mLoadingFolderName = null; mLoadingFolderName = null;
} }
@Override @Override
public void sendPendingMessagesStarted(Account account) public void sendPendingMessagesStarted(Account account) {
{
mSendingAccountDescription = account.getDescription(); mSendingAccountDescription = account.getDescription();
} }
@Override @Override
public void sendPendingMessagesCompleted(Account account) public void sendPendingMessagesCompleted(Account account) {
{
mSendingAccountDescription = null; mSendingAccountDescription = null;
} }
@Override @Override
public void sendPendingMessagesFailed(Account account) public void sendPendingMessagesFailed(Account account) {
{
mSendingAccountDescription = null; mSendingAccountDescription = null;
} }
@Override @Override
public void pendingCommandsProcessing(Account account) public void pendingCommandsProcessing(Account account) {
{
mProcessingAccountDescription = account.getDescription(); mProcessingAccountDescription = account.getDescription();
mFolderCompleted = 0; mFolderCompleted = 0;
mFolderTotal = 0; mFolderTotal = 0;
} }
@Override @Override
public void pendingCommandsFinished(Account account) public void pendingCommandsFinished(Account account) {
{
mProcessingAccountDescription = null; mProcessingAccountDescription = null;
} }
@Override @Override
public void pendingCommandStarted(Account account, String commandTitle) public void pendingCommandStarted(Account account, String commandTitle) {
{
mProcessingCommandTitle = commandTitle; mProcessingCommandTitle = commandTitle;
} }
@Override @Override
public void pendingCommandCompleted(Account account, String commandTitle) public void pendingCommandCompleted(Account account, String commandTitle) {
{
mProcessingCommandTitle = null; mProcessingCommandTitle = null;
} }
public int getFolderCompleted() public int getFolderCompleted() {
{
return mFolderCompleted; return mFolderCompleted;
} }
public int getFolderTotal() public int getFolderTotal() {
{
return mFolderTotal; return mFolderTotal;
} }

View File

@ -19,34 +19,26 @@ import com.fsck.k9.preferences.StorageImporter;
* that can be moved here. * that can be moved here.
* *
*/ */
public class AsyncUIProcessor public class AsyncUIProcessor {
{
private final ExecutorService threadPool = Executors.newCachedThreadPool(); private final ExecutorService threadPool = Executors.newCachedThreadPool();
private Application mApplication; private Application mApplication;
private static AsyncUIProcessor inst = null; private static AsyncUIProcessor inst = null;
private AsyncUIProcessor(Application application) private AsyncUIProcessor(Application application) {
{
mApplication = application; mApplication = application;
} }
public synchronized static AsyncUIProcessor getInstance(Application application) public synchronized static AsyncUIProcessor getInstance(Application application) {
{ if (inst == null) {
if (inst == null)
{
inst = new AsyncUIProcessor(application); inst = new AsyncUIProcessor(application);
} }
return inst; return inst;
} }
public void exportSettings(final String uuid, final String encryptionKey, final ExportListener listener) public void exportSettings(final String uuid, final String encryptionKey, final ExportListener listener) {
{ threadPool.execute(new Runnable() {
threadPool.execute(new Runnable()
{
@Override @Override
public void run() public void run() {
{ try {
try
{
// Do not store with application files. Settings exports should *not* be // Do not store with application files. Settings exports should *not* be
// deleted when the application is uninstalled // deleted when the application is uninstalled
File dir = new File(Environment.getExternalStorageDirectory() + File.separator File dir = new File(Environment.getExternalStorageDirectory() + File.separator
@ -55,13 +47,10 @@ public class AsyncUIProcessor
File file = Utility.createUniqueFile(dir, "settings.k9s"); File file = Utility.createUniqueFile(dir, "settings.k9s");
String fileName = file.getAbsolutePath(); String fileName = file.getAbsolutePath();
StorageExporter.exportPreferences(mApplication, uuid, fileName, encryptionKey); StorageExporter.exportPreferences(mApplication, uuid, fileName, encryptionKey);
if (listener != null) if (listener != null) {
{
listener.exportSuccess(fileName); listener.exportSuccess(fileName);
} }
} } catch (Exception e) {
catch (Exception e)
{
listener.failure(e.getLocalizedMessage(), e); listener.failure(e.getLocalizedMessage(), e);
} }
} }
@ -69,25 +58,18 @@ public class AsyncUIProcessor
); );
} }
public void importSettings(final String fileName, final String encryptionKey, final ImportListener listener) public void importSettings(final String fileName, final String encryptionKey, final ImportListener listener) {
{ threadPool.execute(new Runnable() {
threadPool.execute(new Runnable()
{
@Override @Override
public void run() public void run() {
{ try {
try
{
int numAccounts = StorageImporter.importPreferences(mApplication, fileName, encryptionKey); int numAccounts = StorageImporter.importPreferences(mApplication, fileName, encryptionKey);
K9.setServicesEnabled(mApplication); K9.setServicesEnabled(mApplication);
if (listener != null) if (listener != null) {
{
listener.importSuccess(numAccounts); listener.importSuccess(numAccounts);
} }
} } catch (Exception e) {
catch (Exception e)
{
listener.failure(e.getLocalizedMessage(), e); listener.failure(e.getLocalizedMessage(), e);
} }
} }
@ -95,25 +77,18 @@ public class AsyncUIProcessor
); );
} }
public void importSettings(final InputStream inputStream, final String encryptionKey, final ImportListener listener) public void importSettings(final InputStream inputStream, final String encryptionKey, final ImportListener listener) {
{ threadPool.execute(new Runnable() {
threadPool.execute(new Runnable()
{
@Override @Override
public void run() public void run() {
{ try {
try
{
int numAccounts = StorageImporter.importPreferences(mApplication, inputStream, encryptionKey); int numAccounts = StorageImporter.importPreferences(mApplication, inputStream, encryptionKey);
K9.setServicesEnabled(mApplication); K9.setServicesEnabled(mApplication);
if (listener != null) if (listener != null) {
{
listener.importSuccess(numAccounts); listener.importSuccess(numAccounts);
} }
} } catch (Exception e) {
catch (Exception e)
{
listener.failure(e.getLocalizedMessage(), e); listener.failure(e.getLocalizedMessage(), e);
} }
} }

View File

@ -27,8 +27,7 @@ import java.util.List;
* *
* @see K9ExpandableListActivity * @see K9ExpandableListActivity
*/ */
public class ChooseAccount extends K9ExpandableListActivity public class ChooseAccount extends K9ExpandableListActivity {
{
/** /**
* {@link Intent} extended data name for storing {@link Account#getUuid() * {@link Intent} extended data name for storing {@link Account#getUuid()
@ -42,8 +41,7 @@ public class ChooseAccount extends K9ExpandableListActivity
public static final String EXTRA_IDENTITY = ChooseAccount.class.getName() + "_identity"; public static final String EXTRA_IDENTITY = ChooseAccount.class.getName() + "_identity";
@Override @Override
protected void onCreate(final Bundle savedInstanceState) protected void onCreate(final Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
@ -55,17 +53,14 @@ public class ChooseAccount extends K9ExpandableListActivity
final ExpandableListAdapter adapter = createAdapter(); final ExpandableListAdapter adapter = createAdapter();
setListAdapter(adapter); setListAdapter(adapter);
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
{
@Override @Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
int childPosition, long id) int childPosition, long id) {
{
final Identity identity = (Identity) adapter.getChild(groupPosition, childPosition); final Identity identity = (Identity) adapter.getChild(groupPosition, childPosition);
final Account account = (Account) adapter.getGroup(groupPosition); final Account account = (Account) adapter.getGroup(groupPosition);
if (!account.isAvailable(v.getContext())) if (!account.isAvailable(v.getContext())) {
{
Log.i(K9.LOG_TAG, "Refusing selection of unavailable account"); Log.i(K9.LOG_TAG, "Refusing selection of unavailable account");
return true; return true;
} }
@ -81,15 +76,12 @@ public class ChooseAccount extends K9ExpandableListActivity
final Bundle extras = getIntent().getExtras(); final Bundle extras = getIntent().getExtras();
final String uuid = extras.getString(EXTRA_ACCOUNT); final String uuid = extras.getString(EXTRA_ACCOUNT);
if (uuid != null) if (uuid != null) {
{
final Account[] accounts = Preferences.getPreferences(this).getAccounts(); final Account[] accounts = Preferences.getPreferences(this).getAccounts();
final int length = accounts.length; final int length = accounts.length;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++) {
{
final Account account = accounts[i]; final Account account = accounts[i];
if (uuid.equals(account.getUuid())) if (uuid.equals(account.getUuid())) {
{
// setSelectedChild() doesn't seem to obey the // setSelectedChild() doesn't seem to obey the
// shouldExpandGroup parameter (2.1), manually expanding // shouldExpandGroup parameter (2.1), manually expanding
// group // group
@ -97,16 +89,13 @@ public class ChooseAccount extends K9ExpandableListActivity
final List<Identity> identities = account.getIdentities(); final List<Identity> identities = account.getIdentities();
final Identity identity = (Identity) extras.getSerializable(EXTRA_IDENTITY); final Identity identity = (Identity) extras.getSerializable(EXTRA_IDENTITY);
if (identity == null) if (identity == null) {
{
expandableListView.setSelectedChild(i, 0, true); expandableListView.setSelectedChild(i, 0, true);
break; break;
} }
for (int j = 0; j < identities.size(); j++) for (int j = 0; j < identities.size(); j++) {
{
final Identity loopIdentity = identities.get(j); final Identity loopIdentity = identities.get(j);
if (identity.equals(loopIdentity)) if (identity.equals(loopIdentity)) {
{
expandableListView.setSelectedChild(i, j, true); expandableListView.setSelectedChild(i, j, true);
break; break;
} }
@ -117,8 +106,7 @@ public class ChooseAccount extends K9ExpandableListActivity
} }
} }
private ExpandableListAdapter createAdapter() private ExpandableListAdapter createAdapter() {
{
return new IdentitiesAdapter(this, getLayoutInflater()); return new IdentitiesAdapter(this, getLayoutInflater());
} }
@ -131,65 +119,53 @@ public class ChooseAccount extends K9ExpandableListActivity
* <li>Children represent {@link Identity identities} of the parent account</li> * <li>Children represent {@link Identity identities} of the parent account</li>
* </ul> * </ul>
*/ */
public static class IdentitiesAdapter extends BaseExpandableListAdapter public static class IdentitiesAdapter extends BaseExpandableListAdapter {
{
private Context mContext; private Context mContext;
private LayoutInflater mLayoutInflater; private LayoutInflater mLayoutInflater;
public IdentitiesAdapter(final Context context, final LayoutInflater layoutInflater) public IdentitiesAdapter(final Context context, final LayoutInflater layoutInflater) {
{
mContext = context; mContext = context;
mLayoutInflater = layoutInflater; mLayoutInflater = layoutInflater;
} }
@Override @Override
public Object getChild(int groupPosition, int childPosition) public Object getChild(int groupPosition, int childPosition) {
{
return getAccounts()[groupPosition].getIdentity(childPosition); return getAccounts()[groupPosition].getIdentity(childPosition);
} }
@Override @Override
public long getChildId(int groupPosition, int childPosition) public long getChildId(int groupPosition, int childPosition) {
{
return Integer.valueOf(childPosition).longValue(); return Integer.valueOf(childPosition).longValue();
} }
@Override @Override
public int getChildrenCount(int groupPosition) public int getChildrenCount(int groupPosition) {
{
return getAccounts()[groupPosition].getIdentities().size(); return getAccounts()[groupPosition].getIdentities().size();
} }
@Override @Override
public Object getGroup(int groupPosition) public Object getGroup(int groupPosition) {
{
return getAccounts()[groupPosition]; return getAccounts()[groupPosition];
} }
@Override @Override
public int getGroupCount() public int getGroupCount() {
{
return getAccounts().length; return getAccounts().length;
} }
@Override @Override
public long getGroupId(int groupPosition) public long getGroupId(int groupPosition) {
{
return Integer.valueOf(groupPosition).longValue(); return Integer.valueOf(groupPosition).longValue();
} }
@Override @Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) ViewGroup parent) {
{
final View v; final View v;
if (convertView == null) if (convertView == null) {
{
v = mLayoutInflater.inflate(R.layout.choose_account_item, parent, false); v = mLayoutInflater.inflate(R.layout.choose_account_item, parent, false);
} } else {
else
{
v = convertView; v = convertView;
} }
@ -221,18 +197,14 @@ public class ChooseAccount extends K9ExpandableListActivity
@Override @Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) View convertView, ViewGroup parent) {
{
final Account account = getAccounts()[groupPosition]; final Account account = getAccounts()[groupPosition];
final Identity identity = account.getIdentity(childPosition); final Identity identity = account.getIdentity(childPosition);
final View v; final View v;
if (convertView == null) if (convertView == null) {
{
v = mLayoutInflater.inflate(R.layout.choose_identity_item, parent, false); v = mLayoutInflater.inflate(R.layout.choose_identity_item, parent, false);
} } else {
else
{
v = convertView; v = convertView;
} }
@ -250,20 +222,17 @@ public class ChooseAccount extends K9ExpandableListActivity
} }
@Override @Override
public boolean hasStableIds() public boolean hasStableIds() {
{
// returning false since accounts/identities are mutable // returning false since accounts/identities are mutable
return false; return false;
} }
@Override @Override
public boolean isChildSelectable(int groupPosition, int childPosition) public boolean isChildSelectable(int groupPosition, int childPosition) {
{
return true; return true;
} }
private Account[] getAccounts() private Account[] getAccounts() {
{
return Preferences.getPreferences(mContext).getAccounts(); return Preferences.getPreferences(mContext).getAccounts();
} }
} }

View File

@ -24,8 +24,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
public class ChooseFolder extends K9ListActivity public class ChooseFolder extends K9ListActivity {
{
String mFolder; String mFolder;
String mSelectFolder; String mSelectFolder;
Account mAccount; Account mAccount;
@ -61,8 +60,7 @@ public class ChooseFolder extends K9ListActivity
public static final String EXTRA_SHOW_DISPLAYABLE_ONLY = "com.fsck.k9.ChooseFolder_showDisplayableOnly"; public static final String EXTRA_SHOW_DISPLAYABLE_ONLY = "com.fsck.k9.ChooseFolder_showDisplayableOnly";
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
@ -75,30 +73,24 @@ public class ChooseFolder extends K9ListActivity
mMessageReference = (MessageReference)intent.getSerializableExtra(EXTRA_MESSAGE); mMessageReference = (MessageReference)intent.getSerializableExtra(EXTRA_MESSAGE);
mFolder = intent.getStringExtra(EXTRA_CUR_FOLDER); mFolder = intent.getStringExtra(EXTRA_CUR_FOLDER);
mSelectFolder = intent.getStringExtra(EXTRA_SEL_FOLDER); mSelectFolder = intent.getStringExtra(EXTRA_SEL_FOLDER);
if (intent.getStringExtra(EXTRA_SHOW_CURRENT) != null) if (intent.getStringExtra(EXTRA_SHOW_CURRENT) != null) {
{
hideCurrentFolder = false; hideCurrentFolder = false;
} }
if (intent.getStringExtra(EXTRA_SHOW_FOLDER_NONE) != null) if (intent.getStringExtra(EXTRA_SHOW_FOLDER_NONE) != null) {
{
showOptionNone = true; showOptionNone = true;
} }
if (intent.getStringExtra(EXTRA_SHOW_DISPLAYABLE_ONLY) != null) if (intent.getStringExtra(EXTRA_SHOW_DISPLAYABLE_ONLY) != null) {
{
showDisplayableOnly = true; showDisplayableOnly = true;
} }
if (mFolder == null) if (mFolder == null)
mFolder = ""; mFolder = "";
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1) mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1) {
{
private Filter myFilter = null; private Filter myFilter = null;
@Override @Override
public Filter getFilter() public Filter getFilter() {
{ if (myFilter == null) {
if (myFilter == null)
{
myFilter = new FolderListFilter<String>(this); myFilter = new FolderListFilter<String>(this);
} }
return myFilter; return myFilter;
@ -111,16 +103,13 @@ public class ChooseFolder extends K9ListActivity
MessagingController.getInstance(getApplication()).listFolders(mAccount, false, mListener); MessagingController.getInstance(getApplication()).listFolders(mAccount, false, mListener);
this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
{ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(EXTRA_ACCOUNT, mAccount.getUuid()); intent.putExtra(EXTRA_ACCOUNT, mAccount.getUuid());
intent.putExtra(EXTRA_CUR_FOLDER, mFolder); intent.putExtra(EXTRA_CUR_FOLDER, mFolder);
String destFolderName = (String)((TextView)view).getText(); String destFolderName = (String)((TextView)view).getText();
if (heldInbox != null && getString(R.string.special_mailbox_name_inbox).equals(destFolderName)) if (heldInbox != null && getString(R.string.special_mailbox_name_inbox).equals(destFolderName)) {
{
destFolderName = heldInbox; destFolderName = heldInbox;
} }
intent.putExtra(EXTRA_NEW_FOLDER, destFolderName); intent.putExtra(EXTRA_NEW_FOLDER, destFolderName);
@ -132,8 +121,7 @@ public class ChooseFolder extends K9ListActivity
} }
class ChooseFolderHandler extends Handler class ChooseFolderHandler extends Handler {
{
private static final int MSG_PROGRESS = 2; private static final int MSG_PROGRESS = 2;
@ -141,10 +129,8 @@ public class ChooseFolder extends K9ListActivity
private static final int MSG_SET_SELECTED_FOLDER = 4; private static final int MSG_SET_SELECTED_FOLDER = 4;
@Override @Override
public void handleMessage(android.os.Message msg) public void handleMessage(android.os.Message msg) {
{ switch (msg.what) {
switch (msg.what)
{
case MSG_PROGRESS: case MSG_PROGRESS:
setProgressBarIndeterminateVisibility(msg.arg1 != 0); setProgressBarIndeterminateVisibility(msg.arg1 != 0);
break; break;
@ -164,58 +150,48 @@ public class ChooseFolder extends K9ListActivity
} }
} }
public void progress(boolean progress) public void progress(boolean progress) {
{
android.os.Message msg = new android.os.Message(); android.os.Message msg = new android.os.Message();
msg.what = MSG_PROGRESS; msg.what = MSG_PROGRESS;
msg.arg1 = progress ? 1 : 0; msg.arg1 = progress ? 1 : 0;
sendMessage(msg); sendMessage(msg);
} }
public void setSelectedFolder(int position) public void setSelectedFolder(int position) {
{
android.os.Message msg = new android.os.Message(); android.os.Message msg = new android.os.Message();
msg.what = MSG_SET_SELECTED_FOLDER; msg.what = MSG_SET_SELECTED_FOLDER;
msg.arg1 = position; msg.arg1 = position;
sendMessage(msg); sendMessage(msg);
} }
public void dataChanged() public void dataChanged() {
{
sendEmptyMessage(MSG_DATA_CHANGED); sendEmptyMessage(MSG_DATA_CHANGED);
} }
} }
@Override public boolean onCreateOptionsMenu(Menu menu) @Override public boolean onCreateOptionsMenu(Menu menu) {
{
super.onCreateOptionsMenu(menu); super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.folder_select_option, menu); getMenuInflater().inflate(R.menu.folder_select_option, menu);
return true; return true;
} }
@Override public boolean onOptionsItemSelected(MenuItem item) @Override public boolean onOptionsItemSelected(MenuItem item) {
{ switch (item.getItemId()) {
switch (item.getItemId())
{
case R.id.display_1st_class: case R.id.display_1st_class: {
{
setDisplayMode(FolderMode.FIRST_CLASS); setDisplayMode(FolderMode.FIRST_CLASS);
return true; return true;
} }
case R.id.display_1st_and_2nd_class: case R.id.display_1st_and_2nd_class: {
{
setDisplayMode(FolderMode.FIRST_AND_SECOND_CLASS); setDisplayMode(FolderMode.FIRST_AND_SECOND_CLASS);
return true; return true;
} }
case R.id.display_not_second_class: case R.id.display_not_second_class: {
{
setDisplayMode(FolderMode.NOT_SECOND_CLASS); setDisplayMode(FolderMode.NOT_SECOND_CLASS);
return true; return true;
} }
case R.id.display_all: case R.id.display_all: {
{
setDisplayMode(FolderMode.ALL); setDisplayMode(FolderMode.ALL);
return true; return true;
} }
@ -224,12 +200,10 @@ public class ChooseFolder extends K9ListActivity
} }
} }
private void setDisplayMode(FolderMode aMode) private void setDisplayMode(FolderMode aMode) {
{
mMode = aMode; mMode = aMode;
// invalidate the current filter as it is working on an inval // invalidate the current filter as it is working on an inval
if (myFilter != null) if (myFilter != null) {
{
myFilter.invalidate(); myFilter.invalidate();
} }
//re-populate the list //re-populate the list
@ -237,59 +211,47 @@ public class ChooseFolder extends K9ListActivity
false, mListener); false, mListener);
} }
private MessagingListener mListener = new MessagingListener() private MessagingListener mListener = new MessagingListener() {
{
@Override @Override
public void listFoldersStarted(Account account) public void listFoldersStarted(Account account) {
{ if (!account.equals(mAccount)) {
if (!account.equals(mAccount))
{
return; return;
} }
mHandler.progress(true); mHandler.progress(true);
} }
@Override @Override
public void listFoldersFailed(Account account, String message) public void listFoldersFailed(Account account, String message) {
{ if (!account.equals(mAccount)) {
if (!account.equals(mAccount))
{
return; return;
} }
mHandler.progress(false); mHandler.progress(false);
} }
@Override @Override
public void listFoldersFinished(Account account) public void listFoldersFinished(Account account) {
{ if (!account.equals(mAccount)) {
if (!account.equals(mAccount))
{
return; return;
} }
mHandler.progress(false); mHandler.progress(false);
} }
@Override @Override
public void listFolders(Account account, Folder[] folders) public void listFolders(Account account, Folder[] folders) {
{ if (!account.equals(mAccount)) {
if (!account.equals(mAccount))
{
return; return;
} }
Account.FolderMode aMode = mMode; Account.FolderMode aMode = mMode;
Preferences prefs = Preferences.getPreferences(getApplication().getApplicationContext()); Preferences prefs = Preferences.getPreferences(getApplication().getApplicationContext());
ArrayList<String> localFolders = new ArrayList<String>(); ArrayList<String> localFolders = new ArrayList<String>();
for (Folder folder : folders) for (Folder folder : folders) {
{
String name = folder.getName(); String name = folder.getName();
// Inbox needs to be compared case-insensitively // Inbox needs to be compared case-insensitively
if (hideCurrentFolder && (name.equals(mFolder) || (K9.INBOX.equalsIgnoreCase(mFolder) && K9.INBOX.equalsIgnoreCase(name)))) if (hideCurrentFolder && (name.equals(mFolder) || (K9.INBOX.equalsIgnoreCase(mFolder) && K9.INBOX.equalsIgnoreCase(name)))) {
{
continue; continue;
} }
try try {
{
folder.refresh(prefs); folder.refresh(prefs);
Folder.FolderClass fMode = folder.getDisplayClass(); Folder.FolderClass fMode = folder.getDisplayClass();
@ -297,13 +259,10 @@ public class ChooseFolder extends K9ListActivity
|| (aMode == Account.FolderMode.FIRST_AND_SECOND_CLASS && || (aMode == Account.FolderMode.FIRST_AND_SECOND_CLASS &&
fMode != Folder.FolderClass.FIRST_CLASS && fMode != Folder.FolderClass.FIRST_CLASS &&
fMode != Folder.FolderClass.SECOND_CLASS) fMode != Folder.FolderClass.SECOND_CLASS)
|| (aMode == Account.FolderMode.NOT_SECOND_CLASS && fMode == Folder.FolderClass.SECOND_CLASS)) || (aMode == Account.FolderMode.NOT_SECOND_CLASS && fMode == Folder.FolderClass.SECOND_CLASS)) {
{
continue; continue;
} }
} } catch (MessagingException me) {
catch (MessagingException me)
{
Log.e(K9.LOG_TAG, "Couldn't get prefs to check for displayability of folder " + folder.getName(), me); Log.e(K9.LOG_TAG, "Couldn't get prefs to check for displayability of folder " + folder.getName(), me);
} }
@ -311,29 +270,22 @@ public class ChooseFolder extends K9ListActivity
} }
if (showOptionNone) if (showOptionNone) {
{
localFolders.add(K9.FOLDER_NONE); localFolders.add(K9.FOLDER_NONE);
} }
Collections.sort(localFolders, new Comparator<String>() Collections.sort(localFolders, new Comparator<String>() {
{ public int compare(String aName, String bName) {
public int compare(String aName, String bName) if (K9.FOLDER_NONE.equalsIgnoreCase(aName)) {
{
if (K9.FOLDER_NONE.equalsIgnoreCase(aName))
{
return -1; return -1;
} }
if (K9.FOLDER_NONE.equalsIgnoreCase(bName)) if (K9.FOLDER_NONE.equalsIgnoreCase(bName)) {
{
return 1; return 1;
} }
if (K9.INBOX.equalsIgnoreCase(aName)) if (K9.INBOX.equalsIgnoreCase(aName)) {
{
return -1; return -1;
} }
if (K9.INBOX.equalsIgnoreCase(bName)) if (K9.INBOX.equalsIgnoreCase(bName)) {
{
return 1; return 1;
} }
@ -342,49 +294,36 @@ public class ChooseFolder extends K9ListActivity
}); });
mAdapter.setNotifyOnChange(false); mAdapter.setNotifyOnChange(false);
int selectedFolder = -1; int selectedFolder = -1;
try try {
{
mAdapter.clear(); mAdapter.clear();
int position = 0; int position = 0;
for (String name : localFolders) for (String name : localFolders) {
{ if (K9.INBOX.equalsIgnoreCase(name)) {
if (K9.INBOX.equalsIgnoreCase(name))
{
mAdapter.add(getString(R.string.special_mailbox_name_inbox)); mAdapter.add(getString(R.string.special_mailbox_name_inbox));
heldInbox = name; heldInbox = name;
} } else if (!K9.ERROR_FOLDER_NAME.equals(name)) {
else if (!K9.ERROR_FOLDER_NAME.equals(name))
{
mAdapter.add(name); mAdapter.add(name);
} }
if (mSelectFolder != null) if (mSelectFolder != null) {
{
/* /*
* Never select EXTRA_CUR_FOLDER (mFolder) if EXTRA_SEL_FOLDER * Never select EXTRA_CUR_FOLDER (mFolder) if EXTRA_SEL_FOLDER
* (mSelectedFolder) was provided. * (mSelectedFolder) was provided.
*/ */
if (name.equals(mSelectFolder)) if (name.equals(mSelectFolder)) {
{
selectedFolder = position; selectedFolder = position;
} }
} } else if (name.equals(mFolder) ||
else if (name.equals(mFolder) || (K9.INBOX.equalsIgnoreCase(mFolder) && K9.INBOX.equalsIgnoreCase(name))) {
(K9.INBOX.equalsIgnoreCase(mFolder) && K9.INBOX.equalsIgnoreCase(name)))
{
selectedFolder = position; selectedFolder = position;
} }
position++; position++;
} }
} } finally {
finally
{
mAdapter.setNotifyOnChange(true); mAdapter.setNotifyOnChange(true);
runOnUiThread(new Runnable() runOnUiThread(new Runnable() {
{ public void run() {
public void run()
{
// runOnUiThread( // runOnUiThread(
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
} }
@ -393,8 +332,7 @@ public class ChooseFolder extends K9ListActivity
mHandler.dataChanged(); mHandler.dataChanged();
if (selectedFolder != -1) if (selectedFolder != -1) {
{
mHandler.setSelectedFolder(selectedFolder); mHandler.setSelectedFolder(selectedFolder);
} }
} }

View File

@ -15,8 +15,7 @@ import com.fsck.k9.Preferences;
import com.fsck.k9.R; import com.fsck.k9.R;
import java.util.List; import java.util.List;
public class ChooseIdentity extends K9ListActivity public class ChooseIdentity extends K9ListActivity {
{
Account mAccount; Account mAccount;
String mUID; String mUID;
ArrayAdapter<String> adapter; ArrayAdapter<String> adapter;
@ -27,8 +26,7 @@ public class ChooseIdentity extends K9ListActivity
protected List<Identity> identities = null; protected List<Identity> identities = null;
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
@ -48,24 +46,20 @@ public class ChooseIdentity extends K9ListActivity
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
refreshView(); refreshView();
} }
protected void refreshView() protected void refreshView() {
{
adapter.setNotifyOnChange(false); adapter.setNotifyOnChange(false);
adapter.clear(); adapter.clear();
identities = mAccount.getIdentities(); identities = mAccount.getIdentities();
for (Identity identity : identities) for (Identity identity : identities) {
{
String description = identity.getDescription(); String description = identity.getDescription();
if (description == null || description.trim().length() == 0) if (description == null || description.trim().length() == 0) {
{
description = getString(R.string.message_view_from_format, identity.getName(), identity.getEmail()); description = getString(R.string.message_view_from_format, identity.getName(), identity.getEmail());
} }
adapter.add(description); adapter.add(description);
@ -74,24 +68,18 @@ public class ChooseIdentity extends K9ListActivity
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
protected void setupClickListeners() protected void setupClickListeners() {
{ this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Identity identity = mAccount.getIdentity(position); Identity identity = mAccount.getIdentity(position);
String email = identity.getEmail(); String email = identity.getEmail();
if (email != null && !email.trim().equals("")) if (email != null && !email.trim().equals("")) {
{
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(EXTRA_IDENTITY, mAccount.getIdentity(position)); intent.putExtra(EXTRA_IDENTITY, mAccount.getIdentity(position));
setResult(RESULT_OK, intent); setResult(RESULT_OK, intent);
finish(); finish();
} } else {
else
{
Toast.makeText(ChooseIdentity.this, getString(R.string.identity_has_no_email), Toast.makeText(ChooseIdentity.this, getString(R.string.identity_has_no_email),
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
} }

View File

@ -18,12 +18,10 @@ import android.widget.*;
import com.fsck.k9.view.ColorPickerBox; import com.fsck.k9.view.ColorPickerBox;
public class ColorPickerDialog public class ColorPickerDialog {
{
private static final String TAG = ColorPickerDialog.class.getSimpleName(); private static final String TAG = ColorPickerDialog.class.getSimpleName();
public interface OnColorChangedListener public interface OnColorChangedListener {
{
void colorChanged(int color); void colorChanged(int color);
} }
@ -45,8 +43,7 @@ public class ColorPickerDialog
float sizeUiDp = 240.f; float sizeUiDp = 240.f;
float sizeUiPx; // diset di constructor float sizeUiPx; // diset di constructor
public ColorPickerDialog(Context context, OnColorChangedListener listener, int color ) public ColorPickerDialog(Context context, OnColorChangedListener listener, int color) {
{
this.listener = listener; this.listener = listener;
this.colorOld = color; this.colorOld = color;
this.colorNew = color; this.colorNew = color;
@ -73,15 +70,12 @@ public class ColorPickerDialog
viewColorOld.setBackgroundColor(color); viewColorOld.setBackgroundColor(color);
viewColorNew.setBackgroundColor(color); viewColorNew.setBackgroundColor(color);
viewHue.setOnTouchListener(new View.OnTouchListener() viewHue.setOnTouchListener(new View.OnTouchListener() {
{
@Override @Override
public boolean onTouch(View v, MotionEvent event) public boolean onTouch(View v, MotionEvent event) {
{
if (event.getAction() == MotionEvent.ACTION_MOVE if (event.getAction() == MotionEvent.ACTION_MOVE
|| event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_UP) || event.getAction() == MotionEvent.ACTION_UP) {
{
float y = event.getY(); // dalam px, bukan dp float y = event.getY(); // dalam px, bukan dp
if (y < 0.f) y = 0.f; if (y < 0.f) y = 0.f;
@ -101,15 +95,12 @@ public class ColorPickerDialog
return false; return false;
} }
}); });
viewBox.setOnTouchListener(new View.OnTouchListener() viewBox.setOnTouchListener(new View.OnTouchListener() {
{
@Override @Override
public boolean onTouch(View v, MotionEvent event) public boolean onTouch(View v, MotionEvent event) {
{
if (event.getAction() == MotionEvent.ACTION_MOVE if (event.getAction() == MotionEvent.ACTION_MOVE
|| event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_UP) || event.getAction() == MotionEvent.ACTION_UP) {
{
float x = event.getX(); // dalam px, bukan dp float x = event.getX(); // dalam px, bukan dp
float y = event.getY(); // dalam px, bukan dp float y = event.getY(); // dalam px, bukan dp
@ -135,24 +126,18 @@ public class ColorPickerDialog
dialog = new AlertDialog.Builder(context) dialog = new AlertDialog.Builder(context)
.setView(view) .setView(view)
.setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() .setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() {
{
@Override @Override
public void onClick(DialogInterface dialog, int which) public void onClick(DialogInterface dialog, int which) {
{ if (ColorPickerDialog.this.listener != null) {
if (ColorPickerDialog.this.listener != null)
{
ColorPickerDialog.this.listener.colorChanged(colorNew); ColorPickerDialog.this.listener.colorChanged(colorNew);
} }
} }
}) })
.setNegativeButton(R.string.cancel_action, new DialogInterface.OnClickListener() .setNegativeButton(R.string.cancel_action, new DialogInterface.OnClickListener() {
{
@Override @Override
public void onClick(DialogInterface dialog, int which) public void onClick(DialogInterface dialog, int which) {
{ if (ColorPickerDialog.this.listener != null) {
if (ColorPickerDialog.this.listener != null)
{
} }
} }
}) })
@ -161,39 +146,35 @@ public class ColorPickerDialog
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
protected void placeArrow() protected void placeArrow() {
{
float y = sizeUiPx - (hue * sizeUiPx / 360.f); float y = sizeUiPx - (hue * sizeUiPx / 360.f);
if (y == sizeUiPx) y = 0.f; if (y == sizeUiPx) y = 0.f;
AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) arrow.getLayoutParams(); AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) arrow.getLayoutParams();
layoutParams.y = (int) (y + 4); layoutParams.y = (int)(y + 4);
arrow.setLayoutParams(layoutParams); arrow.setLayoutParams(layoutParams);
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
protected void placeSpyglass() protected void placeSpyglass() {
{
float x = sat * sizeUiPx; float x = sat * sizeUiPx;
float y = (1.f - val) * sizeUiPx; float y = (1.f - val) * sizeUiPx;
AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) viewSpyglass.getLayoutParams(); AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) viewSpyglass.getLayoutParams();
layoutParams.x = (int) (x + 3); layoutParams.x = (int)(x + 3);
layoutParams.y = (int) (y + 3); layoutParams.y = (int)(y + 3);
viewSpyglass.setLayoutParams(layoutParams); viewSpyglass.setLayoutParams(layoutParams);
} }
float[] tmp01 = new float[3]; float[] tmp01 = new float[3];
private int calculateColor() private int calculateColor() {
{
tmp01[0] = hue; tmp01[0] = hue;
tmp01[1] = sat; tmp01[1] = sat;
tmp01[2] = val; tmp01[2] = val;
return Color.HSVToColor(tmp01); return Color.HSVToColor(tmp01);
} }
public void show() public void show() {
{
dialog.show(); dialog.show();
} }
} }

View File

@ -13,8 +13,7 @@ import com.fsck.k9.Preferences;
import com.fsck.k9.R; import com.fsck.k9.R;
import java.util.List; import java.util.List;
public class EditIdentity extends K9Activity public class EditIdentity extends K9Activity {
{
public static final String EXTRA_IDENTITY = "com.fsck.k9.EditIdentity_identity"; public static final String EXTRA_IDENTITY = "com.fsck.k9.EditIdentity_identity";
public static final String EXTRA_IDENTITY_INDEX = "com.fsck.k9.EditIdentity_identity_index"; public static final String EXTRA_IDENTITY_INDEX = "com.fsck.k9.EditIdentity_identity_index";
@ -33,8 +32,7 @@ public class EditIdentity extends K9Activity
private EditText mReplyTo; private EditText mReplyTo;
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mIdentity = (Identity)getIntent().getSerializableExtra(EXTRA_IDENTITY); mIdentity = (Identity)getIntent().getSerializableExtra(EXTRA_IDENTITY);
@ -42,8 +40,7 @@ public class EditIdentity extends K9Activity
String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
if (mIdentityIndex == -1) if (mIdentityIndex == -1) {
{
mIdentity = new Identity(); mIdentity = new Identity();
} }
@ -53,8 +50,7 @@ public class EditIdentity extends K9Activity
* If we're being reloaded we override the original account with the one * If we're being reloaded we override the original account with the one
* we saved * we saved
*/ */
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_IDENTITY)) if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_IDENTITY)) {
{
mIdentity = (Identity)savedInstanceState.getSerializable(EXTRA_IDENTITY); mIdentity = (Identity)savedInstanceState.getSerializable(EXTRA_IDENTITY);
} }
@ -77,40 +73,30 @@ public class EditIdentity extends K9Activity
mSignatureUse = (CheckBox)findViewById(R.id.signature_use); mSignatureUse = (CheckBox)findViewById(R.id.signature_use);
mSignatureView = (EditText)findViewById(R.id.signature); mSignatureView = (EditText)findViewById(R.id.signature);
mSignatureUse.setChecked(mIdentity.getSignatureUse()); mSignatureUse.setChecked(mIdentity.getSignatureUse());
mSignatureUse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() mSignatureUse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
{ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) if (isChecked) {
{
if (isChecked)
{
mSignatureLayout.setVisibility(View.VISIBLE); mSignatureLayout.setVisibility(View.VISIBLE);
mSignatureView.setText(mIdentity.getSignature()); mSignatureView.setText(mIdentity.getSignature());
} } else {
else
{
mSignatureLayout.setVisibility(View.GONE); mSignatureLayout.setVisibility(View.GONE);
} }
} }
}); });
if (mSignatureUse.isChecked()) if (mSignatureUse.isChecked()) {
{
mSignatureView.setText(mIdentity.getSignature()); mSignatureView.setText(mIdentity.getSignature());
} } else {
else
{
mSignatureLayout.setVisibility(View.GONE); mSignatureLayout.setVisibility(View.GONE);
} }
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
} }
private void saveIdentity() private void saveIdentity() {
{
mIdentity.setDescription(mDescriptionView.getText().toString()); mIdentity.setDescription(mDescriptionView.getText().toString());
mIdentity.setEmail(mEmailView.getText().toString()); mIdentity.setEmail(mEmailView.getText().toString());
@ -119,22 +105,16 @@ public class EditIdentity extends K9Activity
mIdentity.setSignatureUse(mSignatureUse.isChecked()); mIdentity.setSignatureUse(mSignatureUse.isChecked());
mIdentity.setSignature(mSignatureView.getText().toString()); mIdentity.setSignature(mSignatureView.getText().toString());
if (mReplyTo.getText().length() == 0) if (mReplyTo.getText().length() == 0) {
{
mIdentity.setReplyTo(null); mIdentity.setReplyTo(null);
} } else {
else
{
mIdentity.setReplyTo(mReplyTo.getText().toString()); mIdentity.setReplyTo(mReplyTo.getText().toString());
} }
List<Identity> identities = mAccount.getIdentities(); List<Identity> identities = mAccount.getIdentities();
if (mIdentityIndex == -1) if (mIdentityIndex == -1) {
{
identities.add(mIdentity); identities.add(mIdentity);
} } else {
else
{
identities.remove(mIdentityIndex); identities.remove(mIdentityIndex);
identities.add(mIdentityIndex, mIdentity); identities.add(mIdentityIndex, mIdentity);
} }
@ -145,10 +125,8 @@ public class EditIdentity extends K9Activity
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
saveIdentity(); saveIdentity();
return true; return true;
} }
@ -156,8 +134,7 @@ public class EditIdentity extends K9Activity
} }
@Override @Override
public void onSaveInstanceState(Bundle outState) public void onSaveInstanceState(Bundle outState) {
{
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putSerializable(EXTRA_IDENTITY, mIdentity); outState.putSerializable(EXTRA_IDENTITY, mIdentity);
} }

View File

@ -6,33 +6,24 @@ import android.widget.Toast;
import com.fsck.k9.Account; import com.fsck.k9.Account;
import com.fsck.k9.R; import com.fsck.k9.R;
public class ExportHelper public class ExportHelper {
{ public static void exportSettings(final Activity activity, final Progressable progressable, final Account account) {
public static void exportSettings(final Activity activity, final Progressable progressable, final Account account)
{
PasswordEntryDialog dialog = new PasswordEntryDialog(activity, activity.getString(R.string.settings_encryption_password_prompt), PasswordEntryDialog dialog = new PasswordEntryDialog(activity, activity.getString(R.string.settings_encryption_password_prompt),
new PasswordEntryDialog.PasswordEntryListener() new PasswordEntryDialog.PasswordEntryListener() {
{ public void passwordChosen(String chosenPassword) {
public void passwordChosen(String chosenPassword) String toastText = activity.getString(R.string.settings_exporting);
{
String toastText = activity.getString(R.string.settings_exporting );
Toast toast = Toast.makeText(activity, toastText, Toast.LENGTH_SHORT); Toast toast = Toast.makeText(activity, toastText, Toast.LENGTH_SHORT);
toast.show(); toast.show();
progressable.setProgress(true); progressable.setProgress(true);
String uuid = null; String uuid = null;
if (account != null) if (account != null) {
{
uuid = account.getUuid(); uuid = account.getUuid();
} }
AsyncUIProcessor.getInstance(activity.getApplication()).exportSettings(uuid, chosenPassword, AsyncUIProcessor.getInstance(activity.getApplication()).exportSettings(uuid, chosenPassword,
new ExportListener() new ExportListener() {
{ public void failure(final String message, Exception e) {
public void failure(final String message, Exception e) activity.runOnUiThread(new Runnable() {
{ public void run() {
activity.runOnUiThread(new Runnable()
{
public void run()
{
progressable.setProgress(false); progressable.setProgress(false);
String toastText = activity.getString(R.string.settings_export_failure, message); String toastText = activity.getString(R.string.settings_export_failure, message);
Toast toast = Toast.makeText(activity.getApplication(), toastText, Toast.LENGTH_LONG); Toast toast = Toast.makeText(activity.getApplication(), toastText, Toast.LENGTH_LONG);
@ -41,14 +32,11 @@ public class ExportHelper
}); });
} }
public void exportSuccess(final String fileName) public void exportSuccess(final String fileName) {
{ activity.runOnUiThread(new Runnable() {
activity.runOnUiThread(new Runnable() public void run() {
{
public void run()
{
progressable.setProgress(false); progressable.setProgress(false);
String toastText = activity.getString(R.string.settings_export_success, fileName ); String toastText = activity.getString(R.string.settings_export_success, fileName);
Toast toast = Toast.makeText(activity.getApplication(), toastText, Toast.LENGTH_LONG); Toast toast = Toast.makeText(activity.getApplication(), toastText, Toast.LENGTH_LONG);
toast.show(); toast.show();
} }
@ -57,8 +45,7 @@ public class ExportHelper
}); });
} }
public void cancel() public void cancel() {
{
} }
}); });
dialog.show(); dialog.show();

View File

@ -1,7 +1,6 @@
package com.fsck.k9.activity; package com.fsck.k9.activity;
public interface ExportListener public interface ExportListener {
{
public void exportSuccess(String fileName); public void exportSuccess(String fileName);
public void failure(String message, Exception e); public void failure(String message, Exception e);

View File

@ -9,8 +9,7 @@ import com.fsck.k9.R;
import com.fsck.k9.mail.Folder; import com.fsck.k9.mail.Folder;
import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.MessagingException;
public class FolderInfoHolder implements Comparable<FolderInfoHolder> public class FolderInfoHolder implements Comparable<FolderInfoHolder> {
{
public String name; public String name;
public String displayName; public String displayName;
public long lastChecked; public long lastChecked;
@ -23,85 +22,66 @@ public class FolderInfoHolder implements Comparable<FolderInfoHolder>
public boolean pushActive; public boolean pushActive;
@Override @Override
public boolean equals(Object o) public boolean equals(Object o) {
{
return this.name.equals(((FolderInfoHolder)o).name); return this.name.equals(((FolderInfoHolder)o).name);
} }
@Override @Override
public int hashCode() public int hashCode() {
{
return name.hashCode(); return name.hashCode();
} }
public int compareTo(FolderInfoHolder o) public int compareTo(FolderInfoHolder o) {
{
String s1 = this.name; String s1 = this.name;
String s2 = o.name; String s2 = o.name;
int ret = s1.compareToIgnoreCase(s2); int ret = s1.compareToIgnoreCase(s2);
if (ret != 0) if (ret != 0) {
{
return ret; return ret;
} } else {
else
{
return s1.compareTo(s2); return s1.compareTo(s2);
} }
} }
private String truncateStatus(String mess) private String truncateStatus(String mess) {
{ if (mess != null && mess.length() > 27) {
if (mess != null && mess.length() > 27)
{
mess = mess.substring(0, 27); mess = mess.substring(0, 27);
} }
return mess; return mess;
} }
// constructor for an empty object for comparisons // constructor for an empty object for comparisons
public FolderInfoHolder() public FolderInfoHolder() {
{
} }
public FolderInfoHolder(Context context, Folder folder, Account account) public FolderInfoHolder(Context context, Folder folder, Account account) {
{ if (context == null) {
if (context == null)
{
throw new IllegalArgumentException("null context given"); throw new IllegalArgumentException("null context given");
} }
populate(context, folder, account); populate(context, folder, account);
} }
public FolderInfoHolder(Context context, Folder folder, Account account, int unreadCount) public FolderInfoHolder(Context context, Folder folder, Account account, int unreadCount) {
{
populate(context, folder, account, unreadCount); populate(context, folder, account, unreadCount);
} }
public void populate(Context context, Folder folder, Account account, int unreadCount) public void populate(Context context, Folder folder, Account account, int unreadCount) {
{
try try {
{
folder.open(Folder.OpenMode.READ_WRITE); folder.open(Folder.OpenMode.READ_WRITE);
// unreadCount = folder.getUnreadMessageCount(); // unreadCount = folder.getUnreadMessageCount();
} } catch (MessagingException me) {
catch (MessagingException me)
{
Log.e(K9.LOG_TAG, "Folder.getUnreadMessageCount() failed", me); Log.e(K9.LOG_TAG, "Folder.getUnreadMessageCount() failed", me);
} }
populate(context,folder,account); populate(context, folder, account);
this.unreadMessageCount = unreadCount; this.unreadMessageCount = unreadCount;
try try {
{
this.flaggedMessageCount = folder.getFlaggedMessageCount(); this.flaggedMessageCount = folder.getFlaggedMessageCount();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Unable to get flaggedMessageCount", e); Log.e(K9.LOG_TAG, "Unable to get flaggedMessageCount", e);
} }
@ -110,50 +90,40 @@ public class FolderInfoHolder implements Comparable<FolderInfoHolder>
} }
public void populate(Context context, Folder folder, Account account) public void populate(Context context, Folder folder, Account account) {
{
this.folder = folder; this.folder = folder;
this.name = folder.getName(); this.name = folder.getName();
this.lastChecked = folder.getLastUpdate(); this.lastChecked = folder.getLastUpdate();
this.status = truncateStatus(folder.getStatus()); this.status = truncateStatus(folder.getStatus());
if (this.name.equalsIgnoreCase(K9.INBOX)) if (this.name.equalsIgnoreCase(K9.INBOX)) {
{
this.displayName = context.getString(R.string.special_mailbox_name_inbox); this.displayName = context.getString(R.string.special_mailbox_name_inbox);
} } else {
else
{
this.displayName = folder.getName(); this.displayName = folder.getName();
} }
if (this.name.equals(account.getOutboxFolderName())) if (this.name.equals(account.getOutboxFolderName())) {
{
this.displayName = String.format(context.getString(R.string.special_mailbox_name_outbox_fmt), this.name); this.displayName = String.format(context.getString(R.string.special_mailbox_name_outbox_fmt), this.name);
} }
if (this.name.equals(account.getDraftsFolderName())) if (this.name.equals(account.getDraftsFolderName())) {
{
this.displayName = String.format(context.getString(R.string.special_mailbox_name_drafts_fmt), this.name); this.displayName = String.format(context.getString(R.string.special_mailbox_name_drafts_fmt), this.name);
} }
if (this.name.equals(account.getTrashFolderName())) if (this.name.equals(account.getTrashFolderName())) {
{
this.displayName = String.format(context.getString(R.string.special_mailbox_name_trash_fmt), this.name); this.displayName = String.format(context.getString(R.string.special_mailbox_name_trash_fmt), this.name);
} }
if (this.name.equals(account.getSentFolderName())) if (this.name.equals(account.getSentFolderName())) {
{
this.displayName = String.format(context.getString(R.string.special_mailbox_name_sent_fmt), this.name); this.displayName = String.format(context.getString(R.string.special_mailbox_name_sent_fmt), this.name);
} }
if (this.name.equals(account.getArchiveFolderName())) if (this.name.equals(account.getArchiveFolderName())) {
{
this.displayName = String.format(context.getString(R.string.special_mailbox_name_archive_fmt), this.name); this.displayName = String.format(context.getString(R.string.special_mailbox_name_archive_fmt), this.name);
} }
if (this.name.equals(account.getSpamFolderName())) if (this.name.equals(account.getSpamFolderName())) {
{
this.displayName = String.format(context.getString(R.string.special_mailbox_name_spam_fmt), this.name); this.displayName = String.format(context.getString(R.string.special_mailbox_name_spam_fmt), this.name);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -15,8 +15,7 @@ import com.fsck.k9.K9;
* *
* @author Marcus@Wolschon.biz * @author Marcus@Wolschon.biz
*/ */
public class FolderListFilter<T> extends Filter public class FolderListFilter<T> extends Filter {
{
/** /**
* ArrayAdapter that contains the list of folders displayed in the * ArrayAdapter that contains the list of folders displayed in the
* ListView. * ListView.
@ -36,8 +35,7 @@ public class FolderListFilter<T> extends Filter
* *
* @param folderNames * @param folderNames
*/ */
public FolderListFilter(final ArrayAdapter<T> folderNames) public FolderListFilter(final ArrayAdapter<T> folderNames) {
{
this.mFolders = folderNames; this.mFolders = folderNames;
} }
@ -48,30 +46,24 @@ public class FolderListFilter<T> extends Filter
* @see #publishResults(CharSequence, FilterResults) * @see #publishResults(CharSequence, FilterResults)
*/ */
@Override @Override
protected FilterResults performFiltering(CharSequence searchTerm) protected FilterResults performFiltering(CharSequence searchTerm) {
{
FilterResults results = new FilterResults(); FilterResults results = new FilterResults();
// Copy the values from mFolders to mOriginalValues if this is the // Copy the values from mFolders to mOriginalValues if this is the
// first time this method is called. // first time this method is called.
if (mOriginalValues == null) if (mOriginalValues == null) {
{
int count = mFolders.getCount(); int count = mFolders.getCount();
mOriginalValues = new ArrayList<T>(count); mOriginalValues = new ArrayList<T>(count);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++) {
{
mOriginalValues.add(mFolders.getItem(i)); mOriginalValues.add(mFolders.getItem(i));
} }
} }
if ((searchTerm == null) || (searchTerm.length() == 0)) if ((searchTerm == null) || (searchTerm.length() == 0)) {
{
ArrayList<T> list = new ArrayList<T>(mOriginalValues); ArrayList<T> list = new ArrayList<T>(mOriginalValues);
results.values = list; results.values = list;
results.count = list.size(); results.count = list.size();
} } else {
else
{
final String searchTermString = searchTerm.toString().toLowerCase(); final String searchTermString = searchTerm.toString().toLowerCase();
final String[] words = searchTermString.split(" "); final String[] words = searchTermString.split(" ");
final int wordCount = words.length; final int wordCount = words.length;
@ -80,14 +72,11 @@ public class FolderListFilter<T> extends Filter
final ArrayList<T> newValues = new ArrayList<T>(); final ArrayList<T> newValues = new ArrayList<T>();
for (final T value : values) for (final T value : values) {
{
final String valueText = value.toString().toLowerCase(); final String valueText = value.toString().toLowerCase();
for (int k = 0; k < wordCount; k++) for (int k = 0; k < wordCount; k++) {
{ if (valueText.contains(words[k])) {
if (valueText.contains(words[k]))
{
newValues.add(value); newValues.add(value);
break; break;
} }
@ -107,26 +96,20 @@ public class FolderListFilter<T> extends Filter
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) protected void publishResults(CharSequence constraint, FilterResults results) {
{
// Don't notify for every change // Don't notify for every change
mFolders.setNotifyOnChange(false); mFolders.setNotifyOnChange(false);
//noinspection unchecked //noinspection unchecked
final List<T> folders = (List<T>) results.values; final List<T> folders = (List<T>) results.values;
mFolders.clear(); mFolders.clear();
if (folders != null) if (folders != null) {
{ for (T folder : folders) {
for (T folder : folders) if (folder != null) {
{
if (folder != null)
{
mFolders.add(folder); mFolders.add(folder);
} }
} }
} } else {
else
{
Log.w(K9.LOG_TAG, "FolderListFilter.publishResults - null search-result "); Log.w(K9.LOG_TAG, "FolderListFilter.publishResults - null search-result ");
} }
@ -134,8 +117,7 @@ public class FolderListFilter<T> extends Filter
mFolders.notifyDataSetChanged(); mFolders.notifyDataSetChanged();
} }
public void invalidate() public void invalidate() {
{
mOriginalValues = null; mOriginalValues = null;
} }
} }

View File

@ -1,7 +1,6 @@
package com.fsck.k9.activity; package com.fsck.k9.activity;
public interface ImportListener public interface ImportListener {
{
public void importSuccess(int numAccounts); public void importSuccess(int numAccounts);
public void failure(String message, Exception e); public void failure(String message, Exception e);

View File

@ -12,8 +12,7 @@ import java.io.Serializable;
* *
* TODO: This container should also have a text part, along with its insertion point. Or maybe a generic InsertableContent and maintain one each for Html and Text? * TODO: This container should also have a text part, along with its insertion point. Or maybe a generic InsertableContent and maintain one each for Html and Text?
*/ */
class InsertableHtmlContent implements Serializable class InsertableHtmlContent implements Serializable {
{
private static final long serialVersionUID = 2397327034L; private static final long serialVersionUID = 2397327034L;
// Default to a headerInsertionPoint at the beginning of the message. // Default to a headerInsertionPoint at the beginning of the message.
private int headerInsertionPoint = 0; private int headerInsertionPoint = 0;
@ -28,18 +27,15 @@ class InsertableHtmlContent implements Serializable
/** /**
* Defines where user content should be inserted, either before or after quoted content. * Defines where user content should be inserted, either before or after quoted content.
*/ */
public enum InsertionLocation public enum InsertionLocation {
{
BEFORE_QUOTE, AFTER_QUOTE BEFORE_QUOTE, AFTER_QUOTE
} }
public void setHeaderInsertionPoint(int headerInsertionPoint) public void setHeaderInsertionPoint(int headerInsertionPoint) {
{
this.headerInsertionPoint = headerInsertionPoint; this.headerInsertionPoint = headerInsertionPoint;
} }
public void setFooterInsertionPoint(int footerInsertionPoint) public void setFooterInsertionPoint(int footerInsertionPoint) {
{
this.footerInsertionPoint = footerInsertionPoint; this.footerInsertionPoint = footerInsertionPoint;
} }
@ -47,8 +43,7 @@ class InsertableHtmlContent implements Serializable
* Get the quoted content. * Get the quoted content.
* @return Quoted content. * @return Quoted content.
*/ */
public String getQuotedContent() public String getQuotedContent() {
{
return quotedContent.toString(); return quotedContent.toString();
} }
@ -56,8 +51,7 @@ class InsertableHtmlContent implements Serializable
* Set the quoted content. The insertion point should be set against this content. * Set the quoted content. The insertion point should be set against this content.
* @param content * @param content
*/ */
public void setQuotedContent(StringBuilder content) public void setQuotedContent(StringBuilder content) {
{
this.quotedContent = content; this.quotedContent = content;
} }
@ -70,8 +64,7 @@ class InsertableHtmlContent implements Serializable
* existing header and quoted content.</p> * existing header and quoted content.</p>
* @param content Content to add. * @param content Content to add.
*/ */
public void insertIntoQuotedHeader(final String content) public void insertIntoQuotedHeader(final String content) {
{
quotedContent.insert(headerInsertionPoint, content); quotedContent.insert(headerInsertionPoint, content);
// Update the location of the footer insertion point. // Update the location of the footer insertion point.
footerInsertionPoint += content.length(); footerInsertionPoint += content.length();
@ -85,8 +78,7 @@ class InsertableHtmlContent implements Serializable
* existing footer and quoted content.</p> * existing footer and quoted content.</p>
* @param content Content to add. * @param content Content to add.
*/ */
public void insertIntoQuotedFooter(final String content) public void insertIntoQuotedFooter(final String content) {
{
quotedContent.insert(footerInsertionPoint, content); quotedContent.insert(footerInsertionPoint, content);
// Update the location of the footer insertion point to the end of the inserted content. // Update the location of the footer insertion point to the end of the inserted content.
footerInsertionPoint += content.length(); footerInsertionPoint += content.length();
@ -95,8 +87,7 @@ class InsertableHtmlContent implements Serializable
/** /**
* Remove all quoted content. * Remove all quoted content.
*/ */
public void clearQuotedContent() public void clearQuotedContent() {
{
quotedContent.setLength(0); quotedContent.setLength(0);
footerInsertionPoint = 0; footerInsertionPoint = 0;
headerInsertionPoint = 0; headerInsertionPoint = 0;
@ -107,8 +98,7 @@ class InsertableHtmlContent implements Serializable
* inserted content buffer. * inserted content buffer.
* @param content * @param content
*/ */
public void setUserContent(final String content) public void setUserContent(final String content) {
{
userContent = new StringBuilder(content); userContent = new StringBuilder(content);
} }
@ -116,8 +106,7 @@ class InsertableHtmlContent implements Serializable
* Configure where user content should be inserted, either before or after the quoted content. * Configure where user content should be inserted, either before or after the quoted content.
* @param insertionLocation Where to insert user content. * @param insertionLocation Where to insert user content.
*/ */
public void setInsertionLocation(final InsertionLocation insertionLocation) public void setInsertionLocation(final InsertionLocation insertionLocation) {
{
this.insertionLocation = insertionLocation; this.insertionLocation = insertionLocation;
} }
@ -125,14 +114,10 @@ class InsertableHtmlContent implements Serializable
* Fetch the insertion point based upon the quote style. * Fetch the insertion point based upon the quote style.
* @return Insertion point * @return Insertion point
*/ */
public int getInsertionPoint() public int getInsertionPoint() {
{ if (insertionLocation == InsertionLocation.BEFORE_QUOTE) {
if (insertionLocation == InsertionLocation.BEFORE_QUOTE)
{
return headerInsertionPoint; return headerInsertionPoint;
} } else {
else
{
return footerInsertionPoint; return footerInsertionPoint;
} }
} }
@ -142,8 +127,7 @@ class InsertableHtmlContent implements Serializable
* @return Composed string. * @return Composed string.
*/ */
@Override @Override
public String toString() public String toString() {
{
final int insertionPoint = getInsertionPoint(); final int insertionPoint = getInsertionPoint();
// Inserting and deleting was twice as fast as instantiating a new StringBuilder and // Inserting and deleting was twice as fast as instantiating a new StringBuilder and
// using substring() to build the new pieces. // using substring() to build the new pieces.
@ -156,8 +140,7 @@ class InsertableHtmlContent implements Serializable
* Return debugging information for this container. * Return debugging information for this container.
* @return Debug string. * @return Debug string.
*/ */
public String toDebugString() public String toDebugString() {
{
return "InsertableHtmlContent{" + return "InsertableHtmlContent{" +
"headerInsertionPoint=" + headerInsertionPoint + "headerInsertionPoint=" + headerInsertionPoint +
", footerInsertionPoint=" + footerInsertionPoint + ", footerInsertionPoint=" + footerInsertionPoint +

View File

@ -21,23 +21,19 @@ import com.fsck.k9.K9;
import com.fsck.k9.helper.DateFormatter; import com.fsck.k9.helper.DateFormatter;
public class K9Activity extends Activity implements Progressable public class K9Activity extends Activity implements Progressable {
{
private GestureDetector gestureDetector; private GestureDetector gestureDetector;
protected ScrollView mTopView; protected ScrollView mTopView;
@Override @Override
public void onCreate(Bundle icicle) public void onCreate(Bundle icicle) {
{
onCreate(icicle, true); onCreate(icicle, true);
} }
public void onCreate(Bundle icicle, boolean useTheme) public void onCreate(Bundle icicle, boolean useTheme) {
{
setLanguage(this, K9.getK9Language()); setLanguage(this, K9.getK9Language());
if (useTheme) if (useTheme) {
{
setTheme(K9.getK9Theme()); setTheme(K9.getK9Theme());
} }
super.onCreate(icicle); super.onCreate(icicle);
@ -48,20 +44,14 @@ public class K9Activity extends Activity implements Progressable
} }
public static void setLanguage(Context context, String language) public static void setLanguage(Context context, String language) {
{
Locale locale; Locale locale;
if (language == null || language.equals("")) if (language == null || language.equals("")) {
{
locale = Locale.getDefault(); locale = Locale.getDefault();
} } else if (language.length() == 5 && language.charAt(2) == '_') {
else if (language.length() == 5 && language.charAt(2) == '_')
{
// language is in the form: en_US // language is in the form: en_US
locale = new Locale(language.substring(0, 2), language.substring(3)); locale = new Locale(language.substring(0, 2), language.substring(3));
} } else {
else
{
locale = new Locale(language); locale = new Locale(language);
} }
Configuration config = new Configuration(); Configuration config = new Configuration();
@ -71,15 +61,13 @@ public class K9Activity extends Activity implements Progressable
} }
@Override @Override
public boolean dispatchTouchEvent(MotionEvent ev) public boolean dispatchTouchEvent(MotionEvent ev) {
{
super.dispatchTouchEvent(ev); super.dispatchTouchEvent(ev);
return gestureDetector.onTouchEvent(ev); return gestureDetector.onTouchEvent(ev);
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
setupFormats(); setupFormats();
} }
@ -87,43 +75,35 @@ public class K9Activity extends Activity implements Progressable
private java.text.DateFormat mDateFormat; private java.text.DateFormat mDateFormat;
private java.text.DateFormat mTimeFormat; private java.text.DateFormat mTimeFormat;
private void setupFormats() private void setupFormats() {
{
mDateFormat = DateFormatter.getDateFormat(this); mDateFormat = DateFormatter.getDateFormat(this);
mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format
} }
public java.text.DateFormat getTimeFormat() public java.text.DateFormat getTimeFormat() {
{
return mTimeFormat; return mTimeFormat;
} }
public java.text.DateFormat getDateFormat() public java.text.DateFormat getDateFormat() {
{
return mDateFormat; return mDateFormat;
} }
protected void onNext() protected void onNext() {
{
} }
protected void onPrevious() protected void onPrevious() {
{
} }
protected Animation inFromRightAnimation() protected Animation inFromRightAnimation() {
{
return slideAnimation(0.0f, +1.0f); return slideAnimation(0.0f, +1.0f);
} }
protected Animation outToLeftAnimation() protected Animation outToLeftAnimation() {
{
return slideAnimation(0.0f, -1.0f); return slideAnimation(0.0f, -1.0f);
} }
private Animation slideAnimation(float right, float left) private Animation slideAnimation(float right, float left) {
{
Animation slide = new TranslateAnimation( Animation slide = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, right, Animation.RELATIVE_TO_PARENT, left, Animation.RELATIVE_TO_PARENT, right, Animation.RELATIVE_TO_PARENT, left,
@ -135,27 +115,21 @@ public class K9Activity extends Activity implements Progressable
return slide; return slide;
} }
class MyGestureDetector extends SimpleOnGestureListener class MyGestureDetector extends SimpleOnGestureListener {
{
private static final float SWIPE_MIN_DISTANCE_DIP = 130.0f; private static final float SWIPE_MIN_DISTANCE_DIP = 130.0f;
private static final float SWIPE_MAX_OFF_PATH_DIP = 250f; private static final float SWIPE_MAX_OFF_PATH_DIP = 250f;
private static final float SWIPE_THRESHOLD_VELOCITY_DIP = 325f; private static final float SWIPE_THRESHOLD_VELOCITY_DIP = 325f;
@Override @Override
public boolean onDoubleTap(MotionEvent ev) public boolean onDoubleTap(MotionEvent ev) {
{
super.onDoubleTap(ev); super.onDoubleTap(ev);
if (mTopView != null) if (mTopView != null) {
{
int height = getResources().getDisplayMetrics().heightPixels; int height = getResources().getDisplayMetrics().heightPixels;
if (ev.getRawY() < (height/4)) if (ev.getRawY() < (height / 4)) {
{
mTopView.fullScroll(View.FOCUS_UP); mTopView.fullScroll(View.FOCUS_UP);
} } else if (ev.getRawY() > (height - height / 4)) {
else if (ev.getRawY() > (height - height/4))
{
mTopView.fullScroll(View.FOCUS_DOWN); mTopView.fullScroll(View.FOCUS_DOWN);
} }
@ -164,10 +138,8 @@ public class K9Activity extends Activity implements Progressable
} }
@Override @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
{ if (K9.gesturesEnabled()) {
if (K9.gesturesEnabled())
{
// Convert the dips to pixels // Convert the dips to pixels
final float mGestureScale = getResources().getDisplayMetrics().density; final float mGestureScale = getResources().getDisplayMetrics().density;
int min_distance = (int)(SWIPE_MIN_DISTANCE_DIP * mGestureScale + 0.5f); int min_distance = (int)(SWIPE_MIN_DISTANCE_DIP * mGestureScale + 0.5f);
@ -175,34 +147,26 @@ public class K9Activity extends Activity implements Progressable
int max_off_path = (int)(SWIPE_MAX_OFF_PATH_DIP * mGestureScale + 0.5f); int max_off_path = (int)(SWIPE_MAX_OFF_PATH_DIP * mGestureScale + 0.5f);
try try {
{
if (Math.abs(e1.getY() - e2.getY()) > max_off_path) if (Math.abs(e1.getY() - e2.getY()) > max_off_path)
return false; return false;
// right to left swipe // right to left swipe
if (e1.getX() - e2.getX() > min_distance && Math.abs(velocityX) > min_velocity) if (e1.getX() - e2.getX() > min_distance && Math.abs(velocityX) > min_velocity) {
{
onNext(); onNext();
} } else if (e2.getX() - e1.getX() > min_distance && Math.abs(velocityX) > min_velocity) {
else if (e2.getX() - e1.getX() > min_distance && Math.abs(velocityX) > min_velocity)
{
onPrevious(); onPrevious();
} }
} } catch (Exception e) {
catch (Exception e)
{
// nothing // nothing
} }
} }
return false; return false;
} }
} }
public void setProgress(boolean progress) public void setProgress(boolean progress) {
{
} }
public void onExport(final Account account) public void onExport(final Account account) {
{
ExportHelper.exportSettings(this, this, account); ExportHelper.exportSettings(this, this, account);
} }

View File

@ -8,12 +8,10 @@ import com.fsck.k9.K9;
/** /**
* @see ExpandableListActivity * @see ExpandableListActivity
*/ */
public class K9ExpandableListActivity extends ExpandableListActivity public class K9ExpandableListActivity extends ExpandableListActivity {
{
@Override @Override
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState) {
{
setTheme(K9.getK9Theme()); setTheme(K9.getK9Theme());
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

View File

@ -14,11 +14,9 @@ import com.fsck.k9.R;
import com.fsck.k9.controller.MessagingController; import com.fsck.k9.controller.MessagingController;
import com.fsck.k9.helper.DateFormatter; import com.fsck.k9.helper.DateFormatter;
public class K9ListActivity extends ListActivity implements Progressable public class K9ListActivity extends ListActivity implements Progressable {
{
@Override @Override
public void onCreate(Bundle icicle) public void onCreate(Bundle icicle) {
{
K9Activity.setLanguage(this, K9.getK9Language()); K9Activity.setLanguage(this, K9.getK9Language());
setTheme(K9.getK9Theme()); setTheme(K9.getK9Theme());
super.onCreate(icicle); super.onCreate(icicle);
@ -26,8 +24,7 @@ public class K9ListActivity extends ListActivity implements Progressable
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
setupFormats(); setupFormats();
} }
@ -35,58 +32,45 @@ public class K9ListActivity extends ListActivity implements Progressable
private java.text.DateFormat mDateFormat; private java.text.DateFormat mDateFormat;
private java.text.DateFormat mTimeFormat; private java.text.DateFormat mTimeFormat;
private void setupFormats() private void setupFormats() {
{
mDateFormat = DateFormatter.getDateFormat(this); mDateFormat = DateFormatter.getDateFormat(this);
mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format
} }
public java.text.DateFormat getTimeFormat() public java.text.DateFormat getTimeFormat() {
{
return mTimeFormat; return mTimeFormat;
} }
public java.text.DateFormat getDateFormat() public java.text.DateFormat getDateFormat() {
{
return mDateFormat; return mDateFormat;
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{
// Shortcuts that work no matter what is selected // Shortcuts that work no matter what is selected
switch (keyCode) switch (keyCode) {
{ case KeyEvent.KEYCODE_VOLUME_UP: {
case KeyEvent.KEYCODE_VOLUME_UP:
{
final ListView listView = getListView(); final ListView listView = getListView();
if (K9.useVolumeKeysForListNavigationEnabled()) if (K9.useVolumeKeysForListNavigationEnabled()) {
{
int currentPosition = listView.getSelectedItemPosition(); int currentPosition = listView.getSelectedItemPosition();
if (currentPosition == AdapterView.INVALID_POSITION || listView.isInTouchMode()) if (currentPosition == AdapterView.INVALID_POSITION || listView.isInTouchMode()) {
{
currentPosition = listView.getFirstVisiblePosition(); currentPosition = listView.getFirstVisiblePosition();
} }
if (currentPosition > 0) if (currentPosition > 0) {
{
listView.setSelection(currentPosition - 1); listView.setSelection(currentPosition - 1);
} }
return true; return true;
} }
} }
case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_DOWN: {
{
final ListView listView = getListView(); final ListView listView = getListView();
if (K9.useVolumeKeysForListNavigationEnabled()) if (K9.useVolumeKeysForListNavigationEnabled()) {
{
int currentPosition = listView.getSelectedItemPosition(); int currentPosition = listView.getSelectedItemPosition();
if (currentPosition == AdapterView.INVALID_POSITION || listView.isInTouchMode()) if (currentPosition == AdapterView.INVALID_POSITION || listView.isInTouchMode()) {
{
currentPosition = listView.getFirstVisiblePosition(); currentPosition = listView.getFirstVisiblePosition();
} }
if (currentPosition < listView.getCount()) if (currentPosition < listView.getCount()) {
{
listView.setSelection(currentPosition + 1); listView.setSelection(currentPosition + 1);
} }
return true; return true;
@ -97,27 +81,22 @@ public class K9ListActivity extends ListActivity implements Progressable
} }
@Override @Override
public boolean onKeyUp(int keyCode, KeyEvent event) public boolean onKeyUp(int keyCode, KeyEvent event) {
{
// Swallow these events too to avoid the audible notification of a volume change // Swallow these events too to avoid the audible notification of a volume change
if (K9.useVolumeKeysForListNavigationEnabled()) if (K9.useVolumeKeysForListNavigationEnabled()) {
{ if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP) || (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP) || (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN))
{
if (K9.DEBUG) if (K9.DEBUG)
Log.v(K9.LOG_TAG, "Swallowed key up."); Log.v(K9.LOG_TAG, "Swallowed key up.");
return true; return true;
} }
} }
return super.onKeyUp(keyCode,event); return super.onKeyUp(keyCode, event);
} }
public void setProgress(boolean progress) public void setProgress(boolean progress) {
{
} }
public void onExport(final Account account) public void onExport(final Account account) {
{
ExportHelper.exportSettings(this, this, account); ExportHelper.exportSettings(this, this, account);
} }

View File

@ -7,11 +7,9 @@ import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
public class K9PreferenceActivity extends PreferenceActivity public class K9PreferenceActivity extends PreferenceActivity {
{
@Override @Override
public void onCreate(Bundle icicle) public void onCreate(Bundle icicle) {
{
K9Activity.setLanguage(this, K9.getK9Language()); K9Activity.setLanguage(this, K9.getK9Language());
// http://code.google.com/p/k9mail/issues/detail?id=2439 // http://code.google.com/p/k9mail/issues/detail?id=2439
// Re-enable themeing support in preferences when // Re-enable themeing support in preferences when
@ -30,8 +28,7 @@ public class K9PreferenceActivity extends PreferenceActivity
* *
* @return The {@link ListPreference} instance identified by {@code key}. * @return The {@link ListPreference} instance identified by {@code key}.
*/ */
protected ListPreference setupListPreference(final String key, final String value) protected ListPreference setupListPreference(final String key, final String value) {
{
final ListPreference prefView = (ListPreference) findPreference(key); final ListPreference prefView = (ListPreference) findPreference(key);
prefView.setValue(value); prefView.setValue(value);
prefView.setSummary(prefView.getEntry()); prefView.setSummary(prefView.getEntry());
@ -53,8 +50,7 @@ public class K9PreferenceActivity extends PreferenceActivity
* entry from entries is selected. * entry from entries is selected.
*/ */
protected void initListPreference(final ListPreference prefView, final String value, protected void initListPreference(final ListPreference prefView, final String value,
final CharSequence[] entries, final CharSequence[] entryValues) final CharSequence[] entries, final CharSequence[] entryValues) {
{
prefView.setEntries(entries); prefView.setEntries(entries);
prefView.setEntryValues(entryValues); prefView.setEntryValues(entryValues);
prefView.setValue(value); prefView.setValue(value);
@ -65,12 +61,10 @@ public class K9PreferenceActivity extends PreferenceActivity
/** /**
* This class handles value changes of the {@link ListPreference} objects. * This class handles value changes of the {@link ListPreference} objects.
*/ */
private static class PreferenceChangeListener implements Preference.OnPreferenceChangeListener private static class PreferenceChangeListener implements Preference.OnPreferenceChangeListener {
{
private ListPreference mPrefView; private ListPreference mPrefView;
private PreferenceChangeListener(final ListPreference prefView) private PreferenceChangeListener(final ListPreference prefView) {
{
this.mPrefView = prefView; this.mPrefView = prefView;
} }
@ -78,8 +72,7 @@ public class K9PreferenceActivity extends PreferenceActivity
* Show the preference value in the preference summary field. * Show the preference value in the preference summary field.
*/ */
@Override @Override
public boolean onPreferenceChange(final Preference preference, final Object newValue) public boolean onPreferenceChange(final Preference preference, final Object newValue) {
{
final String summary = newValue.toString(); final String summary = newValue.toString();
final int index = mPrefView.findIndexOfValue(summary); final int index = mPrefView.findIndexOfValue(summary);
mPrefView.setSummary(mPrefView.getEntries()[index]); mPrefView.setSummary(mPrefView.getEntries()[index]);

View File

@ -18,19 +18,16 @@ import com.fsck.k9.K9;
import com.fsck.k9.Preferences; import com.fsck.k9.Preferences;
import com.fsck.k9.R; import com.fsck.k9.R;
public class LauncherShortcuts extends K9ListActivity implements OnItemClickListener public class LauncherShortcuts extends K9ListActivity implements OnItemClickListener {
{
private AccountsAdapter mAdapter; private AccountsAdapter mAdapter;
private FontSizes mFontSizes = K9.getFontSizes(); private FontSizes mFontSizes = K9.getFontSizes();
@Override @Override
public void onCreate(Bundle icicle) public void onCreate(Bundle icicle) {
{
super.onCreate(icicle); super.onCreate(icicle);
// finish() immediately if we aren't supposed to be here // finish() immediately if we aren't supposed to be here
if (!Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) if (!Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
{
finish(); finish();
return; return;
} }
@ -43,23 +40,20 @@ public class LauncherShortcuts extends K9ListActivity implements OnItemClickList
refresh(); refresh();
} }
private void refresh() private void refresh() {
{
Account[] accounts = Preferences.getPreferences(this).getAccounts(); Account[] accounts = Preferences.getPreferences(this).getAccounts();
mAdapter = new AccountsAdapter(accounts); mAdapter = new AccountsAdapter(accounts);
getListView().setAdapter(mAdapter); getListView().setAdapter(mAdapter);
} }
private void setupShortcut(Account account) private void setupShortcut(Account account) {
{
final Intent shortcutIntent = FolderList.actionHandleAccountIntent(this, account, null, true); final Intent shortcutIntent = FolderList.actionHandleAccountIntent(this, account, null, true);
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
String description = account.getDescription(); String description = account.getDescription();
if (description == null || description.length() == 0) if (description == null || description.length() == 0) {
{
description = account.getEmail(); description = account.getEmail();
} }
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, description); intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, description);
@ -70,38 +64,30 @@ public class LauncherShortcuts extends K9ListActivity implements OnItemClickList
finish(); finish();
} }
public void onItemClick(AdapterView<?> parent, View view, int position, long id) public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
{
Account account = (Account) parent.getItemAtPosition(position); Account account = (Account) parent.getItemAtPosition(position);
setupShortcut(account); setupShortcut(account);
} }
class AccountsAdapter extends ArrayAdapter<Account> class AccountsAdapter extends ArrayAdapter<Account> {
{ public AccountsAdapter(Account[] accounts) {
public AccountsAdapter(Account[] accounts)
{
super(LauncherShortcuts.this, 0, accounts); super(LauncherShortcuts.this, 0, accounts);
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) public View getView(int position, View convertView, ViewGroup parent) {
{
final Account account = getItem(position); final Account account = getItem(position);
final View view; final View view;
if (convertView != null) if (convertView != null) {
{
view = convertView; view = convertView;
} } else {
else
{
view = getLayoutInflater().inflate(R.layout.accounts_item, parent, false); view = getLayoutInflater().inflate(R.layout.accounts_item, parent, false);
view.findViewById(R.id.active_icons).setVisibility(View.GONE); view.findViewById(R.id.active_icons).setVisibility(View.GONE);
} }
AccountViewHolder holder = (AccountViewHolder) view.getTag(); AccountViewHolder holder = (AccountViewHolder) view.getTag();
if (holder == null) if (holder == null) {
{
holder = new AccountViewHolder(); holder = new AccountViewHolder();
holder.description = (TextView) view.findViewById(R.id.description); holder.description = (TextView) view.findViewById(R.id.description);
holder.email = (TextView) view.findViewById(R.id.email); holder.email = (TextView) view.findViewById(R.id.email);
@ -111,18 +97,14 @@ public class LauncherShortcuts extends K9ListActivity implements OnItemClickList
} }
String description = account.getDescription(); String description = account.getDescription();
if (account.getEmail().equals(description)) if (account.getEmail().equals(description)) {
{
holder.email.setVisibility(View.GONE); holder.email.setVisibility(View.GONE);
} } else {
else
{
holder.email.setVisibility(View.VISIBLE); holder.email.setVisibility(View.VISIBLE);
holder.email.setText(account.getEmail()); holder.email.setText(account.getEmail());
} }
if (description == null || description.length() == 0) if (description == null || description.length() == 0) {
{
description = account.getEmail(); description = account.getEmail();
} }
@ -137,8 +119,7 @@ public class LauncherShortcuts extends K9ListActivity implements OnItemClickList
return view; return view;
} }
class AccountViewHolder class AccountViewHolder {
{
public TextView description; public TextView description;
public TextView email; public TextView email;
public View chip; public View chip;

View File

@ -11,20 +11,16 @@ import com.fsck.k9.Identity;
import com.fsck.k9.Preferences; import com.fsck.k9.Preferences;
import com.fsck.k9.R; import com.fsck.k9.R;
public class ManageIdentities extends ChooseIdentity public class ManageIdentities extends ChooseIdentity {
{
private boolean mIdentitiesChanged = false; private boolean mIdentitiesChanged = false;
public static final String EXTRA_IDENTITIES = "com.fsck.k9.EditIdentity_identities"; public static final String EXTRA_IDENTITIES = "com.fsck.k9.EditIdentity_identities";
private static final int ACTIVITY_EDIT_IDENTITY = 1; private static final int ACTIVITY_EDIT_IDENTITY = 1;
@Override @Override
protected void setupClickListeners() protected void setupClickListeners() {
{ this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
editItem(position); editItem(position);
} }
}); });
@ -33,8 +29,7 @@ public class ManageIdentities extends ChooseIdentity
registerForContextMenu(listView); registerForContextMenu(listView);
} }
private void editItem(int i) private void editItem(int i) {
{
Intent intent = new Intent(ManageIdentities.this, EditIdentity.class); Intent intent = new Intent(ManageIdentities.this, EditIdentity.class);
intent.putExtra(EditIdentity.EXTRA_ACCOUNT, mAccount.getUuid()); intent.putExtra(EditIdentity.EXTRA_ACCOUNT, mAccount.getUuid());
intent.putExtra(EditIdentity.EXTRA_IDENTITY, mAccount.getIdentity(i)); intent.putExtra(EditIdentity.EXTRA_IDENTITY, mAccount.getIdentity(i));
@ -43,18 +38,15 @@ public class ManageIdentities extends ChooseIdentity
} }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) public boolean onCreateOptionsMenu(Menu menu) {
{
super.onCreateOptionsMenu(menu); super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.manage_identities_option, menu); getMenuInflater().inflate(R.menu.manage_identities_option, menu);
return true; return true;
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) public boolean onOptionsItemSelected(MenuItem item) {
{ switch (item.getItemId()) {
switch (item.getItemId())
{
case R.id.new_identity: case R.id.new_identity:
Intent intent = new Intent(ManageIdentities.this, EditIdentity.class); Intent intent = new Intent(ManageIdentities.this, EditIdentity.class);
intent.putExtra(EditIdentity.EXTRA_ACCOUNT, mAccount.getUuid()); intent.putExtra(EditIdentity.EXTRA_ACCOUNT, mAccount.getUuid());
@ -67,25 +59,21 @@ public class ManageIdentities extends ChooseIdentity
} }
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
{
super.onCreateContextMenu(menu, v, menuInfo); super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(R.string.manage_identities_context_menu_title); menu.setHeaderTitle(R.string.manage_identities_context_menu_title);
getMenuInflater().inflate(R.menu.manage_identities_context, menu); getMenuInflater().inflate(R.menu.manage_identities_context, menu);
} }
@Override @Override
public boolean onContextItemSelected(MenuItem item) public boolean onContextItemSelected(MenuItem item) {
{
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo(); AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
switch (item.getItemId()) switch (item.getItemId()) {
{
case R.id.edit: case R.id.edit:
editItem(menuInfo.position); editItem(menuInfo.position);
break; break;
case R.id.up: case R.id.up:
if (menuInfo.position > 0) if (menuInfo.position > 0) {
{
Identity identity = identities.remove(menuInfo.position); Identity identity = identities.remove(menuInfo.position);
identities.add(menuInfo.position - 1, identity); identities.add(menuInfo.position - 1, identity);
mIdentitiesChanged = true; mIdentitiesChanged = true;
@ -94,8 +82,7 @@ public class ManageIdentities extends ChooseIdentity
break; break;
case R.id.down: case R.id.down:
if (menuInfo.position < identities.size() - 1) if (menuInfo.position < identities.size() - 1) {
{
Identity identity = identities.remove(menuInfo.position); Identity identity = identities.remove(menuInfo.position);
identities.add(menuInfo.position + 1, identity); identities.add(menuInfo.position + 1, identity);
mIdentitiesChanged = true; mIdentitiesChanged = true;
@ -109,14 +96,11 @@ public class ManageIdentities extends ChooseIdentity
refreshView(); refreshView();
break; break;
case R.id.remove: case R.id.remove:
if (identities.size() > 1) if (identities.size() > 1) {
{
identities.remove(menuInfo.position); identities.remove(menuInfo.position);
mIdentitiesChanged = true; mIdentitiesChanged = true;
refreshView(); refreshView();
} } else {
else
{
Toast.makeText(this, getString(R.string.no_removable_identity), Toast.makeText(this, getString(R.string.no_removable_identity),
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
} }
@ -127,8 +111,7 @@ public class ManageIdentities extends ChooseIdentity
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
//mAccount.refresh(Preferences.getPreferences(getApplication().getApplicationContext())); //mAccount.refresh(Preferences.getPreferences(getApplication().getApplicationContext()));
refreshView(); refreshView();
@ -136,19 +119,15 @@ public class ManageIdentities extends ChooseIdentity
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
saveIdentities(); saveIdentities();
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
private void saveIdentities() private void saveIdentities() {
{ if (mIdentitiesChanged) {
if (mIdentitiesChanged)
{
mAccount.setIdentities(identities); mAccount.setIdentities(identities);
mAccount.save(Preferences.getPreferences(getApplication().getApplicationContext())); mAccount.save(Preferences.getPreferences(getApplication().getApplicationContext()));
} }

File diff suppressed because it is too large Load Diff

View File

@ -4,8 +4,7 @@ import java.util.Date;
import com.fsck.k9.helper.MessageHelper; import com.fsck.k9.helper.MessageHelper;
import com.fsck.k9.mail.store.LocalStore.LocalMessage; import com.fsck.k9.mail.store.LocalStore.LocalMessage;
public class MessageInfoHolder public class MessageInfoHolder {
{
public String date; public String date;
public Date compareDate; public Date compareDate;
public String compareSubject; public String compareSubject;
@ -27,16 +26,13 @@ public class MessageInfoHolder
public String uri; public String uri;
// Empty constructor for comparison // Empty constructor for comparison
public MessageInfoHolder() public MessageInfoHolder() {
{
this.selected = false; this.selected = false;
} }
@Override @Override
public boolean equals(Object o) public boolean equals(Object o) {
{ if (o instanceof MessageInfoHolder == false) {
if (o instanceof MessageInfoHolder == false)
{
return false; return false;
} }
MessageInfoHolder other = (MessageInfoHolder)o; MessageInfoHolder other = (MessageInfoHolder)o;
@ -44,15 +40,12 @@ public class MessageInfoHolder
} }
@Override @Override
public int hashCode() public int hashCode() {
{
return uid.hashCode(); return uid.hashCode();
} }
public String getDate(MessageHelper messageHelper) public String getDate(MessageHelper messageHelper) {
{ if (date == null) {
if (date == null)
{
date = messageHelper.formatDate(message.getSentDate()); date = messageHelper.formatDate(message.getSentDate());
} }
return date; return date;

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,7 @@ import com.fsck.k9.mail.MessagingException;
import java.io.Serializable; import java.io.Serializable;
import java.util.StringTokenizer; import java.util.StringTokenizer;
public class MessageReference implements Serializable public class MessageReference implements Serializable {
{
private static final long serialVersionUID = -1625198750239083389L; private static final long serialVersionUID = -1625198750239083389L;
public String accountUuid; public String accountUuid;
public String folderName; public String folderName;
@ -20,8 +19,7 @@ public class MessageReference implements Serializable
/** /**
* Initialize an empty MessageReference. * Initialize an empty MessageReference.
*/ */
public MessageReference() public MessageReference() {
{
} }
// Version identifier for use when serializing. This will allow us to introduce future versions // Version identifier for use when serializing. This will allow us to introduce future versions
@ -34,42 +32,33 @@ public class MessageReference implements Serializable
* @param identity Serialized identity. * @param identity Serialized identity.
* @throws MessagingException On missing or corrupted identity. * @throws MessagingException On missing or corrupted identity.
*/ */
public MessageReference(final String identity) throws MessagingException public MessageReference(final String identity) throws MessagingException {
{
// Can't be null and must be at least length one so we can check the version. // Can't be null and must be at least length one so we can check the version.
if (identity == null || identity.length() < 1) if (identity == null || identity.length() < 1) {
{
throw new MessagingException("Null or truncated MessageReference identity."); throw new MessagingException("Null or truncated MessageReference identity.");
} }
// Version check. // Version check.
if (identity.charAt(0) == IDENTITY_VERSION_1.charAt(0)) if (identity.charAt(0) == IDENTITY_VERSION_1.charAt(0)) {
{
// Split the identity, stripping away the first two characters representing the version and delimiter. // Split the identity, stripping away the first two characters representing the version and delimiter.
StringTokenizer tokens = new StringTokenizer(identity.substring(2), IDENTITY_SEPARATOR, false); StringTokenizer tokens = new StringTokenizer(identity.substring(2), IDENTITY_SEPARATOR, false);
if (tokens.countTokens() >= 3) if (tokens.countTokens() >= 3) {
{
accountUuid = Utility.base64Decode(tokens.nextToken()); accountUuid = Utility.base64Decode(tokens.nextToken());
folderName = Utility.base64Decode(tokens.nextToken()); folderName = Utility.base64Decode(tokens.nextToken());
uid = Utility.base64Decode(tokens.nextToken()); uid = Utility.base64Decode(tokens.nextToken());
if (tokens.hasMoreTokens()) if (tokens.hasMoreTokens()) {
{
final String flagString = tokens.nextToken(); final String flagString = tokens.nextToken();
try try {
{
flag = Flag.valueOf(flagString); flag = Flag.valueOf(flagString);
} catch (IllegalArgumentException ie) } catch (IllegalArgumentException ie) {
{
throw new MessagingException("Could not thaw message flag '" + flagString + "'", ie); throw new MessagingException("Could not thaw message flag '" + flagString + "'", ie);
} }
} }
if (K9.DEBUG) if (K9.DEBUG)
Log.d(K9.LOG_TAG, "Thawed " + toString()); Log.d(K9.LOG_TAG, "Thawed " + toString());
} } else {
else
{
throw new MessagingException("Invalid MessageReference in " + identity + " identity."); throw new MessagingException("Invalid MessageReference in " + identity + " identity.");
} }
} }
@ -80,8 +69,7 @@ public class MessageReference implements Serializable
* *
* @return Serialized string. * @return Serialized string.
*/ */
public String toIdentityString() public String toIdentityString() {
{
StringBuilder refString = new StringBuilder(); StringBuilder refString = new StringBuilder();
refString.append(IDENTITY_VERSION_1); refString.append(IDENTITY_VERSION_1);
@ -91,8 +79,7 @@ public class MessageReference implements Serializable
refString.append(Utility.base64Encode(folderName)); refString.append(Utility.base64Encode(folderName));
refString.append(IDENTITY_SEPARATOR); refString.append(IDENTITY_SEPARATOR);
refString.append(Utility.base64Encode(uid)); refString.append(Utility.base64Encode(uid));
if (flag != null) if (flag != null) {
{
refString.append(IDENTITY_SEPARATOR); refString.append(IDENTITY_SEPARATOR);
refString.append(flag.name()); refString.append(flag.name());
} }
@ -101,25 +88,21 @@ public class MessageReference implements Serializable
} }
@Override @Override
public boolean equals(Object o) public boolean equals(Object o) {
{ if (o instanceof MessageReference == false) {
if (o instanceof MessageReference == false)
{
return false; return false;
} }
MessageReference other = (MessageReference)o; MessageReference other = (MessageReference)o;
if ((accountUuid == other.accountUuid || (accountUuid != null && accountUuid.equals(other.accountUuid))) if ((accountUuid == other.accountUuid || (accountUuid != null && accountUuid.equals(other.accountUuid)))
&& (folderName == other.folderName || (folderName != null && folderName.equals(other.folderName))) && (folderName == other.folderName || (folderName != null && folderName.equals(other.folderName)))
&& (uid == other.uid || (uid != null && uid.equals(other.uid)))) && (uid == other.uid || (uid != null && uid.equals(other.uid)))) {
{
return true; return true;
} }
return false; return false;
} }
@Override @Override
public int hashCode() public int hashCode() {
{
final int MULTIPLIER = 31; final int MULTIPLIER = 31;
int result = 1; int result = 1;
@ -130,8 +113,7 @@ public class MessageReference implements Serializable
} }
@Override @Override
public String toString() public String toString() {
{
return "MessageReference{" + return "MessageReference{" +
"accountUuid='" + accountUuid + '\'' + "accountUuid='" + accountUuid + '\'' +
", folderName='" + folderName + '\'' + ", folderName='" + folderName + '\'' +

File diff suppressed because it is too large Load Diff

View File

@ -13,50 +13,40 @@ import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
public class PasswordEntryDialog public class PasswordEntryDialog {
{ public interface PasswordEntryListener {
public interface PasswordEntryListener
{
void passwordChosen(String chosenPassword); void passwordChosen(String chosenPassword);
void cancel(); void cancel();
} }
PasswordEntryListener listener; PasswordEntryListener listener;
private EditText passwordView; private EditText passwordView;
AlertDialog dialog; AlertDialog dialog;
public PasswordEntryDialog(Context context, String headerText, PasswordEntryListener listener ) public PasswordEntryDialog(Context context, String headerText, PasswordEntryListener listener) {
{
this.listener = listener; this.listener = listener;
View view = LayoutInflater.from(context).inflate(R.layout.password_entry_dialog, null); View view = LayoutInflater.from(context).inflate(R.layout.password_entry_dialog, null);
Builder builder = new AlertDialog.Builder(context); Builder builder = new AlertDialog.Builder(context);
passwordView = (EditText)view.findViewById(R.id.password_text_box); passwordView = (EditText)view.findViewById(R.id.password_text_box);
builder.setView(view); builder.setView(view);
builder.setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() builder.setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() {
{
@Override @Override
public void onClick(DialogInterface dialog, int which) public void onClick(DialogInterface dialog, int which) {
{ if (PasswordEntryDialog.this.listener != null) {
if (PasswordEntryDialog.this.listener != null)
{
String chosenPassword = passwordView.getText().toString(); String chosenPassword = passwordView.getText().toString();
PasswordEntryDialog.this.listener.passwordChosen(chosenPassword); PasswordEntryDialog.this.listener.passwordChosen(chosenPassword);
} }
} }
}); });
builder.setNegativeButton(R.string.cancel_action, new DialogInterface.OnClickListener() builder.setNegativeButton(R.string.cancel_action, new DialogInterface.OnClickListener() {
{
@Override @Override
public void onClick(DialogInterface dialog, int which) public void onClick(DialogInterface dialog, int which) {
{ if (PasswordEntryDialog.this.listener != null) {
if (PasswordEntryDialog.this.listener != null)
{
PasswordEntryDialog.this.listener.cancel(); PasswordEntryDialog.this.listener.cancel();
} }
} }
}); });
dialog = builder.create(); dialog = builder.create();
passwordView.addTextChangedListener(new TextWatcher() passwordView.addTextChangedListener(new TextWatcher() {
{
@Override @Override
public void afterTextChanged(Editable arg0) { } public void afterTextChanged(Editable arg0) { }
@ -66,8 +56,7 @@ public class PasswordEntryDialog
@Override @Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) int arg3) {
{
Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
String chosenPassword = passwordView.getText().toString(); String chosenPassword = passwordView.getText().toString();
@ -80,8 +69,7 @@ public class PasswordEntryDialog
} }
public void show() public void show() {
{
dialog.show(); dialog.show();
Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
okButton.setEnabled(false); okButton.setEnabled(false);

View File

@ -6,8 +6,7 @@ import android.content.Context;
/** /**
* A listener that the user can register for global, persistent progress events. * A listener that the user can register for global, persistent progress events.
*/ */
public interface ProgressListener public interface ProgressListener {
{
/** /**
* @param context * @param context
* @param title * @param title

View File

@ -1,6 +1,5 @@
package com.fsck.k9.activity; package com.fsck.k9.activity;
public interface Progressable public interface Progressable {
{
public void setProgress(boolean progress); public void setProgress(boolean progress);
} }

View File

@ -2,7 +2,6 @@ package com.fsck.k9.activity;
import com.fsck.k9.activity.MessageList; import com.fsck.k9.activity.MessageList;
public class Search extends MessageList public class Search extends MessageList {
{
} }

View File

@ -6,16 +6,14 @@ package com.fsck.k9.activity;
import com.fsck.k9.R; import com.fsck.k9.R;
import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Flag;
enum SearchModifier enum SearchModifier {
{
FLAGGED(R.string.flagged_modifier, new Flag[] { Flag.FLAGGED}, null), UNREAD(R.string.unread_modifier, null, new Flag[] { Flag.SEEN}); FLAGGED(R.string.flagged_modifier, new Flag[] { Flag.FLAGGED}, null), UNREAD(R.string.unread_modifier, null, new Flag[] { Flag.SEEN});
final int resId; final int resId;
final Flag[] requiredFlags; final Flag[] requiredFlags;
final Flag[] forbiddenFlags; final Flag[] forbiddenFlags;
SearchModifier(int nResId, Flag[] nRequiredFlags, Flag[] nForbiddenFlags) SearchModifier(int nResId, Flag[] nRequiredFlags, Flag[] nForbiddenFlags) {
{
resId = nResId; resId = nResId;
requiredFlags = nRequiredFlags; requiredFlags = nRequiredFlags;
forbiddenFlags = nForbiddenFlags; forbiddenFlags = nForbiddenFlags;

View File

@ -36,8 +36,7 @@ import com.fsck.k9.mail.store.StorageManager;
import com.fsck.k9.mail.store.LocalStore.LocalFolder; import com.fsck.k9.mail.store.LocalStore.LocalFolder;
public class AccountSettings extends K9PreferenceActivity public class AccountSettings extends K9PreferenceActivity {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final int SELECT_AUTO_EXPAND_FOLDER = 1; private static final int SELECT_AUTO_EXPAND_FOLDER = 1;
@ -164,29 +163,24 @@ public class AccountSettings extends K9PreferenceActivity
private ListPreference mTrashFolder; private ListPreference mTrashFolder;
public static void actionSettings(Context context, Account account) public static void actionSettings(Context context, Account account) {
{
Intent i = new Intent(context, AccountSettings.class); Intent i = new Intent(context, AccountSettings.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
context.startActivity(i); context.startActivity(i);
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
try try {
{
final Store store = mAccount.getRemoteStore(); final Store store = mAccount.getRemoteStore();
mIsPushCapable = store.isPushCapable(); mIsPushCapable = store.isPushCapable();
mIsExpungeCapable = store.isExpungeCapable(); mIsExpungeCapable = store.isExpungeCapable();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Could not get remote store", e); Log.e(K9.LOG_TAG, "Could not get remote store", e);
} }
@ -195,10 +189,8 @@ public class AccountSettings extends K9PreferenceActivity
mAccountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION); mAccountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION);
mAccountDescription.setSummary(mAccount.getDescription()); mAccountDescription.setSummary(mAccount.getDescription());
mAccountDescription.setText(mAccount.getDescription()); mAccountDescription.setText(mAccount.getDescription());
mAccountDescription.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountDescription.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
mAccountDescription.setSummary(summary); mAccountDescription.setSummary(summary);
mAccountDescription.setText(summary); mAccountDescription.setText(summary);
@ -209,10 +201,8 @@ public class AccountSettings extends K9PreferenceActivity
mMessageFormat = (ListPreference) findPreference(PREFERENCE_MESSAGE_FORMAT); mMessageFormat = (ListPreference) findPreference(PREFERENCE_MESSAGE_FORMAT);
mMessageFormat.setValue(mAccount.getMessageFormat().name()); mMessageFormat.setValue(mAccount.getMessageFormat().name());
mMessageFormat.setSummary(mMessageFormat.getEntry()); mMessageFormat.setSummary(mMessageFormat.getEntry());
mMessageFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mMessageFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mMessageFormat.findIndexOfValue(summary); int index = mMessageFormat.findIndexOfValue(summary);
mMessageFormat.setSummary(mMessageFormat.getEntries()[index]); mMessageFormat.setSummary(mMessageFormat.getEntries()[index]);
@ -224,11 +214,9 @@ public class AccountSettings extends K9PreferenceActivity
mAccountQuotePrefix = (EditTextPreference) findPreference(PREFERENCE_QUOTE_PREFIX); mAccountQuotePrefix = (EditTextPreference) findPreference(PREFERENCE_QUOTE_PREFIX);
mAccountQuotePrefix.setSummary(mAccount.getQuotePrefix()); mAccountQuotePrefix.setSummary(mAccount.getQuotePrefix());
mAccountQuotePrefix.setText(mAccount.getQuotePrefix()); mAccountQuotePrefix.setText(mAccount.getQuotePrefix());
mAccountQuotePrefix.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountQuotePrefix.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) public boolean onPreferenceChange(Preference preference, Object newValue) {
{
final String value = newValue.toString(); final String value = newValue.toString();
mAccountQuotePrefix.setSummary(value); mAccountQuotePrefix.setSummary(value);
mAccountQuotePrefix.setText(value); mAccountQuotePrefix.setText(value);
@ -241,21 +229,16 @@ public class AccountSettings extends K9PreferenceActivity
mComposingScreen = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_COMPOSING); mComposingScreen = (PreferenceScreen) findPreference(PREFERENCE_SCREEN_COMPOSING);
Preference.OnPreferenceChangeListener quoteStyleListener = new Preference.OnPreferenceChangeListener() Preference.OnPreferenceChangeListener quoteStyleListener = new Preference.OnPreferenceChangeListener() {
{
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) public boolean onPreferenceChange(Preference preference, Object newValue) {
{
final QuoteStyle style = QuoteStyle.valueOf(newValue.toString()); final QuoteStyle style = QuoteStyle.valueOf(newValue.toString());
int index = mQuoteStyle.findIndexOfValue(newValue.toString()); int index = mQuoteStyle.findIndexOfValue(newValue.toString());
mQuoteStyle.setSummary(mQuoteStyle.getEntries()[index]); mQuoteStyle.setSummary(mQuoteStyle.getEntries()[index]);
if (style == QuoteStyle.PREFIX) if (style == QuoteStyle.PREFIX) {
{
mComposingScreen.addPreference(mAccountQuotePrefix); mComposingScreen.addPreference(mAccountQuotePrefix);
mComposingScreen.addPreference(mReplyAfterQuote); mComposingScreen.addPreference(mReplyAfterQuote);
} } else if (style == QuoteStyle.HEADER) {
else if (style == QuoteStyle.HEADER)
{
mComposingScreen.removePreference(mAccountQuotePrefix); mComposingScreen.removePreference(mAccountQuotePrefix);
mComposingScreen.removePreference(mReplyAfterQuote); mComposingScreen.removePreference(mReplyAfterQuote);
} }
@ -273,10 +256,8 @@ public class AccountSettings extends K9PreferenceActivity
mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY); mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY);
mCheckFrequency.setValue(String.valueOf(mAccount.getAutomaticCheckIntervalMinutes())); mCheckFrequency.setValue(String.valueOf(mAccount.getAutomaticCheckIntervalMinutes()));
mCheckFrequency.setSummary(mCheckFrequency.getEntry()); mCheckFrequency.setSummary(mCheckFrequency.getEntry());
mCheckFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mCheckFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mCheckFrequency.findIndexOfValue(summary); int index = mCheckFrequency.findIndexOfValue(summary);
mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]); mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]);
@ -288,10 +269,8 @@ public class AccountSettings extends K9PreferenceActivity
mDisplayMode = (ListPreference) findPreference(PREFERENCE_DISPLAY_MODE); mDisplayMode = (ListPreference) findPreference(PREFERENCE_DISPLAY_MODE);
mDisplayMode.setValue(mAccount.getFolderDisplayMode().name()); mDisplayMode.setValue(mAccount.getFolderDisplayMode().name());
mDisplayMode.setSummary(mDisplayMode.getEntry()); mDisplayMode.setSummary(mDisplayMode.getEntry());
mDisplayMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mDisplayMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mDisplayMode.findIndexOfValue(summary); int index = mDisplayMode.findIndexOfValue(summary);
mDisplayMode.setSummary(mDisplayMode.getEntries()[index]); mDisplayMode.setSummary(mDisplayMode.getEntries()[index]);
@ -303,10 +282,8 @@ public class AccountSettings extends K9PreferenceActivity
mSyncMode = (ListPreference) findPreference(PREFERENCE_SYNC_MODE); mSyncMode = (ListPreference) findPreference(PREFERENCE_SYNC_MODE);
mSyncMode.setValue(mAccount.getFolderSyncMode().name()); mSyncMode.setValue(mAccount.getFolderSyncMode().name());
mSyncMode.setSummary(mSyncMode.getEntry()); mSyncMode.setSummary(mSyncMode.getEntry());
mSyncMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mSyncMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mSyncMode.findIndexOfValue(summary); int index = mSyncMode.findIndexOfValue(summary);
mSyncMode.setSummary(mSyncMode.getEntries()[index]); mSyncMode.setSummary(mSyncMode.getEntries()[index]);
@ -319,10 +296,8 @@ public class AccountSettings extends K9PreferenceActivity
mPushMode.setEnabled(mIsPushCapable); mPushMode.setEnabled(mIsPushCapable);
mPushMode.setValue(mAccount.getFolderPushMode().name()); mPushMode.setValue(mAccount.getFolderPushMode().name());
mPushMode.setSummary(mPushMode.getEntry()); mPushMode.setSummary(mPushMode.getEntry());
mPushMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mPushMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mPushMode.findIndexOfValue(summary); int index = mPushMode.findIndexOfValue(summary);
mPushMode.setSummary(mPushMode.getEntries()[index]); mPushMode.setSummary(mPushMode.getEntries()[index]);
@ -334,10 +309,8 @@ public class AccountSettings extends K9PreferenceActivity
mTargetMode = (ListPreference) findPreference(PREFERENCE_TARGET_MODE); mTargetMode = (ListPreference) findPreference(PREFERENCE_TARGET_MODE);
mTargetMode.setValue(mAccount.getFolderTargetMode().name()); mTargetMode.setValue(mAccount.getFolderTargetMode().name());
mTargetMode.setSummary(mTargetMode.getEntry()); mTargetMode.setSummary(mTargetMode.getEntry());
mTargetMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mTargetMode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mTargetMode.findIndexOfValue(summary); int index = mTargetMode.findIndexOfValue(summary);
mTargetMode.setSummary(mTargetMode.getEntries()[index]); mTargetMode.setSummary(mTargetMode.getEntries()[index]);
@ -349,10 +322,8 @@ public class AccountSettings extends K9PreferenceActivity
mDeletePolicy = (ListPreference) findPreference(PREFERENCE_DELETE_POLICY); mDeletePolicy = (ListPreference) findPreference(PREFERENCE_DELETE_POLICY);
mDeletePolicy.setValue("" + mAccount.getDeletePolicy()); mDeletePolicy.setValue("" + mAccount.getDeletePolicy());
mDeletePolicy.setSummary(mDeletePolicy.getEntry()); mDeletePolicy.setSummary(mDeletePolicy.getEntry());
mDeletePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mDeletePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mDeletePolicy.findIndexOfValue(summary); int index = mDeletePolicy.findIndexOfValue(summary);
mDeletePolicy.setSummary(mDeletePolicy.getEntries()[index]); mDeletePolicy.setSummary(mDeletePolicy.getEntries()[index]);
@ -365,10 +336,8 @@ public class AccountSettings extends K9PreferenceActivity
mExpungePolicy.setEnabled(mIsExpungeCapable); mExpungePolicy.setEnabled(mIsExpungeCapable);
mExpungePolicy.setValue(mAccount.getExpungePolicy()); mExpungePolicy.setValue(mAccount.getExpungePolicy());
mExpungePolicy.setSummary(mExpungePolicy.getEntry()); mExpungePolicy.setSummary(mExpungePolicy.getEntry());
mExpungePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mExpungePolicy.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mExpungePolicy.findIndexOfValue(summary); int index = mExpungePolicy.findIndexOfValue(summary);
mExpungePolicy.setSummary(mExpungePolicy.getEntries()[index]); mExpungePolicy.setSummary(mExpungePolicy.getEntries()[index]);
@ -386,10 +355,8 @@ public class AccountSettings extends K9PreferenceActivity
mSearchableFolders = (ListPreference) findPreference(PREFERENCE_SEARCHABLE_FOLDERS); mSearchableFolders = (ListPreference) findPreference(PREFERENCE_SEARCHABLE_FOLDERS);
mSearchableFolders.setValue(mAccount.getSearchableFolders().name()); mSearchableFolders.setValue(mAccount.getSearchableFolders().name());
mSearchableFolders.setSummary(mSearchableFolders.getEntry()); mSearchableFolders.setSummary(mSearchableFolders.getEntry());
mSearchableFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mSearchableFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mSearchableFolders.findIndexOfValue(summary); int index = mSearchableFolders.findIndexOfValue(summary);
mSearchableFolders.setSummary(mSearchableFolders.getEntries()[index]); mSearchableFolders.setSummary(mSearchableFolders.getEntries()[index]);
@ -401,10 +368,8 @@ public class AccountSettings extends K9PreferenceActivity
mDisplayCount = (ListPreference) findPreference(PREFERENCE_DISPLAY_COUNT); mDisplayCount = (ListPreference) findPreference(PREFERENCE_DISPLAY_COUNT);
mDisplayCount.setValue(String.valueOf(mAccount.getDisplayCount())); mDisplayCount.setValue(String.valueOf(mAccount.getDisplayCount()));
mDisplayCount.setSummary(mDisplayCount.getEntry()); mDisplayCount.setSummary(mDisplayCount.getEntry());
mDisplayCount.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mDisplayCount.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mDisplayCount.findIndexOfValue(summary); int index = mDisplayCount.findIndexOfValue(summary);
mDisplayCount.setSummary(mDisplayCount.getEntries()[index]); mDisplayCount.setSummary(mDisplayCount.getEntries()[index]);
@ -416,10 +381,8 @@ public class AccountSettings extends K9PreferenceActivity
mMessageAge = (ListPreference) findPreference(PREFERENCE_MESSAGE_AGE); mMessageAge = (ListPreference) findPreference(PREFERENCE_MESSAGE_AGE);
mMessageAge.setValue(String.valueOf(mAccount.getMaximumPolledMessageAge())); mMessageAge.setValue(String.valueOf(mAccount.getMaximumPolledMessageAge()));
mMessageAge.setSummary(mMessageAge.getEntry()); mMessageAge.setSummary(mMessageAge.getEntry());
mMessageAge.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mMessageAge.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mMessageAge.findIndexOfValue(summary); int index = mMessageAge.findIndexOfValue(summary);
mMessageAge.setSummary(mMessageAge.getEntries()[index]); mMessageAge.setSummary(mMessageAge.getEntries()[index]);
@ -431,10 +394,8 @@ public class AccountSettings extends K9PreferenceActivity
mMessageSize = (ListPreference) findPreference(PREFERENCE_MESSAGE_SIZE); mMessageSize = (ListPreference) findPreference(PREFERENCE_MESSAGE_SIZE);
mMessageSize.setValue(String.valueOf(mAccount.getMaximumAutoDownloadMessageSize())); mMessageSize.setValue(String.valueOf(mAccount.getMaximumAutoDownloadMessageSize()));
mMessageSize.setSummary(mMessageSize.getEntry()); mMessageSize.setSummary(mMessageSize.getEntry());
mMessageSize.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mMessageSize.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mMessageSize.findIndexOfValue(summary); int index = mMessageSize.findIndexOfValue(summary);
mMessageSize.setSummary(mMessageSize.getEntries()[index]); mMessageSize.setSummary(mMessageSize.getEntries()[index]);
@ -450,10 +411,8 @@ public class AccountSettings extends K9PreferenceActivity
mAccountScrollButtons = (ListPreference) findPreference(PREFERENCE_HIDE_BUTTONS); mAccountScrollButtons = (ListPreference) findPreference(PREFERENCE_HIDE_BUTTONS);
mAccountScrollButtons.setValue("" + mAccount.getScrollMessageViewButtons()); mAccountScrollButtons.setValue("" + mAccount.getScrollMessageViewButtons());
mAccountScrollButtons.setSummary(mAccountScrollButtons.getEntry()); mAccountScrollButtons.setSummary(mAccountScrollButtons.getEntry());
mAccountScrollButtons.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountScrollButtons.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mAccountScrollButtons.findIndexOfValue(summary); int index = mAccountScrollButtons.findIndexOfValue(summary);
mAccountScrollButtons.setSummary(mAccountScrollButtons.getEntries()[index]); mAccountScrollButtons.setSummary(mAccountScrollButtons.getEntries()[index]);
@ -468,10 +427,8 @@ public class AccountSettings extends K9PreferenceActivity
mAccountScrollMoveButtons = (ListPreference) findPreference(PREFERENCE_HIDE_MOVE_BUTTONS); mAccountScrollMoveButtons = (ListPreference) findPreference(PREFERENCE_HIDE_MOVE_BUTTONS);
mAccountScrollMoveButtons.setValue("" + mAccount.getScrollMessageViewMoveButtons()); mAccountScrollMoveButtons.setValue("" + mAccount.getScrollMessageViewMoveButtons());
mAccountScrollMoveButtons.setSummary(mAccountScrollMoveButtons.getEntry()); mAccountScrollMoveButtons.setSummary(mAccountScrollMoveButtons.getEntry());
mAccountScrollMoveButtons.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountScrollMoveButtons.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mAccountScrollMoveButtons.findIndexOfValue(summary); int index = mAccountScrollMoveButtons.findIndexOfValue(summary);
mAccountScrollMoveButtons.setSummary(mAccountScrollMoveButtons.getEntries()[index]); mAccountScrollMoveButtons.setSummary(mAccountScrollMoveButtons.getEntries()[index]);
@ -483,10 +440,8 @@ public class AccountSettings extends K9PreferenceActivity
mAccountShowPictures = (ListPreference) findPreference(PREFERENCE_SHOW_PICTURES); mAccountShowPictures = (ListPreference) findPreference(PREFERENCE_SHOW_PICTURES);
mAccountShowPictures.setValue("" + mAccount.getShowPictures()); mAccountShowPictures.setValue("" + mAccount.getShowPictures());
mAccountShowPictures.setSummary(mAccountShowPictures.getEntry()); mAccountShowPictures.setSummary(mAccountShowPictures.getEntry());
mAccountShowPictures.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountShowPictures.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mAccountShowPictures.findIndexOfValue(summary); int index = mAccountShowPictures.findIndexOfValue(summary);
mAccountShowPictures.setSummary(mAccountShowPictures.getEntries()[index]); mAccountShowPictures.setSummary(mAccountShowPictures.getEntries()[index]);
@ -503,8 +458,7 @@ public class AccountSettings extends K9PreferenceActivity
int i = 0; int i = 0;
final String[] providerLabels = new String[providers.size()]; final String[] providerLabels = new String[providers.size()];
final String[] providerIds = new String[providers.size()]; final String[] providerIds = new String[providers.size()];
for (final Map.Entry<String, String> entry : providers.entrySet()) for (final Map.Entry<String, String> entry : providers.entrySet()) {
{
providerIds[i] = entry.getKey(); providerIds[i] = entry.getKey();
providerLabels[i] = entry.getValue(); providerLabels[i] = entry.getValue();
i++; i++;
@ -514,10 +468,8 @@ public class AccountSettings extends K9PreferenceActivity
mLocalStorageProvider.setValue(mAccount.getLocalStorageProviderId()); mLocalStorageProvider.setValue(mAccount.getLocalStorageProviderId());
mLocalStorageProvider.setSummary(providers.get(mAccount.getLocalStorageProviderId())); mLocalStorageProvider.setSummary(providers.get(mAccount.getLocalStorageProviderId()));
mLocalStorageProvider.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mLocalStorageProvider.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
mLocalStorageProvider.setSummary(providers.get(newValue)); mLocalStorageProvider.setSummary(providers.get(newValue));
return true; return true;
} }
@ -528,16 +480,13 @@ public class AccountSettings extends K9PreferenceActivity
mPushPollOnConnect = (CheckBoxPreference) findPreference(PREFERENCE_PUSH_POLL_ON_CONNECT); mPushPollOnConnect = (CheckBoxPreference) findPreference(PREFERENCE_PUSH_POLL_ON_CONNECT);
mIdleRefreshPeriod = (ListPreference) findPreference(PREFERENCE_IDLE_REFRESH_PERIOD); mIdleRefreshPeriod = (ListPreference) findPreference(PREFERENCE_IDLE_REFRESH_PERIOD);
mMaxPushFolders = (ListPreference) findPreference(PREFERENCE_MAX_PUSH_FOLDERS); mMaxPushFolders = (ListPreference) findPreference(PREFERENCE_MAX_PUSH_FOLDERS);
if (mIsPushCapable) if (mIsPushCapable) {
{
mPushPollOnConnect.setChecked(mAccount.isPushPollOnConnect()); mPushPollOnConnect.setChecked(mAccount.isPushPollOnConnect());
mIdleRefreshPeriod.setValue(String.valueOf(mAccount.getIdleRefreshMinutes())); mIdleRefreshPeriod.setValue(String.valueOf(mAccount.getIdleRefreshMinutes()));
mIdleRefreshPeriod.setSummary(mIdleRefreshPeriod.getEntry()); mIdleRefreshPeriod.setSummary(mIdleRefreshPeriod.getEntry());
mIdleRefreshPeriod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mIdleRefreshPeriod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mIdleRefreshPeriod.findIndexOfValue(summary); int index = mIdleRefreshPeriod.findIndexOfValue(summary);
mIdleRefreshPeriod.setSummary(mIdleRefreshPeriod.getEntries()[index]); mIdleRefreshPeriod.setSummary(mIdleRefreshPeriod.getEntries()[index]);
@ -548,10 +497,8 @@ public class AccountSettings extends K9PreferenceActivity
mMaxPushFolders.setValue(String.valueOf(mAccount.getMaxPushFolders())); mMaxPushFolders.setValue(String.valueOf(mAccount.getMaxPushFolders()));
mMaxPushFolders.setSummary(mMaxPushFolders.getEntry()); mMaxPushFolders.setSummary(mMaxPushFolders.getEntry());
mMaxPushFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mMaxPushFolders.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mMaxPushFolders.findIndexOfValue(summary); int index = mMaxPushFolders.findIndexOfValue(summary);
mMaxPushFolders.setSummary(mMaxPushFolders.getEntries()[index]); mMaxPushFolders.setSummary(mMaxPushFolders.getEntries()[index]);
@ -559,9 +506,7 @@ public class AccountSettings extends K9PreferenceActivity
return false; return false;
} }
}); });
} } else {
else
{
mPushPollOnConnect.setEnabled(false); mPushPollOnConnect.setEnabled(false);
mMaxPushFolders.setEnabled(false); mMaxPushFolders.setEnabled(false);
mIdleRefreshPeriod.setEnabled(false); mIdleRefreshPeriod.setEnabled(false);
@ -590,10 +535,8 @@ public class AccountSettings extends K9PreferenceActivity
mAccountVibratePattern = (ListPreference) findPreference(PREFERENCE_VIBRATE_PATTERN); mAccountVibratePattern = (ListPreference) findPreference(PREFERENCE_VIBRATE_PATTERN);
mAccountVibratePattern.setValue(String.valueOf(mAccount.getNotificationSetting().getVibratePattern())); mAccountVibratePattern.setValue(String.valueOf(mAccount.getNotificationSetting().getVibratePattern()));
mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntry()); mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntry());
mAccountVibratePattern.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountVibratePattern.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mAccountVibratePattern.findIndexOfValue(summary); int index = mAccountVibratePattern.findIndexOfValue(summary);
mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntries()[index]); mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntries()[index]);
@ -606,11 +549,9 @@ public class AccountSettings extends K9PreferenceActivity
mAccountVibrateTimes = (ListPreference) findPreference(PREFERENCE_VIBRATE_TIMES); mAccountVibrateTimes = (ListPreference) findPreference(PREFERENCE_VIBRATE_TIMES);
mAccountVibrateTimes.setValue(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes())); mAccountVibrateTimes.setValue(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes()));
mAccountVibrateTimes.setSummary(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes())); mAccountVibrateTimes.setSummary(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes()));
mAccountVibrateTimes.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAccountVibrateTimes.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) public boolean onPreferenceChange(Preference preference, Object newValue) {
{
final String value = newValue.toString(); final String value = newValue.toString();
mAccountVibrateTimes.setSummary(value); mAccountVibrateTimes.setSummary(value);
mAccountVibrateTimes.setValue(value); mAccountVibrateTimes.setValue(value);
@ -631,50 +572,40 @@ public class AccountSettings extends K9PreferenceActivity
new PopulateFolderPrefsTask().execute(); new PopulateFolderPrefsTask().execute();
mChipColor = findPreference(PREFERENCE_CHIP_COLOR); mChipColor = findPreference(PREFERENCE_CHIP_COLOR);
mChipColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() mChipColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
onChooseChipColor(); onChooseChipColor();
return false; return false;
} }
}); });
mLedColor = findPreference(PREFERENCE_LED_COLOR); mLedColor = findPreference(PREFERENCE_LED_COLOR);
mLedColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() mLedColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
onChooseLedColor(); onChooseLedColor();
return false; return false;
} }
}); });
findPreference(PREFERENCE_COMPOSITION).setOnPreferenceClickListener( findPreference(PREFERENCE_COMPOSITION).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
onCompositionSettings(); onCompositionSettings();
return true; return true;
} }
}); });
findPreference(PREFERENCE_MANAGE_IDENTITIES).setOnPreferenceClickListener( findPreference(PREFERENCE_MANAGE_IDENTITIES).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
onManageIdentities(); onManageIdentities();
return true; return true;
} }
}); });
findPreference(PREFERENCE_INCOMING).setOnPreferenceClickListener( findPreference(PREFERENCE_INCOMING).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
mIncomingChanged = true; mIncomingChanged = true;
onIncomingSettings(); onIncomingSettings();
return true; return true;
@ -682,10 +613,8 @@ public class AccountSettings extends K9PreferenceActivity
}); });
findPreference(PREFERENCE_OUTGOING).setOnPreferenceClickListener( findPreference(PREFERENCE_OUTGOING).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
onOutgoingSettings(); onOutgoingSettings();
return true; return true;
} }
@ -693,28 +622,23 @@ public class AccountSettings extends K9PreferenceActivity
mCryptoApp = (ListPreference) findPreference(PREFERENCE_CRYPTO_APP); mCryptoApp = (ListPreference) findPreference(PREFERENCE_CRYPTO_APP);
CharSequence cryptoAppEntries[] = mCryptoApp.getEntries(); CharSequence cryptoAppEntries[] = mCryptoApp.getEntries();
if (!new Apg().isAvailable(this)) if (!new Apg().isAvailable(this)) {
{
int apgIndex = mCryptoApp.findIndexOfValue(Apg.NAME); int apgIndex = mCryptoApp.findIndexOfValue(Apg.NAME);
if (apgIndex >= 0) if (apgIndex >= 0) {
{
cryptoAppEntries[apgIndex] = "APG (" + getResources().getString(R.string.account_settings_crypto_app_not_available) + ")"; cryptoAppEntries[apgIndex] = "APG (" + getResources().getString(R.string.account_settings_crypto_app_not_available) + ")";
mCryptoApp.setEntries(cryptoAppEntries); mCryptoApp.setEntries(cryptoAppEntries);
} }
} }
mCryptoApp.setValue(String.valueOf(mAccount.getCryptoApp())); mCryptoApp.setValue(String.valueOf(mAccount.getCryptoApp()));
mCryptoApp.setSummary(mCryptoApp.getEntry()); mCryptoApp.setSummary(mCryptoApp.getEntry());
mCryptoApp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mCryptoApp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
String value = newValue.toString(); String value = newValue.toString();
int index = mCryptoApp.findIndexOfValue(value); int index = mCryptoApp.findIndexOfValue(value);
mCryptoApp.setSummary(mCryptoApp.getEntries()[index]); mCryptoApp.setSummary(mCryptoApp.getEntries()[index]);
mCryptoApp.setValue(value); mCryptoApp.setValue(value);
handleCryptoAppDependencies(); handleCryptoAppDependencies();
if (Apg.NAME.equals(value)) if (Apg.NAME.equals(value)) {
{
Apg.createInstance(null).test(AccountSettings.this); Apg.createInstance(null).test(AccountSettings.this);
} }
return false; return false;
@ -727,28 +651,21 @@ public class AccountSettings extends K9PreferenceActivity
handleCryptoAppDependencies(); handleCryptoAppDependencies();
} }
private void handleCryptoAppDependencies() private void handleCryptoAppDependencies() {
{ if ("".equals(mCryptoApp.getValue())) {
if ("".equals(mCryptoApp.getValue()))
{
mCryptoAutoSignature.setEnabled(false); mCryptoAutoSignature.setEnabled(false);
} } else {
else
{
mCryptoAutoSignature.setEnabled(true); mCryptoAutoSignature.setEnabled(true);
} }
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
} }
private void saveSettings() private void saveSettings() {
{ if (mAccountDefault.isChecked()) {
if (mAccountDefault.isChecked())
{
Preferences.getPreferences(this).setDefaultAccount(mAccount); Preferences.getPreferences(this).setDefaultAccount(mAccount);
} }
@ -788,8 +705,7 @@ public class AccountSettings extends K9PreferenceActivity
mAccount.setTrashFolderName(mTrashFolder.getValue()); mAccount.setTrashFolderName(mTrashFolder.getValue());
if (mIsPushCapable) if (mIsPushCapable) {
{
mAccount.setPushPollOnConnect(mPushPollOnConnect.isChecked()); mAccount.setPushPollOnConnect(mPushPollOnConnect.isChecked());
mAccount.setIdleRefreshMinutes(Integer.parseInt(mIdleRefreshPeriod.getValue())); mAccount.setIdleRefreshMinutes(Integer.parseInt(mIdleRefreshPeriod.getValue()));
mAccount.setMaxPushFolders(Integer.parseInt(mMaxPushFolders.getValue())); mAccount.setMaxPushFolders(Integer.parseInt(mMaxPushFolders.getValue()));
@ -801,23 +717,18 @@ public class AccountSettings extends K9PreferenceActivity
boolean needsPushRestart = mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue())); boolean needsPushRestart = mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue()));
boolean displayModeChanged = mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue())); boolean displayModeChanged = mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue()));
if (mAccount.getFolderPushMode() != FolderMode.NONE) if (mAccount.getFolderPushMode() != FolderMode.NONE) {
{
needsPushRestart |= displayModeChanged; needsPushRestart |= displayModeChanged;
needsPushRestart |= mIncomingChanged; needsPushRestart |= mIncomingChanged;
} }
SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences(); SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences();
String newRingtone = prefs.getString(PREFERENCE_RINGTONE, null); String newRingtone = prefs.getString(PREFERENCE_RINGTONE, null);
if (newRingtone != null) if (newRingtone != null) {
{
mAccount.getNotificationSetting().setRing(true); mAccount.getNotificationSetting().setRing(true);
mAccount.getNotificationSetting().setRingtone(newRingtone); mAccount.getNotificationSetting().setRingtone(newRingtone);
} } else {
else if (mAccount.getNotificationSetting().shouldRing()) {
{
if (mAccount.getNotificationSetting().shouldRing())
{
mAccount.getNotificationSetting().setRingtone(null); mAccount.getNotificationSetting().setRingtone(null);
} }
} }
@ -828,28 +739,20 @@ public class AccountSettings extends K9PreferenceActivity
mAccount.setEnableMoveButtons(mAccountEnableMoveButtons.isChecked()); mAccount.setEnableMoveButtons(mAccountEnableMoveButtons.isChecked());
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
if (needsRefresh && needsPushRestart) if (needsRefresh && needsPushRestart) {
{
MailService.actionReset(this, null); MailService.actionReset(this, null);
} } else if (needsRefresh) {
else if (needsRefresh)
{
MailService.actionReschedulePoll(this, null); MailService.actionReschedulePoll(this, null);
} } else if (needsPushRestart) {
else if (needsPushRestart)
{
MailService.actionRestartPushers(this, null); MailService.actionRestartPushers(this, null);
} }
// TODO: refresh folder list here // TODO: refresh folder list here
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) public void onActivityResult(int requestCode, int resultCode, Intent data) {
{ if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) switch (requestCode) {
{
switch (requestCode)
{
case SELECT_AUTO_EXPAND_FOLDER: case SELECT_AUTO_EXPAND_FOLDER:
mAutoExpandFolder.setSummary(translateFolder(data.getStringExtra(ChooseFolder.EXTRA_NEW_FOLDER))); mAutoExpandFolder.setSummary(translateFolder(data.getStringExtra(ChooseFolder.EXTRA_NEW_FOLDER)));
break; break;
@ -859,63 +762,50 @@ public class AccountSettings extends K9PreferenceActivity
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
saveSettings(); saveSettings();
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
private void onCompositionSettings() private void onCompositionSettings() {
{
AccountSetupComposition.actionEditCompositionSettings(this, mAccount); AccountSetupComposition.actionEditCompositionSettings(this, mAccount);
} }
private void onManageIdentities() private void onManageIdentities() {
{
Intent intent = new Intent(this, ManageIdentities.class); Intent intent = new Intent(this, ManageIdentities.class);
intent.putExtra(ChooseIdentity.EXTRA_ACCOUNT, mAccount.getUuid()); intent.putExtra(ChooseIdentity.EXTRA_ACCOUNT, mAccount.getUuid());
startActivityForResult(intent, ACTIVITY_MANAGE_IDENTITIES); startActivityForResult(intent, ACTIVITY_MANAGE_IDENTITIES);
} }
private void onIncomingSettings() private void onIncomingSettings() {
{
AccountSetupIncoming.actionEditIncomingSettings(this, mAccount); AccountSetupIncoming.actionEditIncomingSettings(this, mAccount);
} }
private void onOutgoingSettings() private void onOutgoingSettings() {
{
AccountSetupOutgoing.actionEditOutgoingSettings(this, mAccount); AccountSetupOutgoing.actionEditOutgoingSettings(this, mAccount);
} }
public void onChooseChipColor() public void onChooseChipColor() {
{ new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() {
new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() public void colorChanged(int color) {
{
public void colorChanged(int color)
{
mAccount.setChipColor(color); mAccount.setChipColor(color);
} }
}, },
mAccount.getChipColor()).show(); mAccount.getChipColor()).show();
} }
public void onChooseLedColor() public void onChooseLedColor() {
{ new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() {
new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() public void colorChanged(int color) {
{
public void colorChanged(int color)
{
mAccount.getNotificationSetting().setLedColor(color); mAccount.getNotificationSetting().setLedColor(color);
} }
}, },
mAccount.getNotificationSetting().getLedColor()).show(); mAccount.getNotificationSetting().getLedColor()).show();
} }
public void onChooseAutoExpandFolder() public void onChooseAutoExpandFolder() {
{
Intent selectIntent = new Intent(this, ChooseFolder.class); Intent selectIntent = new Intent(this, ChooseFolder.class);
selectIntent.putExtra(ChooseFolder.EXTRA_ACCOUNT, mAccount.getUuid()); selectIntent.putExtra(ChooseFolder.EXTRA_ACCOUNT, mAccount.getUuid());
@ -926,32 +816,23 @@ public class AccountSettings extends K9PreferenceActivity
startActivityForResult(selectIntent, SELECT_AUTO_EXPAND_FOLDER); startActivityForResult(selectIntent, SELECT_AUTO_EXPAND_FOLDER);
} }
private String translateFolder(String in) private String translateFolder(String in) {
{ if (K9.INBOX.equalsIgnoreCase(in)) {
if (K9.INBOX.equalsIgnoreCase(in))
{
return getString(R.string.special_mailbox_name_inbox); return getString(R.string.special_mailbox_name_inbox);
} } else {
else
{
return in; return in;
} }
} }
private String reverseTranslateFolder(String in) private String reverseTranslateFolder(String in) {
{ if (getString(R.string.special_mailbox_name_inbox).equals(in)) {
if (getString(R.string.special_mailbox_name_inbox).equals(in))
{
return K9.INBOX; return K9.INBOX;
} } else {
else
{
return in; return in;
} }
} }
private void doVibrateTest(Preference preference) private void doVibrateTest(Preference preference) {
{
// Do the vibration to show the user what it's like. // Do the vibration to show the user what it's like.
Vibrator vibrate = (Vibrator)preference.getContext().getSystemService(Context.VIBRATOR_SERVICE); Vibrator vibrate = (Vibrator)preference.getContext().getSystemService(Context.VIBRATOR_SERVICE);
vibrate.vibrate(NotificationSetting.getVibration( vibrate.vibrate(NotificationSetting.getVibration(
@ -959,21 +840,16 @@ public class AccountSettings extends K9PreferenceActivity
Integer.parseInt(mAccountVibrateTimes.getValue())), -1); Integer.parseInt(mAccountVibrateTimes.getValue())), -1);
} }
private class PopulateFolderPrefsTask extends AsyncTask<Void, Void, Void> private class PopulateFolderPrefsTask extends AsyncTask<Void, Void, Void> {
{ List <? extends Folder > folders = new LinkedList<LocalFolder>();
List<? extends Folder> folders = new LinkedList<LocalFolder>();
String[] allFolderValues; String[] allFolderValues;
String[] allFolderLabels; String[] allFolderLabels;
@Override @Override
protected Void doInBackground(Void... params) protected Void doInBackground(Void... params) {
{ try {
try
{
folders = mAccount.getLocalStore().getPersonalNamespaces(false); folders = mAccount.getLocalStore().getPersonalNamespaces(false);
} } catch (Exception e) {
catch (Exception e)
{
/// this can't be checked in /// this can't be checked in
} }
allFolderValues = new String[folders.size()+2]; allFolderValues = new String[folders.size()+2];
@ -987,9 +863,8 @@ public class AccountSettings extends K9PreferenceActivity
allFolderLabels[1] = mAccount.getOutboxFolderName(); allFolderLabels[1] = mAccount.getOutboxFolderName();
int i =2; int i = 2;
for (Folder folder : folders) for (Folder folder : folders) {
{
allFolderLabels[i] = folder.getName(); allFolderLabels[i] = folder.getName();
allFolderValues[i] = folder.getName(); allFolderValues[i] = folder.getName();
i++; i++;
@ -998,8 +873,7 @@ public class AccountSettings extends K9PreferenceActivity
} }
@Override @Override
protected void onPreExecute() protected void onPreExecute() {
{
mAutoExpandFolder = (ListPreference)findPreference(PREFERENCE_AUTO_EXPAND_FOLDER); mAutoExpandFolder = (ListPreference)findPreference(PREFERENCE_AUTO_EXPAND_FOLDER);
mAutoExpandFolder.setEnabled(false); mAutoExpandFolder.setEnabled(false);
mArchiveFolder = (ListPreference)findPreference(PREFERENCE_ARCHIVE_FOLDER); mArchiveFolder = (ListPreference)findPreference(PREFERENCE_ARCHIVE_FOLDER);
@ -1018,15 +892,14 @@ public class AccountSettings extends K9PreferenceActivity
} }
@Override @Override
protected void onPostExecute(Void res) protected void onPostExecute(Void res) {
{ initListPreference(mAutoExpandFolder, mAccount.getAutoExpandFolderName(), allFolderLabels, allFolderValues);
initListPreference(mAutoExpandFolder, mAccount.getAutoExpandFolderName(), allFolderLabels,allFolderValues); initListPreference(mArchiveFolder, mAccount.getArchiveFolderName(), allFolderLabels, allFolderValues);
initListPreference(mArchiveFolder, mAccount.getArchiveFolderName(), allFolderLabels,allFolderValues); initListPreference(mDraftsFolder, mAccount.getDraftsFolderName(), allFolderLabels, allFolderValues);
initListPreference(mDraftsFolder, mAccount.getDraftsFolderName(), allFolderLabels,allFolderValues); initListPreference(mOutboxFolder, mAccount.getOutboxFolderName(), allFolderLabels, allFolderValues);
initListPreference(mOutboxFolder, mAccount.getOutboxFolderName(), allFolderLabels,allFolderValues); initListPreference(mSentFolder, mAccount.getSentFolderName(), allFolderLabels, allFolderValues);
initListPreference(mSentFolder, mAccount.getSentFolderName(), allFolderLabels,allFolderValues); initListPreference(mSpamFolder, mAccount.getSpamFolderName(), allFolderLabels, allFolderValues);
initListPreference(mSpamFolder, mAccount.getSpamFolderName(), allFolderLabels,allFolderValues); initListPreference(mTrashFolder, mAccount.getTrashFolderName(), allFolderLabels, allFolderValues);
initListPreference(mTrashFolder, mAccount.getTrashFolderName(), allFolderLabels,allFolderValues);
mAutoExpandFolder.setEnabled(true); mAutoExpandFolder.setEnabled(true);
mArchiveFolder.setEnabled(true); mArchiveFolder.setEnabled(true);
mDraftsFolder.setEnabled(true); mDraftsFolder.setEnabled(true);

View File

@ -21,8 +21,7 @@ import java.net.URI;
* passed in email address, password and makeDefault are then passed on to the * passed in email address, password and makeDefault are then passed on to the
* AccountSetupIncoming activity. * AccountSetupIncoming activity.
*/ */
public class AccountSetupAccountType extends K9Activity implements OnClickListener public class AccountSetupAccountType extends K9Activity implements OnClickListener {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";
@ -31,8 +30,7 @@ public class AccountSetupAccountType extends K9Activity implements OnClickListen
private boolean mMakeDefault; private boolean mMakeDefault;
public static void actionSelectAccountType(Context context, Account account, boolean makeDefault) public static void actionSelectAccountType(Context context, Account account, boolean makeDefault) {
{
Intent i = new Intent(context, AccountSetupAccountType.class); Intent i = new Intent(context, AccountSetupAccountType.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault);
@ -40,8 +38,7 @@ public class AccountSetupAccountType extends K9Activity implements OnClickListen
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_account_type); setContentView(R.layout.account_setup_account_type);
((Button)findViewById(R.id.pop)).setOnClickListener(this); ((Button)findViewById(R.id.pop)).setOnClickListener(this);
@ -53,61 +50,47 @@ public class AccountSetupAccountType extends K9Activity implements OnClickListen
mMakeDefault = getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false); mMakeDefault = getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false);
} }
private void onPop() private void onPop() {
{ try {
try
{
URI uri = new URI(mAccount.getStoreUri()); URI uri = new URI(mAccount.getStoreUri());
uri = new URI("pop3", uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null); uri = new URI("pop3", uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null);
mAccount.setStoreUri(uri.toString()); mAccount.setStoreUri(uri.toString());
AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault); AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault);
finish(); finish();
} } catch (Exception use) {
catch (Exception use)
{
failure(use); failure(use);
} }
} }
private void onImap() private void onImap() {
{ try {
try
{
URI uri = new URI(mAccount.getStoreUri()); URI uri = new URI(mAccount.getStoreUri());
uri = new URI("imap", uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null); uri = new URI("imap", uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null);
mAccount.setStoreUri(uri.toString()); mAccount.setStoreUri(uri.toString());
AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault); AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault);
finish(); finish();
} } catch (Exception use) {
catch (Exception use)
{
failure(use); failure(use);
} }
} }
private void onWebDav() private void onWebDav() {
{ try {
try
{
URI uri = new URI(mAccount.getStoreUri()); URI uri = new URI(mAccount.getStoreUri());
uri = new URI("webdav", uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null); uri = new URI("webdav", uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null);
mAccount.setStoreUri(uri.toString()); mAccount.setStoreUri(uri.toString());
AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault); AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault);
finish(); finish();
} } catch (Exception use) {
catch (Exception use)
{
failure(use); failure(use);
} }
} }
public void onClick(View v) public void onClick(View v) {
{ switch (v.getId()) {
switch (v.getId())
{
case R.id.pop: case R.id.pop:
onPop(); onPop();
break; break;
@ -119,8 +102,7 @@ public class AccountSetupAccountType extends K9Activity implements OnClickListen
break; break;
} }
} }
private void failure(Exception use) private void failure(Exception use) {
{
Log.e(K9.LOG_TAG, "Failure", use); Log.e(K9.LOG_TAG, "Failure", use);
String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); String toastText = getString(R.string.account_setup_bad_uri, use.getMessage());

View File

@ -35,8 +35,7 @@ import java.net.URLEncoder;
* AccountSetupAccountType activity. * AccountSetupAccountType activity.
*/ */
public class AccountSetupBasics extends K9Activity public class AccountSetupBasics extends K9Activity
implements OnClickListener, TextWatcher implements OnClickListener, TextWatcher {
{
private final static String EXTRA_ACCOUNT = "com.fsck.k9.AccountSetupBasics.account"; private final static String EXTRA_ACCOUNT = "com.fsck.k9.AccountSetupBasics.account";
private final static int DIALOG_NOTE = 1; private final static int DIALOG_NOTE = 1;
private final static String STATE_KEY_PROVIDER = private final static String STATE_KEY_PROVIDER =
@ -53,15 +52,13 @@ public class AccountSetupBasics extends K9Activity
private EmailAddressValidator mEmailValidator = new EmailAddressValidator(); private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
public static void actionNewAccount(Context context) public static void actionNewAccount(Context context) {
{
Intent i = new Intent(context, AccountSetupBasics.class); Intent i = new Intent(context, AccountSetupBasics.class);
context.startActivity(i); context.startActivity(i);
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_basics); setContentView(R.layout.account_setup_basics);
mPrefs = Preferences.getPreferences(this); mPrefs = Preferences.getPreferences(this);
@ -77,59 +74,48 @@ public class AccountSetupBasics extends K9Activity
mEmailView.addTextChangedListener(this); mEmailView.addTextChangedListener(this);
mPasswordView.addTextChangedListener(this); mPasswordView.addTextChangedListener(this);
if (mPrefs.getAccounts().length > 0) if (mPrefs.getAccounts().length > 0) {
{
mDefaultView.setVisibility(View.VISIBLE); mDefaultView.setVisibility(View.VISIBLE);
} }
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
{
String accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); String accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
} }
if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
{
mProvider = (Provider)savedInstanceState.getSerializable(STATE_KEY_PROVIDER); mProvider = (Provider)savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
} }
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
validateFields(); validateFields();
} }
@Override @Override
public void onSaveInstanceState(Bundle outState) public void onSaveInstanceState(Bundle outState) {
{
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
if (mAccount != null) if (mAccount != null) {
{
outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); outState.putString(EXTRA_ACCOUNT, mAccount.getUuid());
} }
if (mProvider != null) if (mProvider != null) {
{
outState.putSerializable(STATE_KEY_PROVIDER, mProvider); outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
} }
} }
public void afterTextChanged(Editable s) public void afterTextChanged(Editable s) {
{
validateFields(); validateFields();
} }
public void beforeTextChanged(CharSequence s, int start, int count, int after) public void beforeTextChanged(CharSequence s, int start, int count, int after) {
{
} }
public void onTextChanged(CharSequence s, int start, int before, int count) public void onTextChanged(CharSequence s, int start, int before, int count) {
{
} }
private void validateFields() private void validateFields() {
{
String email = mEmailView.getText().toString(); String email = mEmailView.getText().toString();
boolean valid = Utility.requiredFieldValid(mEmailView) boolean valid = Utility.requiredFieldValid(mEmailView)
&& Utility.requiredFieldValid(mPasswordView) && Utility.requiredFieldValid(mPasswordView)
@ -145,61 +131,45 @@ public class AccountSetupBasics extends K9Activity
Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128);
} }
private String getOwnerName() private String getOwnerName() {
{
String name = null; String name = null;
try try {
{
name = Contacts.getInstance(this).getOwnerName(); name = Contacts.getInstance(this).getOwnerName();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Could not get owner name, using default account name", e); Log.e(K9.LOG_TAG, "Could not get owner name, using default account name", e);
} }
if (name == null || name.length() == 0) if (name == null || name.length() == 0) {
{ try {
try
{
name = getDefaultAccountName(); name = getDefaultAccountName();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Could not get default account name", e); Log.e(K9.LOG_TAG, "Could not get default account name", e);
} }
} }
if (name == null) if (name == null) {
{
name = ""; name = "";
} }
return name; return name;
} }
private String getDefaultAccountName() private String getDefaultAccountName() {
{
String name = null; String name = null;
Account account = Preferences.getPreferences(this).getDefaultAccount(); Account account = Preferences.getPreferences(this).getDefaultAccount();
if (account != null) if (account != null) {
{
name = account.getName(); name = account.getName();
} }
return name; return name;
} }
@Override @Override
public Dialog onCreateDialog(int id) public Dialog onCreateDialog(int id) {
{ if (id == DIALOG_NOTE) {
if (id == DIALOG_NOTE) if (mProvider != null && mProvider.note != null) {
{
if (mProvider != null && mProvider.note != null)
{
return new AlertDialog.Builder(this) return new AlertDialog.Builder(this)
.setMessage(mProvider.note) .setMessage(mProvider.note)
.setPositiveButton( .setPositiveButton(
getString(R.string.okay_action), getString(R.string.okay_action),
new DialogInterface.OnClickListener() new DialogInterface.OnClickListener() {
{ public void onClick(DialogInterface dialog, int which) {
public void onClick(DialogInterface dialog, int which)
{
finishAutoSetup(); finishAutoSetup();
} }
}) })
@ -212,8 +182,7 @@ public class AccountSetupBasics extends K9Activity
return null; return null;
} }
private void finishAutoSetup() private void finishAutoSetup() {
{
String email = mEmailView.getText().toString(); String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString(); String password = mPasswordView.getText().toString();
String[] emailParts = splitEmail(email); String[] emailParts = splitEmail(email);
@ -221,8 +190,7 @@ public class AccountSetupBasics extends K9Activity
String domain = emailParts[1]; String domain = emailParts[1];
URI incomingUri = null; URI incomingUri = null;
URI outgoingUri = null; URI outgoingUri = null;
try try {
{
String userEnc = URLEncoder.encode(user, "UTF-8"); String userEnc = URLEncoder.encode(user, "UTF-8");
String passwordEnc = URLEncoder.encode(password, "UTF-8"); String passwordEnc = URLEncoder.encode(password, "UTF-8");
@ -258,14 +226,10 @@ public class AccountSetupBasics extends K9Activity
mAccount.setOutboxFolderName(getString(R.string.special_mailbox_name_outbox)); mAccount.setOutboxFolderName(getString(R.string.special_mailbox_name_outbox));
mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent)); mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent));
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, true); AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, true);
} } catch (UnsupportedEncodingException enc) {
catch (UnsupportedEncodingException enc)
{
// This really shouldn't happen since the encoding is hardcoded to UTF-8 // This really shouldn't happen since the encoding is hardcoded to UTF-8
Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc); Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc);
} } catch (URISyntaxException use) {
catch (URISyntaxException use)
{
/* /*
* If there is some problem with the URI we give up and go on to * If there is some problem with the URI we give up and go on to
* manual setup. * manual setup.
@ -275,14 +239,12 @@ public class AccountSetupBasics extends K9Activity
} }
@Override @Override
protected void onNext() protected void onNext() {
{
String email = mEmailView.getText().toString(); String email = mEmailView.getText().toString();
String[] emailParts = splitEmail(email); String[] emailParts = splitEmail(email);
String domain = emailParts[1]; String domain = emailParts[1];
mProvider = findProviderForDomain(domain); mProvider = findProviderForDomain(domain);
if (mProvider == null) if (mProvider == null) {
{
/* /*
* We don't have default settings for this account, start the manual * We don't have default settings for this account, start the manual
* setup process. * setup process.
@ -291,25 +253,19 @@ public class AccountSetupBasics extends K9Activity
return; return;
} }
if (mProvider.note != null) if (mProvider.note != null) {
{
showDialog(DIALOG_NOTE); showDialog(DIALOG_NOTE);
} } else {
else
{
finishAutoSetup(); finishAutoSetup();
} }
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) public void onActivityResult(int requestCode, int resultCode, Intent data) {
{ if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK)
{
mAccount.setDescription(mAccount.getEmail()); mAccount.setDescription(mAccount.getEmail());
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
if (mDefaultView.isChecked()) if (mDefaultView.isChecked()) {
{
Preferences.getPreferences(this).setDefaultAccount(mAccount); Preferences.getPreferences(this).setDefaultAccount(mAccount);
} }
K9.setServicesEnabled(this); K9.setServicesEnabled(this);
@ -318,8 +274,7 @@ public class AccountSetupBasics extends K9Activity
} }
} }
private void onManualSetup() private void onManualSetup() {
{
String email = mEmailView.getText().toString(); String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString(); String password = mPasswordView.getText().toString();
String[] emailParts = splitEmail(email); String[] emailParts = splitEmail(email);
@ -329,8 +284,7 @@ public class AccountSetupBasics extends K9Activity
mAccount = Preferences.getPreferences(this).newAccount(); mAccount = Preferences.getPreferences(this).newAccount();
mAccount.setName(getOwnerName()); mAccount.setName(getOwnerName());
mAccount.setEmail(email); mAccount.setEmail(email);
try try {
{
String userEnc = URLEncoder.encode(user, "UTF-8"); String userEnc = URLEncoder.encode(user, "UTF-8");
String passwordEnc = URLEncoder.encode(password, "UTF-8"); String passwordEnc = URLEncoder.encode(password, "UTF-8");
@ -338,14 +292,10 @@ public class AccountSetupBasics extends K9Activity
null, null); null, null);
mAccount.setStoreUri(uri.toString()); mAccount.setStoreUri(uri.toString());
mAccount.setTransportUri(uri.toString()); mAccount.setTransportUri(uri.toString());
} } catch (UnsupportedEncodingException enc) {
catch (UnsupportedEncodingException enc)
{
// This really shouldn't happen since the encoding is hardcoded to UTF-8 // This really shouldn't happen since the encoding is hardcoded to UTF-8
Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc); Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc);
} } catch (URISyntaxException use) {
catch (URISyntaxException use)
{
/* /*
* If we can't set up the URL we just continue. It's only for * If we can't set up the URL we just continue. It's only for
* convenience. * convenience.
@ -360,10 +310,8 @@ public class AccountSetupBasics extends K9Activity
finish(); finish();
} }
public void onClick(View v) public void onClick(View v) {
{ switch (v.getId()) {
switch (v.getId())
{
case R.id.next: case R.id.next:
onNext(); onNext();
break; break;
@ -380,69 +328,52 @@ public class AccountSetupBasics extends K9Activity
* @param name * @param name
* @return * @return
*/ */
private String getXmlAttribute(XmlResourceParser xml, String name) private String getXmlAttribute(XmlResourceParser xml, String name) {
{
int resId = xml.getAttributeResourceValue(null, name, 0); int resId = xml.getAttributeResourceValue(null, name, 0);
if (resId == 0) if (resId == 0) {
{
return xml.getAttributeValue(null, name); return xml.getAttributeValue(null, name);
} } else {
else
{
return getString(resId); return getString(resId);
} }
} }
private Provider findProviderForDomain(String domain) private Provider findProviderForDomain(String domain) {
{ try {
try
{
XmlResourceParser xml = getResources().getXml(R.xml.providers); XmlResourceParser xml = getResources().getXml(R.xml.providers);
int xmlEventType; int xmlEventType;
Provider provider = null; Provider provider = null;
while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) {
{
if (xmlEventType == XmlResourceParser.START_TAG if (xmlEventType == XmlResourceParser.START_TAG
&& "provider".equals(xml.getName()) && "provider".equals(xml.getName())
&& domain.equalsIgnoreCase(getXmlAttribute(xml, "domain"))) && domain.equalsIgnoreCase(getXmlAttribute(xml, "domain"))) {
{
provider = new Provider(); provider = new Provider();
provider.id = getXmlAttribute(xml, "id"); provider.id = getXmlAttribute(xml, "id");
provider.label = getXmlAttribute(xml, "label"); provider.label = getXmlAttribute(xml, "label");
provider.domain = getXmlAttribute(xml, "domain"); provider.domain = getXmlAttribute(xml, "domain");
provider.note = getXmlAttribute(xml, "note"); provider.note = getXmlAttribute(xml, "note");
} } else if (xmlEventType == XmlResourceParser.START_TAG
else if (xmlEventType == XmlResourceParser.START_TAG
&& "incoming".equals(xml.getName()) && "incoming".equals(xml.getName())
&& provider != null) && provider != null) {
{
provider.incomingUriTemplate = new URI(getXmlAttribute(xml, "uri")); provider.incomingUriTemplate = new URI(getXmlAttribute(xml, "uri"));
provider.incomingUsernameTemplate = getXmlAttribute(xml, "username"); provider.incomingUsernameTemplate = getXmlAttribute(xml, "username");
} } else if (xmlEventType == XmlResourceParser.START_TAG
else if (xmlEventType == XmlResourceParser.START_TAG
&& "outgoing".equals(xml.getName()) && "outgoing".equals(xml.getName())
&& provider != null) && provider != null) {
{
provider.outgoingUriTemplate = new URI(getXmlAttribute(xml, "uri")); provider.outgoingUriTemplate = new URI(getXmlAttribute(xml, "uri"));
provider.outgoingUsernameTemplate = getXmlAttribute(xml, "username"); provider.outgoingUsernameTemplate = getXmlAttribute(xml, "username");
} } else if (xmlEventType == XmlResourceParser.END_TAG
else if (xmlEventType == XmlResourceParser.END_TAG
&& "provider".equals(xml.getName()) && "provider".equals(xml.getName())
&& provider != null) && provider != null) {
{
return provider; return provider;
} }
} }
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Error while trying to load provider settings.", e); Log.e(K9.LOG_TAG, "Error while trying to load provider settings.", e);
} }
return null; return null;
} }
private String[] splitEmail(String email) private String[] splitEmail(String email) {
{
String[] retParts = new String[2]; String[] retParts = new String[2];
String[] emailParts = email.split("@"); String[] emailParts = email.split("@");
retParts[0] = (emailParts.length > 0) ? emailParts[0] : ""; retParts[0] = (emailParts.length > 0) ? emailParts[0] : "";
@ -450,8 +381,7 @@ public class AccountSetupBasics extends K9Activity
return retParts; return retParts;
} }
static class Provider implements Serializable static class Provider implements Serializable {
{
private static final long serialVersionUID = 8511656164616538989L; private static final long serialVersionUID = 8511656164616538989L;
public String id; public String id;

View File

@ -34,8 +34,7 @@ import java.security.cert.X509Certificate;
* XXX NOTE: The manifest for this app has it ignore config changes, because * XXX NOTE: The manifest for this app has it ignore config changes, because
* it doesn't correctly deal with restarting while its thread is running. * it doesn't correctly deal with restarting while its thread is running.
*/ */
public class AccountSetupCheckSettings extends K9Activity implements OnClickListener public class AccountSetupCheckSettings extends K9Activity implements OnClickListener {
{
public static final int ACTIVITY_REQUEST_CODE = 1; public static final int ACTIVITY_REQUEST_CODE = 1;
@ -62,8 +61,7 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
private boolean mDestroyed; private boolean mDestroyed;
public static void actionCheckSettings(Activity context, Account account, public static void actionCheckSettings(Activity context, Account account,
boolean checkIncoming, boolean checkOutgoing) boolean checkIncoming, boolean checkOutgoing) {
{
Intent i = new Intent(context, AccountSetupCheckSettings.class); Intent i = new Intent(context, AccountSetupCheckSettings.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
i.putExtra(EXTRA_CHECK_INCOMING, checkIncoming); i.putExtra(EXTRA_CHECK_INCOMING, checkIncoming);
@ -72,8 +70,7 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_check_settings); setContentView(R.layout.account_setup_check_settings);
mMessageView = (TextView)findViewById(R.id.message); mMessageView = (TextView)findViewById(R.id.message);
@ -88,58 +85,44 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
mCheckIncoming = getIntent().getBooleanExtra(EXTRA_CHECK_INCOMING, false); mCheckIncoming = getIntent().getBooleanExtra(EXTRA_CHECK_INCOMING, false);
mCheckOutgoing = getIntent().getBooleanExtra(EXTRA_CHECK_OUTGOING, false); mCheckOutgoing = getIntent().getBooleanExtra(EXTRA_CHECK_OUTGOING, false);
new Thread() new Thread() {
{
@Override @Override
public void run() public void run() {
{
Store store = null; Store store = null;
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
try try {
{ if (mDestroyed) {
if (mDestroyed)
{
return; return;
} }
if (mCanceled) if (mCanceled) {
{
finish(); finish();
return; return;
} }
if (mCheckIncoming) if (mCheckIncoming) {
{
store = mAccount.getRemoteStore(); store = mAccount.getRemoteStore();
if (store instanceof WebDavStore) if (store instanceof WebDavStore) {
{
setMessage(R.string.account_setup_check_settings_authenticate); setMessage(R.string.account_setup_check_settings_authenticate);
} } else {
else
{
setMessage(R.string.account_setup_check_settings_check_incoming_msg); setMessage(R.string.account_setup_check_settings_check_incoming_msg);
} }
store.checkSettings(); store.checkSettings();
if (store instanceof WebDavStore) if (store instanceof WebDavStore) {
{
setMessage(R.string.account_setup_check_settings_fetch); setMessage(R.string.account_setup_check_settings_fetch);
} }
MessagingController.getInstance(getApplication()).listFoldersSynchronous(mAccount, true, null); MessagingController.getInstance(getApplication()).listFoldersSynchronous(mAccount, true, null);
MessagingController.getInstance(getApplication()).synchronizeMailbox(mAccount, K9.INBOX , null, null); MessagingController.getInstance(getApplication()).synchronizeMailbox(mAccount, K9.INBOX , null, null);
} }
if (mDestroyed) if (mDestroyed) {
{
return; return;
} }
if (mCanceled) if (mCanceled) {
{
finish(); finish();
return; return;
} }
if (mCheckOutgoing) if (mCheckOutgoing) {
{ if (!(mAccount.getRemoteStore() instanceof WebDavStore)) {
if (!(mAccount.getRemoteStore() instanceof WebDavStore))
{
setMessage(R.string.account_setup_check_settings_check_outgoing_msg); setMessage(R.string.account_setup_check_settings_check_outgoing_msg);
} }
Transport transport = Transport.getInstance(mAccount); Transport transport = Transport.getInstance(mAccount);
@ -147,34 +130,26 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
transport.open(); transport.open();
transport.close(); transport.close();
} }
if (mDestroyed) if (mDestroyed) {
{
return; return;
} }
if (mCanceled) if (mCanceled) {
{
finish(); finish();
return; return;
} }
setResult(RESULT_OK); setResult(RESULT_OK);
finish(); finish();
} } catch (final AuthenticationFailedException afe) {
catch (final AuthenticationFailedException afe)
{
Log.e(K9.LOG_TAG, "Error while testing settings", afe); Log.e(K9.LOG_TAG, "Error while testing settings", afe);
showErrorDialog( showErrorDialog(
R.string.account_setup_failed_dlg_auth_message_fmt, R.string.account_setup_failed_dlg_auth_message_fmt,
afe.getMessage() == null ? "" : afe.getMessage()); afe.getMessage() == null ? "" : afe.getMessage());
} } catch (final CertificateValidationException cve) {
catch (final CertificateValidationException cve)
{
Log.e(K9.LOG_TAG, "Error while testing settings", cve); Log.e(K9.LOG_TAG, "Error while testing settings", cve);
acceptKeyDialog( acceptKeyDialog(
R.string.account_setup_failed_dlg_certificate_message_fmt, R.string.account_setup_failed_dlg_certificate_message_fmt,
cve); cve);
} } catch (final Throwable t) {
catch (final Throwable t)
{
Log.e(K9.LOG_TAG, "Error while testing settings", t); Log.e(K9.LOG_TAG, "Error while testing settings", t);
showErrorDialog( showErrorDialog(
R.string.account_setup_failed_dlg_server_message_fmt, R.string.account_setup_failed_dlg_server_message_fmt,
@ -188,21 +163,16 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
} }
@Override @Override
public void onDestroy() public void onDestroy() {
{
super.onDestroy(); super.onDestroy();
mDestroyed = true; mDestroyed = true;
mCanceled = true; mCanceled = true;
} }
private void setMessage(final int resId) private void setMessage(final int resId) {
{ mHandler.post(new Runnable() {
mHandler.post(new Runnable() public void run() {
{ if (mDestroyed) {
public void run()
{
if (mDestroyed)
{
return; return;
} }
mMessageView.setText(getString(resId)); mMessageView.setText(getString(resId));
@ -210,14 +180,10 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
}); });
} }
private void showErrorDialog(final int msgResId, final Object... args) private void showErrorDialog(final int msgResId, final Object... args) {
{ mHandler.post(new Runnable() {
mHandler.post(new Runnable() public void run() {
{ if (mDestroyed) {
public void run()
{
if (mDestroyed)
{
return; return;
} }
mProgressBar.setIndeterminate(false); mProgressBar.setIndeterminate(false);
@ -228,21 +194,17 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
.setNegativeButton( .setNegativeButton(
getString(R.string.account_setup_failed_dlg_continue_action), getString(R.string.account_setup_failed_dlg_continue_action),
new DialogInterface.OnClickListener() new DialogInterface.OnClickListener() {
{ public void onClick(DialogInterface dialog, int which) {
public void onClick(DialogInterface dialog, int which) mCanceled = false;
{
mCanceled=false;
setResult(RESULT_OK); setResult(RESULT_OK);
finish(); finish();
} }
}) })
.setPositiveButton( .setPositiveButton(
getString(R.string.account_setup_failed_dlg_edit_details_action), getString(R.string.account_setup_failed_dlg_edit_details_action),
new DialogInterface.OnClickListener() new DialogInterface.OnClickListener() {
{ public void onClick(DialogInterface dialog, int which) {
public void onClick(DialogInterface dialog, int which)
{
finish(); finish();
} }
}) })
@ -250,44 +212,32 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
} }
}); });
} }
private void acceptKeyDialog(final int msgResId, final Object... args) private void acceptKeyDialog(final int msgResId, final Object... args) {
{ mHandler.post(new Runnable() {
mHandler.post(new Runnable() public void run() {
{ if (mDestroyed) {
public void run()
{
if (mDestroyed)
{
return; return;
} }
final X509Certificate[] chain = TrustManagerFactory.getLastCertChain(); final X509Certificate[] chain = TrustManagerFactory.getLastCertChain();
String exMessage = "Unknown Error"; String exMessage = "Unknown Error";
Exception ex = ((Exception)args[0]); Exception ex = ((Exception)args[0]);
if (ex != null) if (ex != null) {
{ if (ex.getCause() != null) {
if (ex.getCause() != null) if (ex.getCause().getCause() != null) {
{
if (ex.getCause().getCause() != null)
{
exMessage = ex.getCause().getCause().getMessage(); exMessage = ex.getCause().getCause().getMessage();
} } else {
else
{
exMessage = ex.getCause().getMessage(); exMessage = ex.getCause().getMessage();
} }
} } else {
else
{
exMessage = ex.getMessage(); exMessage = ex.getMessage();
} }
} }
mProgressBar.setIndeterminate(false); mProgressBar.setIndeterminate(false);
StringBuffer chainInfo = new StringBuffer(100); StringBuffer chainInfo = new StringBuffer(100);
for (int i = 0; i < chain.length; i++) for (int i = 0; i < chain.length; i++) {
{
// display certificate chain information // display certificate chain information
chainInfo.append("Certificate chain[" + i + "]:\n"); chainInfo.append("Certificate chain[" + i + "]:\n");
chainInfo.append("Subject: " + chain[i].getSubjectDN().toString() + "\n"); chainInfo.append("Subject: " + chain[i].getSubjectDN().toString() + "\n");
@ -297,31 +247,24 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
new AlertDialog.Builder(AccountSetupCheckSettings.this) new AlertDialog.Builder(AccountSetupCheckSettings.this)
.setTitle(getString(R.string.account_setup_failed_dlg_invalid_certificate_title)) .setTitle(getString(R.string.account_setup_failed_dlg_invalid_certificate_title))
//.setMessage(getString(R.string.account_setup_failed_dlg_invalid_certificate) //.setMessage(getString(R.string.account_setup_failed_dlg_invalid_certificate)
.setMessage(getString(msgResId,exMessage) .setMessage(getString(msgResId, exMessage)
+ " " + chainInfo.toString() + " " + chainInfo.toString()
) )
.setCancelable(true) .setCancelable(true)
.setPositiveButton( .setPositiveButton(
getString(R.string.account_setup_failed_dlg_invalid_certificate_accept), getString(R.string.account_setup_failed_dlg_invalid_certificate_accept),
new DialogInterface.OnClickListener() new DialogInterface.OnClickListener() {
{ public void onClick(DialogInterface dialog, int which) {
public void onClick(DialogInterface dialog, int which) try {
{
try
{
String alias = mAccount.getUuid(); String alias = mAccount.getUuid();
if (mCheckIncoming) if (mCheckIncoming) {
{
alias = alias + ".incoming"; alias = alias + ".incoming";
} }
if (mCheckOutgoing) if (mCheckOutgoing) {
{
alias = alias + ".outgoing"; alias = alias + ".outgoing";
} }
TrustManagerFactory.addCertificateChain(alias, chain); TrustManagerFactory.addCertificateChain(alias, chain);
} } catch (CertificateException e) {
catch (CertificateException e)
{
showErrorDialog( showErrorDialog(
R.string.account_setup_failed_dlg_certificate_message_fmt, R.string.account_setup_failed_dlg_certificate_message_fmt,
e.getMessage() == null ? "" : e.getMessage()); e.getMessage() == null ? "" : e.getMessage());
@ -332,10 +275,8 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
}) })
.setNegativeButton( .setNegativeButton(
getString(R.string.account_setup_failed_dlg_invalid_certificate_reject), getString(R.string.account_setup_failed_dlg_invalid_certificate_reject),
new DialogInterface.OnClickListener() new DialogInterface.OnClickListener() {
{ public void onClick(DialogInterface dialog, int which) {
public void onClick(DialogInterface dialog, int which)
{
finish(); finish();
} }
}) })
@ -345,23 +286,19 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
} }
@Override @Override
public void onActivityResult(int reqCode, int resCode, Intent data) public void onActivityResult(int reqCode, int resCode, Intent data) {
{
setResult(resCode); setResult(resCode);
finish(); finish();
} }
private void onCancel() private void onCancel() {
{
mCanceled = true; mCanceled = true;
setMessage(R.string.account_setup_check_settings_canceling_msg); setMessage(R.string.account_setup_check_settings_canceling_msg);
} }
public void onClick(View v) public void onClick(View v) {
{ switch (v.getId()) {
switch (v.getId())
{
case R.id.cancel: case R.id.cancel:
onCancel(); onCancel();
break; break;

View File

@ -15,8 +15,7 @@ import com.fsck.k9.Preferences;
import com.fsck.k9.R; import com.fsck.k9.R;
import com.fsck.k9.activity.K9Activity; import com.fsck.k9.activity.K9Activity;
public class AccountSetupComposition extends K9Activity public class AccountSetupComposition extends K9Activity {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
@ -31,8 +30,7 @@ public class AccountSetupComposition extends K9Activity
private RadioButton mAccountSignatureAfterLocation; private RadioButton mAccountSignatureAfterLocation;
private LinearLayout mAccountSignatureLayout; private LinearLayout mAccountSignatureLayout;
public static void actionEditCompositionSettings(Activity context, Account account) public static void actionEditCompositionSettings(Activity context, Account account) {
{
Intent i = new Intent(context, AccountSetupComposition.class); Intent i = new Intent(context, AccountSetupComposition.class);
i.setAction(Intent.ACTION_EDIT); i.setAction(Intent.ACTION_EDIT);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
@ -41,8 +39,7 @@ public class AccountSetupComposition extends K9Activity
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT);
@ -54,8 +51,7 @@ public class AccountSetupComposition extends K9Activity
* If we're being reloaded we override the original account with the one * If we're being reloaded we override the original account with the one
* we saved * we saved
*/ */
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
{
accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
} }
@ -74,20 +70,15 @@ public class AccountSetupComposition extends K9Activity
mAccountSignatureUse = (CheckBox)findViewById(R.id.account_signature_use); mAccountSignatureUse = (CheckBox)findViewById(R.id.account_signature_use);
boolean useSignature = mAccount.getSignatureUse(); boolean useSignature = mAccount.getSignatureUse();
mAccountSignatureUse.setChecked(useSignature); mAccountSignatureUse.setChecked(useSignature);
mAccountSignatureUse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() mAccountSignatureUse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
{ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) if (isChecked) {
{
if (isChecked)
{
mAccountSignatureLayout.setVisibility(View.VISIBLE); mAccountSignatureLayout.setVisibility(View.VISIBLE);
mAccountSignature.setText(mAccount.getSignature()); mAccountSignature.setText(mAccount.getSignature());
boolean isSignatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText(); boolean isSignatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText();
mAccountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText); mAccountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText);
mAccountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText); mAccountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText);
} } else {
else
{
mAccountSignatureLayout.setVisibility(View.GONE); mAccountSignatureLayout.setVisibility(View.GONE);
} }
} }
@ -98,35 +89,29 @@ public class AccountSetupComposition extends K9Activity
mAccountSignatureBeforeLocation = (RadioButton)findViewById(R.id.account_signature_location_before_quoted_text); mAccountSignatureBeforeLocation = (RadioButton)findViewById(R.id.account_signature_location_before_quoted_text);
mAccountSignatureAfterLocation = (RadioButton)findViewById(R.id.account_signature_location_after_quoted_text); mAccountSignatureAfterLocation = (RadioButton)findViewById(R.id.account_signature_location_after_quoted_text);
if (useSignature) if (useSignature) {
{
mAccountSignature.setText(mAccount.getSignature()); mAccountSignature.setText(mAccount.getSignature());
boolean isSignatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText(); boolean isSignatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText();
mAccountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText); mAccountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText);
mAccountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText); mAccountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText);
} } else {
else
{
mAccountSignatureLayout.setVisibility(View.GONE); mAccountSignatureLayout.setVisibility(View.GONE);
} }
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
//mAccount.refresh(Preferences.getPreferences(this)); //mAccount.refresh(Preferences.getPreferences(this));
} }
private void saveSettings() private void saveSettings() {
{
mAccount.setEmail(mAccountEmail.getText().toString()); mAccount.setEmail(mAccountEmail.getText().toString());
mAccount.setAlwaysBcc(mAccountAlwaysBcc.getText().toString()); mAccount.setAlwaysBcc(mAccountAlwaysBcc.getText().toString());
mAccount.setName(mAccountName.getText().toString()); mAccount.setName(mAccountName.getText().toString());
mAccount.setSignatureUse(mAccountSignatureUse.isChecked()); mAccount.setSignatureUse(mAccountSignatureUse.isChecked());
if (mAccountSignatureUse.isChecked()) if (mAccountSignatureUse.isChecked()) {
{
mAccount.setSignature(mAccountSignature.getText().toString()); mAccount.setSignature(mAccountSignature.getText().toString());
boolean isSignatureBeforeQuotedText = mAccountSignatureBeforeLocation.isChecked(); boolean isSignatureBeforeQuotedText = mAccountSignatureBeforeLocation.isChecked();
mAccount.setSignatureBeforeQuotedText(isSignatureBeforeQuotedText); mAccount.setSignatureBeforeQuotedText(isSignatureBeforeQuotedText);
@ -136,25 +121,21 @@ public class AccountSetupComposition extends K9Activity
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
saveSettings(); saveSettings();
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
@Override @Override
public void onSaveInstanceState(Bundle outState) public void onSaveInstanceState(Bundle outState) {
{
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putSerializable(EXTRA_ACCOUNT, mAccount.getUuid()); outState.putSerializable(EXTRA_ACCOUNT, mAccount.getUuid());
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) public void onActivityResult(int requestCode, int resultCode, Intent data) {
{
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
finish(); finish();
} }

View File

@ -22,38 +22,30 @@ import java.net.URISyntaxException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
public class AccountSetupIncoming extends K9Activity implements OnClickListener public class AccountSetupIncoming extends K9Activity implements OnClickListener {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";
private static final int popPorts[] = private static final int popPorts[] = {
{
110, 995, 995, 110, 110 110, 995, 995, 110, 110
}; };
private static final String popSchemes[] = private static final String popSchemes[] = {
{
"pop3", "pop3+ssl", "pop3+ssl+", "pop3+tls", "pop3+tls+" "pop3", "pop3+ssl", "pop3+ssl+", "pop3+tls", "pop3+tls+"
}; };
private static final int imapPorts[] = private static final int imapPorts[] = {
{
143, 993, 993, 143, 143 143, 993, 993, 143, 143
}; };
private static final String imapSchemes[] = private static final String imapSchemes[] = {
{
"imap", "imap+ssl", "imap+ssl+", "imap+tls", "imap+tls+" "imap", "imap+ssl", "imap+ssl+", "imap+tls", "imap+tls+"
}; };
private static final int webdavPorts[] = private static final int webdavPorts[] = {
{
80, 443, 443, 443, 443 80, 443, 443, 443, 443
}; };
private static final String webdavSchemes[] = private static final String webdavSchemes[] = {
{
"webdav", "webdav+ssl", "webdav+ssl+", "webdav+tls", "webdav+tls+" "webdav", "webdav+ssl", "webdav+ssl+", "webdav+tls", "webdav+tls+"
}; };
private static final String authTypes[] = private static final String authTypes[] = {
{
"PLAIN", "CRAM_MD5" "PLAIN", "CRAM_MD5"
}; };
@ -78,16 +70,14 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
private CheckBox compressionOther; private CheckBox compressionOther;
private CheckBox subscribedFoldersOnly; private CheckBox subscribedFoldersOnly;
public static void actionIncomingSettings(Activity context, Account account, boolean makeDefault) public static void actionIncomingSettings(Activity context, Account account, boolean makeDefault) {
{
Intent i = new Intent(context, AccountSetupIncoming.class); Intent i = new Intent(context, AccountSetupIncoming.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault);
context.startActivity(i); context.startActivity(i);
} }
public static void actionEditIncomingSettings(Activity context, Account account) public static void actionEditIncomingSettings(Activity context, Account account) {
{
Intent i = new Intent(context, AccountSetupIncoming.class); Intent i = new Intent(context, AccountSetupIncoming.class);
i.setAction(Intent.ACTION_EDIT); i.setAction(Intent.ACTION_EDIT);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
@ -95,8 +85,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_incoming); setContentView(R.layout.account_setup_incoming);
@ -119,8 +108,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
mNextButton.setOnClickListener(this); mNextButton.setOnClickListener(this);
SpinnerOption securityTypes[] = SpinnerOption securityTypes[] = {
{
new SpinnerOption(0, getString(R.string.account_setup_incoming_security_none_label)), new SpinnerOption(0, getString(R.string.account_setup_incoming_security_none_label)),
new SpinnerOption(1, new SpinnerOption(1,
getString(R.string.account_setup_incoming_security_ssl_optional_label)), getString(R.string.account_setup_incoming_security_ssl_optional_label)),
@ -132,8 +120,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
// This needs to be kept in sync with the list at the top of the file. // This needs to be kept in sync with the list at the top of the file.
// that makes me somewhat unhappy // that makes me somewhat unhappy
SpinnerOption authTypeSpinnerOptions[] = SpinnerOption authTypeSpinnerOptions[] = {
{
new SpinnerOption(0, "PLAIN"), new SpinnerOption(0, "PLAIN"),
new SpinnerOption(1, "CRAM_MD5") new SpinnerOption(1, "CRAM_MD5")
}; };
@ -152,15 +139,12 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
* Updates the port when the user changes the security type. This allows * Updates the port when the user changes the security type. This allows
* us to show a reasonable default which the user can change. * us to show a reasonable default which the user can change.
*/ */
mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
{ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
updatePortFromSecurityType(); updatePortFromSecurityType();
} }
public void onNothingSelected(AdapterView<?> parent) public void onNothingSelected(AdapterView<?> parent) {
{
} }
}); });
@ -168,19 +152,15 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
* Calls validateFields() which enables or disables the Next button * Calls validateFields() which enables or disables the Next button
* based on the fields' validity. * based on the fields' validity.
*/ */
TextWatcher validationTextWatcher = new TextWatcher() TextWatcher validationTextWatcher = new TextWatcher() {
{ public void afterTextChanged(Editable s) {
public void afterTextChanged(Editable s)
{
validateFields(); validateFields();
} }
public void beforeTextChanged(CharSequence s, int start, int count, int after) public void beforeTextChanged(CharSequence s, int start, int count, int after) {
{
} }
public void onTextChanged(CharSequence s, int start, int before, int count) public void onTextChanged(CharSequence s, int start, int before, int count) {
{
} }
}; };
mUsernameView.addTextChangedListener(validationTextWatcher); mUsernameView.addTextChangedListener(validationTextWatcher);
@ -201,65 +181,51 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
* If we're being reloaded we override the original account with the one * If we're being reloaded we override the original account with the one
* we saved * we saved
*/ */
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
{
accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
} }
try try {
{
URI uri = new URI(mAccount.getStoreUri()); URI uri = new URI(mAccount.getStoreUri());
String username = null; String username = null;
String password = null; String password = null;
String authType = null; String authType = null;
if (uri.getUserInfo() != null) if (uri.getUserInfo() != null) {
{
String[] userInfoParts = uri.getUserInfo().split(":"); String[] userInfoParts = uri.getUserInfo().split(":");
if (userInfoParts.length == 3) if (userInfoParts.length == 3) {
{
authType = userInfoParts[0]; authType = userInfoParts[0];
username = URLDecoder.decode(userInfoParts[1], "UTF-8"); username = URLDecoder.decode(userInfoParts[1], "UTF-8");
password = URLDecoder.decode(userInfoParts[2], "UTF-8"); password = URLDecoder.decode(userInfoParts[2], "UTF-8");
} } else if (userInfoParts.length == 2) {
else if (userInfoParts.length == 2)
{
username = URLDecoder.decode(userInfoParts[0], "UTF-8"); username = URLDecoder.decode(userInfoParts[0], "UTF-8");
password = URLDecoder.decode(userInfoParts[1], "UTF-8"); password = URLDecoder.decode(userInfoParts[1], "UTF-8");
} } else if (userInfoParts.length == 1) {
else if (userInfoParts.length == 1)
{
username = URLDecoder.decode(userInfoParts[0], "UTF-8"); username = URLDecoder.decode(userInfoParts[0], "UTF-8");
} }
} }
if (username != null) if (username != null) {
{
mUsernameView.setText(username); mUsernameView.setText(username);
} }
if (password != null) if (password != null) {
{
mPasswordView.setText(password); mPasswordView.setText(password);
} }
if (authType != null) if (authType != null) {
{ for (int i = 0; i < authTypes.length; i++) {
for (int i = 0; i < authTypes.length; i++) if (authTypes[i].equals(authType)) {
{
if (authTypes[i].equals(authType))
{
SpinnerOption.setSpinnerOptionValue(mAuthTypeView, i); SpinnerOption.setSpinnerOptionValue(mAuthTypeView, i);
} }
} }
} }
if (uri.getScheme().startsWith("pop3")) if (uri.getScheme().startsWith("pop3")) {
{
serverLabelView.setText(R.string.account_setup_incoming_pop_server_label); serverLabelView.setText(R.string.account_setup_incoming_pop_server_label);
mAccountPorts = popPorts; mAccountPorts = popPorts;
mAccountSchemes = popSchemes; mAccountSchemes = popSchemes;
@ -273,15 +239,12 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
findViewById(R.id.compression_section).setVisibility(View.GONE); findViewById(R.id.compression_section).setVisibility(View.GONE);
findViewById(R.id.compression_label).setVisibility(View.GONE); findViewById(R.id.compression_label).setVisibility(View.GONE);
mAccount.setDeletePolicy(Account.DELETE_POLICY_NEVER); mAccount.setDeletePolicy(Account.DELETE_POLICY_NEVER);
} } else if (uri.getScheme().startsWith("imap")) {
else if (uri.getScheme().startsWith("imap"))
{
serverLabelView.setText(R.string.account_setup_incoming_imap_server_label); serverLabelView.setText(R.string.account_setup_incoming_imap_server_label);
mAccountPorts = imapPorts; mAccountPorts = imapPorts;
mAccountSchemes = imapSchemes; mAccountSchemes = imapSchemes;
if (uri.getPath() != null && uri.getPath().length() > 0) if (uri.getPath() != null && uri.getPath().length() > 0) {
{
mImapPathPrefixView.setText(uri.getPath().substring(1)); mImapPathPrefixView.setText(uri.getPath().substring(1));
} }
@ -291,13 +254,10 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
findViewById(R.id.webdav_auth_path_section).setVisibility(View.GONE); findViewById(R.id.webdav_auth_path_section).setVisibility(View.GONE);
mAccount.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE); mAccount.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE);
if (!Intent.ACTION_EDIT.equals(getIntent().getAction())) if (!Intent.ACTION_EDIT.equals(getIntent().getAction())) {
{
findViewById(R.id.imap_folder_setup_section).setVisibility(View.GONE); findViewById(R.id.imap_folder_setup_section).setVisibility(View.GONE);
} }
} } else if (uri.getScheme().startsWith("webdav")) {
else if (uri.getScheme().startsWith("webdav"))
{
serverLabelView.setText(R.string.account_setup_incoming_webdav_server_label); serverLabelView.setText(R.string.account_setup_incoming_webdav_server_label);
mAccountPorts = webdavPorts; mAccountPorts = webdavPorts;
mAccountSchemes = webdavSchemes; mAccountSchemes = webdavSchemes;
@ -309,49 +269,35 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
findViewById(R.id.compression_section).setVisibility(View.GONE); findViewById(R.id.compression_section).setVisibility(View.GONE);
findViewById(R.id.compression_label).setVisibility(View.GONE); findViewById(R.id.compression_label).setVisibility(View.GONE);
subscribedFoldersOnly.setVisibility(View.GONE); subscribedFoldersOnly.setVisibility(View.GONE);
if (uri.getPath() != null && uri.getPath().length() > 0) if (uri.getPath() != null && uri.getPath().length() > 0) {
{
String[] pathParts = uri.getPath().split("\\|"); String[] pathParts = uri.getPath().split("\\|");
for (int i = 0, count = pathParts.length; i < count; i++) for (int i = 0, count = pathParts.length; i < count; i++) {
{ if (i == 0) {
if (i == 0)
{
if (pathParts[0] != null && if (pathParts[0] != null &&
pathParts[0].length() > 1) pathParts[0].length() > 1) {
{
mWebdavPathPrefixView.setText(pathParts[0].substring(1)); mWebdavPathPrefixView.setText(pathParts[0].substring(1));
} }
} } else if (i == 1) {
else if (i == 1)
{
if (pathParts[1] != null && if (pathParts[1] != null &&
pathParts[1].length() > 1) pathParts[1].length() > 1) {
{
mWebdavAuthPathView.setText(pathParts[1]); mWebdavAuthPathView.setText(pathParts[1]);
} }
} } else if (i == 2) {
else if (i == 2)
{
if (pathParts[2] != null && if (pathParts[2] != null &&
pathParts[2].length() > 1) pathParts[2].length() > 1) {
{
mWebdavMailboxPathView.setText(pathParts[2]); mWebdavMailboxPathView.setText(pathParts[2]);
} }
} }
} }
} }
mAccount.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE); mAccount.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE);
} } else {
else
{
throw new Exception("Unknown account type: " + mAccount.getStoreUri()); throw new Exception("Unknown account type: " + mAccount.getStoreUri());
} }
for (int i = 0; i < mAccountSchemes.length; i++) for (int i = 0; i < mAccountSchemes.length; i++) {
{ if (mAccountSchemes[i].equals(uri.getScheme())) {
if (mAccountSchemes[i].equals(uri.getScheme()))
{
SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i); SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i);
} }
} }
@ -359,39 +305,31 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
compressionWifi.setChecked(mAccount.useCompression(Account.TYPE_WIFI)); compressionWifi.setChecked(mAccount.useCompression(Account.TYPE_WIFI));
compressionOther.setChecked(mAccount.useCompression(Account.TYPE_OTHER)); compressionOther.setChecked(mAccount.useCompression(Account.TYPE_OTHER));
if (uri.getHost() != null) if (uri.getHost() != null) {
{
mServerView.setText(uri.getHost()); mServerView.setText(uri.getHost());
} }
if (uri.getPort() != -1) if (uri.getPort() != -1) {
{
mPortView.setText(Integer.toString(uri.getPort())); mPortView.setText(Integer.toString(uri.getPort()));
} } else {
else
{
updatePortFromSecurityType(); updatePortFromSecurityType();
} }
subscribedFoldersOnly.setChecked(mAccount.subscribedFoldersOnly()); subscribedFoldersOnly.setChecked(mAccount.subscribedFoldersOnly());
validateFields(); validateFields();
} } catch (Exception e) {
catch (Exception e)
{
failure(e); failure(e);
} }
} }
@Override @Override
public void onSaveInstanceState(Bundle outState) public void onSaveInstanceState(Bundle outState) {
{
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); outState.putString(EXTRA_ACCOUNT, mAccount.getUuid());
} }
private void validateFields() private void validateFields() {
{
mNextButton mNextButton
.setEnabled(Utility.requiredFieldValid(mUsernameView) .setEnabled(Utility.requiredFieldValid(mUsernameView)
&& Utility.requiredFieldValid(mPasswordView) && Utility.requiredFieldValid(mPasswordView)
@ -400,33 +338,25 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128);
} }
private void updatePortFromSecurityType() private void updatePortFromSecurityType() {
{ if (mAccountPorts != null) {
if (mAccountPorts != null)
{
int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
mPortView.setText(Integer.toString(mAccountPorts[securityType])); mPortView.setText(Integer.toString(mAccountPorts[securityType]));
} }
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) public void onActivityResult(int requestCode, int resultCode, Intent data) {
{ if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) if (Intent.ACTION_EDIT.equals(getIntent().getAction())) {
{
if (Intent.ACTION_EDIT.equals(getIntent().getAction()))
{
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
finish(); finish();
} } else {
else
{
/* /*
* Set the username and password for the outgoing settings to the username and * Set the username and password for the outgoing settings to the username and
* password the user just set for incoming. * password the user just set for incoming.
*/ */
try try {
{
String usernameEnc = URLEncoder.encode(mUsernameView.getText().toString(), "UTF-8"); String usernameEnc = URLEncoder.encode(mUsernameView.getText().toString(), "UTF-8");
String passwordEnc = URLEncoder.encode(mPasswordView.getText().toString(), "UTF-8"); String passwordEnc = URLEncoder.encode(mPasswordView.getText().toString(), "UTF-8");
URI oldUri = new URI(mAccount.getTransportUri()); URI oldUri = new URI(mAccount.getTransportUri());
@ -439,14 +369,10 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
null, null,
null); null);
mAccount.setTransportUri(uri.toString()); mAccount.setTransportUri(uri.toString());
} } catch (UnsupportedEncodingException enc) {
catch (UnsupportedEncodingException enc)
{
// This really shouldn't happen since the encoding is hardcoded to UTF-8 // This really shouldn't happen since the encoding is hardcoded to UTF-8
Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc); Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc);
} } catch (URISyntaxException use) {
catch (URISyntaxException use)
{
/* /*
* If we can't set up the URL we just continue. It's only for * If we can't set up the URL we just continue. It's only for
* convenience. * convenience.
@ -461,18 +387,13 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
} }
@Override @Override
protected void onNext() protected void onNext() {
{ try {
try
{
int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
String path = null; String path = null;
if (mAccountSchemes[securityType].startsWith("imap")) if (mAccountSchemes[securityType].startsWith("imap")) {
{
path = "/" + mImapPathPrefixView.getText(); path = "/" + mImapPathPrefixView.getText();
} } else if (mAccountSchemes[securityType].startsWith("webdav")) {
else if (mAccountSchemes[securityType].startsWith("webdav"))
{
path = "/" + mWebdavPathPrefixView.getText(); path = "/" + mWebdavPathPrefixView.getText();
path = path + "|" + mWebdavAuthPathView.getText(); path = path + "|" + mWebdavAuthPathView.getText();
path = path + "|" + mWebdavMailboxPathView.getText(); path = path + "|" + mWebdavMailboxPathView.getText();
@ -484,13 +405,10 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
String userEnc = URLEncoder.encode(user, "UTF-8"); String userEnc = URLEncoder.encode(user, "UTF-8");
String passwordEnc = URLEncoder.encode(password, "UTF-8"); String passwordEnc = URLEncoder.encode(password, "UTF-8");
if (mAccountSchemes[securityType].startsWith("imap")) if (mAccountSchemes[securityType].startsWith("imap")) {
{
String authType = ((SpinnerOption)mAuthTypeView.getSelectedItem()).label; String authType = ((SpinnerOption)mAuthTypeView.getSelectedItem()).label;
userInfo = authType + ":" + userEnc + ":" + passwordEnc; userInfo = authType + ":" + userEnc + ":" + passwordEnc;
} } else {
else
{
userInfo = userEnc + ":" + passwordEnc; userInfo = userEnc + ":" + passwordEnc;
} }
URI uri = new URI( URI uri = new URI(
@ -510,33 +428,25 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
mAccount.setSubscribedFoldersOnly(subscribedFoldersOnly.isChecked()); mAccount.setSubscribedFoldersOnly(subscribedFoldersOnly.isChecked());
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, false); AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, false);
} } catch (Exception e) {
catch (Exception e)
{
failure(e); failure(e);
} }
} }
public void onClick(View v) public void onClick(View v) {
{ try {
try switch (v.getId()) {
{
switch (v.getId())
{
case R.id.next: case R.id.next:
onNext(); onNext();
break; break;
} }
} } catch (Exception e) {
catch (Exception e)
{
failure(e); failure(e);
} }
} }
private void failure(Exception use) private void failure(Exception use) {
{
Log.e(K9.LOG_TAG, "Failure", use); Log.e(K9.LOG_TAG, "Failure", use);
String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); String toastText = getString(R.string.account_setup_bad_uri, use.getMessage());

View File

@ -16,8 +16,7 @@ import com.fsck.k9.*;
import com.fsck.k9.activity.K9Activity; import com.fsck.k9.activity.K9Activity;
import com.fsck.k9.helper.Utility; import com.fsck.k9.helper.Utility;
public class AccountSetupNames extends K9Activity implements OnClickListener public class AccountSetupNames extends K9Activity implements OnClickListener {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private EditText mDescription; private EditText mDescription;
@ -28,16 +27,14 @@ public class AccountSetupNames extends K9Activity implements OnClickListener
private Button mDoneButton; private Button mDoneButton;
public static void actionSetNames(Context context, Account account) public static void actionSetNames(Context context, Account account) {
{
Intent i = new Intent(context, AccountSetupNames.class); Intent i = new Intent(context, AccountSetupNames.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
context.startActivity(i); context.startActivity(i);
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_names); setContentView(R.layout.account_setup_names);
mDescription = (EditText)findViewById(R.id.account_description); mDescription = (EditText)findViewById(R.id.account_description);
@ -45,19 +42,15 @@ public class AccountSetupNames extends K9Activity implements OnClickListener
mDoneButton = (Button)findViewById(R.id.done); mDoneButton = (Button)findViewById(R.id.done);
mDoneButton.setOnClickListener(this); mDoneButton.setOnClickListener(this);
TextWatcher validationTextWatcher = new TextWatcher() TextWatcher validationTextWatcher = new TextWatcher() {
{ public void afterTextChanged(Editable s) {
public void afterTextChanged(Editable s)
{
validateFields(); validateFields();
} }
public void beforeTextChanged(CharSequence s, int start, int count, int after) public void beforeTextChanged(CharSequence s, int start, int count, int after) {
{
} }
public void onTextChanged(CharSequence s, int start, int before, int count) public void onTextChanged(CharSequence s, int start, int before, int count) {
{
} }
}; };
mName.addTextChangedListener(validationTextWatcher); mName.addTextChangedListener(validationTextWatcher);
@ -73,27 +66,22 @@ public class AccountSetupNames extends K9Activity implements OnClickListener
* just leave the saved value alone. * just leave the saved value alone.
*/ */
// mDescription.setText(mAccount.getDescription()); // mDescription.setText(mAccount.getDescription());
if (mAccount.getName() != null) if (mAccount.getName() != null) {
{
mName.setText(mAccount.getName()); mName.setText(mAccount.getName());
} }
if (!Utility.requiredFieldValid(mName)) if (!Utility.requiredFieldValid(mName)) {
{
mDoneButton.setEnabled(false); mDoneButton.setEnabled(false);
} }
} }
private void validateFields() private void validateFields() {
{
mDoneButton.setEnabled(Utility.requiredFieldValid(mName)); mDoneButton.setEnabled(Utility.requiredFieldValid(mName));
Utility.setCompoundDrawablesAlpha(mDoneButton, mDoneButton.isEnabled() ? 255 : 128); Utility.setCompoundDrawablesAlpha(mDoneButton, mDoneButton.isEnabled() ? 255 : 128);
} }
@Override @Override
protected void onNext() protected void onNext() {
{ if (Utility.requiredFieldValid(mDescription)) {
if (Utility.requiredFieldValid(mDescription))
{
mAccount.setDescription(mDescription.getText().toString()); mAccount.setDescription(mDescription.getText().toString());
} }
mAccount.setName(mName.getText().toString()); mAccount.setName(mName.getText().toString());
@ -101,10 +89,8 @@ public class AccountSetupNames extends K9Activity implements OnClickListener
finish(); finish();
} }
public void onClick(View v) public void onClick(View v) {
{ switch (v.getId()) {
switch (v.getId())
{
case R.id.done: case R.id.done:
onNext(); onNext();
break; break;

View File

@ -14,8 +14,7 @@ import com.fsck.k9.*;
import com.fsck.k9.activity.K9Activity; import com.fsck.k9.activity.K9Activity;
import com.fsck.k9.mail.Store; import com.fsck.k9.mail.Store;
public class AccountSetupOptions extends K9Activity implements OnClickListener public class AccountSetupOptions extends K9Activity implements OnClickListener {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";
@ -31,8 +30,7 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
private Account mAccount; private Account mAccount;
public static void actionOptions(Context context, Account account, boolean makeDefault) public static void actionOptions(Context context, Account account, boolean makeDefault) {
{
Intent i = new Intent(context, AccountSetupOptions.class); Intent i = new Intent(context, AccountSetupOptions.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault);
@ -40,8 +38,7 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_options); setContentView(R.layout.account_setup_options);
@ -53,8 +50,7 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
findViewById(R.id.next).setOnClickListener(this); findViewById(R.id.next).setOnClickListener(this);
SpinnerOption checkFrequencies[] = SpinnerOption checkFrequencies[] = {
{
new SpinnerOption(-1, new SpinnerOption(-1,
getString(R.string.account_setup_options_mail_check_frequency_never)), getString(R.string.account_setup_options_mail_check_frequency_never)),
new SpinnerOption(1, new SpinnerOption(1,
@ -88,8 +84,7 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mCheckFrequencyView.setAdapter(checkFrequenciesAdapter); mCheckFrequencyView.setAdapter(checkFrequenciesAdapter);
SpinnerOption displayCounts[] = SpinnerOption displayCounts[] = {
{
new SpinnerOption(10, getString(R.string.account_setup_options_mail_display_count_10)), new SpinnerOption(10, getString(R.string.account_setup_options_mail_display_count_10)),
new SpinnerOption(25, getString(R.string.account_setup_options_mail_display_count_25)), new SpinnerOption(25, getString(R.string.account_setup_options_mail_display_count_25)),
new SpinnerOption(50, getString(R.string.account_setup_options_mail_display_count_50)), new SpinnerOption(50, getString(R.string.account_setup_options_mail_display_count_50)),
@ -116,31 +111,24 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
boolean isPushCapable = false; boolean isPushCapable = false;
try try {
{
Store store = mAccount.getRemoteStore(); Store store = mAccount.getRemoteStore();
isPushCapable = store.isPushCapable(); isPushCapable = store.isPushCapable();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Could not get remote store", e); Log.e(K9.LOG_TAG, "Could not get remote store", e);
} }
if (!isPushCapable) if (!isPushCapable) {
{
mPushEnable.setVisibility(View.GONE); mPushEnable.setVisibility(View.GONE);
} } else {
else
{
mPushEnable.setChecked(true); mPushEnable.setChecked(true);
} }
} }
private void onDone() private void onDone() {
{
mAccount.setDescription(mAccount.getEmail()); mAccount.setDescription(mAccount.getEmail());
mAccount.setNotifyNewMail(mNotifyView.isChecked()); mAccount.setNotifyNewMail(mNotifyView.isChecked());
mAccount.setShowOngoing(mNotifySyncView.isChecked()); mAccount.setShowOngoing(mNotifySyncView.isChecked());
@ -149,19 +137,15 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
mAccount.setDisplayCount((Integer)((SpinnerOption)mDisplayCountView mAccount.setDisplayCount((Integer)((SpinnerOption)mDisplayCountView
.getSelectedItem()).value); .getSelectedItem()).value);
if (mPushEnable.isChecked()) if (mPushEnable.isChecked()) {
{
mAccount.setFolderPushMode(Account.FolderMode.FIRST_CLASS); mAccount.setFolderPushMode(Account.FolderMode.FIRST_CLASS);
} } else {
else
{
mAccount.setFolderPushMode(Account.FolderMode.NONE); mAccount.setFolderPushMode(Account.FolderMode.NONE);
} }
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
if (mAccount.equals(Preferences.getPreferences(this).getDefaultAccount()) || if (mAccount.equals(Preferences.getPreferences(this).getDefaultAccount()) ||
getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false)) getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false)) {
{
Preferences.getPreferences(this).setDefaultAccount(mAccount); Preferences.getPreferences(this).setDefaultAccount(mAccount);
} }
K9.setServicesEnabled(this); K9.setServicesEnabled(this);
@ -169,10 +153,8 @@ public class AccountSetupOptions extends K9Activity implements OnClickListener
finish(); finish();
} }
public void onClick(View v) public void onClick(View v) {
{ switch (v.getId()) {
switch (v.getId())
{
case R.id.next: case R.id.next:
onDone(); onDone();
break; break;

View File

@ -23,19 +23,16 @@ import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
public class AccountSetupOutgoing extends K9Activity implements OnClickListener, public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
OnCheckedChangeListener OnCheckedChangeListener {
{
private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault";
private static final int smtpPorts[] = private static final int smtpPorts[] = {
{
25, 465, 465, 25, 25 25, 465, 465, 25, 25
}; };
private static final String smtpSchemes[] = private static final String smtpSchemes[] = {
{
"smtp", "smtp+ssl", "smtp+ssl+", "smtp+tls", "smtp+tls+" "smtp", "smtp+ssl", "smtp+ssl+", "smtp+tls", "smtp+tls+"
}; };
/* /*
@ -49,8 +46,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
}; };
*/ */
private static final String authTypes[] = private static final String authTypes[] = {
{
"PLAIN", "CRAM_MD5" "PLAIN", "CRAM_MD5"
}; };
private EditText mUsernameView; private EditText mUsernameView;
@ -65,16 +61,14 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
private Account mAccount; private Account mAccount;
private boolean mMakeDefault; private boolean mMakeDefault;
public static void actionOutgoingSettings(Context context, Account account, boolean makeDefault) public static void actionOutgoingSettings(Context context, Account account, boolean makeDefault) {
{
Intent i = new Intent(context, AccountSetupOutgoing.class); Intent i = new Intent(context, AccountSetupOutgoing.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault);
context.startActivity(i); context.startActivity(i);
} }
public static void actionEditOutgoingSettings(Context context, Account account) public static void actionEditOutgoingSettings(Context context, Account account) {
{
Intent i = new Intent(context, AccountSetupOutgoing.class); Intent i = new Intent(context, AccountSetupOutgoing.class);
i.setAction(Intent.ACTION_EDIT); i.setAction(Intent.ACTION_EDIT);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
@ -82,24 +76,19 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.account_setup_outgoing); setContentView(R.layout.account_setup_outgoing);
String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
try try {
{ if (new URI(mAccount.getStoreUri()).getScheme().startsWith("webdav")) {
if (new URI(mAccount.getStoreUri()).getScheme().startsWith("webdav"))
{
mAccount.setTransportUri(mAccount.getStoreUri()); mAccount.setTransportUri(mAccount.getStoreUri());
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, false, true); AccountSetupCheckSettings.actionCheckSettings(this, mAccount, false, true);
} }
} } catch (URISyntaxException e) {
catch (URISyntaxException e)
{
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
@ -118,8 +107,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
mNextButton.setOnClickListener(this); mNextButton.setOnClickListener(this);
mRequireLoginView.setOnCheckedChangeListener(this); mRequireLoginView.setOnCheckedChangeListener(this);
SpinnerOption securityTypes[] = SpinnerOption securityTypes[] = {
{
new SpinnerOption(0, getString(R.string.account_setup_incoming_security_none_label)), new SpinnerOption(0, getString(R.string.account_setup_incoming_security_none_label)),
new SpinnerOption(1, new SpinnerOption(1,
getString(R.string.account_setup_incoming_security_ssl_optional_label)), getString(R.string.account_setup_incoming_security_ssl_optional_label)),
@ -131,8 +119,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
// This needs to be kept in sync with the list at the top of the file. // This needs to be kept in sync with the list at the top of the file.
// that makes me somewhat unhappy // that makes me somewhat unhappy
SpinnerOption authTypeSpinnerOptions[] = SpinnerOption authTypeSpinnerOptions[] = {
{
new SpinnerOption(0, "PLAIN"), new SpinnerOption(0, "PLAIN"),
new SpinnerOption(1, "CRAM_MD5") new SpinnerOption(1, "CRAM_MD5")
}; };
@ -153,15 +140,12 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
* Updates the port when the user changes the security type. This allows * Updates the port when the user changes the security type. This allows
* us to show a reasonable default which the user can change. * us to show a reasonable default which the user can change.
*/ */
mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
{ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
updatePortFromSecurityType(); updatePortFromSecurityType();
} }
public void onNothingSelected(AdapterView<?> parent) public void onNothingSelected(AdapterView<?> parent) {
{
} }
}); });
@ -169,19 +153,15 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
* Calls validateFields() which enables or disables the Next button * Calls validateFields() which enables or disables the Next button
* based on the fields' validity. * based on the fields' validity.
*/ */
TextWatcher validationTextWatcher = new TextWatcher() TextWatcher validationTextWatcher = new TextWatcher() {
{ public void afterTextChanged(Editable s) {
public void afterTextChanged(Editable s)
{
validateFields(); validateFields();
} }
public void beforeTextChanged(CharSequence s, int start, int count, int after) public void beforeTextChanged(CharSequence s, int start, int count, int after) {
{
} }
public void onTextChanged(CharSequence s, int start, int before, int count) public void onTextChanged(CharSequence s, int start, int before, int count) {
{
} }
}; };
mUsernameView.addTextChangedListener(validationTextWatcher); mUsernameView.addTextChangedListener(validationTextWatcher);
@ -203,82 +183,64 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
* If we're being reloaded we override the original account with the one * If we're being reloaded we override the original account with the one
* we saved * we saved
*/ */
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
{
accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid); mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
} }
try try {
{
URI uri = new URI(mAccount.getTransportUri()); URI uri = new URI(mAccount.getTransportUri());
String username = null; String username = null;
String password = null; String password = null;
String authType = null; String authType = null;
if (uri.getUserInfo() != null) if (uri.getUserInfo() != null) {
{
String[] userInfoParts = uri.getUserInfo().split(":"); String[] userInfoParts = uri.getUserInfo().split(":");
username = URLDecoder.decode(userInfoParts[0], "UTF-8"); username = URLDecoder.decode(userInfoParts[0], "UTF-8");
if (userInfoParts.length > 1) if (userInfoParts.length > 1) {
{
password = URLDecoder.decode(userInfoParts[1], "UTF-8"); password = URLDecoder.decode(userInfoParts[1], "UTF-8");
} }
if (userInfoParts.length > 2) if (userInfoParts.length > 2) {
{
authType = userInfoParts[2]; authType = userInfoParts[2];
} }
} }
if (username != null) if (username != null) {
{
mUsernameView.setText(username); mUsernameView.setText(username);
mRequireLoginView.setChecked(true); mRequireLoginView.setChecked(true);
} }
if (password != null) if (password != null) {
{
mPasswordView.setText(password); mPasswordView.setText(password);
} }
if (authType != null) if (authType != null) {
{ for (int i = 0; i < authTypes.length; i++) {
for (int i = 0; i < authTypes.length; i++) if (authTypes[i].equals(authType)) {
{
if (authTypes[i].equals(authType))
{
SpinnerOption.setSpinnerOptionValue(mAuthTypeView, i); SpinnerOption.setSpinnerOptionValue(mAuthTypeView, i);
} }
} }
} }
for (int i = 0; i < smtpSchemes.length; i++) for (int i = 0; i < smtpSchemes.length; i++) {
{ if (smtpSchemes[i].equals(uri.getScheme())) {
if (smtpSchemes[i].equals(uri.getScheme()))
{
SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i); SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i);
} }
} }
if (uri.getHost() != null) if (uri.getHost() != null) {
{
mServerView.setText(uri.getHost()); mServerView.setText(uri.getHost());
} }
if (uri.getPort() != -1) if (uri.getPort() != -1) {
{
mPortView.setText(Integer.toString(uri.getPort())); mPortView.setText(Integer.toString(uri.getPort()));
} } else {
else
{
updatePortFromSecurityType(); updatePortFromSecurityType();
} }
validateFields(); validateFields();
} } catch (Exception e) {
catch (Exception e)
{
/* /*
* We should always be able to parse our own settings. * We should always be able to parse our own settings.
*/ */
@ -288,14 +250,12 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
} }
@Override @Override
public void onSaveInstanceState(Bundle outState) public void onSaveInstanceState(Bundle outState) {
{
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); outState.putString(EXTRA_ACCOUNT, mAccount.getUuid());
} }
private void validateFields() private void validateFields() {
{
mNextButton mNextButton
.setEnabled( .setEnabled(
Utility.domainFieldValid(mServerView) && Utility.domainFieldValid(mServerView) &&
@ -306,24 +266,18 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128);
} }
private void updatePortFromSecurityType() private void updatePortFromSecurityType() {
{
int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
mPortView.setText(Integer.toString(smtpPorts[securityType])); mPortView.setText(Integer.toString(smtpPorts[securityType]));
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) public void onActivityResult(int requestCode, int resultCode, Intent data) {
{ if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) if (Intent.ACTION_EDIT.equals(getIntent().getAction())) {
{
if (Intent.ACTION_EDIT.equals(getIntent().getAction()))
{
mAccount.save(Preferences.getPreferences(this)); mAccount.save(Preferences.getPreferences(this));
finish(); finish();
} } else {
else
{
AccountSetupOptions.actionOptions(this, mAccount, mMakeDefault); AccountSetupOptions.actionOptions(this, mAccount, mMakeDefault);
finish(); finish();
} }
@ -331,33 +285,26 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
} }
@Override @Override
protected void onNext() protected void onNext() {
{
int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
URI uri; URI uri;
try try {
{
String usernameEnc = URLEncoder.encode(mUsernameView.getText().toString(), "UTF-8"); String usernameEnc = URLEncoder.encode(mUsernameView.getText().toString(), "UTF-8");
String passwordEnc = URLEncoder.encode(mPasswordView.getText().toString(), "UTF-8"); String passwordEnc = URLEncoder.encode(mPasswordView.getText().toString(), "UTF-8");
String userInfo = null; String userInfo = null;
String authType = ((SpinnerOption)mAuthTypeView.getSelectedItem()).label; String authType = ((SpinnerOption)mAuthTypeView.getSelectedItem()).label;
if (mRequireLoginView.isChecked()) if (mRequireLoginView.isChecked()) {
{
userInfo = usernameEnc + ":" + passwordEnc + ":" + authType; userInfo = usernameEnc + ":" + passwordEnc + ":" + authType;
} }
uri = new URI(smtpSchemes[securityType], userInfo, mServerView.getText().toString(), uri = new URI(smtpSchemes[securityType], userInfo, mServerView.getText().toString(),
Integer.parseInt(mPortView.getText().toString()), null, null, null); Integer.parseInt(mPortView.getText().toString()), null, null, null);
mAccount.setTransportUri(uri.toString()); mAccount.setTransportUri(uri.toString());
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, false, true); AccountSetupCheckSettings.actionCheckSettings(this, mAccount, false, true);
} } catch (UnsupportedEncodingException enc) {
catch (UnsupportedEncodingException enc)
{
// This really shouldn't happen since the encoding is hardcoded to UTF-8 // This really shouldn't happen since the encoding is hardcoded to UTF-8
Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc); Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc);
} } catch (Exception e) {
catch (Exception e)
{
/* /*
* It's unrecoverable if we cannot create a URI from components that * It's unrecoverable if we cannot create a URI from components that
* we validated to be safe. * we validated to be safe.
@ -367,23 +314,19 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
} }
public void onClick(View v) public void onClick(View v) {
{ switch (v.getId()) {
switch (v.getId())
{
case R.id.next: case R.id.next:
onNext(); onNext();
break; break;
} }
} }
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
{
mRequireLoginSettingsView.setVisibility(isChecked ? View.VISIBLE : View.GONE); mRequireLoginSettingsView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
validateFields(); validateFields();
} }
private void failure(Exception use) private void failure(Exception use) {
{
Log.e(K9.LOG_TAG, "Failure", use); Log.e(K9.LOG_TAG, "Failure", use);
String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); String toastText = getString(R.string.account_setup_bad_uri, use.getMessage());

View File

@ -19,8 +19,7 @@ import com.fsck.k9.mail.store.LocalStore;
import com.fsck.k9.mail.store.LocalStore.LocalFolder; import com.fsck.k9.mail.store.LocalStore.LocalFolder;
import com.fsck.k9.service.MailService; import com.fsck.k9.service.MailService;
public class FolderSettings extends K9PreferenceActivity public class FolderSettings extends K9PreferenceActivity {
{
private static final String EXTRA_FOLDER_NAME = "com.fsck.k9.folderName"; private static final String EXTRA_FOLDER_NAME = "com.fsck.k9.folderName";
private static final String EXTRA_ACCOUNT = "com.fsck.k9.account"; private static final String EXTRA_ACCOUNT = "com.fsck.k9.account";
@ -40,8 +39,7 @@ public class FolderSettings extends K9PreferenceActivity
private ListPreference mSyncClass; private ListPreference mSyncClass;
private ListPreference mPushClass; private ListPreference mPushClass;
public static void actionSettings(Context context, Account account, String folderName) public static void actionSettings(Context context, Account account, String folderName) {
{
Intent i = new Intent(context, FolderSettings.class); Intent i = new Intent(context, FolderSettings.class);
i.putExtra(EXTRA_FOLDER_NAME, folderName); i.putExtra(EXTRA_FOLDER_NAME, folderName);
i.putExtra(EXTRA_ACCOUNT, account.getUuid()); i.putExtra(EXTRA_ACCOUNT, account.getUuid());
@ -49,35 +47,28 @@ public class FolderSettings extends K9PreferenceActivity
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String folderName = (String)getIntent().getSerializableExtra(EXTRA_FOLDER_NAME); String folderName = (String)getIntent().getSerializableExtra(EXTRA_FOLDER_NAME);
String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT);
Account mAccount = Preferences.getPreferences(this).getAccount(accountUuid); Account mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
try try {
{
LocalStore localStore = mAccount.getLocalStore(); LocalStore localStore = mAccount.getLocalStore();
mFolder = localStore.getFolder(folderName); mFolder = localStore.getFolder(folderName);
mFolder.open(OpenMode.READ_WRITE); mFolder.open(OpenMode.READ_WRITE);
} } catch (MessagingException me) {
catch (MessagingException me)
{
Log.e(K9.LOG_TAG, "Unable to edit folder " + folderName + " preferences", me); Log.e(K9.LOG_TAG, "Unable to edit folder " + folderName + " preferences", me);
return; return;
} }
boolean isPushCapable = false; boolean isPushCapable = false;
Store store = null; Store store = null;
try try {
{
store = mAccount.getRemoteStore(); store = mAccount.getRemoteStore();
isPushCapable = store.isPushCapable(); isPushCapable = store.isPushCapable();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Could not get remote store", e); Log.e(K9.LOG_TAG, "Could not get remote store", e);
} }
@ -95,10 +86,8 @@ public class FolderSettings extends K9PreferenceActivity
mDisplayClass = (ListPreference) findPreference(PREFERENCE_DISPLAY_CLASS); mDisplayClass = (ListPreference) findPreference(PREFERENCE_DISPLAY_CLASS);
mDisplayClass.setValue(mFolder.getDisplayClass().name()); mDisplayClass.setValue(mFolder.getDisplayClass().name());
mDisplayClass.setSummary(mDisplayClass.getEntry()); mDisplayClass.setSummary(mDisplayClass.getEntry());
mDisplayClass.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mDisplayClass.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mDisplayClass.findIndexOfValue(summary); int index = mDisplayClass.findIndexOfValue(summary);
mDisplayClass.setSummary(mDisplayClass.getEntries()[index]); mDisplayClass.setSummary(mDisplayClass.getEntries()[index]);
@ -110,10 +99,8 @@ public class FolderSettings extends K9PreferenceActivity
mSyncClass = (ListPreference) findPreference(PREFERENCE_SYNC_CLASS); mSyncClass = (ListPreference) findPreference(PREFERENCE_SYNC_CLASS);
mSyncClass.setValue(mFolder.getRawSyncClass().name()); mSyncClass.setValue(mFolder.getRawSyncClass().name());
mSyncClass.setSummary(mSyncClass.getEntry()); mSyncClass.setSummary(mSyncClass.getEntry());
mSyncClass.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mSyncClass.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mSyncClass.findIndexOfValue(summary); int index = mSyncClass.findIndexOfValue(summary);
mSyncClass.setSummary(mSyncClass.getEntries()[index]); mSyncClass.setSummary(mSyncClass.getEntries()[index]);
@ -126,10 +113,8 @@ public class FolderSettings extends K9PreferenceActivity
mPushClass.setEnabled(isPushCapable); mPushClass.setEnabled(isPushCapable);
mPushClass.setValue(mFolder.getRawPushClass().name()); mPushClass.setValue(mFolder.getRawPushClass().name());
mPushClass.setSummary(mPushClass.getEntry()); mPushClass.setSummary(mPushClass.getEntry());
mPushClass.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mPushClass.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString(); final String summary = newValue.toString();
int index = mPushClass.findIndexOfValue(summary); int index = mPushClass.findIndexOfValue(summary);
mPushClass.setSummary(mPushClass.getEntries()[index]); mPushClass.setSummary(mPushClass.getEntries()[index]);
@ -140,13 +125,11 @@ public class FolderSettings extends K9PreferenceActivity
} }
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
} }
private void saveSettings() throws MessagingException private void saveSettings() throws MessagingException {
{
mFolder.setInTopGroup(mInTopGroup.isChecked()); mFolder.setInTopGroup(mInTopGroup.isChecked());
mFolder.setIntegrate(mIntegrate.isChecked()); mFolder.setIntegrate(mIntegrate.isChecked());
// We call getPushClass() because display class changes can affect push class when push class is set to inherit // We call getPushClass() because display class changes can affect push class when push class is set to inherit
@ -162,24 +145,18 @@ public class FolderSettings extends K9PreferenceActivity
FolderClass newDisplayClass = mFolder.getDisplayClass(); FolderClass newDisplayClass = mFolder.getDisplayClass();
if (oldPushClass != newPushClass if (oldPushClass != newPushClass
|| (newPushClass != FolderClass.NO_CLASS && oldDisplayClass != newDisplayClass)) || (newPushClass != FolderClass.NO_CLASS && oldDisplayClass != newDisplayClass)) {
{
MailService.actionRestartPushers(getApplication(), null); MailService.actionRestartPushers(getApplication(), null);
} }
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK) try {
{
try
{
saveSettings(); saveSettings();
} } catch (MessagingException e) {
catch (MessagingException e) Log.e(K9.LOG_TAG, "Saving folder settings failed " + e);
{
Log.e(K9.LOG_TAG,"Saving folder settings failed "+e);
} }
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);

View File

@ -17,8 +17,7 @@ import com.fsck.k9.activity.K9PreferenceActivity;
* *
* @see FontSizes * @see FontSizes
*/ */
public class FontSizeSettings extends K9PreferenceActivity public class FontSizeSettings extends K9PreferenceActivity {
{
/* /*
* Keys of the preferences defined in res/xml/font_preferences.xml * Keys of the preferences defined in res/xml/font_preferences.xml
*/ */
@ -62,15 +61,13 @@ public class FontSizeSettings extends K9PreferenceActivity
* *
* @param context The application context. * @param context The application context.
*/ */
public static void actionEditSettings(Context context) public static void actionEditSettings(Context context) {
{
Intent i = new Intent(context, FontSizeSettings.class); Intent i = new Intent(context, FontSizeSettings.class);
context.startActivity(i); context.startActivity(i);
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
FontSizes fontSizes = K9.getFontSizes(); FontSizes fontSizes = K9.getFontSizes();
@ -133,8 +130,7 @@ public class FontSizeSettings extends K9PreferenceActivity
* Update the global FontSize object and permanently store the (possibly * Update the global FontSize object and permanently store the (possibly
* changed) font size settings. * changed) font size settings.
*/ */
private void saveSettings() private void saveSettings() {
{
FontSizes fontSizes = K9.getFontSizes(); FontSizes fontSizes = K9.getFontSizes();
fontSizes.setAccountName(Integer.parseInt(mAccountName.getValue())); fontSizes.setAccountName(Integer.parseInt(mAccountName.getValue()));
@ -164,10 +160,8 @@ public class FontSizeSettings extends K9PreferenceActivity
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
saveSettings(); saveSettings();
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);

View File

@ -29,8 +29,7 @@ import com.fsck.k9.preferences.TimePickerPreference;
import com.fsck.k9.service.MailService; import com.fsck.k9.service.MailService;
public class Prefs extends K9PreferenceActivity public class Prefs extends K9PreferenceActivity {
{
/** /**
* Immutable empty {@link CharSequence} array * Immutable empty {@link CharSequence} array
@ -57,7 +56,7 @@ public class Prefs extends K9PreferenceActivity
private static final String PREFERENCE_MESSAGELIST_PREVIEW_LINES = "messagelist_preview_lines"; private static final String PREFERENCE_MESSAGELIST_PREVIEW_LINES = "messagelist_preview_lines";
private static final String PREFERENCE_MESSAGELIST_STARS = "messagelist_stars"; private static final String PREFERENCE_MESSAGELIST_STARS = "messagelist_stars";
private static final String PREFERENCE_MESSAGELIST_CHECKBOXES = "messagelist_checkboxes"; private static final String PREFERENCE_MESSAGELIST_CHECKBOXES = "messagelist_checkboxes";
private static final String PREFERENCE_MESSAGELIST_SHOW_CORRESPONDENT_NAMES= "messagelist_show_correspondent_names"; private static final String PREFERENCE_MESSAGELIST_SHOW_CORRESPONDENT_NAMES = "messagelist_show_correspondent_names";
private static final String PREFERENCE_MESSAGELIST_SHOW_CONTACT_NAME = "messagelist_show_contact_name"; private static final String PREFERENCE_MESSAGELIST_SHOW_CONTACT_NAME = "messagelist_show_contact_name";
private static final String PREFERENCE_MESSAGELIST_CONTACT_NAME_COLOR = "messagelist_contact_name_color"; private static final String PREFERENCE_MESSAGELIST_CONTACT_NAME_COLOR = "messagelist_contact_name_color";
private static final String PREFERENCE_MESSAGEVIEW_FIXEDWIDTH = "messageview_fixedwidth_font"; private static final String PREFERENCE_MESSAGEVIEW_FIXEDWIDTH = "messageview_fixedwidth_font";
@ -112,15 +111,13 @@ public class Prefs extends K9PreferenceActivity
public static void actionPrefs(Context context) public static void actionPrefs(Context context) {
{
Intent i = new Intent(context, Prefs.class); Intent i = new Intent(context, Prefs.class);
context.startActivity(i); context.startActivity(i);
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) {
{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.global_preferences); addPreferencesFromResource(R.xml.global_preferences);
@ -130,10 +127,8 @@ public class Prefs extends K9PreferenceActivity
Vector<CharSequence> entryValueVector = new Vector<CharSequence>(Arrays.asList(mLanguage.getEntryValues())); Vector<CharSequence> entryValueVector = new Vector<CharSequence>(Arrays.asList(mLanguage.getEntryValues()));
String supportedLanguages[] = getResources().getStringArray(R.array.supported_languages); String supportedLanguages[] = getResources().getStringArray(R.array.supported_languages);
HashSet<String> supportedLanguageSet = new HashSet<String>(Arrays.asList(supportedLanguages)); HashSet<String> supportedLanguageSet = new HashSet<String>(Arrays.asList(supportedLanguages));
for (int i = entryVector.size() - 1; i > -1; --i) for (int i = entryVector.size() - 1; i > -1; --i) {
{ if (!supportedLanguageSet.contains(entryValueVector.get(i))) {
if (!supportedLanguageSet.contains(entryValueVector.get(i)))
{
entryVector.remove(i); entryVector.remove(i);
entryValueVector.remove(i); entryValueVector.remove(i);
} }
@ -146,10 +141,8 @@ public class Prefs extends K9PreferenceActivity
mTheme = setupListPreference(PREFERENCE_THEME, theme); mTheme = setupListPreference(PREFERENCE_THEME, theme);
findPreference(PREFERENCE_FONT_SIZE).setOnPreferenceClickListener( findPreference(PREFERENCE_FONT_SIZE).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() new Preference.OnPreferenceClickListener() {
{ public boolean onPreferenceClick(Preference preference) {
public boolean onPreferenceClick(Preference preference)
{
onFontSizeSettings(); onFontSizeSettings();
return true; return true;
} }
@ -159,8 +152,7 @@ public class Prefs extends K9PreferenceActivity
String[] formats = DateFormatter.getFormats(this); String[] formats = DateFormatter.getFormats(this);
CharSequence[] entries = new CharSequence[formats.length]; CharSequence[] entries = new CharSequence[formats.length];
CharSequence[] values = new CharSequence[formats.length]; CharSequence[] values = new CharSequence[formats.length];
for (int i = 0 ; i < formats.length; i++) for (int i = 0 ; i < formats.length; i++) {
{
String format = formats[i]; String format = formats[i];
entries[i] = DateFormatter.getSampleDate(this, format); entries[i] = DateFormatter.getSampleDate(this, format);
values[i] = format; values[i] = format;
@ -219,26 +211,18 @@ public class Prefs extends K9PreferenceActivity
mChangeContactNameColor = (CheckBoxPreference)findPreference(PREFERENCE_MESSAGELIST_CONTACT_NAME_COLOR); mChangeContactNameColor = (CheckBoxPreference)findPreference(PREFERENCE_MESSAGELIST_CONTACT_NAME_COLOR);
mChangeContactNameColor.setChecked(K9.changeContactNameColor()); mChangeContactNameColor.setChecked(K9.changeContactNameColor());
if (K9.changeContactNameColor()) if (K9.changeContactNameColor()) {
{
mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_changed); mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_changed);
} } else {
else
{
mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_default); mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_default);
} }
mChangeContactNameColor.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mChangeContactNameColor.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final Boolean checked = (Boolean) newValue; final Boolean checked = (Boolean) newValue;
if (checked) if (checked) {
{
onChooseContactNameColor(); onChooseContactNameColor();
mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_changed); mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_changed);
} } else {
else
{
mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_default); mChangeContactNameColor.setSummary(R.string.global_settings_registered_name_color_default);
} }
mChangeContactNameColor.setChecked(checked); mChangeContactNameColor.setChecked(checked);
@ -256,8 +240,7 @@ public class Prefs extends K9PreferenceActivity
mZoomControlsEnabled.setChecked(K9.zoomControlsEnabled()); mZoomControlsEnabled.setChecked(K9.zoomControlsEnabled());
mMobileOptimizedLayout = (CheckBoxPreference) findPreference(PREFERENCE_MESSAGEVIEW_MOBILE_LAYOUT); mMobileOptimizedLayout = (CheckBoxPreference) findPreference(PREFERENCE_MESSAGEVIEW_MOBILE_LAYOUT);
if (Integer.parseInt(Build.VERSION.SDK) <= 7 ) if (Integer.parseInt(Build.VERSION.SDK) <= 7) {
{
mMobileOptimizedLayout.setEnabled(false); mMobileOptimizedLayout.setEnabled(false);
} }
@ -270,10 +253,8 @@ public class Prefs extends K9PreferenceActivity
mQuietTimeStarts = (TimePickerPreference) findPreference(PREFERENCE_QUIET_TIME_STARTS); mQuietTimeStarts = (TimePickerPreference) findPreference(PREFERENCE_QUIET_TIME_STARTS);
mQuietTimeStarts.setDefaultValue(K9.getQuietTimeStarts()); mQuietTimeStarts.setDefaultValue(K9.getQuietTimeStarts());
mQuietTimeStarts.setSummary(K9.getQuietTimeStarts()); mQuietTimeStarts.setSummary(K9.getQuietTimeStarts());
mQuietTimeStarts.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mQuietTimeStarts.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String time = (String) newValue; final String time = (String) newValue;
mQuietTimeStarts.setSummary(time); mQuietTimeStarts.setSummary(time);
return false; return false;
@ -283,10 +264,8 @@ public class Prefs extends K9PreferenceActivity
mQuietTimeEnds = (TimePickerPreference) findPreference(PREFERENCE_QUIET_TIME_ENDS); mQuietTimeEnds = (TimePickerPreference) findPreference(PREFERENCE_QUIET_TIME_ENDS);
mQuietTimeEnds.setSummary(K9.getQuietTimeEnds()); mQuietTimeEnds.setSummary(K9.getQuietTimeEnds());
mQuietTimeEnds.setDefaultValue(K9.getQuietTimeEnds()); mQuietTimeEnds.setDefaultValue(K9.getQuietTimeEnds());
mQuietTimeEnds.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mQuietTimeEnds.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
{ public boolean onPreferenceChange(Preference preference, Object newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String time = (String) newValue; final String time = (String) newValue;
mQuietTimeEnds.setSummary(time); mQuietTimeEnds.setSummary(time);
return false; return false;
@ -308,8 +287,7 @@ public class Prefs extends K9PreferenceActivity
mSensitiveLogging.setChecked(K9.DEBUG_SENSITIVE); mSensitiveLogging.setChecked(K9.DEBUG_SENSITIVE);
} }
private void saveSettings() private void saveSettings() {
{
SharedPreferences preferences = Preferences.getPreferences(this).getPreferences(); SharedPreferences preferences = Preferences.getPreferences(this).getPreferences();
K9.setK9Language(mLanguage.getValue()); K9.setK9Language(mLanguage.getValue());
@ -346,8 +324,7 @@ public class Prefs extends K9PreferenceActivity
boolean needsRefresh = K9.setBackgroundOps(mBackgroundOps.getValue()); boolean needsRefresh = K9.setBackgroundOps(mBackgroundOps.getValue());
K9.setUseGalleryBugWorkaround(mUseGalleryBugWorkaround.isChecked()); K9.setUseGalleryBugWorkaround(mUseGalleryBugWorkaround.isChecked());
if (!K9.DEBUG && mDebugLogging.isChecked()) if (!K9.DEBUG && mDebugLogging.isChecked()) {
{
Toast.makeText(this, R.string.debug_logging_enabled, Toast.LENGTH_LONG).show(); Toast.makeText(this, R.string.debug_logging_enabled, Toast.LENGTH_LONG).show();
} }
K9.DEBUG = mDebugLogging.isChecked(); K9.DEBUG = mDebugLogging.isChecked();
@ -358,20 +335,16 @@ public class Prefs extends K9PreferenceActivity
DateFormatter.setDateFormat(editor, mDateFormat.getValue()); DateFormatter.setDateFormat(editor, mDateFormat.getValue());
editor.commit(); editor.commit();
if (needsRefresh) if (needsRefresh) {
{
MailService.actionReset(this, null); MailService.actionReset(this, null);
} }
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event) {
{ if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
saveSettings(); saveSettings();
if (K9.manageBack()) if (K9.manageBack()) {
{
Accounts.listAccounts(this); Accounts.listAccounts(this);
finish(); finish();
return true; return true;
@ -380,17 +353,13 @@ public class Prefs extends K9PreferenceActivity
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
private void onFontSizeSettings() private void onFontSizeSettings() {
{
FontSizeSettings.actionEditSettings(this); FontSizeSettings.actionEditSettings(this);
} }
private void onChooseContactNameColor() private void onChooseContactNameColor() {
{ new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() {
new ColorPickerDialog(this, new ColorPickerDialog.OnColorChangedListener() public void colorChanged(int color) {
{
public void colorChanged(int color)
{
K9.setContactNameColor(color); K9.setContactNameColor(color);
} }
}, },

View File

@ -7,29 +7,23 @@ import android.content.Context;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Spinner; import android.widget.Spinner;
public class SpinnerHelper public class SpinnerHelper {
{ public static void initSpinner(Context context, Spinner spinner, int entryRes, int valueRes, String curVal) {
public static void initSpinner(Context context, Spinner spinner, int entryRes, int valueRes, String curVal)
{
String[] entryArray = context.getResources().getStringArray(entryRes); String[] entryArray = context.getResources().getStringArray(entryRes);
String[] valueArray = context.getResources().getStringArray(valueRes); String[] valueArray = context.getResources().getStringArray(valueRes);
initSpinner(context, spinner, entryArray, valueArray, curVal); initSpinner(context, spinner, entryArray, valueArray, curVal);
} }
public static void initSpinner(Context context, Spinner spinner, String[] entryArray, String[] valueArray, String curVal) public static void initSpinner(Context context, Spinner spinner, String[] entryArray, String[] valueArray, String curVal) {
{
if (entryArray.length != valueArray.length) if (entryArray.length != valueArray.length) {
{
throw new RuntimeException("Entry and value arrays are of unequal lenght"); throw new RuntimeException("Entry and value arrays are of unequal lenght");
} }
EntryValue[] entryValues = new EntryValue[entryArray.length]; EntryValue[] entryValues = new EntryValue[entryArray.length];
int curSelection = 0; int curSelection = 0;
for (int i = 0; i < entryArray.length; i++) for (int i = 0; i < entryArray.length; i++) {
{
entryValues[i] = new EntryValue(entryArray[i], valueArray[i]); entryValues[i] = new EntryValue(entryArray[i], valueArray[i]);
if (valueArray[i].equals(curVal)) if (valueArray[i].equals(curVal)) {
{
curSelection = i; curSelection = i;
} }
} }
@ -40,50 +34,37 @@ public class SpinnerHelper
spinner.setSelection(curSelection); spinner.setSelection(curSelection);
} }
public static String getSpinnerValue(Spinner spinner) public static String getSpinnerValue(Spinner spinner) {
{
EntryValue entryValue = (EntryValue)spinner.getSelectedItem(); EntryValue entryValue = (EntryValue)spinner.getSelectedItem();
if (entryValue != null) if (entryValue != null) {
{
return entryValue.getValue(); return entryValue.getValue();
} } else {
else
{
return null; return null;
} }
} }
public static String getSpinnerEntry(Spinner spinner) public static String getSpinnerEntry(Spinner spinner) {
{
EntryValue entryValue = (EntryValue)spinner.getSelectedItem(); EntryValue entryValue = (EntryValue)spinner.getSelectedItem();
if (entryValue != null) if (entryValue != null) {
{
return entryValue.getEntry(); return entryValue.getEntry();
} } else {
else
{
return null; return null;
} }
} }
private static class EntryValue private static class EntryValue {
{
final String entry; final String entry;
final String value; final String value;
EntryValue(String entry, String value) EntryValue(String entry, String value) {
{
this.entry = entry; this.entry = entry;
this.value = value; this.value = value;
} }
@Override @Override
public String toString() public String toString() {
{
return entry; return entry;
} }
public String getEntry() public String getEntry() {
{
return entry; return entry;
} }
public String getValue() public String getValue() {
{
return value; return value;
} }
} }

View File

@ -6,34 +6,28 @@ package com.fsck.k9.activity.setup;
import android.widget.Spinner; import android.widget.Spinner;
public class SpinnerOption public class SpinnerOption {
{
public Object value; public Object value;
public String label; public String label;
public static void setSpinnerOptionValue(Spinner spinner, Object value) public static void setSpinnerOptionValue(Spinner spinner, Object value) {
{ for (int i = 0, count = spinner.getCount(); i < count; i++) {
for (int i = 0, count = spinner.getCount(); i < count; i++)
{
SpinnerOption so = (SpinnerOption)spinner.getItemAtPosition(i); SpinnerOption so = (SpinnerOption)spinner.getItemAtPosition(i);
if (so.value.equals(value)) if (so.value.equals(value)) {
{
spinner.setSelection(i, true); spinner.setSelection(i, true);
return; return;
} }
} }
} }
public SpinnerOption(Object value, String label) public SpinnerOption(Object value, String label) {
{
this.value = value; this.value = value;
this.label = label; this.label = label;
} }
@Override @Override
public String toString() public String toString() {
{
return label; return label;
} }
} }

View File

@ -4,25 +4,16 @@ package com.fsck.k9.controller;
import java.util.Comparator; import java.util.Comparator;
import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Message;
public class MessageDateComparator implements Comparator<Message> public class MessageDateComparator implements Comparator<Message> {
{ public int compare(Message o1, Message o2) {
public int compare(Message o1, Message o2) try {
{ if (o1.getSentDate() == null) {
try
{
if (o1.getSentDate() == null)
{
return 1; return 1;
} } else if (o2.getSentDate() == null) {
else if (o2.getSentDate() == null)
{
return -1; return -1;
} } else
else
return o2.getSentDate().compareTo(o1.getSentDate()); return o2.getSentDate().compareTo(o1.getSentDate());
} } catch (Exception e) {
catch (Exception e)
{
return 0; return 0;
} }
} }

View File

@ -2,7 +2,6 @@ package com.fsck.k9.controller;
import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Message;
public interface MessageRemovalListener public interface MessageRemovalListener {
{
public void messageRemoved(Message message); public void messageRemoved(Message message);
} }

View File

@ -3,8 +3,7 @@ package com.fsck.k9.controller;
import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Message;
public interface MessageRetrievalListener public interface MessageRetrievalListener {
{
public void messageStarted(String uid, int number, int ofTotal); public void messageStarted(String uid, int number, int ofTotal);
public void messageFinished(Message message, int number, int ofTotal); public void messageFinished(Message message, int number, int ofTotal);

File diff suppressed because it is too large Load Diff

View File

@ -18,122 +18,97 @@ import com.fsck.k9.service.SleepService;
import java.util.List; import java.util.List;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
public class MessagingControllerPushReceiver implements PushReceiver public class MessagingControllerPushReceiver implements PushReceiver {
{
final Account account; final Account account;
final MessagingController controller; final MessagingController controller;
final Application mApplication; final Application mApplication;
public MessagingControllerPushReceiver(Application nApplication, Account nAccount, MessagingController nController) public MessagingControllerPushReceiver(Application nApplication, Account nAccount, MessagingController nController) {
{
account = nAccount; account = nAccount;
controller = nController; controller = nController;
mApplication = nApplication; mApplication = nApplication;
} }
public void messagesFlagsChanged(Folder folder, public void messagesFlagsChanged(Folder folder,
List<Message> messages) List<Message> messages) {
{
controller.messagesArrived(account, folder, messages, true); controller.messagesArrived(account, folder, messages, true);
} }
public void messagesArrived(Folder folder, List<Message> messages) public void messagesArrived(Folder folder, List<Message> messages) {
{
controller.messagesArrived(account, folder, messages, false); controller.messagesArrived(account, folder, messages, false);
} }
public void messagesRemoved(Folder folder, List<Message> messages) public void messagesRemoved(Folder folder, List<Message> messages) {
{
controller.messagesArrived(account, folder, messages, true); controller.messagesArrived(account, folder, messages, true);
} }
public void syncFolder(Folder folder) public void syncFolder(Folder folder) {
{
if (K9.DEBUG) if (K9.DEBUG)
Log.v(K9.LOG_TAG, "syncFolder(" + folder.getName() + ")"); Log.v(K9.LOG_TAG, "syncFolder(" + folder.getName() + ")");
final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch latch = new CountDownLatch(1);
controller.synchronizeMailbox(account, folder.getName(), new MessagingListener() controller.synchronizeMailbox(account, folder.getName(), new MessagingListener() {
{
@Override @Override
public void synchronizeMailboxFinished(Account account, String folder, public void synchronizeMailboxFinished(Account account, String folder,
int totalMessagesInMailbox, int numNewMessages) int totalMessagesInMailbox, int numNewMessages) {
{
latch.countDown(); latch.countDown();
} }
@Override @Override
public void synchronizeMailboxFailed(Account account, String folder, public void synchronizeMailboxFailed(Account account, String folder,
String message) String message) {
{
latch.countDown(); latch.countDown();
} }
}, folder); }, folder);
if (K9.DEBUG) if (K9.DEBUG)
Log.v(K9.LOG_TAG, "syncFolder(" + folder.getName() + ") about to await latch release"); Log.v(K9.LOG_TAG, "syncFolder(" + folder.getName() + ") about to await latch release");
try try {
{
latch.await(); latch.await();
if (K9.DEBUG) if (K9.DEBUG)
Log.v(K9.LOG_TAG, "syncFolder(" + folder.getName() + ") got latch release"); Log.v(K9.LOG_TAG, "syncFolder(" + folder.getName() + ") got latch release");
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Interrupted while awaiting latch release", e); Log.e(K9.LOG_TAG, "Interrupted while awaiting latch release", e);
} }
} }
@Override @Override
public void sleep(TracingWakeLock wakeLock, long millis) public void sleep(TracingWakeLock wakeLock, long millis) {
{
SleepService.sleep(mApplication, millis, wakeLock, K9.PUSH_WAKE_LOCK_TIMEOUT); SleepService.sleep(mApplication, millis, wakeLock, K9.PUSH_WAKE_LOCK_TIMEOUT);
} }
public void pushError(String errorMessage, Exception e) public void pushError(String errorMessage, Exception e) {
{
String errMess = errorMessage; String errMess = errorMessage;
if (errMess == null && e != null) if (errMess == null && e != null) {
{
errMess = e.getMessage(); errMess = e.getMessage();
} }
controller.addErrorMessage(account, errMess, e); controller.addErrorMessage(account, errMess, e);
} }
public String getPushState(String folderName) public String getPushState(String folderName) {
{
LocalFolder localFolder = null; LocalFolder localFolder = null;
try try {
{
LocalStore localStore = account.getLocalStore(); LocalStore localStore = account.getLocalStore();
localFolder = localStore.getFolder(folderName); localFolder = localStore.getFolder(folderName);
localFolder.open(OpenMode.READ_WRITE); localFolder.open(OpenMode.READ_WRITE);
return localFolder.getPushState(); return localFolder.getPushState();
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Unable to get push state from account " + account.getDescription() Log.e(K9.LOG_TAG, "Unable to get push state from account " + account.getDescription()
+ ", folder " + folderName, e); + ", folder " + folderName, e);
return null; return null;
} } finally {
finally if (localFolder != null) {
{
if (localFolder != null)
{
localFolder.close(); localFolder.close();
} }
} }
} }
public void setPushActive(String folderName, boolean enabled) public void setPushActive(String folderName, boolean enabled) {
{ for (MessagingListener l : controller.getListeners()) {
for (MessagingListener l : controller.getListeners())
{
l.setPushActive(account, folderName, enabled); l.setPushActive(account, folderName, enabled);
} }
} }
@Override @Override
public Context getContext() public Context getContext() {
{
return mApplication; return mApplication;
} }

View File

@ -18,179 +18,138 @@ import java.util.List;
* this interface use the @Override annotation in their implementations to avoid being caught by * this interface use the @Override annotation in their implementations to avoid being caught by
* changes in this class. * changes in this class.
*/ */
public class MessagingListener public class MessagingListener {
{
public void searchStats(AccountStats stats) {} public void searchStats(AccountStats stats) {}
public void accountStatusChanged(BaseAccount account, AccountStats stats) public void accountStatusChanged(BaseAccount account, AccountStats stats) {
{
} }
public void accountSizeChanged(Account account, long oldSize, long newSize) public void accountSizeChanged(Account account, long oldSize, long newSize) {
{
} }
public void listFoldersStarted(Account account) public void listFoldersStarted(Account account) {
{
} }
public void listFolders(Account account, Folder[] folders) public void listFolders(Account account, Folder[] folders) {
{
} }
public void listFoldersFailed(Account account, String message) public void listFoldersFailed(Account account, String message) {
{
} }
public void listFoldersFinished(Account account) public void listFoldersFinished(Account account) {
{
} }
public void listLocalMessagesStarted(Account account, String folder) public void listLocalMessagesStarted(Account account, String folder) {
{
} }
public void listLocalMessages(Account account, String folder, Message[] messages) public void listLocalMessages(Account account, String folder, Message[] messages) {
{
} }
public void listLocalMessagesAddMessages(Account account, String folder, List<Message> messages) public void listLocalMessagesAddMessages(Account account, String folder, List<Message> messages) {
{
} }
public void listLocalMessagesUpdateMessage(Account account, String folder, Message message) public void listLocalMessagesUpdateMessage(Account account, String folder, Message message) {
{
} }
public void listLocalMessagesRemoveMessage(Account account, String folder, Message message) public void listLocalMessagesRemoveMessage(Account account, String folder, Message message) {
{
} }
public void listLocalMessagesFailed(Account account, String folder, String message) public void listLocalMessagesFailed(Account account, String folder, String message) {
{
} }
public void listLocalMessagesFinished(Account account, String folder) public void listLocalMessagesFinished(Account account, String folder) {
{
} }
public void synchronizeMailboxStarted(Account account, String folder) public void synchronizeMailboxStarted(Account account, String folder) {
{
} }
public void synchronizeMailboxHeadersStarted(Account account, String folder) public void synchronizeMailboxHeadersStarted(Account account, String folder) {
{
} }
public void synchronizeMailboxHeadersProgress(Account account, String folder, int completed, int total) public void synchronizeMailboxHeadersProgress(Account account, String folder, int completed, int total) {
{
} }
public void synchronizeMailboxHeadersFinished(Account account, String folder, public void synchronizeMailboxHeadersFinished(Account account, String folder,
int totalMessagesInMailbox, int numNewMessages) int totalMessagesInMailbox, int numNewMessages) {
{
} }
public void synchronizeMailboxProgress(Account account, String folder, int completed, int total) public void synchronizeMailboxProgress(Account account, String folder, int completed, int total)
{} {}
public void synchronizeMailboxNewMessage(Account account, String folder, Message message) public void synchronizeMailboxNewMessage(Account account, String folder, Message message) {
{
} }
public void synchronizeMailboxAddOrUpdateMessage(Account account, String folder, Message message) public void synchronizeMailboxAddOrUpdateMessage(Account account, String folder, Message message) {
{
} }
public void synchronizeMailboxRemovedMessage(Account account, String folder,Message message) public void synchronizeMailboxRemovedMessage(Account account, String folder, Message message) {
{
} }
public void synchronizeMailboxFinished(Account account, String folder, public void synchronizeMailboxFinished(Account account, String folder,
int totalMessagesInMailbox, int numNewMessages) int totalMessagesInMailbox, int numNewMessages) {
{
} }
public void synchronizeMailboxFailed(Account account, String folder, public void synchronizeMailboxFailed(Account account, String folder,
String message) String message) {
{
} }
public void loadMessageForViewStarted(Account account, String folder, String uid) public void loadMessageForViewStarted(Account account, String folder, String uid) {
{
} }
public void loadMessageForViewHeadersAvailable(Account account, String folder, String uid, public void loadMessageForViewHeadersAvailable(Account account, String folder, String uid,
Message message) Message message) {
{
} }
public void loadMessageForViewBodyAvailable(Account account, String folder, String uid, public void loadMessageForViewBodyAvailable(Account account, String folder, String uid,
Message message) Message message) {
{
} }
public void loadMessageForViewFinished(Account account, String folder, String uid, public void loadMessageForViewFinished(Account account, String folder, String uid,
Message message) Message message) {
{
} }
public void loadMessageForViewFailed(Account account, String folder, String uid, Throwable t) public void loadMessageForViewFailed(Account account, String folder, String uid, Throwable t) {
{
} }
public void checkMailStarted(Context context, Account account) public void checkMailStarted(Context context, Account account) {
{
} }
public void checkMailFinished(Context context, Account account) public void checkMailFinished(Context context, Account account) {
{
} }
public void checkMailFailed(Context context, Account account, String reason) public void checkMailFailed(Context context, Account account, String reason) {
{
} }
public void sendPendingMessagesStarted(Account account) public void sendPendingMessagesStarted(Account account) {
{
} }
public void sendPendingMessagesCompleted(Account account) public void sendPendingMessagesCompleted(Account account) {
{
} }
public void sendPendingMessagesFailed(Account account) public void sendPendingMessagesFailed(Account account) {
{
} }
public void messageDeleted(Account account, String folder, Message message) public void messageDeleted(Account account, String folder, Message message) {
{
} }
public void emptyTrashCompleted(Account account) public void emptyTrashCompleted(Account account) {
{
} }
public void folderStatusChanged(Account account, String folderName, int unreadMessageCount) public void folderStatusChanged(Account account, String folderName, int unreadMessageCount) {
{
} }
public void folderStatusChanged(Account account, String folderName) public void folderStatusChanged(Account account, String folderName) {
{
} }
public void systemStatusChanged() public void systemStatusChanged() {
{
} }
public void messageUidChanged(Account account, String folder, String oldUid, String newUid) public void messageUidChanged(Account account, String folder, String oldUid, String newUid) {
{
} }
public void setPushActive(Account account, String folderName, boolean enabled) public void setPushActive(Account account, String folderName, boolean enabled) {
{
} }
@ -199,16 +158,14 @@ public class MessagingListener
Message message, Message message,
Part part, Part part,
Object tag, Object tag,
boolean requiresDownload) boolean requiresDownload) {
{
} }
public void loadAttachmentFinished( public void loadAttachmentFinished(
Account account, Account account,
Message message, Message message,
Part part, Part part,
Object tag) Object tag) {
{
} }
public void loadAttachmentFailed( public void loadAttachmentFailed(
@ -216,8 +173,7 @@ public class MessagingListener
Message message, Message message,
Part part, Part part,
Object tag, Object tag,
String reason) String reason) {
{
} }
public void pendingCommandsProcessing(Account account) {} public void pendingCommandsProcessing(Account account) {}
@ -235,8 +191,7 @@ public class MessagingListener
* @param moreCommandsToRun True if the controller will continue on to another command * @param moreCommandsToRun True if the controller will continue on to another command
* immediately. * immediately.
*/ */
public void controllerCommandCompleted(boolean moreCommandsToRun) public void controllerCommandCompleted(boolean moreCommandsToRun) {
{
} }
} }

View File

@ -25,8 +25,7 @@ import com.fsck.k9.mail.internet.MimeUtility;
/** /**
* APG integration. * APG integration.
*/ */
public class Apg extends CryptoProvider public class Apg extends CryptoProvider {
{
static final long serialVersionUID = 0x21071235; static final long serialVersionUID = 0x21071235;
public static final String NAME = "apg"; public static final String NAME = "apg";
@ -44,8 +43,7 @@ public class Apg extends CryptoProvider
public static final Uri CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS = public static final Uri CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS =
Uri.parse("content://" + AUTHORITY + "/key_rings/public/emails/"); Uri.parse("content://" + AUTHORITY + "/key_rings/public/emails/");
public static class Intent public static class Intent {
{
public static final String DECRYPT = "org.thialfihar.android.apg.intent.DECRYPT"; public static final String DECRYPT = "org.thialfihar.android.apg.intent.DECRYPT";
public static final String ENCRYPT = "org.thialfihar.android.apg.intent.ENCRYPT"; public static final String ENCRYPT = "org.thialfihar.android.apg.intent.ENCRYPT";
public static final String DECRYPT_FILE = "org.thialfihar.android.apg.intent.DECRYPT_FILE"; public static final String DECRYPT_FILE = "org.thialfihar.android.apg.intent.DECRYPT_FILE";
@ -88,8 +86,7 @@ public class Apg extends CryptoProvider
Pattern.compile(".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*", Pattern.compile(".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*",
Pattern.DOTALL); Pattern.DOTALL);
public static Apg createInstance() public static Apg createInstance() {
{
return new Apg(); return new Apg();
} }
@ -100,23 +97,16 @@ public class Apg extends CryptoProvider
* @return whether a suitable version of APG was found * @return whether a suitable version of APG was found
*/ */
@Override @Override
public boolean isAvailable(Context context) public boolean isAvailable(Context context) {
{ try {
try
{
PackageInfo pi = context.getPackageManager().getPackageInfo(mApgPackageName, 0); PackageInfo pi = context.getPackageManager().getPackageInfo(mApgPackageName, 0);
if (pi.versionCode >= mMinRequiredVersion) if (pi.versionCode >= mMinRequiredVersion) {
{
return true; return true;
} } else {
else
{
Toast.makeText(context, Toast.makeText(context,
R.string.error_apg_version_not_supported, Toast.LENGTH_SHORT).show(); R.string.error_apg_version_not_supported, Toast.LENGTH_SHORT).show();
} }
} } catch (NameNotFoundException e) {
catch (NameNotFoundException e)
{
// not found // not found
} }
@ -131,17 +121,13 @@ public class Apg extends CryptoProvider
* @return success or failure * @return success or failure
*/ */
@Override @Override
public boolean selectSecretKey(Activity activity, PgpData pgpData) public boolean selectSecretKey(Activity activity, PgpData pgpData) {
{
android.content.Intent intent = new android.content.Intent(Intent.SELECT_SECRET_KEY); android.content.Intent intent = new android.content.Intent(Intent.SELECT_SECRET_KEY);
intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION);
try try {
{
activity.startActivityForResult(intent, Apg.SELECT_SECRET_KEY); activity.startActivityForResult(intent, Apg.SELECT_SECRET_KEY);
return true; return true;
} } catch (ActivityNotFoundException e) {
catch (ActivityNotFoundException e)
{
Toast.makeText(activity, Toast.makeText(activity,
R.string.error_activity_not_found, R.string.error_activity_not_found,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -158,67 +144,51 @@ public class Apg extends CryptoProvider
* @return success or failure * @return success or failure
*/ */
@Override @Override
public boolean selectEncryptionKeys(Activity activity, String emails, PgpData pgpData) public boolean selectEncryptionKeys(Activity activity, String emails, PgpData pgpData) {
{
android.content.Intent intent = new android.content.Intent(Apg.Intent.SELECT_PUBLIC_KEYS); android.content.Intent intent = new android.content.Intent(Apg.Intent.SELECT_PUBLIC_KEYS);
intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION);
long[] initialKeyIds = null; long[] initialKeyIds = null;
if (!pgpData.hasEncryptionKeys()) if (!pgpData.hasEncryptionKeys()) {
{
Vector<Long> keyIds = new Vector<Long>(); Vector<Long> keyIds = new Vector<Long>();
if (pgpData.hasSignatureKey()) if (pgpData.hasSignatureKey()) {
{
keyIds.add(pgpData.getSignatureKeyId()); keyIds.add(pgpData.getSignatureKeyId());
} }
try try {
{
Uri contentUri = Uri.withAppendedPath( Uri contentUri = Uri.withAppendedPath(
Apg.CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS, Apg.CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS,
emails); emails);
Cursor c = activity.getContentResolver().query(contentUri, Cursor c = activity.getContentResolver().query(contentUri,
new String[] { "master_key_id" }, new String[] { "master_key_id" },
null, null, null); null, null, null);
if (c != null) if (c != null) {
{ while (c.moveToNext()) {
while (c.moveToNext())
{
keyIds.add(c.getLong(0)); keyIds.add(c.getLong(0));
} }
} }
if (c != null) if (c != null) {
{
c.close(); c.close();
} }
} } catch (SecurityException e) {
catch (SecurityException e)
{
Toast.makeText(activity, Toast.makeText(activity,
activity.getResources().getString(R.string.insufficient_apg_permissions), activity.getResources().getString(R.string.insufficient_apg_permissions),
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
} }
if (keyIds.size() > 0) if (keyIds.size() > 0) {
{
initialKeyIds = new long[keyIds.size()]; initialKeyIds = new long[keyIds.size()];
for (int i = 0, size = keyIds.size(); i < size; ++i) for (int i = 0, size = keyIds.size(); i < size; ++i) {
{
initialKeyIds[i] = keyIds.get(i); initialKeyIds[i] = keyIds.get(i);
} }
} }
} } else {
else
{
initialKeyIds = pgpData.getEncryptionKeys(); initialKeyIds = pgpData.getEncryptionKeys();
} }
intent.putExtra(Apg.EXTRA_SELECTION, initialKeyIds); intent.putExtra(Apg.EXTRA_SELECTION, initialKeyIds);
try try {
{
activity.startActivityForResult(intent, Apg.SELECT_PUBLIC_KEYS); activity.startActivityForResult(intent, Apg.SELECT_PUBLIC_KEYS);
return true; return true;
} } catch (ActivityNotFoundException e) {
catch (ActivityNotFoundException e)
{
Toast.makeText(activity, Toast.makeText(activity,
R.string.error_activity_not_found, R.string.error_activity_not_found,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -234,32 +204,25 @@ public class Apg extends CryptoProvider
* @return key ids * @return key ids
*/ */
@Override @Override
public long[] getSecretKeyIdsFromEmail(Context context, String email) public long[] getSecretKeyIdsFromEmail(Context context, String email) {
{
long ids[] = null; long ids[] = null;
try try {
{
Uri contentUri = Uri.withAppendedPath(Apg.CONTENT_URI_SECRET_KEY_RING_BY_EMAILS, Uri contentUri = Uri.withAppendedPath(Apg.CONTENT_URI_SECRET_KEY_RING_BY_EMAILS,
email); email);
Cursor c = context.getContentResolver().query(contentUri, Cursor c = context.getContentResolver().query(contentUri,
new String[] { "master_key_id" }, new String[] { "master_key_id" },
null, null, null); null, null, null);
if (c != null && c.getCount() > 0) if (c != null && c.getCount() > 0) {
{
ids = new long[c.getCount()]; ids = new long[c.getCount()];
while (c.moveToNext()) while (c.moveToNext()) {
{
ids[c.getPosition()] = c.getLong(0); ids[c.getPosition()] = c.getLong(0);
} }
} }
if (c != null) if (c != null) {
{
c.close(); c.close();
} }
} } catch (SecurityException e) {
catch (SecurityException e)
{
Toast.makeText(context, Toast.makeText(context,
context.getResources().getString(R.string.insufficient_apg_permissions), context.getResources().getString(R.string.insufficient_apg_permissions),
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
@ -276,36 +239,29 @@ public class Apg extends CryptoProvider
* @return user id * @return user id
*/ */
@Override @Override
public String getUserId(Context context, long keyId) public String getUserId(Context context, long keyId) {
{
String userId = null; String userId = null;
try try {
{
Uri contentUri = ContentUris.withAppendedId( Uri contentUri = ContentUris.withAppendedId(
Apg.CONTENT_URI_SECRET_KEY_RING_BY_KEY_ID, Apg.CONTENT_URI_SECRET_KEY_RING_BY_KEY_ID,
keyId); keyId);
Cursor c = context.getContentResolver().query(contentUri, Cursor c = context.getContentResolver().query(contentUri,
new String[] { "user_id" }, new String[] { "user_id" },
null, null, null); null, null, null);
if (c != null && c.moveToFirst()) if (c != null && c.moveToFirst()) {
{
userId = c.getString(0); userId = c.getString(0);
} }
if (c != null) if (c != null) {
{
c.close(); c.close();
} }
} } catch (SecurityException e) {
catch (SecurityException e)
{
Toast.makeText(context, Toast.makeText(context,
context.getResources().getString(R.string.insufficient_apg_permissions), context.getResources().getString(R.string.insufficient_apg_permissions),
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
} }
if (userId == null) if (userId == null) {
{
userId = context.getString(R.string.unknown_crypto_signature_user_id); userId = context.getString(R.string.unknown_crypto_signature_user_id);
} }
return userId; return userId;
@ -322,13 +278,10 @@ public class Apg extends CryptoProvider
*/ */
@Override @Override
public boolean onActivityResult(Activity activity, int requestCode, int resultCode, public boolean onActivityResult(Activity activity, int requestCode, int resultCode,
android.content.Intent data, PgpData pgpData) android.content.Intent data, PgpData pgpData) {
{ switch (requestCode) {
switch (requestCode)
{
case Apg.SELECT_SECRET_KEY: case Apg.SELECT_SECRET_KEY:
if (resultCode != Activity.RESULT_OK || data == null) if (resultCode != Activity.RESULT_OK || data == null) {
{
break; break;
} }
pgpData.setSignatureKeyId(data.getLongExtra(Apg.EXTRA_KEY_ID, 0)); pgpData.setSignatureKeyId(data.getLongExtra(Apg.EXTRA_KEY_ID, 0));
@ -337,8 +290,7 @@ public class Apg extends CryptoProvider
break; break;
case Apg.SELECT_PUBLIC_KEYS: case Apg.SELECT_PUBLIC_KEYS:
if (resultCode != Activity.RESULT_OK || data == null) if (resultCode != Activity.RESULT_OK || data == null) {
{
pgpData.setEncryptionKeys(null); pgpData.setEncryptionKeys(null);
((MessageCompose) activity).onEncryptionKeySelectionDone(); ((MessageCompose) activity).onEncryptionKeySelectionDone();
break; break;
@ -348,8 +300,7 @@ public class Apg extends CryptoProvider
break; break;
case Apg.ENCRYPT_MESSAGE: case Apg.ENCRYPT_MESSAGE:
if (resultCode != Activity.RESULT_OK || data == null) if (resultCode != Activity.RESULT_OK || data == null) {
{
pgpData.setEncryptionKeys(null); pgpData.setEncryptionKeys(null);
((MessageCompose) activity).onEncryptDone(); ((MessageCompose) activity).onEncryptDone();
break; break;
@ -357,19 +308,16 @@ public class Apg extends CryptoProvider
pgpData.setEncryptedData(data.getStringExtra(Apg.EXTRA_ENCRYPTED_MESSAGE)); pgpData.setEncryptedData(data.getStringExtra(Apg.EXTRA_ENCRYPTED_MESSAGE));
// this was a stupid bug in an earlier version, just gonna leave this in for an APG // this was a stupid bug in an earlier version, just gonna leave this in for an APG
// version or two // version or two
if (pgpData.getEncryptedData() == null) if (pgpData.getEncryptedData() == null) {
{
pgpData.setEncryptedData(data.getStringExtra(Apg.EXTRA_DECRYPTED_MESSAGE)); pgpData.setEncryptedData(data.getStringExtra(Apg.EXTRA_DECRYPTED_MESSAGE));
} }
if (pgpData.getEncryptedData() != null) if (pgpData.getEncryptedData() != null) {
{
((MessageCompose) activity).onEncryptDone(); ((MessageCompose) activity).onEncryptDone();
} }
break; break;
case Apg.DECRYPT_MESSAGE: case Apg.DECRYPT_MESSAGE:
if (resultCode != Activity.RESULT_OK || data == null) if (resultCode != Activity.RESULT_OK || data == null) {
{
break; break;
} }
@ -399,21 +347,17 @@ public class Apg extends CryptoProvider
* @return success or failure * @return success or failure
*/ */
@Override @Override
public boolean encrypt(Activity activity, String data, PgpData pgpData) public boolean encrypt(Activity activity, String data, PgpData pgpData) {
{
android.content.Intent intent = new android.content.Intent(Intent.ENCRYPT_AND_RETURN); android.content.Intent intent = new android.content.Intent(Intent.ENCRYPT_AND_RETURN);
intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION);
intent.setType("text/plain"); intent.setType("text/plain");
intent.putExtra(Apg.EXTRA_TEXT, data); intent.putExtra(Apg.EXTRA_TEXT, data);
intent.putExtra(Apg.EXTRA_ENCRYPTION_KEY_IDS, pgpData.getEncryptionKeys()); intent.putExtra(Apg.EXTRA_ENCRYPTION_KEY_IDS, pgpData.getEncryptionKeys());
intent.putExtra(Apg.EXTRA_SIGNATURE_KEY_ID, pgpData.getSignatureKeyId()); intent.putExtra(Apg.EXTRA_SIGNATURE_KEY_ID, pgpData.getSignatureKeyId());
try try {
{
activity.startActivityForResult(intent, Apg.ENCRYPT_MESSAGE); activity.startActivityForResult(intent, Apg.ENCRYPT_MESSAGE);
return true; return true;
} } catch (ActivityNotFoundException e) {
catch (ActivityNotFoundException e)
{
Toast.makeText(activity, Toast.makeText(activity,
R.string.error_activity_not_found, R.string.error_activity_not_found,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -430,23 +374,18 @@ public class Apg extends CryptoProvider
* @return success or failure * @return success or failure
*/ */
@Override @Override
public boolean decrypt(Activity activity, String data, PgpData pgpData) public boolean decrypt(Activity activity, String data, PgpData pgpData) {
{
android.content.Intent intent = new android.content.Intent(Apg.Intent.DECRYPT_AND_RETURN); android.content.Intent intent = new android.content.Intent(Apg.Intent.DECRYPT_AND_RETURN);
intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION);
intent.setType("text/plain"); intent.setType("text/plain");
if (data == null) if (data == null) {
{
return false; return false;
} }
try try {
{
intent.putExtra(EXTRA_TEXT, data); intent.putExtra(EXTRA_TEXT, data);
activity.startActivityForResult(intent, Apg.DECRYPT_MESSAGE); activity.startActivityForResult(intent, Apg.DECRYPT_MESSAGE);
return true; return true;
} } catch (ActivityNotFoundException e) {
catch (ActivityNotFoundException e)
{
Toast.makeText(activity, Toast.makeText(activity,
R.string.error_activity_not_found, R.string.error_activity_not_found,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -455,29 +394,22 @@ public class Apg extends CryptoProvider
} }
@Override @Override
public boolean isEncrypted(Message message) public boolean isEncrypted(Message message) {
{
String data = null; String data = null;
try try {
{
Part part = MimeUtility.findFirstPartByMimeType(message, "text/plain"); Part part = MimeUtility.findFirstPartByMimeType(message, "text/plain");
if (part == null) if (part == null) {
{
part = MimeUtility.findFirstPartByMimeType(message, "text/html"); part = MimeUtility.findFirstPartByMimeType(message, "text/html");
} }
if (part != null) if (part != null) {
{
data = MimeUtility.getTextFromPart(part); data = MimeUtility.getTextFromPart(part);
} }
} } catch (MessagingException e) {
catch (MessagingException e)
{
// guess not... // guess not...
// TODO: maybe log this? // TODO: maybe log this?
} }
if (data == null) if (data == null) {
{
return false; return false;
} }
@ -486,29 +418,22 @@ public class Apg extends CryptoProvider
} }
@Override @Override
public boolean isSigned(Message message) public boolean isSigned(Message message) {
{
String data = null; String data = null;
try try {
{
Part part = MimeUtility.findFirstPartByMimeType(message, "text/plain"); Part part = MimeUtility.findFirstPartByMimeType(message, "text/plain");
if (part == null) if (part == null) {
{
part = MimeUtility.findFirstPartByMimeType(message, "text/html"); part = MimeUtility.findFirstPartByMimeType(message, "text/html");
} }
if (part != null) if (part != null) {
{
data = MimeUtility.getTextFromPart(part); data = MimeUtility.getTextFromPart(part);
} }
} } catch (MessagingException e) {
catch (MessagingException e)
{
// guess not... // guess not...
// TODO: maybe log this? // TODO: maybe log this?
} }
if (data == null) if (data == null) {
{
return false; return false;
} }
@ -522,8 +447,7 @@ public class Apg extends CryptoProvider
* @return provider name * @return provider name
*/ */
@Override @Override
public String getName() public String getName() {
{
return NAME; return NAME;
} }
@ -533,15 +457,12 @@ public class Apg extends CryptoProvider
* @return success or failure * @return success or failure
*/ */
@Override @Override
public boolean test(Context context) public boolean test(Context context) {
{ if (!isAvailable(context)) {
if (!isAvailable(context))
{
return false; return false;
} }
try try {
{
// try out one content provider to check permissions // try out one content provider to check permissions
Uri contentUri = ContentUris.withAppendedId( Uri contentUri = ContentUris.withAppendedId(
Apg.CONTENT_URI_SECRET_KEY_RING_BY_KEY_ID, Apg.CONTENT_URI_SECRET_KEY_RING_BY_KEY_ID,
@ -549,13 +470,10 @@ public class Apg extends CryptoProvider
Cursor c = context.getContentResolver().query(contentUri, Cursor c = context.getContentResolver().query(contentUri,
new String[] { "user_id" }, new String[] { "user_id" },
null, null, null); null, null, null);
if (c != null) if (c != null) {
{
c.close(); c.close();
} }
} } catch (SecurityException e) {
catch (SecurityException e)
{
// if there was a problem, then let the user know, this will not stop K9/APG from // if there was a problem, then let the user know, this will not stop K9/APG from
// working, but some features won't be available, so we can still return "true" // working, but some features won't be available, so we can still return "true"
Toast.makeText(context, Toast.makeText(context,

View File

@ -11,8 +11,7 @@ import com.fsck.k9.mail.Message;
* It currently also stores the results of such encryption or decryption. * It currently also stores the results of such encryption or decryption.
* TODO: separate the storage from the provider * TODO: separate the storage from the provider
*/ */
abstract public class CryptoProvider abstract public class CryptoProvider {
{
static final long serialVersionUID = 0x21071234; static final long serialVersionUID = 0x21071234;
abstract public boolean isAvailable(Context context); abstract public boolean isAvailable(Context context);
@ -29,10 +28,8 @@ abstract public class CryptoProvider
abstract public String getName(); abstract public String getName();
abstract public boolean test(Context context); abstract public boolean test(Context context);
public static CryptoProvider createInstance(String name) public static CryptoProvider createInstance(String name) {
{ if (Apg.NAME.equals(name)) {
if (Apg.NAME.equals(name))
{
return Apg.createInstance(); return Apg.createInstance();
} }

View File

@ -9,86 +9,72 @@ import com.fsck.k9.mail.Message;
* Dummy CryptoProvider for when cryptography is disabled. It is never "available" and doesn't * Dummy CryptoProvider for when cryptography is disabled. It is never "available" and doesn't
* do anything. * do anything.
*/ */
public class None extends CryptoProvider public class None extends CryptoProvider {
{
static final long serialVersionUID = 0x21071230; static final long serialVersionUID = 0x21071230;
public static final String NAME = ""; public static final String NAME = "";
public static None createInstance() public static None createInstance() {
{
return new None(); return new None();
} }
@Override @Override
public boolean isAvailable(Context context) public boolean isAvailable(Context context) {
{
return false; return false;
} }
@Override @Override
public boolean selectSecretKey(Activity activity, PgpData pgpData) public boolean selectSecretKey(Activity activity, PgpData pgpData) {
{
return false; return false;
} }
@Override @Override
public boolean selectEncryptionKeys(Activity activity, String emails, PgpData pgpData) public boolean selectEncryptionKeys(Activity activity, String emails, PgpData pgpData) {
{
return false; return false;
} }
@Override @Override
public long[] getSecretKeyIdsFromEmail(Context context, String email) public long[] getSecretKeyIdsFromEmail(Context context, String email) {
{
return null; return null;
} }
@Override @Override
public String getUserId(Context context, long keyId) public String getUserId(Context context, long keyId) {
{
return null; return null;
} }
@Override @Override
public boolean onActivityResult(Activity activity, int requestCode, int resultCode, public boolean onActivityResult(Activity activity, int requestCode, int resultCode,
android.content.Intent data, PgpData pgpData) android.content.Intent data, PgpData pgpData) {
{
return false; return false;
} }
@Override @Override
public boolean encrypt(Activity activity, String data, PgpData pgpData) public boolean encrypt(Activity activity, String data, PgpData pgpData) {
{
return false; return false;
} }
@Override @Override
public boolean decrypt(Activity activity, String data, PgpData pgpData) public boolean decrypt(Activity activity, String data, PgpData pgpData) {
{
return false; return false;
} }
@Override @Override
public boolean isEncrypted(Message message) public boolean isEncrypted(Message message) {
{
return false; return false;
} }
@Override @Override
public boolean isSigned(Message message) public boolean isSigned(Message message) {
{
return false; return false;
} }
@Override @Override
public String getName() public String getName() {
{
return NAME; return NAME;
} }
@Override @Override
public boolean test(Context context) public boolean test(Context context) {
{
return true; return true;
} }
} }

View File

@ -2,8 +2,7 @@ package com.fsck.k9.crypto;
import java.io.Serializable; import java.io.Serializable;
public class PgpData implements Serializable public class PgpData implements Serializable {
{
private static final long serialVersionUID = 6314045536470848410L; private static final long serialVersionUID = 6314045536470848410L;
protected long mEncryptionKeyIds[] = null; protected long mEncryptionKeyIds[] = null;
protected long mSignatureKeyId = 0; protected long mSignatureKeyId = 0;
@ -13,83 +12,67 @@ public class PgpData implements Serializable
protected String mDecryptedData = null; protected String mDecryptedData = null;
protected String mEncryptedData = null; protected String mEncryptedData = null;
public void setSignatureKeyId(long keyId) public void setSignatureKeyId(long keyId) {
{
mSignatureKeyId = keyId; mSignatureKeyId = keyId;
} }
public long getSignatureKeyId() public long getSignatureKeyId() {
{
return mSignatureKeyId; return mSignatureKeyId;
} }
public void setEncryptionKeys(long keyIds[]) public void setEncryptionKeys(long keyIds[]) {
{
mEncryptionKeyIds = keyIds; mEncryptionKeyIds = keyIds;
} }
public long[] getEncryptionKeys() public long[] getEncryptionKeys() {
{
return mEncryptionKeyIds; return mEncryptionKeyIds;
} }
public boolean hasSignatureKey() public boolean hasSignatureKey() {
{
return mSignatureKeyId != 0; return mSignatureKeyId != 0;
} }
public boolean hasEncryptionKeys() public boolean hasEncryptionKeys() {
{
return (mEncryptionKeyIds != null) && (mEncryptionKeyIds.length > 0); return (mEncryptionKeyIds != null) && (mEncryptionKeyIds.length > 0);
} }
public String getEncryptedData() public String getEncryptedData() {
{
return mEncryptedData; return mEncryptedData;
} }
public void setEncryptedData(String data) public void setEncryptedData(String data) {
{
mEncryptedData = data; mEncryptedData = data;
} }
public String getDecryptedData() public String getDecryptedData() {
{
return mDecryptedData; return mDecryptedData;
} }
public void setDecryptedData(String data) public void setDecryptedData(String data) {
{
mDecryptedData = data; mDecryptedData = data;
} }
public void setSignatureUserId(String userId) public void setSignatureUserId(String userId) {
{
mSignatureUserId = userId; mSignatureUserId = userId;
} }
public String getSignatureUserId() public String getSignatureUserId() {
{
return mSignatureUserId; return mSignatureUserId;
} }
public boolean getSignatureSuccess() public boolean getSignatureSuccess() {
{
return mSignatureSuccess; return mSignatureSuccess;
} }
public void setSignatureSuccess(boolean success) public void setSignatureSuccess(boolean success) {
{
mSignatureSuccess = success; mSignatureSuccess = success;
} }
public boolean getSignatureUnknown() public boolean getSignatureUnknown() {
{
return mSignatureUnknown; return mSignatureUnknown;
} }
public void setSignatureUnknown(boolean unknown) public void setSignatureUnknown(boolean unknown) {
{
mSignatureUnknown = unknown; mSignatureUnknown = unknown;
} }
} }

View File

@ -7,8 +7,7 @@ import android.util.Log;
/** /**
* Helper class to get the current state of the auto-sync setting. * Helper class to get the current state of the auto-sync setting.
*/ */
public class AutoSyncHelper public class AutoSyncHelper {
{
/** /**
* False, if we never tried to load the class for this SDK version. * False, if we never tried to load the class for this SDK version.
* True, otherwise. * True, otherwise.
@ -34,8 +33,7 @@ public class AutoSyncHelper
* @return the IAutoSync object for this SDK version, or null if something * @return the IAutoSync object for this SDK version, or null if something
* went wrong. * went wrong.
*/ */
private static IAutoSync loadAutoSync() private static IAutoSync loadAutoSync() {
{
/* /*
* We're trying to load the class for this SDK version. If anything * We're trying to load the class for this SDK version. If anything
* goes wrong after this point, we don't want to try again. * goes wrong after this point, we don't want to try again.
@ -49,48 +47,33 @@ public class AutoSyncHelper
int sdkVersion = Integer.parseInt(Build.VERSION.SDK); int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
String className = null; String className = null;
if (sdkVersion == Build.VERSION_CODES.CUPCAKE) if (sdkVersion == Build.VERSION_CODES.CUPCAKE) {
{
className = "com.fsck.k9.helper.AutoSyncSdk3"; className = "com.fsck.k9.helper.AutoSyncSdk3";
} } else if (sdkVersion == Build.VERSION_CODES.DONUT) {
else if (sdkVersion == Build.VERSION_CODES.DONUT)
{
className = "com.fsck.k9.helper.AutoSyncSdk4"; className = "com.fsck.k9.helper.AutoSyncSdk4";
} } else if (sdkVersion >= Build.VERSION_CODES.ECLAIR) {
else if (sdkVersion >= Build.VERSION_CODES.ECLAIR)
{
className = "com.fsck.k9.helper.AutoSyncSdk5"; className = "com.fsck.k9.helper.AutoSyncSdk5";
} }
/* /*
* Find the required class by name and instantiate it. * Find the required class by name and instantiate it.
*/ */
try try {
{ Class <? extends IAutoSync > clazz =
Class<? extends IAutoSync> clazz =
Class.forName(className).asSubclass(IAutoSync.class); Class.forName(className).asSubclass(IAutoSync.class);
IAutoSync autoSync = clazz.newInstance(); IAutoSync autoSync = clazz.newInstance();
autoSync.initialize(K9.app); autoSync.initialize(K9.app);
return autoSync; return autoSync;
} } catch (ClassNotFoundException e) {
catch (ClassNotFoundException e)
{
Log.e(K9.LOG_TAG, "Couldn't find class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't find class: " + className, e);
} } catch (InstantiationException e) {
catch (InstantiationException e)
{
Log.e(K9.LOG_TAG, "Couldn't instantiate class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't instantiate class: " + className, e);
} } catch (IllegalAccessException e) {
catch (IllegalAccessException e)
{
Log.e(K9.LOG_TAG, "Couldn't access class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't access class: " + className, e);
} } catch (NoSuchMethodException e) {
catch (NoSuchMethodException e) if (K9.DEBUG) {
{
if (K9.DEBUG)
{
Log.d(K9.LOG_TAG, "Couldn't load method to get auto-sync state", e); Log.d(K9.LOG_TAG, "Couldn't load method to get auto-sync state", e);
} }
} }
@ -104,10 +87,8 @@ public class AutoSyncHelper
* @return true, if calls to getMasterSyncAutomatically() will return the * @return true, if calls to getMasterSyncAutomatically() will return the
* state of the auto-sync setting. false, otherwise. * state of the auto-sync setting. false, otherwise.
*/ */
public static boolean isAvailable() public static boolean isAvailable() {
{ if (!sChecked) {
if (!sChecked)
{
sAutoSync = loadAutoSync(); sAutoSync = loadAutoSync();
} }
return (sAutoSync != null); return (sAutoSync != null);
@ -119,15 +100,12 @@ public class AutoSyncHelper
* @return the state of the auto-sync setting. * @return the state of the auto-sync setting.
* @see IAutoSync * @see IAutoSync
*/ */
public static boolean getMasterSyncAutomatically() public static boolean getMasterSyncAutomatically() {
{ if (!sChecked) {
if (!sChecked)
{
sAutoSync = loadAutoSync(); sAutoSync = loadAutoSync();
} }
if (sAutoSync == null) if (sAutoSync == null) {
{
throw new RuntimeException( throw new RuntimeException(
"Called getMasterSyncAutomatically() before checking if it's available."); "Called getMasterSyncAutomatically() before checking if it's available.");
} }

View File

@ -6,13 +6,11 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
public class AutoSyncSdk3 implements IAutoSync public class AutoSyncSdk3 implements IAutoSync {
{
private Method mGetListenForNetworkTickles; private Method mGetListenForNetworkTickles;
private Object mQueryMap; private Object mQueryMap;
public void initialize(Context context) throws NoSuchMethodException public void initialize(Context context) throws NoSuchMethodException {
{
/* /*
* There's no documented/official way to query the state of the * There's no documented/official way to query the state of the
* auto-sync setting for a normal application in SDK 1.5/API 3. * auto-sync setting for a normal application in SDK 1.5/API 3.
@ -21,27 +19,20 @@ public class AutoSyncSdk3 implements IAutoSync
* can call its getListenForNetworkTickles() method. This will return * can call its getListenForNetworkTickles() method. This will return
* the current auto-sync state. * the current auto-sync state.
*/ */
try try {
{
Class<?> clazz = Class.forName("android.provider.Sync$Settings$QueryMap"); Class<?> clazz = Class.forName("android.provider.Sync$Settings$QueryMap");
Constructor<?> c = clazz.getConstructor(ContentResolver.class, boolean.class, Handler.class); Constructor<?> c = clazz.getConstructor(ContentResolver.class, boolean.class, Handler.class);
mQueryMap = c.newInstance(context.getContentResolver(), true, null); mQueryMap = c.newInstance(context.getContentResolver(), true, null);
mGetListenForNetworkTickles = mQueryMap.getClass().getMethod("getListenForNetworkTickles"); mGetListenForNetworkTickles = mQueryMap.getClass().getMethod("getListenForNetworkTickles");
} } catch (Exception e) {
catch (Exception e)
{
throw new NoSuchMethodException(); throw new NoSuchMethodException();
} }
} }
public boolean getMasterSyncAutomatically() public boolean getMasterSyncAutomatically() {
{ try {
try
{
return (Boolean) mGetListenForNetworkTickles.invoke(mQueryMap); return (Boolean) mGetListenForNetworkTickles.invoke(mQueryMap);
} } catch (Exception e) {
catch (Exception e)
{
return false; return false;
} }
} }

View File

@ -8,13 +8,11 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
public class AutoSyncSdk4 implements IAutoSync public class AutoSyncSdk4 implements IAutoSync {
{
private Method mGetListenForNetworkTickles; private Method mGetListenForNetworkTickles;
private Object mContentService; private Object mContentService;
public void initialize(Context context) throws NoSuchMethodException public void initialize(Context context) throws NoSuchMethodException {
{
/* /*
* There's no documented/official way to query the state of the * There's no documented/official way to query the state of the
* auto-sync setting for a normal application in SDK 1.6/API 4. * auto-sync setting for a normal application in SDK 1.6/API 4.
@ -23,26 +21,19 @@ public class AutoSyncSdk4 implements IAutoSync
* getListenForNetworkTickles() method. This will return the current * getListenForNetworkTickles() method. This will return the current
* auto-sync state. * auto-sync state.
*/ */
try try {
{
Method getContentService = ContentResolver.class.getMethod("getContentService"); Method getContentService = ContentResolver.class.getMethod("getContentService");
mContentService = getContentService.invoke(null); mContentService = getContentService.invoke(null);
mGetListenForNetworkTickles = mContentService.getClass().getMethod("getListenForNetworkTickles"); mGetListenForNetworkTickles = mContentService.getClass().getMethod("getListenForNetworkTickles");
} } catch (Exception e) {
catch (Exception e)
{
throw new NoSuchMethodException(); throw new NoSuchMethodException();
} }
} }
public boolean getMasterSyncAutomatically() public boolean getMasterSyncAutomatically() {
{ try {
try
{
return (Boolean) mGetListenForNetworkTickles.invoke(mContentService); return (Boolean) mGetListenForNetworkTickles.invoke(mContentService);
} } catch (Exception e) {
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Could not query for network tickle", e); Log.e(K9.LOG_TAG, "Could not query for network tickle", e);
return true; return true;
} }

View File

@ -3,15 +3,12 @@ package com.fsck.k9.helper;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
public class AutoSyncSdk5 implements IAutoSync public class AutoSyncSdk5 implements IAutoSync {
{ public void initialize(Context context) throws NoSuchMethodException {
public void initialize(Context context) throws NoSuchMethodException
{
// Nothing to do here // Nothing to do here
} }
public boolean getMasterSyncAutomatically() public boolean getMasterSyncAutomatically() {
{
/* /*
* SDK 2.0/API 5 introduced an official method to query the auto-sync * SDK 2.0/API 5 introduced an official method to query the auto-sync
* state. * state.

View File

@ -20,8 +20,7 @@ import com.fsck.k9.mail.Address;
* @see ContactsSdk3_4 * @see ContactsSdk3_4
* @see ContactsSdk5 * @see ContactsSdk5
*/ */
public abstract class Contacts public abstract class Contacts {
{
/** /**
* Instance of the SDK specific class that interfaces with the contacts * Instance of the SDK specific class that interfaces with the contacts
* API. * API.
@ -34,10 +33,8 @@ public abstract class Contacts
* @param context A {@link Context} instance. * @param context A {@link Context} instance.
* @return Appropriate {@link Contacts} instance for this device. * @return Appropriate {@link Contacts} instance for this device.
*/ */
public static Contacts getInstance(Context context) public static Contacts getInstance(Context context) {
{ if (sInstance == null) {
if (sInstance == null)
{
/* /*
* Check the version of the SDK we are running on. Choose an * Check the version of the SDK we are running on. Choose an
* implementation class designed for that version of the SDK. * implementation class designed for that version of the SDK.
@ -45,56 +42,38 @@ public abstract class Contacts
int sdkVersion = Integer.parseInt(Build.VERSION.SDK); int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
String className = null; String className = null;
if (sdkVersion <= Build.VERSION_CODES.DONUT) if (sdkVersion <= Build.VERSION_CODES.DONUT) {
{
className = "com.fsck.k9.helper.ContactsSdk3_4"; className = "com.fsck.k9.helper.ContactsSdk3_4";
} } else if (sdkVersion <= Build.VERSION_CODES.ECLAIR_MR1) {
else if (sdkVersion <= Build.VERSION_CODES.ECLAIR_MR1)
{
/* /*
* The new API was introduced with SDK 5. But Android versions < 2.2 * The new API was introduced with SDK 5. But Android versions < 2.2
* need some additional code to be able to search for phonetic names. * need some additional code to be able to search for phonetic names.
*/ */
className = "com.fsck.k9.helper.ContactsSdk5p"; className = "com.fsck.k9.helper.ContactsSdk5p";
} } else {
else
{
className = "com.fsck.k9.helper.ContactsSdk5"; className = "com.fsck.k9.helper.ContactsSdk5";
} }
/* /*
* Find the required class by name and instantiate it. * Find the required class by name and instantiate it.
*/ */
try try {
{ Class <? extends Contacts > clazz =
Class<? extends Contacts> clazz =
Class.forName(className).asSubclass(Contacts.class); Class.forName(className).asSubclass(Contacts.class);
Constructor<? extends Contacts> constructor = clazz.getConstructor(Context.class); Constructor <? extends Contacts > constructor = clazz.getConstructor(Context.class);
sInstance = constructor.newInstance(context); sInstance = constructor.newInstance(context);
} } catch (ClassNotFoundException e) {
catch (ClassNotFoundException e)
{
Log.e(K9.LOG_TAG, "Couldn't find class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't find class: " + className, e);
} } catch (InstantiationException e) {
catch (InstantiationException e)
{
Log.e(K9.LOG_TAG, "Couldn't instantiate class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't instantiate class: " + className, e);
} } catch (IllegalAccessException e) {
catch (IllegalAccessException e)
{
Log.e(K9.LOG_TAG, "Couldn't access class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't access class: " + className, e);
} } catch (NoSuchMethodException e) {
catch (NoSuchMethodException e)
{
Log.e(K9.LOG_TAG, "Couldn't find constructor of class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't find constructor of class: " + className, e);
} } catch (IllegalArgumentException e) {
catch (IllegalArgumentException e)
{
Log.e(K9.LOG_TAG, "Wrong arguments for constructor of class: " + className, e); Log.e(K9.LOG_TAG, "Wrong arguments for constructor of class: " + className, e);
} } catch (InvocationTargetException e) {
catch (InvocationTargetException e)
{
Log.e(K9.LOG_TAG, "Couldn't invoke constructor of class: " + className, e); Log.e(K9.LOG_TAG, "Couldn't invoke constructor of class: " + className, e);
} }
} }
@ -111,8 +90,7 @@ public abstract class Contacts
* *
* @param context A {@link Context} instance. * @param context A {@link Context} instance.
*/ */
protected Contacts(Context context) protected Contacts(Context context) {
{
mContext = context; mContext = context;
mContentResolver = context.getContentResolver(); mContentResolver = context.getContentResolver();
} }

View File

@ -13,8 +13,7 @@ import com.fsck.k9.mail.Address;
* @see android.provider.Contacts * @see android.provider.Contacts
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts {
{
/** /**
* The order in which the search results are returned by * The order in which the search results are returned by
* {@link #searchContacts(CharSequence)}. * {@link #searchContacts(CharSequence)}.
@ -31,8 +30,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
* {@link com.fsck.k9.EmailAddressAdapter} or more specificly by * {@link com.fsck.k9.EmailAddressAdapter} or more specificly by
* {@link android.widget.ResourceCursorAdapter}. * {@link android.widget.ResourceCursorAdapter}.
*/ */
private static final String PROJECTION[] = private static final String PROJECTION[] = {
{
Contacts.ContactMethods._ID, Contacts.ContactMethods._ID,
Contacts.ContactMethods.DISPLAY_NAME, Contacts.ContactMethods.DISPLAY_NAME,
Contacts.ContactMethods.DATA, Contacts.ContactMethods.DATA,
@ -58,14 +56,12 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
private static final int CONTACT_ID_INDEX = 3; private static final int CONTACT_ID_INDEX = 3;
public ContactsSdk3_4(final Context context) public ContactsSdk3_4(final Context context) {
{
super(context); super(context);
} }
@Override @Override
public void createContact(final Address email) public void createContact(final Address email) {
{
final Uri contactUri = Uri.fromParts("mailto", email.getAddress(), null); final Uri contactUri = Uri.fromParts("mailto", email.getAddress(), null);
final Intent contactIntent = new Intent(Contacts.Intents.SHOW_OR_CREATE_CONTACT); final Intent contactIntent = new Intent(Contacts.Intents.SHOW_OR_CREATE_CONTACT);
@ -77,8 +73,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
// Only provide personal name hint if we have one // Only provide personal name hint if we have one
final String senderPersonal = email.getPersonal(); final String senderPersonal = email.getPersonal();
if (senderPersonal != null) if (senderPersonal != null) {
{
contactIntent.putExtra(Contacts.Intents.Insert.NAME, senderPersonal); contactIntent.putExtra(Contacts.Intents.Insert.NAME, senderPersonal);
} }
@ -86,8 +81,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public String getOwnerName() public String getOwnerName() {
{
String name = null; String name = null;
final Cursor c = mContentResolver.query( final Cursor c = mContentResolver.query(
Uri.withAppendedPath(Contacts.People.CONTENT_URI, "owner"), Uri.withAppendedPath(Contacts.People.CONTENT_URI, "owner"),
@ -96,10 +90,8 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
null, null,
null); null);
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
c.moveToFirst(); c.moveToFirst();
name = c.getString(0); // owner's display name name = c.getString(0); // owner's display name
} }
@ -110,16 +102,13 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public boolean isInContacts(final String emailAddress) public boolean isInContacts(final String emailAddress) {
{
boolean result = false; boolean result = false;
final Cursor c = getContactByAddress(emailAddress); final Cursor c = getContactByAddress(emailAddress);
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
result = true; result = true;
} }
c.close(); c.close();
@ -129,17 +118,13 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public Cursor searchContacts(final CharSequence constraint) public Cursor searchContacts(final CharSequence constraint) {
{
final String where; final String where;
final String[] args; final String[] args;
if (constraint == null) if (constraint == null) {
{
where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL; where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL;
args = null; args = null;
} } else {
else
{
where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL + where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL +
" AND " + " AND " +
"(" + "(" +
@ -170,8 +155,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
args, args,
SORT_ORDER); SORT_ORDER);
if (c != null) if (c != null) {
{
/* /*
* To prevent expensive execution in the UI thread: * To prevent expensive execution in the UI thread:
* Cursors get lazily executed, so if you don't call anything on * Cursors get lazily executed, so if you don't call anything on
@ -187,20 +171,16 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public String getNameForAddress(String address) public String getNameForAddress(String address) {
{ if (address == null) {
if (address == null)
{
return null; return null;
} }
final Cursor c = getContactByAddress(address); final Cursor c = getContactByAddress(address);
String name = null; String name = null;
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
c.moveToFirst(); c.moveToFirst();
name = getName(c); name = getName(c);
} }
@ -211,29 +191,23 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public String getName(Cursor c) public String getName(Cursor c) {
{
return c.getString(NAME_INDEX); return c.getString(NAME_INDEX);
} }
@Override @Override
public String getEmail(Cursor c) public String getEmail(Cursor c) {
{
return c.getString(EMAIL_INDEX); return c.getString(EMAIL_INDEX);
} }
@Override @Override
public void markAsContacted(final Address[] addresses) public void markAsContacted(final Address[] addresses) {
{
//TODO: Optimize! Potentially a lot of database queries //TODO: Optimize! Potentially a lot of database queries
for (final Address address : addresses) for (final Address address : addresses) {
{
final Cursor c = getContactByAddress(address.getAddress()); final Cursor c = getContactByAddress(address.getAddress());
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
c.moveToFirst(); c.moveToFirst();
final long personId = c.getLong(CONTACT_ID_INDEX); final long personId = c.getLong(CONTACT_ID_INDEX);
Contacts.People.markAsContacted(mContentResolver, personId); Contacts.People.markAsContacted(mContentResolver, personId);
@ -251,8 +225,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
* @return A {@link Cursor} instance that can be used to fetch information * @return A {@link Cursor} instance that can be used to fetch information
* about the contact with the given email address * about the contact with the given email address
*/ */
private Cursor getContactByAddress(String address) private Cursor getContactByAddress(String address) {
{
final String where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL + final String where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL +
" AND " + " AND " +
Contacts.ContactMethods.DATA + " = ?"; Contacts.ContactMethods.DATA + " = ?";

View File

@ -17,8 +17,7 @@ import com.fsck.k9.mail.Address;
* *
* @see android.provider.ContactsContract * @see android.provider.ContactsContract
*/ */
public class ContactsSdk5 extends com.fsck.k9.helper.Contacts public class ContactsSdk5 extends com.fsck.k9.helper.Contacts {
{
/** /**
* The order in which the search results are returned by * The order in which the search results are returned by
* {@link #searchContacts(CharSequence)}. * {@link #searchContacts(CharSequence)}.
@ -35,8 +34,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
* {@link com.fsck.k9.EmailAddressAdapter} or more specificly by * {@link com.fsck.k9.EmailAddressAdapter} or more specificly by
* {@link android.widget.ResourceCursorAdapter}. * {@link android.widget.ResourceCursorAdapter}.
*/ */
protected static final String PROJECTION[] = protected static final String PROJECTION[] = {
{
Email._ID, Email._ID,
Contacts.DISPLAY_NAME, Contacts.DISPLAY_NAME,
Email.DATA, Email.DATA,
@ -62,14 +60,12 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
protected static final int CONTACT_ID_INDEX = 3; protected static final int CONTACT_ID_INDEX = 3;
public ContactsSdk5(final Context context) public ContactsSdk5(final Context context) {
{
super(context); super(context);
} }
@Override @Override
public void createContact(final Address email) public void createContact(final Address email) {
{
final Uri contactUri = Uri.fromParts("mailto", email.getAddress(), null); final Uri contactUri = Uri.fromParts("mailto", email.getAddress(), null);
final Intent contactIntent = new Intent(Intents.SHOW_OR_CREATE_CONTACT); final Intent contactIntent = new Intent(Intents.SHOW_OR_CREATE_CONTACT);
@ -81,8 +77,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
// Only provide personal name hint if we have one // Only provide personal name hint if we have one
final String senderPersonal = email.getPersonal(); final String senderPersonal = email.getPersonal();
if (senderPersonal != null) if (senderPersonal != null) {
{
contactIntent.putExtra(Intents.Insert.NAME, senderPersonal); contactIntent.putExtra(Intents.Insert.NAME, senderPersonal);
} }
@ -90,16 +85,13 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public String getOwnerName() public String getOwnerName() {
{
String name = null; String name = null;
// Get the name of the first account that has one. // Get the name of the first account that has one.
Account[] accounts = AccountManager.get(mContext).getAccounts(); Account[] accounts = AccountManager.get(mContext).getAccounts();
for (final Account account : accounts) for (final Account account : accounts) {
{ if (account.name != null) {
if (account.name != null)
{
name = account.name; name = account.name;
break; break;
} }
@ -109,16 +101,13 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public boolean isInContacts(final String emailAddress) public boolean isInContacts(final String emailAddress) {
{
boolean result = false; boolean result = false;
final Cursor c = getContactByAddress(emailAddress); final Cursor c = getContactByAddress(emailAddress);
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
result = true; result = true;
} }
c.close(); c.close();
@ -128,8 +117,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public Cursor searchContacts(final CharSequence constraint) public Cursor searchContacts(final CharSequence constraint) {
{
final String filter = (constraint == null) ? "" : constraint.toString(); final String filter = (constraint == null) ? "" : constraint.toString();
final Uri uri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, Uri.encode(filter)); final Uri uri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, Uri.encode(filter));
final Cursor c = mContentResolver.query( final Cursor c = mContentResolver.query(
@ -139,8 +127,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
null, null,
SORT_ORDER); SORT_ORDER);
if (c != null) if (c != null) {
{
/* /*
* To prevent expensive execution in the UI thread: * To prevent expensive execution in the UI thread:
* Cursors get lazily executed, so if you don't call anything on * Cursors get lazily executed, so if you don't call anything on
@ -156,20 +143,16 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public String getNameForAddress(String address) public String getNameForAddress(String address) {
{ if (address == null) {
if (address == null)
{
return null; return null;
} }
final Cursor c = getContactByAddress(address); final Cursor c = getContactByAddress(address);
String name = null; String name = null;
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
c.moveToFirst(); c.moveToFirst();
name = getName(c); name = getName(c);
} }
@ -180,29 +163,23 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
} }
@Override @Override
public String getName(Cursor c) public String getName(Cursor c) {
{
return c.getString(NAME_INDEX); return c.getString(NAME_INDEX);
} }
@Override @Override
public String getEmail(Cursor c) public String getEmail(Cursor c) {
{
return c.getString(EMAIL_INDEX); return c.getString(EMAIL_INDEX);
} }
@Override @Override
public void markAsContacted(final Address[] addresses) public void markAsContacted(final Address[] addresses) {
{
//TODO: Optimize! Potentially a lot of database queries //TODO: Optimize! Potentially a lot of database queries
for (final Address address : addresses) for (final Address address : addresses) {
{
final Cursor c = getContactByAddress(address.getAddress()); final Cursor c = getContactByAddress(address.getAddress());
if (c != null) if (c != null) {
{ if (c.getCount() > 0) {
if (c.getCount() > 0)
{
c.moveToFirst(); c.moveToFirst();
final long personId = c.getLong(CONTACT_ID_INDEX); final long personId = c.getLong(CONTACT_ID_INDEX);
ContactsContract.Contacts.markAsContacted(mContentResolver, personId); ContactsContract.Contacts.markAsContacted(mContentResolver, personId);
@ -220,8 +197,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
* @return A {@link Cursor} instance that can be used to fetch information * @return A {@link Cursor} instance that can be used to fetch information
* about the contact with the given email address * about the contact with the given email address
*/ */
private Cursor getContactByAddress(final String address) private Cursor getContactByAddress(final String address) {
{
final Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(address)); final Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(address));
final Cursor c = mContentResolver.query( final Cursor c = mContentResolver.query(
uri, uri,

View File

@ -16,18 +16,14 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName;
* *
* @see android.provider.ContactsContract * @see android.provider.ContactsContract
*/ */
public class ContactsSdk5p extends ContactsSdk5 public class ContactsSdk5p extends ContactsSdk5 {
{ public ContactsSdk5p(final Context context) {
public ContactsSdk5p(final Context context)
{
super(context); super(context);
} }
@Override @Override
public Cursor searchContacts(final CharSequence constraint) public Cursor searchContacts(final CharSequence constraint) {
{ if (constraint == null) {
if (constraint == null)
{
return null; return null;
} }
@ -43,17 +39,12 @@ public class ContactsSdk5p extends ContactsSdk5
null); null);
final StringBuilder matches = new StringBuilder(); final StringBuilder matches = new StringBuilder();
if ((cursor != null) && (cursor.getCount() > 0)) if ((cursor != null) && (cursor.getCount() > 0)) {
{
boolean first = true; boolean first = true;
while (cursor.moveToNext()) while (cursor.moveToNext()) {
{ if (first) {
if (first)
{
first = false; first = false;
} } else {
else
{
matches.append(","); matches.append(",");
} }
matches.append(cursor.getLong(0)); matches.append(cursor.getLong(0));
@ -97,8 +88,7 @@ public class ContactsSdk5p extends ContactsSdk5
args, args,
SORT_ORDER); SORT_ORDER);
if (c != null) if (c != null) {
{
/* /*
* To prevent expensive execution in the UI thread: * To prevent expensive execution in the UI thread:
* Cursors get lazily executed, so if you don't call anything on * Cursors get lazily executed, so if you don't call anything on

View File

@ -11,14 +11,11 @@ import java.util.Calendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class DateFormatter public class DateFormatter {
{ private DateFormatter() {
private DateFormatter()
{
} }
private final static Calendar SAMPLE_DATE = Calendar.getInstance(); private final static Calendar SAMPLE_DATE = Calendar.getInstance();
static static {
{
SAMPLE_DATE.set(SAMPLE_DATE.get(Calendar.YEAR), SAMPLE_DATE.getActualMaximum(Calendar.MONTH), SAMPLE_DATE.getActualMaximum(Calendar.DAY_OF_MONTH)); SAMPLE_DATE.set(SAMPLE_DATE.get(Calendar.YEAR), SAMPLE_DATE.getActualMaximum(Calendar.MONTH), SAMPLE_DATE.getActualMaximum(Calendar.DAY_OF_MONTH));
} }
@ -30,45 +27,34 @@ public class DateFormatter
private static volatile String sChosenFormat = null; private static volatile String sChosenFormat = null;
public static String getSampleDate(Context context, String formatString) public static String getSampleDate(Context context, String formatString) {
{
java.text.DateFormat formatter = getDateFormat(context, formatString); java.text.DateFormat formatter = getDateFormat(context, formatString);
return formatter.format(SAMPLE_DATE.getTime()); return formatter.format(SAMPLE_DATE.getTime());
} }
public static String[] getFormats(Context context) public static String[] getFormats(Context context) {
{
return context.getResources().getStringArray(R.array.date_formats); return context.getResources().getStringArray(R.array.date_formats);
} }
private static ThreadLocal<Map<String, DateFormat>> storedFormats = new ThreadLocal<Map<String, DateFormat>>() private static ThreadLocal<Map<String, DateFormat>> storedFormats = new ThreadLocal<Map<String, DateFormat>>() {
{
@Override @Override
public synchronized Map<String, DateFormat> initialValue() public synchronized Map<String, DateFormat> initialValue() {
{
return new HashMap<String, DateFormat>(); return new HashMap<String, DateFormat>();
} }
}; };
public static DateFormat getDateFormat(Context context, String formatString) public static DateFormat getDateFormat(Context context, String formatString) {
{
java.text.DateFormat dateFormat; java.text.DateFormat dateFormat;
if (SHORT_FORMAT.equals(formatString)) if (SHORT_FORMAT.equals(formatString)) {
{
dateFormat = android.text.format.DateFormat.getDateFormat(context); dateFormat = android.text.format.DateFormat.getDateFormat(context);
} } else if (MEDIUM_FORMAT.equals(formatString)) {
else if (MEDIUM_FORMAT.equals(formatString))
{
dateFormat = android.text.format.DateFormat.getMediumDateFormat(context); dateFormat = android.text.format.DateFormat.getMediumDateFormat(context);
} } else {
else
{
Map<String, DateFormat> formatMap = storedFormats.get(); Map<String, DateFormat> formatMap = storedFormats.get();
dateFormat = formatMap.get(formatString); dateFormat = formatMap.get(formatString);
if (dateFormat == null) if (dateFormat == null) {
{
dateFormat = new SimpleDateFormat(formatString); dateFormat = new SimpleDateFormat(formatString);
formatMap.put(formatString, dateFormat); formatMap.put(formatString, dateFormat);
} }
@ -76,24 +62,20 @@ public class DateFormatter
return dateFormat; return dateFormat;
} }
public static void setDateFormat(Editor editor, String formatString) public static void setDateFormat(Editor editor, String formatString) {
{
sChosenFormat = formatString; sChosenFormat = formatString;
editor.putString(PREF_KEY, formatString); editor.putString(PREF_KEY, formatString);
} }
public static String getFormat(Context context) public static String getFormat(Context context) {
{ if (sChosenFormat == null) {
if (sChosenFormat == null)
{
Preferences prefs = Preferences.getPreferences(context); Preferences prefs = Preferences.getPreferences(context);
sChosenFormat = prefs.getPreferences().getString(PREF_KEY, DEFAULT_FORMAT); sChosenFormat = prefs.getPreferences().getString(PREF_KEY, DEFAULT_FORMAT);
} }
return sChosenFormat; return sChosenFormat;
} }
public static DateFormat getDateFormat(Context context) public static DateFormat getDateFormat(Context context) {
{
String formatString = getFormat(context); String formatString = getFormat(context);
return getDateFormat(context, formatString); return getDateFormat(context, formatString);
} }

View File

@ -33,17 +33,12 @@ import java.util.Vector;
/** /**
* Implements basic domain-name validation as specified by RFC2818. * Implements basic domain-name validation as specified by RFC2818.
*/ */
public class DomainNameChecker public class DomainNameChecker {
{
private static Pattern QUICK_IP_PATTERN; private static Pattern QUICK_IP_PATTERN;
static static {
{ try {
try
{
QUICK_IP_PATTERN = Pattern.compile("^[a-f0-9\\.:]+$"); QUICK_IP_PATTERN = Pattern.compile("^[a-f0-9\\.:]+$");
} } catch (PatternSyntaxException e) {
catch (PatternSyntaxException e)
{
} }
} }
@ -60,21 +55,16 @@ public class DomainNameChecker
* The domain name of the site being visited * The domain name of the site being visited
* @return True iff if there is a domain match as specified by RFC2818 * @return True iff if there is a domain match as specified by RFC2818
*/ */
public static boolean match(X509Certificate certificate, String thisDomain) public static boolean match(X509Certificate certificate, String thisDomain) {
{
if ((certificate == null) || (thisDomain == null) if ((certificate == null) || (thisDomain == null)
|| (thisDomain.length() == 0)) || (thisDomain.length() == 0)) {
{
return false; return false;
} }
thisDomain = thisDomain.toLowerCase(); thisDomain = thisDomain.toLowerCase();
if (!isIpAddress(thisDomain)) if (!isIpAddress(thisDomain)) {
{
return matchDns(certificate, thisDomain); return matchDns(certificate, thisDomain);
} } else {
else
{
return matchIpAddress(certificate, thisDomain); return matchIpAddress(certificate, thisDomain);
} }
} }
@ -82,34 +72,26 @@ public class DomainNameChecker
/** /**
* @return True iff the domain name is specified as an IP address * @return True iff the domain name is specified as an IP address
*/ */
private static boolean isIpAddress(String domain) private static boolean isIpAddress(String domain) {
{ if ((domain == null) || (domain.length() == 0)) {
if ((domain == null) || (domain.length() == 0))
{
return false; return false;
} }
boolean rval; boolean rval;
try try {
{
// do a quick-dirty IP match first to avoid DNS lookup // do a quick-dirty IP match first to avoid DNS lookup
rval = QUICK_IP_PATTERN.matcher(domain).matches(); rval = QUICK_IP_PATTERN.matcher(domain).matches();
if (rval) if (rval) {
{
rval = domain.equals(InetAddress.getByName(domain) rval = domain.equals(InetAddress.getByName(domain)
.getHostAddress()); .getHostAddress());
} }
} } catch (UnknownHostException e) {
catch (UnknownHostException e)
{
String errorMessage = e.getMessage(); String errorMessage = e.getMessage();
if (errorMessage == null) if (errorMessage == null) {
{
errorMessage = "unknown host exception"; errorMessage = "unknown host exception";
} }
if (K9.DEBUG) if (K9.DEBUG) {
{
Log.v(K9.LOG_TAG, "DomainNameChecker.isIpAddress(): " Log.v(K9.LOG_TAG, "DomainNameChecker.isIpAddress(): "
+ errorMessage); + errorMessage);
} }
@ -130,37 +112,26 @@ public class DomainNameChecker
* The DNS domain name of the site being visited * The DNS domain name of the site being visited
* @return True iff if there is a domain match as specified by RFC2818 * @return True iff if there is a domain match as specified by RFC2818
*/ */
private static boolean matchIpAddress(X509Certificate certificate, String thisDomain) private static boolean matchIpAddress(X509Certificate certificate, String thisDomain) {
{ if (K9.DEBUG) {
if (K9.DEBUG)
{
Log.v(K9.LOG_TAG, "DomainNameChecker.matchIpAddress(): this domain: " + thisDomain); Log.v(K9.LOG_TAG, "DomainNameChecker.matchIpAddress(): this domain: " + thisDomain);
} }
try try {
{
Collection<?> subjectAltNames = certificate.getSubjectAlternativeNames(); Collection<?> subjectAltNames = certificate.getSubjectAlternativeNames();
if (subjectAltNames != null) if (subjectAltNames != null) {
{ for (Object subjectAltName : subjectAltNames) {
for (Object subjectAltName : subjectAltNames) List<?> altNameEntry = (List<?>)(subjectAltName);
{ if ((altNameEntry != null) && (2 <= altNameEntry.size())) {
List<?> altNameEntry = (List<?>) (subjectAltName); Integer altNameType = (Integer)(altNameEntry.get(0));
if ((altNameEntry != null) && (2 <= altNameEntry.size())) if (altNameType != null) {
{ if (altNameType == ALT_IPA_NAME) {
Integer altNameType = (Integer) (altNameEntry.get(0)); String altName = (String)(altNameEntry.get(1));
if (altNameType != null) if (altName != null) {
{ if (K9.DEBUG) {
if (altNameType == ALT_IPA_NAME)
{
String altName = (String) (altNameEntry.get(1));
if (altName != null)
{
if (K9.DEBUG)
{
Log.v(K9.LOG_TAG, "alternative IP: " + altName); Log.v(K9.LOG_TAG, "alternative IP: " + altName);
} }
if (thisDomain.equalsIgnoreCase(altName)) if (thisDomain.equalsIgnoreCase(altName)) {
{
return true; return true;
} }
} }
@ -169,9 +140,7 @@ public class DomainNameChecker
} }
} }
} }
} } catch (CertificateParsingException e) {
catch (CertificateParsingException e)
{
} }
return false; return false;
@ -187,31 +156,22 @@ public class DomainNameChecker
* The DNS domain name of the site being visited * The DNS domain name of the site being visited
* @return True iff if there is a domain match as specified by RFC2818 * @return True iff if there is a domain match as specified by RFC2818
*/ */
private static boolean matchDns(X509Certificate certificate, String thisDomain) private static boolean matchDns(X509Certificate certificate, String thisDomain) {
{
boolean hasDns = false; boolean hasDns = false;
try try {
{
Collection<?> subjectAltNames = certificate.getSubjectAlternativeNames(); Collection<?> subjectAltNames = certificate.getSubjectAlternativeNames();
if (subjectAltNames != null) if (subjectAltNames != null) {
{
Iterator<?> i = subjectAltNames.iterator(); Iterator<?> i = subjectAltNames.iterator();
while (i.hasNext()) while (i.hasNext()) {
{
List<?> altNameEntry = (List<?>)(i.next()); List<?> altNameEntry = (List<?>)(i.next());
if ((altNameEntry != null) && (2 <= altNameEntry.size())) if ((altNameEntry != null) && (2 <= altNameEntry.size())) {
{
Integer altNameType = (Integer)(altNameEntry.get(0)); Integer altNameType = (Integer)(altNameEntry.get(0));
if (altNameType != null) if (altNameType != null) {
{ if (altNameType.intValue() == ALT_DNS_NAME) {
if (altNameType.intValue() == ALT_DNS_NAME)
{
hasDns = true; hasDns = true;
String altName = (String)(altNameEntry.get(1)); String altName = (String)(altNameEntry.get(1));
if (altName != null) if (altName != null) {
{ if (matchDns(thisDomain, altName)) {
if (matchDns(thisDomain, altName))
{
return true; return true;
} }
} }
@ -220,19 +180,15 @@ public class DomainNameChecker
} }
} }
} }
} } catch (CertificateParsingException e) {
catch (CertificateParsingException e)
{
// one way we can get here is if an alternative name starts with // one way we can get here is if an alternative name starts with
// '*' character, which is contrary to one interpretation of the // '*' character, which is contrary to one interpretation of the
// spec (a valid DNS name must start with a letter); there is no // spec (a valid DNS name must start with a letter); there is no
// good way around this, and in order to be compatible we proceed // good way around this, and in order to be compatible we proceed
// to check the common name (ie, ignore alternative names) // to check the common name (ie, ignore alternative names)
if (K9.DEBUG) if (K9.DEBUG) {
{
String errorMessage = e.getMessage(); String errorMessage = e.getMessage();
if (errorMessage == null) if (errorMessage == null) {
{
errorMessage = "failed to parse certificate"; errorMessage = "failed to parse certificate";
} }
@ -241,15 +197,12 @@ public class DomainNameChecker
} }
} }
if (!hasDns) if (!hasDns) {
{
X509Name xName = new X509Name(certificate.getSubjectDN().getName()); X509Name xName = new X509Name(certificate.getSubjectDN().getName());
Vector<?> val = xName.getValues(); Vector<?> val = xName.getValues();
Vector<?> oid = xName.getOIDs(); Vector<?> oid = xName.getOIDs();
for (int i = 0; i < oid.size(); i++) for (int i = 0; i < oid.size(); i++) {
{ if (oid.elementAt(i).equals(X509Name.CN)) {
if (oid.elementAt(i).equals(X509Name.CN))
{
return matchDns(thisDomain, (String)(val.elementAt(i))); return matchDns(thisDomain, (String)(val.elementAt(i)));
} }
} }
@ -265,18 +218,15 @@ public class DomainNameChecker
* The domain name from the certificate * The domain name from the certificate
* @return True iff thisDomain matches thatDomain as specified by RFC2818 * @return True iff thisDomain matches thatDomain as specified by RFC2818
*/ */
private static boolean matchDns(String thisDomain, String thatDomain) private static boolean matchDns(String thisDomain, String thatDomain) {
{ if (K9.DEBUG) {
if (K9.DEBUG)
{
Log.v(K9.LOG_TAG, "DomainNameChecker.matchDns():" Log.v(K9.LOG_TAG, "DomainNameChecker.matchDns():"
+ " this domain: " + thisDomain + " that domain: " + " this domain: " + thisDomain + " that domain: "
+ thatDomain); + thatDomain);
} }
if ((thisDomain == null) || (thisDomain.length() == 0) if ((thisDomain == null) || (thisDomain.length() == 0)
|| (thatDomain == null) || (thatDomain.length() == 0)) || (thatDomain == null) || (thatDomain.length() == 0)) {
{
return false; return false;
} }
@ -284,8 +234,7 @@ public class DomainNameChecker
// (a) domain name strings are equal, ignoring case: X matches X // (a) domain name strings are equal, ignoring case: X matches X
boolean rval = thisDomain.equals(thatDomain); boolean rval = thisDomain.equals(thatDomain);
if (!rval) if (!rval) {
{
String[] thisDomainTokens = thisDomain.split("\\."); String[] thisDomainTokens = thisDomain.split("\\.");
String[] thatDomainTokens = thatDomain.split("\\."); String[] thatDomainTokens = thatDomain.split("\\.");
@ -293,21 +242,16 @@ public class DomainNameChecker
int thatDomainTokensNum = thatDomainTokens.length; int thatDomainTokensNum = thatDomainTokens.length;
// (b) OR thatHost is a '.'-suffix of thisHost: Z.Y.X matches X // (b) OR thatHost is a '.'-suffix of thisHost: Z.Y.X matches X
if (thisDomainTokensNum >= thatDomainTokensNum) if (thisDomainTokensNum >= thatDomainTokensNum) {
{ for (int i = thatDomainTokensNum - 1; i >= 0; --i) {
for (int i = thatDomainTokensNum - 1; i >= 0; --i)
{
rval = thisDomainTokens[i].equals(thatDomainTokens[i]); rval = thisDomainTokens[i].equals(thatDomainTokens[i]);
if (!rval) if (!rval) {
{
// (c) OR we have a special *-match: // (c) OR we have a special *-match:
// Z.Y.X matches *.Y.X but does not match *.X // Z.Y.X matches *.Y.X but does not match *.X
rval = ((i == 0) && (thisDomainTokensNum == thatDomainTokensNum)); rval = ((i == 0) && (thisDomainTokensNum == thatDomainTokensNum));
if (rval) if (rval) {
{
rval = thatDomainTokens[0].equals("*"); rval = thatDomainTokens[0].equals("*");
if (!rval) if (!rval) {
{
// (d) OR we have a *-component match: // (d) OR we have a *-component match:
// f*.com matches foo.com but not bar.com // f*.com matches foo.com but not bar.com
rval = domainTokenMatch(thisDomainTokens[0], rval = domainTokenMatch(thisDomainTokens[0],
@ -333,15 +277,11 @@ public class DomainNameChecker
* wildcard match as specified by RFC2818-3.1. For example, f*.com * wildcard match as specified by RFC2818-3.1. For example, f*.com
* must match foo.com but not bar.com * must match foo.com but not bar.com
*/ */
private static boolean domainTokenMatch(String thisDomainToken, String thatDomainToken) private static boolean domainTokenMatch(String thisDomainToken, String thatDomainToken) {
{ if ((thisDomainToken != null) && (thatDomainToken != null)) {
if ((thisDomainToken != null) && (thatDomainToken != null))
{
int starIndex = thatDomainToken.indexOf('*'); int starIndex = thatDomainToken.indexOf('*');
if (starIndex >= 0) if (starIndex >= 0) {
{ if (thatDomainToken.length() - 1 <= thisDomainToken.length()) {
if (thatDomainToken.length() - 1 <= thisDomainToken.length())
{
String prefix = thatDomainToken.substring(0, starIndex); String prefix = thatDomainToken.substring(0, starIndex);
String suffix = thatDomainToken.substring(starIndex + 1); String suffix = thatDomainToken.substring(starIndex + 1);

View File

@ -15,8 +15,7 @@ import java.util.regex.Matcher;
/** /**
* Contains common routines to convert html to text and vice versa. * Contains common routines to convert html to text and vice versa.
*/ */
public class HtmlConverter public class HtmlConverter {
{
/** /**
* When generating previews, Spannable objects that can't be converted into a String are * When generating previews, Spannable objects that can't be converted into a String are
* represented as 0xfffc. When displayed, these show up as undisplayed squares. These constants * represented as 0xfffc. When displayed, these show up as undisplayed squares. These constants
@ -40,8 +39,7 @@ public class HtmlConverter
* @param html HTML string to convert. * @param html HTML string to convert.
* @return Plain text result. * @return Plain text result.
*/ */
public static String htmlToText(final String html) public static String htmlToText(final String html) {
{
return Html.fromHtml(html, null, new HtmlToTextTagHandler()).toString() return Html.fromHtml(html, null, new HtmlToTextTagHandler()).toString()
.replace(PREVIEW_OBJECT_CHARACTER, PREVIEW_OBJECT_REPLACEMENT) .replace(PREVIEW_OBJECT_CHARACTER, PREVIEW_OBJECT_REPLACEMENT)
.replace(NBSP_CHARACTER, NBSP_REPLACEMENT); .replace(NBSP_CHARACTER, NBSP_REPLACEMENT);
@ -52,11 +50,9 @@ public class HtmlConverter
* representations of HTML tags that Android's built-in parser doesn't understand and hides code * representations of HTML tags that Android's built-in parser doesn't understand and hides code
* contained in STYLE and SCRIPT blocks. * contained in STYLE and SCRIPT blocks.
*/ */
private static class HtmlToTextTagHandler implements Html.TagHandler private static class HtmlToTextTagHandler implements Html.TagHandler {
{
// List of tags whose content should be ignored. // List of tags whose content should be ignored.
private static final Set<String> TAGS_WITH_IGNORED_CONTENT = Collections.unmodifiableSet(new HashSet<String>() private static final Set<String> TAGS_WITH_IGNORED_CONTENT = Collections.unmodifiableSet(new HashSet<String>() {
{
{ {
add("style"); add("style");
add("script"); add("script");
@ -66,17 +62,13 @@ public class HtmlConverter
}); });
@Override @Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
{
tag = tag.toLowerCase(); tag = tag.toLowerCase();
if (tag.equals("hr") && opening) if (tag.equals("hr") && opening) {
{
// In the case of an <hr>, replace it with a bunch of underscores. This is roughly // In the case of an <hr>, replace it with a bunch of underscores. This is roughly
// the behaviour of Outlook in Rich Text mode. // the behaviour of Outlook in Rich Text mode.
output.append("_____________________________________________\n"); output.append("_____________________________________________\n");
} } else if (TAGS_WITH_IGNORED_CONTENT.contains(tag)) {
else if (TAGS_WITH_IGNORED_CONTENT.contains(tag))
{
handleIgnoredTag(opening, output); handleIgnoredTag(opening, output);
} }
} }
@ -92,19 +84,14 @@ public class HtmlConverter
* @param opening If this is an opening tag or not. * @param opening If this is an opening tag or not.
* @param output Spannable string that we're working with. * @param output Spannable string that we're working with.
*/ */
private void handleIgnoredTag(boolean opening, Editable output) private void handleIgnoredTag(boolean opening, Editable output) {
{
int len = output.length(); int len = output.length();
if (opening) if (opening) {
{
output.setSpan(new Annotation(IGNORED_ANNOTATION_KEY, IGNORED_ANNOTATION_VALUE), len, output.setSpan(new Annotation(IGNORED_ANNOTATION_KEY, IGNORED_ANNOTATION_VALUE), len,
len, Spannable.SPAN_MARK_MARK); len, Spannable.SPAN_MARK_MARK);
} } else {
else
{
Object start = getOpeningAnnotation(output); Object start = getOpeningAnnotation(output);
if (start != null) if (start != null) {
{
int where = output.getSpanStart(start); int where = output.getSpanStart(start);
// Remove the temporary Annotation span. // Remove the temporary Annotation span.
output.removeSpan(start); output.removeSpan(start);
@ -120,16 +107,13 @@ public class HtmlConverter
* @param output Spannable string we're working with. * @param output Spannable string we're working with.
* @return Starting Annotation object. * @return Starting Annotation object.
*/ */
private Object getOpeningAnnotation(Editable output) private Object getOpeningAnnotation(Editable output) {
{
Object[] objs = output.getSpans(0, output.length(), Annotation.class); Object[] objs = output.getSpans(0, output.length(), Annotation.class);
for (int i = objs.length - 1; i >= 0; i--) for (int i = objs.length - 1; i >= 0; i--) {
{
Annotation span = (Annotation) objs[i]; Annotation span = (Annotation) objs[i];
if (output.getSpanFlags(objs[i]) == Spannable.SPAN_MARK_MARK if (output.getSpanFlags(objs[i]) == Spannable.SPAN_MARK_MARK
&& span.getKey().equals(IGNORED_ANNOTATION_KEY) && span.getKey().equals(IGNORED_ANNOTATION_KEY)
&& span.getValue().equals(IGNORED_ANNOTATION_VALUE)) && span.getValue().equals(IGNORED_ANNOTATION_VALUE)) {
{
return objs[i]; return objs[i];
} }
} }
@ -146,14 +130,12 @@ public class HtmlConverter
* @param text Plain text string. * @param text Plain text string.
* @return HTML string. * @return HTML string.
*/ */
public static String textToHtml(String text) public static String textToHtml(String text) {
{
// Our HTMLification code is somewhat memory intensive // Our HTMLification code is somewhat memory intensive
// and was causing lots of OOM errors on the market // and was causing lots of OOM errors on the market
// if the message is big and plain text, just do // if the message is big and plain text, just do
// a trivial htmlification // a trivial htmlification
if (text.length() > MAX_SMART_HTMLIFY_MESSAGE_LENGTH) if (text.length() > MAX_SMART_HTMLIFY_MESSAGE_LENGTH) {
{
return "<html><head/><body>" + return "<html><head/><body>" +
htmlifyMessageHeader() + htmlifyMessageHeader() +
text + text +
@ -163,12 +145,9 @@ public class HtmlConverter
StringReader reader = new StringReader(text); StringReader reader = new StringReader(text);
StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH); StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH);
int c; int c;
try try {
{ while ((c = reader.read()) != -1) {
while ((c = reader.read()) != -1) switch (c) {
{
switch (c)
{
case '&': case '&':
buff.append("&amp;"); buff.append("&amp;");
break; break;
@ -184,16 +163,14 @@ public class HtmlConverter
buff.append((char)c); buff.append((char)c);
}//switch }//switch
} }
} } catch (IOException e) {
catch (IOException e)
{
//Should never happen //Should never happen
Log.e(K9.LOG_TAG, "Could not read string to convert text to HTML:", e); Log.e(K9.LOG_TAG, "Could not read string to convert text to HTML:", e);
} }
text = buff.toString(); text = buff.toString();
text = text.replaceAll("\\s*([-=_]{30,}+)\\s*","<hr />"); text = text.replaceAll("\\s*([-=_]{30,}+)\\s*", "<hr />");
text = text.replaceAll("(?m)^([^\r\n]{4,}[\\s\\w,:;+/])(?:\r\n|\n|\r)(?=[a-z]\\S{0,10}[\\s\\n\\r])","$1 "); text = text.replaceAll("(?m)^([^\r\n]{4,}[\\s\\w,:;+/])(?:\r\n|\n|\r)(?=[a-z]\\S{0,10}[\\s\\n\\r])", "$1 ");
text = text.replaceAll("(?m)(\r\n|\n|\r){4,}","\n\n"); text = text.replaceAll("(?m)(\r\n|\n|\r){4,}", "\n\n");
StringBuffer sb = new StringBuffer(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH); StringBuffer sb = new StringBuffer(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH);
sb.append("<html><head></head><body>"); sb.append("<html><head></head><body>");
@ -214,22 +191,15 @@ public class HtmlConverter
*/ */
private static void linkifyText(final String text, final StringBuffer outputBuffer) { private static void linkifyText(final String text, final StringBuffer outputBuffer) {
Matcher m = Regex.WEB_URL_PATTERN.matcher(text); Matcher m = Regex.WEB_URL_PATTERN.matcher(text);
while (m.find()) while (m.find()) {
{
int start = m.start(); int start = m.start();
if (start == 0 || (start != 0 && text.charAt(start - 1) != '@')) if (start == 0 || (start != 0 && text.charAt(start - 1) != '@')) {
{ if (m.group().indexOf(':') > 0) { // With no URI-schema we may get "http:/" links with the second / missing
if (m.group().indexOf(':') > 0) // With no URI-schema we may get "http:/" links with the second / missing
{
m.appendReplacement(outputBuffer, "<a href=\"$0\">$0</a>"); m.appendReplacement(outputBuffer, "<a href=\"$0\">$0</a>");
} } else {
else
{
m.appendReplacement(outputBuffer, "<a href=\"http://$0\">$0</a>"); m.appendReplacement(outputBuffer, "<a href=\"http://$0\">$0</a>");
} }
} } else {
else
{
m.appendReplacement(outputBuffer, "$0"); m.appendReplacement(outputBuffer, "$0");
} }
} }
@ -242,10 +212,8 @@ public class HtmlConverter
* Useful to avoid calling the heavyweight convertEmoji2Img method. * Useful to avoid calling the heavyweight convertEmoji2Img method.
* We don't use String.codePointAt here for performance reasons. * We don't use String.codePointAt here for performance reasons.
*/ */
private static boolean hasEmoji(String html) private static boolean hasEmoji(String html) {
{ for (int i = 0; i < html.length(); ++i) {
for (int i = 0; i < html.length(); ++i)
{
char c = html.charAt(i); char c = html.charAt(i);
if (c >= 0xDBB8 && c < 0xDBBC) if (c >= 0xDBB8 && c < 0xDBBC)
return true; return true;
@ -253,16 +221,13 @@ public class HtmlConverter
return false; return false;
} }
public static String convertEmoji2Img(String html) public static String convertEmoji2Img(String html) {
{ if (!hasEmoji(html)) {
if (!hasEmoji(html))
{
return html; return html;
} }
StringBuilder buff = new StringBuilder(html.length() + 512); StringBuilder buff = new StringBuilder(html.length() + 512);
for (int i = 0; i < html.length(); i = html.offsetByCodePoints(i, 1)) for (int i = 0; i < html.length(); i = html.offsetByCodePoints(i, 1)) {
{
int codePoint = html.codePointAt(i); int codePoint = html.codePointAt(i);
String emoji = getEmojiForCodePoint(codePoint); String emoji = getEmojiForCodePoint(codePoint);
if (emoji != null) if (emoji != null)
@ -274,12 +239,10 @@ public class HtmlConverter
return buff.toString(); return buff.toString();
} }
private static String getEmojiForCodePoint(int codePoint) private static String getEmojiForCodePoint(int codePoint) {
{
// Derived from http://code.google.com/p/emoji4unicode/source/browse/trunk/data/emoji4unicode.xml // Derived from http://code.google.com/p/emoji4unicode/source/browse/trunk/data/emoji4unicode.xml
// XXX: This doesn't cover all the characters. More emoticons are wanted. // XXX: This doesn't cover all the characters. More emoticons are wanted.
switch (codePoint) switch (codePoint) {
{
case 0xFE000: case 0xFE000:
return "sun"; return "sun";
case 0xFE001: case 0xFE001:
@ -1109,26 +1072,18 @@ public class HtmlConverter
} }
} }
private static String htmlifyMessageHeader() private static String htmlifyMessageHeader() {
{ if (K9.messageViewFixedWidthFont()) {
if (K9.messageViewFixedWidthFont())
{
return "<pre style=\"white-space: pre-wrap; word-wrap:break-word; \">"; return "<pre style=\"white-space: pre-wrap; word-wrap:break-word; \">";
} } else {
else
{
return "<div style=\"white-space: pre-wrap; word-wrap:break-word; \">"; return "<div style=\"white-space: pre-wrap; word-wrap:break-word; \">";
} }
} }
private static String htmlifyMessageFooter() private static String htmlifyMessageFooter() {
{ if (K9.messageViewFixedWidthFont()) {
if (K9.messageViewFixedWidthFont())
{
return "</pre>"; return "</pre>";
} } else {
else
{
return "</div>"; return "</div>";
} }
} }
@ -1138,8 +1093,7 @@ public class HtmlConverter
* @param text Plain text. * @param text Plain text.
* @return HTML fragment. * @return HTML fragment.
*/ */
public static String textToHtmlFragment(final String text) public static String textToHtmlFragment(final String text) {
{
// Escape the entities and add newlines. // Escape the entities and add newlines.
String htmlified = TextUtils.htmlEncode(text); String htmlified = TextUtils.htmlEncode(text);

View File

@ -7,8 +7,7 @@ import android.content.Context;
* current state of the auto-sync setting. This method differs from SDK 3 to * current state of the auto-sync setting. This method differs from SDK 3 to
* SDK 5, so there are specialized implementations for each SDK version. * SDK 5, so there are specialized implementations for each SDK version.
*/ */
public interface IAutoSync public interface IAutoSync {
{
/** /**
* Do the necessary reflection magic to get the necessary objects and/or * Do the necessary reflection magic to get the necessary objects and/or
* methods to later query the state of the auto-sync setting. * methods to later query the state of the auto-sync setting.

View File

@ -9,14 +9,12 @@ import android.net.Uri;
import java.io.File; import java.io.File;
public class MediaScannerNotifier implements MediaScannerConnectionClient public class MediaScannerNotifier implements MediaScannerConnectionClient {
{
private MediaScannerConnection mConnection; private MediaScannerConnection mConnection;
private File mFile; private File mFile;
private Context mContext; private Context mContext;
public MediaScannerNotifier(Context context, File file) public MediaScannerNotifier(Context context, File file) {
{
mFile = file; mFile = file;
mConnection = new MediaScannerConnection(context, this); mConnection = new MediaScannerConnection(context, this);
mConnection.connect(); mConnection.connect();
@ -24,24 +22,18 @@ public class MediaScannerNotifier implements MediaScannerConnectionClient
} }
public void onMediaScannerConnected() public void onMediaScannerConnected() {
{
mConnection.scanFile(mFile.getAbsolutePath(), null); mConnection.scanFile(mFile.getAbsolutePath(), null);
} }
public void onScanCompleted(String path, Uri uri) public void onScanCompleted(String path, Uri uri) {
{ try {
try if (uri != null) {
{
if (uri != null)
{
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri); intent.setData(uri);
mContext.startActivity(intent); mContext.startActivity(intent);
} }
} } finally {
finally
{
mConnection.disconnect(); mConnection.disconnect();
} }
} }

View File

@ -20,15 +20,12 @@ import com.fsck.k9.mail.Message.RecipientType;
import com.fsck.k9.mail.store.LocalStore.LocalMessage; import com.fsck.k9.mail.store.LocalStore.LocalMessage;
import com.fsck.k9.helper.DateFormatter; import com.fsck.k9.helper.DateFormatter;
public class MessageHelper public class MessageHelper {
{
private static MessageHelper sInstance; private static MessageHelper sInstance;
public synchronized static MessageHelper getInstance(final Context context) public synchronized static MessageHelper getInstance(final Context context) {
{ if (sInstance == null) {
if (sInstance == null)
{
sInstance = new MessageHelper(context); sInstance = new MessageHelper(context);
} }
return sInstance; return sInstance;
@ -40,24 +37,20 @@ public class MessageHelper
private DateFormat mDateFormat; private DateFormat mDateFormat;
private MessageHelper(final Context context) private MessageHelper(final Context context) {
{
mContext = context; mContext = context;
mDateFormat = DateFormatter.getDateFormat(mContext); mDateFormat = DateFormatter.getDateFormat(mContext);
mTodayDateFormat = android.text.format.DateFormat.getTimeFormat(mContext); mTodayDateFormat = android.text.format.DateFormat.getTimeFormat(mContext);
} }
public void populate(final MessageInfoHolder target, final Message m, public void populate(final MessageInfoHolder target, final Message m,
final FolderInfoHolder folder, final Account account) final FolderInfoHolder folder, final Account account) {
{
final Contacts contactHelper = K9.showContactName() ? Contacts.getInstance(mContext) : null; final Contacts contactHelper = K9.showContactName() ? Contacts.getInstance(mContext) : null;
try try {
{
LocalMessage message = (LocalMessage) m; LocalMessage message = (LocalMessage) m;
target.message = message; target.message = message;
target.compareDate = message.getSentDate(); target.compareDate = message.getSentDate();
if (target.compareDate == null) if (target.compareDate == null) {
{
target.compareDate = message.getInternalDate(); target.compareDate = message.getInternalDate();
} }
@ -71,24 +64,18 @@ public class MessageHelper
Address[] addrs = message.getFrom(); Address[] addrs = message.getFrom();
if (addrs.length > 0 && account.isAnIdentity(addrs[0])) if (addrs.length > 0 && account.isAnIdentity(addrs[0])) {
{
CharSequence to = Address.toFriendly(message .getRecipients(RecipientType.TO), contactHelper); CharSequence to = Address.toFriendly(message .getRecipients(RecipientType.TO), contactHelper);
target.compareCounterparty = to.toString(); target.compareCounterparty = to.toString();
target.sender = new SpannableStringBuilder(mContext.getString(R.string.message_to_label)).append(to); target.sender = new SpannableStringBuilder(mContext.getString(R.string.message_to_label)).append(to);
} } else {
else
{
target.sender = Address.toFriendly(addrs, contactHelper); target.sender = Address.toFriendly(addrs, contactHelper);
target.compareCounterparty = target.sender.toString(); target.compareCounterparty = target.sender.toString();
} }
if (addrs.length > 0) if (addrs.length > 0) {
{
target.senderAddress = addrs[0].getAddress(); target.senderAddress = addrs[0].getAddress();
} } else {
else
{
// a reasonable fallback "whomever we were corresponding with // a reasonable fallback "whomever we were corresponding with
target.senderAddress = target.compareCounterparty; target.senderAddress = target.compareCounterparty;
} }
@ -101,20 +88,14 @@ public class MessageHelper
target.account = account.getDescription(); target.account = account.getDescription();
target.uri = "email://messages/" + account.getAccountNumber() + "/" + m.getFolder().getName() + "/" + m.getUid(); target.uri = "email://messages/" + account.getAccountNumber() + "/" + m.getFolder().getName() + "/" + m.getUid();
} } catch (MessagingException me) {
catch (MessagingException me)
{
Log.w(K9.LOG_TAG, "Unable to load message info", me); Log.w(K9.LOG_TAG, "Unable to load message info", me);
} }
} }
public String formatDate(Date date) public String formatDate(Date date) {
{ if (Utility.isDateToday(date)) {
if (Utility.isDateToday(date))
{
return mTodayDateFormat.format(date); return mTodayDateFormat.format(date);
} } else {
else
{
return mDateFormat.format(date); return mDateFormat.format(date);
} }
} }

View File

@ -27,8 +27,7 @@ import java.util.regex.Pattern;
/** /**
* Commonly used regular expression patterns. * Commonly used regular expression patterns.
*/ */
public class Regex public class Regex {
{
/** /**
* Regular expression to match all IANA top-level domains. * Regular expression to match all IANA top-level domains.
@ -190,19 +189,16 @@ public class Regex
* @return A String comprising all of the non-null matched * @return A String comprising all of the non-null matched
* groups concatenated together * groups concatenated together
*/ */
public static final String concatGroups(Matcher matcher) public static final String concatGroups(Matcher matcher) {
{
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
final int numGroups = matcher.groupCount(); final int numGroups = matcher.groupCount();
for (int i = 1; i <= numGroups; i++) for (int i = 1; i <= numGroups; i++) {
{
String s = matcher.group(i); String s = matcher.group(i);
System.err.println("Group(" + i + ") : " + s); System.err.println("Group(" + i + ") : " + s);
if (s != null) if (s != null) {
{
b.append(s); b.append(s);
} }
} }
@ -220,17 +216,14 @@ public class Regex
* @return A String comprising all of the digits and plus in * @return A String comprising all of the digits and plus in
* the match * the match
*/ */
public static final String digitsAndPlusOnly(Matcher matcher) public static final String digitsAndPlusOnly(Matcher matcher) {
{
StringBuilder buffer = new StringBuilder(); StringBuilder buffer = new StringBuilder();
String matchingRegion = matcher.group(); String matchingRegion = matcher.group();
for (int i = 0, size = matchingRegion.length(); i < size; i++) for (int i = 0, size = matchingRegion.length(); i < size; i++) {
{
char character = matchingRegion.charAt(i); char character = matchingRegion.charAt(i);
if (character == '+' || Character.isDigit(character)) if (character == '+' || Character.isDigit(character)) {
{
buffer.append(character); buffer.append(character);
} }
} }

View File

@ -3,24 +3,19 @@ package com.fsck.k9.helper;
import android.content.Context; import android.content.Context;
import com.fsck.k9.R; import com.fsck.k9.R;
public class SizeFormatter public class SizeFormatter {
{
/* /*
* Formats the given size as a String in bytes, kB, MB or GB with a single digit * Formats the given size as a String in bytes, kB, MB or GB with a single digit
* of precision. Ex: 12,315,000 = 12.3 MB * of precision. Ex: 12,315,000 = 12.3 MB
*/ */
public static String formatSize(Context context, long size) public static String formatSize(Context context, long size) {
{ if (size > 1024000000) {
if (size > 1024000000)
{
return ((float)(size / 102400000) / 10) + context.getString(R.string.abbrev_gigabytes); return ((float)(size / 102400000) / 10) + context.getString(R.string.abbrev_gigabytes);
} }
if (size > 1024000) if (size > 1024000) {
{
return ((float)(size / 102400) / 10) + context.getString(R.string.abbrev_megabytes); return ((float)(size / 102400) / 10) + context.getString(R.string.abbrev_megabytes);
} }
if (size > 1024) if (size > 1024) {
{
return ((float)(size / 102) / 10) + context.getString(R.string.abbrev_kilobytes); return ((float)(size / 102) / 10) + context.getString(R.string.abbrev_kilobytes);
} }
return size + context.getString(R.string.abbrev_bytes); return size + context.getString(R.string.abbrev_bytes);

View File

@ -20,8 +20,7 @@ import java.util.Date;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class Utility public class Utility {
{
// \u00A0 (non-breaking space) happens to be used by French MUA // \u00A0 (non-breaking space) happens to be used by French MUA
@ -37,25 +36,20 @@ public class Utility
private static final Pattern TAG_PATTERN = Pattern.compile("\\[[-_a-z0-9]+\\] ", private static final Pattern TAG_PATTERN = Pattern.compile("\\[[-_a-z0-9]+\\] ",
Pattern.CASE_INSENSITIVE); Pattern.CASE_INSENSITIVE);
public static String readInputStream(InputStream in, String encoding) throws IOException public static String readInputStream(InputStream in, String encoding) throws IOException {
{
InputStreamReader reader = new InputStreamReader(in, encoding); InputStreamReader reader = new InputStreamReader(in, encoding);
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
int count; int count;
char[] buf = new char[512]; char[] buf = new char[512];
while ((count = reader.read(buf)) != -1) while ((count = reader.read(buf)) != -1) {
{
sb.append(buf, 0, count); sb.append(buf, 0, count);
} }
return sb.toString(); return sb.toString();
} }
public static boolean arrayContains(Object[] a, Object o) public static boolean arrayContains(Object[] a, Object o) {
{ for (Object element : a) {
for (Object element : a) if (element.equals(o)) {
{
if (element.equals(o))
{
return true; return true;
} }
} }
@ -71,70 +65,55 @@ public class Utility
* @param seperator * @param seperator
* @return * @return
*/ */
public static String combine(Object[] parts, char seperator) public static String combine(Object[] parts, char seperator) {
{ if (parts == null) {
if (parts == null)
{
return null; return null;
} }
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
for (int i = 0; i < parts.length; i++) for (int i = 0; i < parts.length; i++) {
{
sb.append(parts[i].toString()); sb.append(parts[i].toString());
if (i < parts.length - 1) if (i < parts.length - 1) {
{
sb.append(seperator); sb.append(seperator);
} }
} }
return sb.toString(); return sb.toString();
} }
public static String base64Decode(String encoded) public static String base64Decode(String encoded) {
{ if (encoded == null) {
if (encoded == null)
{
return null; return null;
} }
byte[] decoded = new Base64().decode(encoded.getBytes()); byte[] decoded = new Base64().decode(encoded.getBytes());
return new String(decoded); return new String(decoded);
} }
public static String base64Encode(String s) public static String base64Encode(String s) {
{ if (s == null) {
if (s == null)
{
return s; return s;
} }
byte[] encoded = new Base64().encode(s.getBytes()); byte[] encoded = new Base64().encode(s.getBytes());
return new String(encoded); return new String(encoded);
} }
public static boolean requiredFieldValid(TextView view) public static boolean requiredFieldValid(TextView view) {
{
return view.getText() != null && view.getText().length() > 0; return view.getText() != null && view.getText().length() > 0;
} }
public static boolean requiredFieldValid(Editable s) public static boolean requiredFieldValid(Editable s) {
{
return s != null && s.length() > 0; return s != null && s.length() > 0;
} }
public static boolean domainFieldValid(EditText view) public static boolean domainFieldValid(EditText view) {
{ if (view.getText() != null) {
if (view.getText() != null)
{
String s = view.getText().toString(); String s = view.getText().toString();
if (s.matches("^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}$")) if (s.matches("^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}$")) {
{
return true; return true;
} }
if (s.matches("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")) if (s.matches("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")) {
{
return true; return true;
} }
if ((s.equalsIgnoreCase("localhost"))||(s.equalsIgnoreCase("localhost.localdomain"))) if ((s.equalsIgnoreCase("localhost")) || (s.equalsIgnoreCase("localhost.localdomain"))) {
{
return true; return true;
} }
} }
@ -150,14 +129,10 @@ public class Utility
* @param text String to quote. * @param text String to quote.
* @return Possibly quoted string. * @return Possibly quoted string.
*/ */
public static String quoteAtoms(final String text) public static String quoteAtoms(final String text) {
{ if (ATOM.matcher(text).matches()) {
if (ATOM.matcher(text).matches())
{
return text; return text;
} } else {
else
{
return quoteString(text); return quoteString(text);
} }
} }
@ -176,18 +151,13 @@ public class Utility
* @param s * @param s
* @return * @return
*/ */
public static String quoteString(String s) public static String quoteString(String s) {
{ if (s == null) {
if (s == null)
{
return null; return null;
} }
if (!s.matches("^\".*\"$")) if (!s.matches("^\".*\"$")) {
{
return "\"" + s + "\""; return "\"" + s + "\"";
} } else {
else
{
return s; return s;
} }
} }
@ -197,45 +167,33 @@ public class Utility
* allocations. This version is around 3x as fast as the standard one and I'm using it * allocations. This version is around 3x as fast as the standard one and I'm using it
* hundreds of times in places that slow down the UI, so it helps. * hundreds of times in places that slow down the UI, so it helps.
*/ */
public static String fastUrlDecode(String s) public static String fastUrlDecode(String s) {
{ try {
try
{
byte[] bytes = s.getBytes("UTF-8"); byte[] bytes = s.getBytes("UTF-8");
byte ch; byte ch;
int length = 0; int length = 0;
for (int i = 0, count = bytes.length; i < count; i++) for (int i = 0, count = bytes.length; i < count; i++) {
{
ch = bytes[i]; ch = bytes[i];
if (ch == '%') if (ch == '%') {
{
int h = (bytes[i + 1] - '0'); int h = (bytes[i + 1] - '0');
int l = (bytes[i + 2] - '0'); int l = (bytes[i + 2] - '0');
if (h > 9) if (h > 9) {
{
h -= 7; h -= 7;
} }
if (l > 9) if (l > 9) {
{
l -= 7; l -= 7;
} }
bytes[length] = (byte)((h << 4) | l); bytes[length] = (byte)((h << 4) | l);
i += 2; i += 2;
} } else if (ch == '+') {
else if (ch == '+')
{
bytes[length] = ' '; bytes[length] = ' ';
} } else {
else
{
bytes[length] = bytes[i]; bytes[length] = bytes[i];
} }
length++; length++;
} }
return new String(bytes, 0, length, "UTF-8"); return new String(bytes, 0, length, "UTF-8");
} } catch (UnsupportedEncodingException uee) {
catch (UnsupportedEncodingException uee)
{
return null; return null;
} }
} }
@ -245,15 +203,11 @@ public class Utility
* @param date * @param date
* @return * @return
*/ */
public static boolean isDateToday(Date date) public static boolean isDateToday(Date date) {
{
Date now = new Date(); Date now = new Date();
if (now.getTime() - 64800000 > date.getTime() || now.getTime() + 64800000 < date.getTime()) if (now.getTime() - 64800000 > date.getTime() || now.getTime() + 64800000 < date.getTime()) {
{
return false; return false;
} } else {
else
{
return true; return true;
} }
} }
@ -262,8 +216,7 @@ public class Utility
* TODO disabled this method globally. It is used in all the settings screens but I just * TODO disabled this method globally. It is used in all the settings screens but I just
* noticed that an unrelated icon was dimmed. Android must share drawables internally. * noticed that an unrelated icon was dimmed. Android must share drawables internally.
*/ */
public static void setCompoundDrawablesAlpha(TextView view, int alpha) public static void setCompoundDrawablesAlpha(TextView view, int alpha) {
{
// Drawable[] drawables = view.getCompoundDrawables(); // Drawable[] drawables = view.getCompoundDrawables();
// for (Drawable drawable : drawables) { // for (Drawable drawable : drawables) {
// if (drawable != null) { // if (drawable != null) {
@ -311,11 +264,9 @@ public class Utility
* @return a line with newlines inserted, <code>null</code> if null input * @return a line with newlines inserted, <code>null</code> if null input
*/ */
private static final String NEWLINE_REGEX = "(?:\\r?\\n)"; private static final String NEWLINE_REGEX = "(?:\\r?\\n)";
public static String wrap(String str, int wrapLength) public static String wrap(String str, int wrapLength) {
{
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
for (String piece : str.split(NEWLINE_REGEX)) for (String piece : str.split(NEWLINE_REGEX)) {
{
result.append(wrap(piece, wrapLength, null, false)); result.append(wrap(piece, wrapLength, null, false));
result.append("\n"); result.append("\n");
} }
@ -360,62 +311,47 @@ public class Utility
* @param wrapLongWords true if long words (such as URLs) should be wrapped * @param wrapLongWords true if long words (such as URLs) should be wrapped
* @return a line with newlines inserted, <code>null</code> if null input * @return a line with newlines inserted, <code>null</code> if null input
*/ */
public static String wrap(String str, int wrapLength, String newLineStr, boolean wrapLongWords) public static String wrap(String str, int wrapLength, String newLineStr, boolean wrapLongWords) {
{ if (str == null) {
if (str == null)
{
return null; return null;
} }
if (newLineStr == null) if (newLineStr == null) {
{
newLineStr = "\n"; newLineStr = "\n";
} }
if (wrapLength < 1) if (wrapLength < 1) {
{
wrapLength = 1; wrapLength = 1;
} }
int inputLineLength = str.length(); int inputLineLength = str.length();
int offset = 0; int offset = 0;
StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32); StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32);
while ((inputLineLength - offset) > wrapLength) while ((inputLineLength - offset) > wrapLength) {
{ if (str.charAt(offset) == ' ') {
if (str.charAt(offset) == ' ')
{
offset++; offset++;
continue; continue;
} }
int spaceToWrapAt = str.lastIndexOf(' ', wrapLength + offset); int spaceToWrapAt = str.lastIndexOf(' ', wrapLength + offset);
if (spaceToWrapAt >= offset) if (spaceToWrapAt >= offset) {
{
// normal case // normal case
wrappedLine.append(str.substring(offset, spaceToWrapAt)); wrappedLine.append(str.substring(offset, spaceToWrapAt));
wrappedLine.append(newLineStr); wrappedLine.append(newLineStr);
offset = spaceToWrapAt + 1; offset = spaceToWrapAt + 1;
} } else {
else
{
// really long word or URL // really long word or URL
if (wrapLongWords) if (wrapLongWords) {
{
// wrap really long word one line at a time // wrap really long word one line at a time
wrappedLine.append(str.substring(offset, wrapLength + offset)); wrappedLine.append(str.substring(offset, wrapLength + offset));
wrappedLine.append(newLineStr); wrappedLine.append(newLineStr);
offset += wrapLength; offset += wrapLength;
} } else {
else
{
// do not wrap really long word, just extend beyond limit // do not wrap really long word, just extend beyond limit
spaceToWrapAt = str.indexOf(' ', wrapLength + offset); spaceToWrapAt = str.indexOf(' ', wrapLength + offset);
if (spaceToWrapAt >= 0) if (spaceToWrapAt >= 0) {
{
wrappedLine.append(str.substring(offset, spaceToWrapAt)); wrappedLine.append(str.substring(offset, spaceToWrapAt));
wrappedLine.append(newLineStr); wrappedLine.append(newLineStr);
offset = spaceToWrapAt + 1; offset = spaceToWrapAt + 1;
} } else {
else
{
wrappedLine.append(str.substring(offset)); wrappedLine.append(str.substring(offset));
offset = inputLineLength; offset = inputLineLength;
} }
@ -442,8 +378,7 @@ public class Utility
* Never <code>null</code>. * Never <code>null</code>.
* @return Never <code>null</code>. * @return Never <code>null</code>.
*/ */
public static String stripSubject(final String subject) public static String stripSubject(final String subject) {
{
int lastPrefix = 0; int lastPrefix = 0;
final Matcher tagMatcher = TAG_PATTERN.matcher(subject); final Matcher tagMatcher = TAG_PATTERN.matcher(subject);
@ -452,11 +387,9 @@ public class Utility
boolean tagPresent = false; boolean tagPresent = false;
// whether the last action stripped a tag // whether the last action stripped a tag
boolean tagStripped = false; boolean tagStripped = false;
if (tagMatcher.find(0)) if (tagMatcher.find(0)) {
{
tagPresent = true; tagPresent = true;
if (tagMatcher.start() == 0) if (tagMatcher.start() == 0) {
{
// found at beginning of subject, considering it an actual tag // found at beginning of subject, considering it an actual tag
tag = tagMatcher.group(); tag = tagMatcher.group();
@ -478,25 +411,19 @@ public class Utility
&& matcher.find(lastPrefix) && matcher.find(lastPrefix)
&& matcher.start() == lastPrefix && matcher.start() == lastPrefix
&& (!tagPresent || tag == null || subject.regionMatches(matcher.end(), tag, 0, && (!tagPresent || tag == null || subject.regionMatches(matcher.end(), tag, 0,
tag.length()))) tag.length()))) {
{
lastPrefix = matcher.end(); lastPrefix = matcher.end();
if (tagPresent) if (tagPresent) {
{
tagStripped = false; tagStripped = false;
if (tag == null) if (tag == null) {
{
// attempt to find tag // attempt to find tag
if (tagMatcher.start() == lastPrefix) if (tagMatcher.start() == lastPrefix) {
{
tag = tagMatcher.group(); tag = tagMatcher.group();
lastPrefix += tag.length(); lastPrefix += tag.length();
tagStripped = true; tagStripped = true;
} }
} } else if (lastPrefix < subject.length() - 1 && subject.startsWith(tag, lastPrefix)) {
else if (lastPrefix < subject.length() - 1 && subject.startsWith(tag, lastPrefix))
{
// Re: [foo] Re: [foo] blah blah blah // Re: [foo] Re: [foo] blah blah blah
// ^ ^ // ^ ^
// ^ ^ // ^ ^
@ -509,17 +436,13 @@ public class Utility
} }
} }
// Null pointer check is to make the static analysis component of Eclipse happy. // Null pointer check is to make the static analysis component of Eclipse happy.
if (tagStripped && (tag != null)) if (tagStripped && (tag != null)) {
{
// restore the last tag // restore the last tag
lastPrefix -= tag.length(); lastPrefix -= tag.length();
} }
if (lastPrefix > -1 && lastPrefix < subject.length() - 1) if (lastPrefix > -1 && lastPrefix < subject.length() - 1) {
{
return subject.substring(lastPrefix).trim(); return subject.substring(lastPrefix).trim();
} } else {
else
{
return subject.trim(); return subject.trim();
} }
} }
@ -529,22 +452,15 @@ public class Utility
* @param name * @param name
* Never <code>null</code>. * Never <code>null</code>.
*/ */
public static void touchFile(final File parentDir, final String name) public static void touchFile(final File parentDir, final String name) {
{
final File file = new File(parentDir, name); final File file = new File(parentDir, name);
try try {
{ if (!file.exists()) {
if (!file.exists())
{
file.createNewFile(); file.createNewFile();
} } else {
else
{
file.setLastModified(System.currentTimeMillis()); file.setLastModified(System.currentTimeMillis());
} }
} } catch (Exception e) {
catch (Exception e)
{
Log.d(K9.LOG_TAG, "Unable to touch file: " + file.getAbsolutePath(), e); Log.d(K9.LOG_TAG, "Unable to touch file: " + file.getAbsolutePath(), e);
} }
} }
@ -557,31 +473,24 @@ public class Utility
* @param filename * @param filename
* @return * @return
*/ */
public static File createUniqueFile(File directory, String filename) public static File createUniqueFile(File directory, String filename) {
{
File file = new File(directory, filename); File file = new File(directory, filename);
if (!file.exists()) if (!file.exists()) {
{
return file; return file;
} }
// Get the extension of the file, if any. // Get the extension of the file, if any.
int index = filename.lastIndexOf('.'); int index = filename.lastIndexOf('.');
String format; String format;
if (index != -1) if (index != -1) {
{
String name = filename.substring(0, index); String name = filename.substring(0, index);
String extension = filename.substring(index); String extension = filename.substring(index);
format = name + "-%d" + extension; format = name + "-%d" + extension;
} } else {
else
{
format = filename + "-%d"; format = filename + "-%d";
} }
for (int i = 2; i < Integer.MAX_VALUE; i++) for (int i = 2; i < Integer.MAX_VALUE; i++) {
{
file = new File(directory, String.format(format, i)); file = new File(directory, String.format(format, i));
if (!file.exists()) if (!file.exists()) {
{
return file; return file;
} }
} }
@ -595,31 +504,25 @@ public class Utility
* @param to * @param to
* @return * @return
*/ */
public static boolean move(final File from, final File to) public static boolean move(final File from, final File to) {
{ if (to.exists()) {
if (to.exists())
{
to.delete(); to.delete();
} }
to.getParentFile().mkdirs(); to.getParentFile().mkdirs();
try try {
{
FileInputStream in = new FileInputStream(from); FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(to); FileOutputStream out = new FileOutputStream(to);
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
int count = -1; int count = -1;
while ((count = in.read(buffer)) > 0) while ((count = in.read(buffer)) > 0) {
{
out.write(buffer, 0, count); out.write(buffer, 0, count);
} }
out.close(); out.close();
in.close(); in.close();
from.delete(); from.delete();
return true; return true;
} } catch (Exception e) {
catch (Exception e)
{
Log.w(K9.LOG_TAG, "cannot move " + from.getAbsolutePath() + " to " + to.getAbsolutePath(), e); Log.w(K9.LOG_TAG, "cannot move " + from.getAbsolutePath() + " to " + to.getAbsolutePath(), e);
return false; return false;
} }
@ -630,59 +533,44 @@ public class Utility
* @param fromDir * @param fromDir
* @param toDir * @param toDir
*/ */
public static void moveRecursive(final File fromDir, final File toDir) public static void moveRecursive(final File fromDir, final File toDir) {
{ if (!fromDir.exists()) {
if (!fromDir.exists())
{
return; return;
} }
if (!fromDir.isDirectory()) if (!fromDir.isDirectory()) {
{ if (toDir.exists()) {
if (toDir.exists()) if (!toDir.delete()) {
{
if (!toDir.delete())
{
Log.w(K9.LOG_TAG, "cannot delete already existing file/directory " + toDir.getAbsolutePath()); Log.w(K9.LOG_TAG, "cannot delete already existing file/directory " + toDir.getAbsolutePath());
} }
} }
if (!fromDir.renameTo(toDir)) if (!fromDir.renameTo(toDir)) {
{
Log.w(K9.LOG_TAG, "cannot rename " + fromDir.getAbsolutePath() + " to " + toDir.getAbsolutePath() + " - moving instead"); Log.w(K9.LOG_TAG, "cannot rename " + fromDir.getAbsolutePath() + " to " + toDir.getAbsolutePath() + " - moving instead");
move(fromDir, toDir); move(fromDir, toDir);
} }
return; return;
} }
if (!toDir.exists() || !toDir.isDirectory()) if (!toDir.exists() || !toDir.isDirectory()) {
{ if (toDir.exists()) {
if (toDir.exists() )
{
toDir.delete(); toDir.delete();
} }
if (!toDir.mkdirs()) if (!toDir.mkdirs()) {
{
Log.w(K9.LOG_TAG, "cannot create directory " + toDir.getAbsolutePath()); Log.w(K9.LOG_TAG, "cannot create directory " + toDir.getAbsolutePath());
} }
} }
File[] files = fromDir.listFiles(); File[] files = fromDir.listFiles();
for (File file : files) for (File file : files) {
{ if (file.isDirectory()) {
if (file.isDirectory())
{
moveRecursive(file, new File(toDir, file.getName())); moveRecursive(file, new File(toDir, file.getName()));
file.delete(); file.delete();
} } else {
else
{
File target = new File(toDir, file.getName()); File target = new File(toDir, file.getName());
if (!file.renameTo(target)) if (!file.renameTo(target)) {
{
Log.w(K9.LOG_TAG, "cannot rename " + file.getAbsolutePath() + " to " + target.getAbsolutePath() + " - moving instead"); Log.w(K9.LOG_TAG, "cannot rename " + file.getAbsolutePath() + " to " + target.getAbsolutePath() + " - moving instead");
move(file, target); move(file, target);
} }
} }
} }
if (!fromDir.delete()) if (!fromDir.delete()) {
{
Log.w(K9.LOG_TAG, "cannot delete " + fromDir.getAbsolutePath()); Log.w(K9.LOG_TAG, "cannot delete " + fromDir.getAbsolutePath());
} }
} }
@ -695,22 +583,17 @@ public class Utility
* @param message Content to evaluate * @param message Content to evaluate
* @return True if it has external images; false otherwise. * @return True if it has external images; false otherwise.
*/ */
public static boolean hasExternalImages(final String message) public static boolean hasExternalImages(final String message) {
{
Matcher imgMatches = IMG_PATTERN.matcher(message); Matcher imgMatches = IMG_PATTERN.matcher(message);
while (imgMatches.find()) while (imgMatches.find()) {
{ if (!imgMatches.group(1).equals("content")) {
if (!imgMatches.group(1).equals("content")) if (K9.DEBUG) {
{
if (K9.DEBUG)
{
Log.d(K9.LOG_TAG, "External images found"); Log.d(K9.LOG_TAG, "External images found");
} }
return true; return true;
} }
} }
if (K9.DEBUG) if (K9.DEBUG) {
{
Log.d(K9.LOG_TAG, "No external images."); Log.d(K9.LOG_TAG, "No external images.");
} }
return false; return false;

View File

@ -10,20 +10,16 @@ import android.os.PowerManager;
import android.os.PowerManager.WakeLock; import android.os.PowerManager.WakeLock;
import android.util.Log; import android.util.Log;
public class TracingPowerManager public class TracingPowerManager {
{
private final static boolean TRACE = false; private final static boolean TRACE = false;
public static AtomicInteger wakeLockId = new AtomicInteger(0); public static AtomicInteger wakeLockId = new AtomicInteger(0);
PowerManager pm = null; PowerManager pm = null;
private static TracingPowerManager tracingPowerManager; private static TracingPowerManager tracingPowerManager;
private Timer timer = null; private Timer timer = null;
public static synchronized TracingPowerManager getPowerManager(Context context) public static synchronized TracingPowerManager getPowerManager(Context context) {
{ if (tracingPowerManager == null) {
if (tracingPowerManager == null) if (K9.DEBUG) {
{
if (K9.DEBUG)
{
Log.v(K9.LOG_TAG, "Creating TracingPowerManager"); Log.v(K9.LOG_TAG, "Creating TracingPowerManager");
} }
tracingPowerManager = new TracingPowerManager(context); tracingPowerManager = new TracingPowerManager(context);
@ -32,140 +28,104 @@ public class TracingPowerManager
} }
private TracingPowerManager(Context context) private TracingPowerManager(Context context) {
{
pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (TRACE) if (TRACE) {
{
timer = new Timer(); timer = new Timer();
} }
} }
public TracingWakeLock newWakeLock(int flags, String tag) public TracingWakeLock newWakeLock(int flags, String tag) {
{
return new TracingWakeLock(flags, tag); return new TracingWakeLock(flags, tag);
} }
public class TracingWakeLock public class TracingWakeLock {
{
final WakeLock wakeLock; final WakeLock wakeLock;
final int id; final int id;
final String tag; final String tag;
volatile TimerTask timerTask; volatile TimerTask timerTask;
volatile Long startTime = null; volatile Long startTime = null;
volatile Long timeout = null; volatile Long timeout = null;
public TracingWakeLock(int flags, String ntag) public TracingWakeLock(int flags, String ntag) {
{
tag = ntag; tag = ntag;
wakeLock = pm.newWakeLock(flags, tag); wakeLock = pm.newWakeLock(flags, tag);
id = wakeLockId.getAndIncrement(); id = wakeLockId.getAndIncrement();
if (K9.DEBUG) if (K9.DEBUG) {
{ Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": Create");
Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id+ ": Create");
} }
} }
public void acquire(long timeout) public void acquire(long timeout) {
{ synchronized (wakeLock) {
synchronized (wakeLock)
{
wakeLock.acquire(timeout); wakeLock.acquire(timeout);
} }
if (K9.DEBUG) if (K9.DEBUG) {
{
Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + " for " + timeout + " ms: acquired"); Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + " for " + timeout + " ms: acquired");
} }
raiseNotification(); raiseNotification();
if (startTime == null) if (startTime == null) {
{
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
} }
this.timeout = timeout; this.timeout = timeout;
} }
public void acquire() public void acquire() {
{ synchronized (wakeLock) {
synchronized (wakeLock)
{
wakeLock.acquire(); wakeLock.acquire();
} }
raiseNotification(); raiseNotification();
if (K9.DEBUG) if (K9.DEBUG) {
{
Log.w(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": acquired with no timeout. K-9 Mail should not do this"); Log.w(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": acquired with no timeout. K-9 Mail should not do this");
} }
if (startTime == null) if (startTime == null) {
{
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
} }
timeout = null; timeout = null;
} }
public void setReferenceCounted(boolean counted) public void setReferenceCounted(boolean counted) {
{ synchronized (wakeLock) {
synchronized (wakeLock)
{
wakeLock.setReferenceCounted(counted); wakeLock.setReferenceCounted(counted);
} }
} }
public void release() public void release() {
{ if (startTime != null) {
if (startTime != null)
{
Long endTime = System.currentTimeMillis(); Long endTime = System.currentTimeMillis();
if (K9.DEBUG) if (K9.DEBUG) {
{
Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": releasing after " + (endTime - startTime) + " ms, timeout = " + timeout + " ms"); Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": releasing after " + (endTime - startTime) + " ms, timeout = " + timeout + " ms");
} }
} } else {
else if (K9.DEBUG) {
{
if (K9.DEBUG)
{
Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ", timeout = " + timeout + " ms: releasing"); Log.v(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ", timeout = " + timeout + " ms: releasing");
} }
} }
cancelNotification(); cancelNotification();
synchronized (wakeLock) synchronized (wakeLock) {
{
wakeLock.release(); wakeLock.release();
} }
startTime = null; startTime = null;
} }
private void cancelNotification() private void cancelNotification() {
{ if (timer != null) {
if (timer != null) synchronized (timer) {
{ if (timerTask != null) {
synchronized (timer)
{
if (timerTask != null)
{
timerTask.cancel(); timerTask.cancel();
} }
} }
} }
} }
private void raiseNotification() private void raiseNotification() {
{ if (timer != null) {
if (timer != null) synchronized (timer) {
{ if (timerTask != null) {
synchronized (timer)
{
if (timerTask != null)
{
timerTask.cancel(); timerTask.cancel();
timerTask = null; timerTask = null;
} }
timerTask = new TimerTask() timerTask = new TimerTask() {
{
@Override @Override
public void run() public void run() {
{ if (startTime != null) {
if (startTime != null)
{
Long endTime = System.currentTimeMillis(); Long endTime = System.currentTimeMillis();
Log.i(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": has been active for " Log.i(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": has been active for "
+ (endTime - startTime) + " ms, timeout = " + timeout + " ms"); + (endTime - startTime) + " ms, timeout = " + timeout + " ms");
} } else {
else
{
Log.i(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": still active, timeout = " + timeout + " ms"); Log.i(K9.LOG_TAG, "TracingWakeLock for tag " + tag + " / id " + id + ": still active, timeout = " + timeout + " ms");
} }
} }

View File

@ -21,8 +21,7 @@ import org.apache.james.mime4j.MimeException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class Address public class Address {
{
/** /**
* If the number of addresses exceeds this value the addresses aren't * If the number of addresses exceeds this value the addresses aren't
* resolved to the names of Android contacts. * resolved to the names of Android contacts.
@ -45,28 +44,22 @@ public class Address
String mPersonal; String mPersonal;
public Address(String address, String personal) public Address(String address, String personal) {
{
this(address, personal, true); this(address, personal, true);
} }
public Address(String address) public Address(String address) {
{
this(address, null); this(address, null);
} }
private Address(String address, String personal, boolean parse) private Address(String address, String personal, boolean parse) {
{ if (parse) {
if (parse)
{
Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(address); Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(address);
if (tokens.length > 0) if (tokens.length > 0) {
{
Rfc822Token token = tokens[0]; Rfc822Token token = tokens[0];
mAddress = token.getAddress(); mAddress = token.getAddress();
String name = token.getName(); String name = token.getName();
if ((name != null) && !("".equals(name))) if ((name != null) && !("".equals(name))) {
{
/* /*
* Don't use the "personal" argument if "address" is of the form: * Don't use the "personal" argument if "address" is of the form:
* James Bond <james.bond@mi6.uk> * James Bond <james.bond@mi6.uk>
@ -74,47 +67,35 @@ public class Address
* See issue 2920 * See issue 2920
*/ */
mPersonal = name; mPersonal = name;
} } else {
else
{
mPersonal = (personal == null) ? null : personal.trim(); mPersonal = (personal == null) ? null : personal.trim();
} }
} } else {
else
{
// This should be an error // This should be an error
} }
} } else {
else
{
mAddress = address; mAddress = address;
mPersonal = personal; mPersonal = personal;
} }
} }
public String getAddress() public String getAddress() {
{
return mAddress; return mAddress;
} }
public void setAddress(String address) public void setAddress(String address) {
{
this.mAddress = address; this.mAddress = address;
} }
public String getPersonal() public String getPersonal() {
{
return mPersonal; return mPersonal;
} }
public void setPersonal(String personal) public void setPersonal(String personal) {
{ if ("".equals(personal)) {
if ("".equals(personal))
{
personal = null; personal = null;
} }
if (personal != null) if (personal != null) {
{
personal = personal.trim(); personal = personal.trim();
} }
this.mPersonal = personal; this.mPersonal = personal;
@ -127,17 +108,13 @@ public class Address
* @param addressList * @param addressList
* @return An array of 0 or more Addresses. * @return An array of 0 or more Addresses.
*/ */
public static Address[] parseUnencoded(String addressList) public static Address[] parseUnencoded(String addressList) {
{
List<Address> addresses = new ArrayList<Address>(); List<Address> addresses = new ArrayList<Address>();
if ((addressList != null) && !("".equals(addressList))) if ((addressList != null) && !("".equals(addressList))) {
{
Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(addressList); Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(addressList);
for (Rfc822Token token : tokens) for (Rfc822Token token : tokens) {
{
String address = token.getAddress(); String address = token.getAddress();
if ((address != null) && !("".equals(address))) if ((address != null) && !("".equals(address))) {
{
addresses.add(new Address(token.getAddress(), token.getName(), false)); addresses.add(new Address(token.getAddress(), token.getName(), false));
} }
} }
@ -152,109 +129,81 @@ public class Address
* @param addressList * @param addressList
* @return An array of 0 or more Addresses. * @return An array of 0 or more Addresses.
*/ */
public static Address[] parse(String addressList) public static Address[] parse(String addressList) {
{
ArrayList<Address> addresses = new ArrayList<Address>(); ArrayList<Address> addresses = new ArrayList<Address>();
if ((addressList == null) && !("".equals(addressList))) if ((addressList == null) && !("".equals(addressList))) {
{
return EMPTY_ADDRESS_ARRAY; return EMPTY_ADDRESS_ARRAY;
} }
try try {
{
MailboxList parsedList = AddressBuilder.parseAddressList(addressList).flatten(); MailboxList parsedList = AddressBuilder.parseAddressList(addressList).flatten();
for (int i = 0, count = parsedList.size(); i < count; i++) for (int i = 0, count = parsedList.size(); i < count; i++) {
{
org.apache.james.mime4j.dom.address.Address address = parsedList.get(i); org.apache.james.mime4j.dom.address.Address address = parsedList.get(i);
if (address instanceof Mailbox) if (address instanceof Mailbox) {
{
Mailbox mailbox = (Mailbox)address; Mailbox mailbox = (Mailbox)address;
addresses.add(new Address(mailbox.getLocalPart() + "@" + mailbox.getDomain(), mailbox.getName(), false)); addresses.add(new Address(mailbox.getLocalPart() + "@" + mailbox.getDomain(), mailbox.getName(), false));
} } else {
else
{
Log.e(K9.LOG_TAG, "Unknown address type from Mime4J: " Log.e(K9.LOG_TAG, "Unknown address type from Mime4J: "
+ address.getClass().toString()); + address.getClass().toString());
} }
} }
} } catch (MimeException pe) {
catch (MimeException pe)
{
Log.e(K9.LOG_TAG, "MimeException in Address.parse()", pe); Log.e(K9.LOG_TAG, "MimeException in Address.parse()", pe);
} }
return addresses.toArray(EMPTY_ADDRESS_ARRAY); return addresses.toArray(EMPTY_ADDRESS_ARRAY);
} }
@Override @Override
public boolean equals(Object o) public boolean equals(Object o) {
{ if (o instanceof Address) {
if (o instanceof Address)
{
return getAddress().equals(((Address) o).getAddress()); return getAddress().equals(((Address) o).getAddress());
} }
return super.equals(o); return super.equals(o);
} }
@Override @Override
public int hashCode() public int hashCode() {
{
return getAddress().hashCode(); return getAddress().hashCode();
} }
@Override @Override
public String toString() public String toString() {
{ if (mPersonal != null && !mPersonal.equals("")) {
if (mPersonal != null && !mPersonal.equals(""))
{
return Utility.quoteAtoms(mPersonal) + " <" + mAddress + ">"; return Utility.quoteAtoms(mPersonal) + " <" + mAddress + ">";
} } else {
else
{
return mAddress; return mAddress;
} }
} }
public static String toString(Address[] addresses) public static String toString(Address[] addresses) {
{ if (addresses == null) {
if (addresses == null)
{
return null; return null;
} }
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
for (int i = 0; i < addresses.length; i++) for (int i = 0; i < addresses.length; i++) {
{
sb.append(addresses[i].toString()); sb.append(addresses[i].toString());
if (i < addresses.length - 1) if (i < addresses.length - 1) {
{
sb.append(", "); sb.append(", ");
} }
} }
return sb.toString(); return sb.toString();
} }
public String toEncodedString() public String toEncodedString() {
{ if (mPersonal != null) {
if (mPersonal != null)
{
return EncoderUtil.encodeAddressDisplayName(mPersonal) + " <" + mAddress + ">"; return EncoderUtil.encodeAddressDisplayName(mPersonal) + " <" + mAddress + ">";
} } else {
else
{
return mAddress; return mAddress;
} }
} }
public static String toEncodedString(Address[] addresses) public static String toEncodedString(Address[] addresses) {
{ if (addresses == null) {
if (addresses == null)
{
return null; return null;
} }
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
for (int i = 0; i < addresses.length; i++) for (int i = 0; i < addresses.length; i++) {
{
sb.append(addresses[i].toEncodedString()); sb.append(addresses[i].toEncodedString());
if (i < addresses.length - 1) if (i < addresses.length - 1) {
{
sb.append(','); sb.append(',');
} }
} }
@ -266,8 +215,7 @@ public class Address
* is not available. * is not available.
* @return * @return
*/ */
public CharSequence toFriendly() public CharSequence toFriendly() {
{
return toFriendly((Contacts)null); return toFriendly((Contacts)null);
} }
@ -283,23 +231,17 @@ public class Address
* @return * @return
* A "friendly" name for this {@link Address}. * A "friendly" name for this {@link Address}.
*/ */
public CharSequence toFriendly(final Contacts contacts) public CharSequence toFriendly(final Contacts contacts) {
{ if (!K9.showCorrespondentNames()) {
if (!K9.showCorrespondentNames())
{
return mAddress; return mAddress;
} } else if (contacts != null) {
else if (contacts != null)
{
final String name = contacts.getNameForAddress(mAddress); final String name = contacts.getNameForAddress(mAddress);
// TODO: The results should probably be cached for performance reasons. // TODO: The results should probably be cached for performance reasons.
if (name != null) if (name != null) {
{ if (K9.changeContactNameColor()) {
if (K9.changeContactNameColor())
{
final SpannableString coloredName = new SpannableString(name); final SpannableString coloredName = new SpannableString(name);
coloredName.setSpan(new ForegroundColorSpan(K9.getContactNameColor()), coloredName.setSpan(new ForegroundColorSpan(K9.getContactNameColor()),
0, 0,
@ -307,9 +249,7 @@ public class Address
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
); );
return coloredName; return coloredName;
} } else {
else
{
return name; return name;
} }
} }
@ -318,30 +258,24 @@ public class Address
return ((mPersonal != null) && (mPersonal.length() > 0)) ? mPersonal : mAddress; return ((mPersonal != null) && (mPersonal.length() > 0)) ? mPersonal : mAddress;
} }
public static CharSequence toFriendly(Address[] addresses) public static CharSequence toFriendly(Address[] addresses) {
{
return toFriendly(addresses, null); return toFriendly(addresses, null);
} }
public static CharSequence toFriendly(Address[] addresses, Contacts contacts) public static CharSequence toFriendly(Address[] addresses, Contacts contacts) {
{ if (addresses == null) {
if (addresses == null)
{
return null; return null;
} }
if (addresses.length >= TOO_MANY_ADDRESSES) if (addresses.length >= TOO_MANY_ADDRESSES) {
{
// Don't look up contacts if the number of addresses is very high. // Don't look up contacts if the number of addresses is very high.
contacts = null; contacts = null;
} }
SpannableStringBuilder sb = new SpannableStringBuilder(); SpannableStringBuilder sb = new SpannableStringBuilder();
for (int i = 0; i < addresses.length; i++) for (int i = 0; i < addresses.length; i++) {
{
sb.append(addresses[i].toFriendly(contacts)); sb.append(addresses[i].toFriendly(contacts));
if (i < addresses.length - 1) if (i < addresses.length - 1) {
{
sb.append(','); sb.append(',');
} }
} }
@ -353,10 +287,8 @@ public class Address
* @param addressList Packed address list. * @param addressList Packed address list.
* @return Unpacked list. * @return Unpacked list.
*/ */
public static Address[] unpack(String addressList) public static Address[] unpack(String addressList) {
{ if (addressList == null) {
if (addressList == null)
{
return new Address[] { }; return new Address[] { };
} }
ArrayList<Address> addresses = new ArrayList<Address>(); ArrayList<Address> addresses = new ArrayList<Address>();
@ -364,24 +296,19 @@ public class Address
int pairStartIndex = 0; int pairStartIndex = 0;
int pairEndIndex = 0; int pairEndIndex = 0;
int addressEndIndex = 0; int addressEndIndex = 0;
while (pairStartIndex < length) while (pairStartIndex < length) {
{
pairEndIndex = addressList.indexOf(",\u0000", pairStartIndex); pairEndIndex = addressList.indexOf(",\u0000", pairStartIndex);
if (pairEndIndex == -1) if (pairEndIndex == -1) {
{
pairEndIndex = length; pairEndIndex = length;
} }
addressEndIndex = addressList.indexOf(";\u0000", pairStartIndex); addressEndIndex = addressList.indexOf(";\u0000", pairStartIndex);
String address = null; String address = null;
String personal = null; String personal = null;
if (addressEndIndex == -1 || addressEndIndex > pairEndIndex) if (addressEndIndex == -1 || addressEndIndex > pairEndIndex) {
{
address = addressList.substring(pairStartIndex, pairEndIndex); address = addressList.substring(pairStartIndex, pairEndIndex);
} } else {
else
{
address = addressList.substring(pairStartIndex, addressEndIndex); address = addressList.substring(pairStartIndex, addressEndIndex);
personal =addressList.substring(addressEndIndex + 2, pairEndIndex); personal = addressList.substring(addressEndIndex + 2, pairEndIndex);
} }
addresses.add(new Address(address, personal)); addresses.add(new Address(address, personal));
pairStartIndex = pairEndIndex + 2; pairStartIndex = pairEndIndex + 2;
@ -397,27 +324,22 @@ public class Address
* @param addresses Array of addresses to pack. * @param addresses Array of addresses to pack.
* @return Packed addresses. * @return Packed addresses.
*/ */
public static String pack(Address[] addresses) public static String pack(Address[] addresses) {
{ if (addresses == null) {
if (addresses == null)
{
return null; return null;
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int i = 0, count = addresses.length; i < count; i++) for (int i = 0, count = addresses.length; i < count; i++) {
{
Address address = addresses[i]; Address address = addresses[i];
sb.append(address.getAddress()); sb.append(address.getAddress());
String personal = address.getPersonal(); String personal = address.getPersonal();
if (personal != null) if (personal != null) {
{
sb.append(";\u0000"); sb.append(";\u0000");
// Escape quotes in the address part on the way in // Escape quotes in the address part on the way in
personal = personal.replaceAll("\"","\\\""); personal = personal.replaceAll("\"", "\\\"");
sb.append(personal); sb.append(personal);
} }
if (i < count - 1) if (i < count - 1) {
{
sb.append(",\u0000"); sb.append(",\u0000");
} }
} }

View File

@ -1,17 +1,14 @@
package com.fsck.k9.mail; package com.fsck.k9.mail;
public class AuthenticationFailedException extends MessagingException public class AuthenticationFailedException extends MessagingException {
{
public static final long serialVersionUID = -1; public static final long serialVersionUID = -1;
public AuthenticationFailedException(String message) public AuthenticationFailedException(String message) {
{
super(message); super(message);
} }
public AuthenticationFailedException(String message, Throwable throwable) public AuthenticationFailedException(String message, Throwable throwable) {
{
super(message, throwable); super(message, throwable);
} }
} }

View File

@ -5,8 +5,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
public interface Body public interface Body {
{
public InputStream getInputStream() throws MessagingException; public InputStream getInputStream() throws MessagingException;
public void writeTo(OutputStream out) throws IOException, MessagingException; public void writeTo(OutputStream out) throws IOException, MessagingException;
} }

View File

@ -1,17 +1,14 @@
package com.fsck.k9.mail; package com.fsck.k9.mail;
public abstract class BodyPart implements Part public abstract class BodyPart implements Part {
{
private Multipart mParent; private Multipart mParent;
public Multipart getParent() public Multipart getParent() {
{
return mParent; return mParent;
} }
public void setParent(Multipart parent) public void setParent(Multipart parent) {
{
mParent = parent; mParent = parent;
} }
} }

View File

@ -1,17 +1,14 @@
package com.fsck.k9.mail; package com.fsck.k9.mail;
public class CertificateValidationException extends MessagingException public class CertificateValidationException extends MessagingException {
{
public static final long serialVersionUID = -1; public static final long serialVersionUID = -1;
public CertificateValidationException(String message) public CertificateValidationException(String message) {
{
super(message); super(message);
} }
public CertificateValidationException(String message, Throwable throwable) public CertificateValidationException(String message, Throwable throwable) {
{
super(message, throwable); super(message, throwable);
} }
} }

View File

@ -15,8 +15,7 @@ import java.util.ArrayList;
* any information it needs to download the content. * any information it needs to download the content.
* </pre> * </pre>
*/ */
public class FetchProfile extends ArrayList<FetchProfile.Item> public class FetchProfile extends ArrayList<FetchProfile.Item> {
{
private static final long serialVersionUID = -5520076119120964166L; private static final long serialVersionUID = -5520076119120964166L;
/** /**
@ -24,8 +23,7 @@ public class FetchProfile extends ArrayList<FetchProfile.Item>
* item fetched by using these items could potentially include all of the * item fetched by using these items could potentially include all of the
* previous items. * previous items.
*/ */
public enum Item public enum Item {
{
/** /**
* Download the flags of the message. * Download the flags of the message.
*/ */

View File

@ -4,8 +4,7 @@ package com.fsck.k9.mail;
/** /**
* Flags that can be applied to Messages. * Flags that can be applied to Messages.
*/ */
public enum Flag public enum Flag {
{
DELETED, DELETED,
SEEN, SEEN,
ANSWERED, ANSWERED,

View File

@ -9,30 +9,25 @@ import com.fsck.k9.Preferences;
import com.fsck.k9.controller.MessageRetrievalListener; import com.fsck.k9.controller.MessageRetrievalListener;
public abstract class Folder public abstract class Folder {
{
protected final Account mAccount; protected final Account mAccount;
private String status = null; private String status = null;
private long lastChecked = 0; private long lastChecked = 0;
private long lastPush = 0; private long lastPush = 0;
public enum OpenMode public enum OpenMode {
{
READ_WRITE, READ_ONLY, READ_WRITE, READ_ONLY,
} }
// NONE is obsolete, it will be translated to NO_CLASS for display and to INHERITED for sync and push // NONE is obsolete, it will be translated to NO_CLASS for display and to INHERITED for sync and push
public enum FolderClass public enum FolderClass {
{
NONE, NO_CLASS, INHERITED, FIRST_CLASS, SECOND_CLASS NONE, NO_CLASS, INHERITED, FIRST_CLASS, SECOND_CLASS
} }
public enum FolderType public enum FolderType {
{
HOLDS_FOLDERS, HOLDS_MESSAGES, HOLDS_FOLDERS, HOLDS_MESSAGES,
} }
protected Folder(Account account) protected Folder(Account account) {
{
mAccount = account; mAccount = account;
} }
@ -69,8 +64,7 @@ public abstract class Folder
* Create a new folder with a specified display limit. Not abstract to allow * Create a new folder with a specified display limit. Not abstract to allow
* remote folders to not override or worry about this call if they don't care to. * remote folders to not override or worry about this call if they don't care to.
*/ */
public boolean create(FolderType type, int displayLimit) throws MessagingException public boolean create(FolderType type, int displayLimit) throws MessagingException {
{
return create(type); return create(type);
} }
@ -101,8 +95,7 @@ public abstract class Folder
public abstract Message[] getMessages(MessageRetrievalListener listener) public abstract Message[] getMessages(MessageRetrievalListener listener)
throws MessagingException; throws MessagingException;
public Message[] getMessages(MessageRetrievalListener listener, boolean includeDeleted) throws MessagingException public Message[] getMessages(MessageRetrievalListener listener, boolean includeDeleted) throws MessagingException {
{
return getMessages(listener); return getMessages(listener);
} }
@ -115,10 +108,8 @@ public abstract class Folder
public void moveMessages(Message[] msgs, Folder folder) throws MessagingException {} public void moveMessages(Message[] msgs, Folder folder) throws MessagingException {}
public void delete(Message[] msgs, String trashFolderName) throws MessagingException public void delete(Message[] msgs, String trashFolderName) throws MessagingException {
{ for (Message message : msgs) {
for (Message message : msgs)
{
Message myMessage = getMessage(message.getUid()); Message myMessage = getMessage(message.getUid());
myMessage.delete(trashFolderName); myMessage.delete(trashFolderName);
} }
@ -138,8 +129,7 @@ public abstract class Folder
MessageRetrievalListener listener) throws MessagingException; MessageRetrievalListener listener) throws MessagingException;
public void fetchPart(Message message, Part part, public void fetchPart(Message message, Part part,
MessageRetrievalListener listener) throws MessagingException MessageRetrievalListener listener) throws MessagingException {
{
// This is causing trouble. Disabled for now. See issue 1733 // This is causing trouble. Disabled for now. See issue 1733
//throw new RuntimeException("fetchPart() not implemented."); //throw new RuntimeException("fetchPart() not implemented.");
@ -159,83 +149,67 @@ public abstract class Folder
* @param message * @param message
* @return empty string to clear the pushState, null to leave the state as-is * @return empty string to clear the pushState, null to leave the state as-is
*/ */
public String getNewPushState(String oldPushState, Message message) public String getNewPushState(String oldPushState, Message message) {
{
return null; return null;
} }
public boolean supportsFetchingFlags() public boolean supportsFetchingFlags() {
{
return true; return true;
}//isFlagSupported }//isFlagSupported
@Override @Override
public String toString() public String toString() {
{
return getName(); return getName();
} }
public long getLastChecked() public long getLastChecked() {
{
return lastChecked; return lastChecked;
} }
public void setLastChecked(long lastChecked) throws MessagingException public void setLastChecked(long lastChecked) throws MessagingException {
{
this.lastChecked = lastChecked; this.lastChecked = lastChecked;
} }
public long getLastPush() public long getLastPush() {
{
return lastPush; return lastPush;
} }
public void setLastPush(long lastCheckedDisplay) throws MessagingException public void setLastPush(long lastCheckedDisplay) throws MessagingException {
{
this.lastPush = lastCheckedDisplay; this.lastPush = lastCheckedDisplay;
} }
public long getLastUpdate() public long getLastUpdate() {
{
return Math.max(getLastChecked(), getLastPush()); return Math.max(getLastChecked(), getLastPush());
} }
public FolderClass getDisplayClass() public FolderClass getDisplayClass() {
{
return FolderClass.NO_CLASS; return FolderClass.NO_CLASS;
} }
public FolderClass getSyncClass() public FolderClass getSyncClass() {
{
return getDisplayClass(); return getDisplayClass();
} }
public FolderClass getPushClass() public FolderClass getPushClass() {
{
return getSyncClass(); return getSyncClass();
} }
public void refresh(Preferences preferences) throws MessagingException public void refresh(Preferences preferences) throws MessagingException {
{
} }
public boolean isInTopGroup() public boolean isInTopGroup() {
{
return false; return false;
} }
public String getStatus() public String getStatus() {
{
return status; return status;
} }
public void setStatus(String status) throws MessagingException public void setStatus(String status) throws MessagingException {
{
this.status = status; this.status = status;
} }
public Account getAccount() public Account getAccount() {
{
return mAccount; return mAccount;
} }
} }

View File

@ -7,14 +7,12 @@ import java.util.Set;
import com.fsck.k9.activity.MessageReference; import com.fsck.k9.activity.MessageReference;
import com.fsck.k9.mail.store.UnavailableStorageException; import com.fsck.k9.mail.store.UnavailableStorageException;
public abstract class Message implements Part, Body public abstract class Message implements Part, Body {
{
private static final Flag[] EMPTY_FLAG_ARRAY = new Flag[0]; private static final Flag[] EMPTY_FLAG_ARRAY = new Flag[0];
private MessageReference mReference = null; private MessageReference mReference = null;
public enum RecipientType public enum RecipientType {
{
TO, CC, BCC, TO, CC, BCC,
} }
@ -26,28 +24,22 @@ public abstract class Message implements Part, Body
protected Folder mFolder; protected Folder mFolder;
public boolean olderThan(Date earliestDate) public boolean olderThan(Date earliestDate) {
{ if (earliestDate == null) {
if (earliestDate == null)
{
return false; return false;
} }
Date myDate = getSentDate(); Date myDate = getSentDate();
if (myDate == null) if (myDate == null) {
{
myDate = getInternalDate(); myDate = getInternalDate();
} }
if (myDate != null) if (myDate != null) {
{
return myDate.before(earliestDate); return myDate.before(earliestDate);
} }
return false; return false;
} }
@Override @Override
public boolean equals(Object o) public boolean equals(Object o) {
{ if (o == null || !(o instanceof Message)) {
if (o == null || !(o instanceof Message))
{
return false; return false;
} }
Message other = (Message)o; Message other = (Message)o;
@ -57,8 +49,7 @@ public abstract class Message implements Part, Body
} }
@Override @Override
public int hashCode() public int hashCode() {
{
final int MULTIPLIER = 31; final int MULTIPLIER = 31;
int result = 1; int result = 1;
@ -68,19 +59,16 @@ public abstract class Message implements Part, Body
return result; return result;
} }
public String getUid() public String getUid() {
{
return mUid; return mUid;
} }
public void setUid(String uid) public void setUid(String uid) {
{
mReference = null; mReference = null;
this.mUid = uid; this.mUid = uid;
} }
public Folder getFolder() public Folder getFolder() {
{
return mFolder; return mFolder;
} }
@ -88,13 +76,11 @@ public abstract class Message implements Part, Body
public abstract void setSubject(String subject) throws MessagingException; public abstract void setSubject(String subject) throws MessagingException;
public Date getInternalDate() public Date getInternalDate() {
{
return mInternalDate; return mInternalDate;
} }
public void setInternalDate(Date internalDate) public void setInternalDate(Date internalDate) {
{
this.mInternalDate = internalDate; this.mInternalDate = internalDate;
} }
@ -107,10 +93,8 @@ public abstract class Message implements Part, Body
public abstract void setRecipients(RecipientType type, Address[] addresses) public abstract void setRecipients(RecipientType type, Address[] addresses)
throws MessagingException; throws MessagingException;
public void setRecipient(RecipientType type, Address address) throws MessagingException public void setRecipient(RecipientType type, Address address) throws MessagingException {
{ setRecipients(type, new Address[] {
setRecipients(type, new Address[]
{
address address
}); });
} }
@ -147,8 +131,7 @@ public abstract class Message implements Part, Body
public abstract void setBody(Body body) throws MessagingException; public abstract void setBody(Body body) throws MessagingException;
public boolean isMimeType(String mimeType) throws MessagingException public boolean isMimeType(String mimeType) throws MessagingException {
{
return getContentType().startsWith(mimeType); return getContentType().startsWith(mimeType);
} }
@ -157,8 +140,7 @@ public abstract class Message implements Part, Body
/* /*
* TODO Refactor Flags at some point to be able to store user defined flags. * TODO Refactor Flags at some point to be able to store user defined flags.
*/ */
public Flag[] getFlags() public Flag[] getFlags() {
{
return mFlags.toArray(EMPTY_FLAG_ARRAY); return mFlags.toArray(EMPTY_FLAG_ARRAY);
} }
@ -170,14 +152,10 @@ public abstract class Message implements Part, Body
* , the flag is removed. * , the flag is removed.
* @throws MessagingException * @throws MessagingException
*/ */
public void setFlag(Flag flag, boolean set) throws MessagingException public void setFlag(Flag flag, boolean set) throws MessagingException {
{ if (set) {
if (set)
{
mFlags.add(flag); mFlags.add(flag);
} } else {
else
{
mFlags.remove(flag); mFlags.remove(flag);
} }
} }
@ -187,16 +165,13 @@ public abstract class Message implements Part, Body
* @param flags * @param flags
* @param set * @param set
*/ */
public void setFlags(Flag[] flags, boolean set) throws MessagingException public void setFlags(Flag[] flags, boolean set) throws MessagingException {
{ for (Flag flag : flags) {
for (Flag flag : flags)
{
setFlag(flag, set); setFlag(flag, set);
} }
} }
public boolean isSet(Flag flag) public boolean isSet(Flag flag) {
{
return mFlags.contains(flag); return mFlags.contains(flag);
} }
@ -209,10 +184,8 @@ public abstract class Message implements Part, Body
public abstract void setCharset(String charset) throws MessagingException; public abstract void setCharset(String charset) throws MessagingException;
public MessageReference makeMessageReference() public MessageReference makeMessageReference() {
{ if (mReference == null) {
if (mReference == null)
{
mReference = new MessageReference(); mReference = new MessageReference();
mReference.accountUuid = getFolder().getAccount().getUuid(); mReference.accountUuid = getFolder().getAccount().getUuid();
mReference.folderName = getFolder().getName(); mReference.folderName = getFolder().getName();
@ -221,8 +194,7 @@ public abstract class Message implements Part, Body
return mReference; return mReference;
} }
public boolean equalsReference(MessageReference ref) public boolean equalsReference(MessageReference ref) {
{
MessageReference tmpReference = makeMessageReference(); MessageReference tmpReference = makeMessageReference();
return tmpReference.equals(ref); return tmpReference.equals(ref);
} }

View File

@ -1,41 +1,34 @@
package com.fsck.k9.mail; package com.fsck.k9.mail;
public class MessagingException extends Exception public class MessagingException extends Exception {
{
public static final long serialVersionUID = -1; public static final long serialVersionUID = -1;
boolean permanentFailure = false; boolean permanentFailure = false;
public MessagingException(String message) public MessagingException(String message) {
{
super(message); super(message);
} }
public MessagingException(String message, boolean perm) public MessagingException(String message, boolean perm) {
{
super(message); super(message);
permanentFailure = perm; permanentFailure = perm;
} }
public MessagingException(String message, Throwable throwable) public MessagingException(String message, Throwable throwable) {
{
super(message, throwable); super(message, throwable);
} }
public MessagingException(String message, boolean perm, Throwable throwable) public MessagingException(String message, boolean perm, Throwable throwable) {
{
super(message, throwable); super(message, throwable);
permanentFailure = perm; permanentFailure = perm;
} }
public boolean isPermanentFailure() public boolean isPermanentFailure() {
{
return permanentFailure; return permanentFailure;
} }
public void setPermanentFailure(boolean permanentFailure) public void setPermanentFailure(boolean permanentFailure) {
{
this.permanentFailure = permanentFailure; this.permanentFailure = permanentFailure;
} }

View File

@ -7,93 +7,75 @@ import com.fsck.k9.mail.internet.MimeHeader;
import com.fsck.k9.mail.internet.MimeUtility; import com.fsck.k9.mail.internet.MimeUtility;
import com.fsck.k9.mail.internet.TextBody; import com.fsck.k9.mail.internet.TextBody;
public abstract class Multipart implements Body public abstract class Multipart implements Body {
{
protected Part mParent; protected Part mParent;
protected ArrayList<BodyPart> mParts = new ArrayList<BodyPart>(); protected ArrayList<BodyPart> mParts = new ArrayList<BodyPart>();
protected String mContentType; protected String mContentType;
public void addBodyPart(BodyPart part) public void addBodyPart(BodyPart part) {
{
mParts.add(part); mParts.add(part);
part.setParent(this); part.setParent(this);
} }
public void addBodyPart(BodyPart part, int index) public void addBodyPart(BodyPart part, int index) {
{
mParts.add(index, part); mParts.add(index, part);
part.setParent(this); part.setParent(this);
} }
public BodyPart getBodyPart(int index) public BodyPart getBodyPart(int index) {
{
return mParts.get(index); return mParts.get(index);
} }
public String getContentType() public String getContentType() {
{
return mContentType; return mContentType;
} }
public int getCount() public int getCount() {
{
return mParts.size(); return mParts.size();
} }
public boolean removeBodyPart(BodyPart part) public boolean removeBodyPart(BodyPart part) {
{
part.setParent(null); part.setParent(null);
return mParts.remove(part); return mParts.remove(part);
} }
public void removeBodyPart(int index) public void removeBodyPart(int index) {
{
mParts.get(index).setParent(null); mParts.get(index).setParent(null);
mParts.remove(index); mParts.remove(index);
} }
public Part getParent() public Part getParent() {
{
return mParent; return mParent;
} }
public void setParent(Part parent) public void setParent(Part parent) {
{
this.mParent = parent; this.mParent = parent;
} }
public void setEncoding(String encoding) public void setEncoding(String encoding) {
{ for (BodyPart part : mParts) {
for (BodyPart part : mParts) try {
{
try
{
Body body = part.getBody(); Body body = part.getBody();
if (body instanceof TextBody) if (body instanceof TextBody) {
{
part.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, encoding); part.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, encoding);
((TextBody)body).setEncoding(encoding); ((TextBody)body).setEncoding(encoding);
} }
} } catch (MessagingException e) {
catch (MessagingException e)
{
// Ignore // Ignore
} }
} }
} }
public void setCharset(String charset) throws MessagingException public void setCharset(String charset) throws MessagingException {
{
if (mParts.isEmpty()) if (mParts.isEmpty())
return; return;
BodyPart part = mParts.get(0); BodyPart part = mParts.get(0);
Body body = part.getBody(); Body body = part.getBody();
if (body instanceof TextBody) if (body instanceof TextBody) {
{
MimeUtility.setCharset(charset, part); MimeUtility.setCharset(charset, part);
((TextBody)body).setCharset(charset); ((TextBody)body).setCharset(charset);
} }

View File

@ -4,8 +4,7 @@ package com.fsck.k9.mail;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
public interface Part public interface Part {
{
public void addHeader(String name, String value) throws MessagingException; public void addHeader(String name, String value) throws MessagingException;
public void removeHeader(String name) throws MessagingException; public void removeHeader(String name) throws MessagingException;

Some files were not shown because too many files have changed in this diff Show More