Loading k9mail-library/src/main/java/com/fsck/k9/mail/PushReceiver.java +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ public interface PushReceiver { void messagesRemoved(Folder folder, List<Message> mess); String getPushState(String folderName); void pushError(String errorMessage, Exception e); void authenticationFailed(); void setPushActive(String folderName, boolean enabled); void sleep(TracingWakeLock wakeLock, long millis); } k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolderPusher.java +24 −10 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import android.content.Context; import android.os.PowerManager; import android.util.Log; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.K9MailLib; import com.fsck.k9.mail.Message; Loading Loading @@ -188,19 +189,18 @@ class ImapFolderPusher extends ImapFolder { returnFromIdle(); } } catch (Exception e) { wakeLock.acquire(PUSH_WAKE_LOCK_TIMEOUT); } catch (AuthenticationFailedException e) { reacquireWakeLockAndCleanUp(); clearStoredUntaggedResponses(); idling = false; pushReceiver.setPushActive(getName(), false); try { connection.close(); } catch (Exception me) { Log.e(LOG_TAG, "Got exception while closing for exception for " + getLogId(), me); if (K9MailLib.isDebug()) { Log.e(K9MailLib.LOG_TAG, "Authentication failed. Stopping ImapFolderPusher.", e); } pushReceiver.authenticationFailed(); stop = true; } catch (Exception e) { reacquireWakeLockAndCleanUp(); if (stop) { Log.i(LOG_TAG, "Got exception while idling, but stop is set for " + getLogId()); } else { Loading Loading @@ -241,6 +241,20 @@ class ImapFolderPusher extends ImapFolder { } } private void reacquireWakeLockAndCleanUp() { wakeLock.acquire(PUSH_WAKE_LOCK_TIMEOUT); clearStoredUntaggedResponses(); idling = false; pushReceiver.setPushActive(getName(), false); try { connection.close(); } catch (Exception me) { Log.e(LOG_TAG, "Got exception while closing for exception for " + getLogId(), me); } } private long getNewUidNext() throws MessagingException { long newUidNext = uidNext; if (newUidNext != -1L) { Loading k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java +18 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import com.fsck.k9.R; import com.fsck.k9.activity.MessageReference; import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; import com.fsck.k9.cache.EmailProviderCache; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.CertificateValidationException; import com.fsck.k9.mail.power.TracingPowerManager; import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; Loading Loading @@ -879,6 +880,8 @@ public class MessagingController implements Runnable { } notificationController.clearAuthenticationErrorNotification(account, true); /* * Get the remote message count. */ Loading Loading @@ -1010,6 +1013,12 @@ public class MessagingController implements Runnable { if (K9.DEBUG) Log.i(K9.LOG_TAG, "Done synchronizing folder " + account.getDescription() + ":" + folder); } catch (AuthenticationFailedException e) { handleAuthenticationFailure(account, true); for (MessagingListener l : getListeners(listener)) { l.synchronizeMailboxFailed(account, folder, "Authentication failure"); } } catch (Exception e) { Log.e(K9.LOG_TAG, "synchronizeMailbox", e); // If we don't set the last checked, it can try too often during Loading Loading @@ -1042,6 +1051,10 @@ public class MessagingController implements Runnable { } void handleAuthenticationFailure(Account account, boolean incoming) { notificationController.showAuthenticationErrorNotification(account, incoming); } private void updateMoreMessages(Folder remoteFolder, LocalFolder localFolder, Date earliestDate, int remoteStart) throws MessagingException, IOException { Loading Loading @@ -3142,7 +3155,12 @@ public class MessagingController implements Runnable { queuePendingCommand(account, command); processPendingCommands(account); } } catch (AuthenticationFailedException e) { lastFailure = e; wasPermanentFailure = false; handleAuthenticationFailure(account, false); handleSendFailure(account, localStore, localFolder, message, e, wasPermanentFailure); } catch (CertificateValidationException e) { lastFailure = e; wasPermanentFailure = false; Loading k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerPushReceiver.java +5 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,11 @@ public class MessagingControllerPushReceiver implements PushReceiver { controller.addErrorMessage(account, errMess, e); } @Override public void authenticationFailed() { controller.handleAuthenticationFailure(account, true); } public String getPushState(String folderName) { LocalFolder localFolder = null; try { Loading k9mail/src/main/java/com/fsck/k9/notification/AuthenticationErrorNotifications.java 0 → 100644 +71 −0 Original line number Diff line number Diff line package com.fsck.k9.notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.BigTextStyle; import android.support.v4.app.NotificationManagerCompat; import com.fsck.k9.Account; import com.fsck.k9.R; import com.fsck.k9.activity.setup.AccountSetupIncoming; import com.fsck.k9.activity.setup.AccountSetupOutgoing; import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; class AuthenticationErrorNotifications { private final NotificationController controller; public AuthenticationErrorNotifications(NotificationController controller) { this.controller = controller; } public void showAuthenticationErrorNotification(Account account, boolean incoming) { int notificationId = NotificationIds.getAuthenticationErrorNotificationId(account, incoming); Context context = controller.getContext(); PendingIntent editServerSettingsPendingIntent = createContentIntent(context, account, incoming); String title = context.getString(R.string.notification_authentication_error_title); String text = context.getString(R.string.notification_authentication_error_text, account.getDescription()); NotificationCompat.Builder builder = controller.createNotificationBuilder() .setSmallIcon(R.drawable.notification_icon_warning) .setWhen(System.currentTimeMillis()) .setAutoCancel(true) .setTicker(title) .setContentTitle(title) .setContentText(text) .setContentIntent(editServerSettingsPendingIntent) .setStyle(new BigTextStyle().bigText(text)) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); controller.configureNotification(builder, null, null, NOTIFICATION_LED_FAILURE_COLOR, NOTIFICATION_LED_BLINK_FAST, true); getNotificationManager().notify(notificationId, builder.build()); } public void clearAuthenticationErrorNotification(Account account, boolean incoming) { int notificationId = NotificationIds.getAuthenticationErrorNotificationId(account, incoming); getNotificationManager().cancel(notificationId); } PendingIntent createContentIntent(Context context, Account account, boolean incoming) { Intent editServerSettingsIntent = incoming ? AccountSetupIncoming.intentActionEditIncomingSettings(context, account) : AccountSetupOutgoing.intentActionEditOutgoingSettings(context, account); return PendingIntent.getActivity(context, account.getAccountNumber(), editServerSettingsIntent, PendingIntent.FLAG_UPDATE_CURRENT); } private NotificationManagerCompat getNotificationManager() { return controller.getNotificationManager(); } } Loading
k9mail-library/src/main/java/com/fsck/k9/mail/PushReceiver.java +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ public interface PushReceiver { void messagesRemoved(Folder folder, List<Message> mess); String getPushState(String folderName); void pushError(String errorMessage, Exception e); void authenticationFailed(); void setPushActive(String folderName, boolean enabled); void sleep(TracingWakeLock wakeLock, long millis); }
k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolderPusher.java +24 −10 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import android.content.Context; import android.os.PowerManager; import android.util.Log; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.K9MailLib; import com.fsck.k9.mail.Message; Loading Loading @@ -188,19 +189,18 @@ class ImapFolderPusher extends ImapFolder { returnFromIdle(); } } catch (Exception e) { wakeLock.acquire(PUSH_WAKE_LOCK_TIMEOUT); } catch (AuthenticationFailedException e) { reacquireWakeLockAndCleanUp(); clearStoredUntaggedResponses(); idling = false; pushReceiver.setPushActive(getName(), false); try { connection.close(); } catch (Exception me) { Log.e(LOG_TAG, "Got exception while closing for exception for " + getLogId(), me); if (K9MailLib.isDebug()) { Log.e(K9MailLib.LOG_TAG, "Authentication failed. Stopping ImapFolderPusher.", e); } pushReceiver.authenticationFailed(); stop = true; } catch (Exception e) { reacquireWakeLockAndCleanUp(); if (stop) { Log.i(LOG_TAG, "Got exception while idling, but stop is set for " + getLogId()); } else { Loading Loading @@ -241,6 +241,20 @@ class ImapFolderPusher extends ImapFolder { } } private void reacquireWakeLockAndCleanUp() { wakeLock.acquire(PUSH_WAKE_LOCK_TIMEOUT); clearStoredUntaggedResponses(); idling = false; pushReceiver.setPushActive(getName(), false); try { connection.close(); } catch (Exception me) { Log.e(LOG_TAG, "Got exception while closing for exception for " + getLogId(), me); } } private long getNewUidNext() throws MessagingException { long newUidNext = uidNext; if (newUidNext != -1L) { Loading
k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java +18 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import com.fsck.k9.R; import com.fsck.k9.activity.MessageReference; import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; import com.fsck.k9.cache.EmailProviderCache; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.CertificateValidationException; import com.fsck.k9.mail.power.TracingPowerManager; import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; Loading Loading @@ -879,6 +880,8 @@ public class MessagingController implements Runnable { } notificationController.clearAuthenticationErrorNotification(account, true); /* * Get the remote message count. */ Loading Loading @@ -1010,6 +1013,12 @@ public class MessagingController implements Runnable { if (K9.DEBUG) Log.i(K9.LOG_TAG, "Done synchronizing folder " + account.getDescription() + ":" + folder); } catch (AuthenticationFailedException e) { handleAuthenticationFailure(account, true); for (MessagingListener l : getListeners(listener)) { l.synchronizeMailboxFailed(account, folder, "Authentication failure"); } } catch (Exception e) { Log.e(K9.LOG_TAG, "synchronizeMailbox", e); // If we don't set the last checked, it can try too often during Loading Loading @@ -1042,6 +1051,10 @@ public class MessagingController implements Runnable { } void handleAuthenticationFailure(Account account, boolean incoming) { notificationController.showAuthenticationErrorNotification(account, incoming); } private void updateMoreMessages(Folder remoteFolder, LocalFolder localFolder, Date earliestDate, int remoteStart) throws MessagingException, IOException { Loading Loading @@ -3142,7 +3155,12 @@ public class MessagingController implements Runnable { queuePendingCommand(account, command); processPendingCommands(account); } } catch (AuthenticationFailedException e) { lastFailure = e; wasPermanentFailure = false; handleAuthenticationFailure(account, false); handleSendFailure(account, localStore, localFolder, message, e, wasPermanentFailure); } catch (CertificateValidationException e) { lastFailure = e; wasPermanentFailure = false; Loading
k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerPushReceiver.java +5 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,11 @@ public class MessagingControllerPushReceiver implements PushReceiver { controller.addErrorMessage(account, errMess, e); } @Override public void authenticationFailed() { controller.handleAuthenticationFailure(account, true); } public String getPushState(String folderName) { LocalFolder localFolder = null; try { Loading
k9mail/src/main/java/com/fsck/k9/notification/AuthenticationErrorNotifications.java 0 → 100644 +71 −0 Original line number Diff line number Diff line package com.fsck.k9.notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.BigTextStyle; import android.support.v4.app.NotificationManagerCompat; import com.fsck.k9.Account; import com.fsck.k9.R; import com.fsck.k9.activity.setup.AccountSetupIncoming; import com.fsck.k9.activity.setup.AccountSetupOutgoing; import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; class AuthenticationErrorNotifications { private final NotificationController controller; public AuthenticationErrorNotifications(NotificationController controller) { this.controller = controller; } public void showAuthenticationErrorNotification(Account account, boolean incoming) { int notificationId = NotificationIds.getAuthenticationErrorNotificationId(account, incoming); Context context = controller.getContext(); PendingIntent editServerSettingsPendingIntent = createContentIntent(context, account, incoming); String title = context.getString(R.string.notification_authentication_error_title); String text = context.getString(R.string.notification_authentication_error_text, account.getDescription()); NotificationCompat.Builder builder = controller.createNotificationBuilder() .setSmallIcon(R.drawable.notification_icon_warning) .setWhen(System.currentTimeMillis()) .setAutoCancel(true) .setTicker(title) .setContentTitle(title) .setContentText(text) .setContentIntent(editServerSettingsPendingIntent) .setStyle(new BigTextStyle().bigText(text)) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); controller.configureNotification(builder, null, null, NOTIFICATION_LED_FAILURE_COLOR, NOTIFICATION_LED_BLINK_FAST, true); getNotificationManager().notify(notificationId, builder.build()); } public void clearAuthenticationErrorNotification(Account account, boolean incoming) { int notificationId = NotificationIds.getAuthenticationErrorNotificationId(account, incoming); getNotificationManager().cancel(notificationId); } PendingIntent createContentIntent(Context context, Account account, boolean incoming) { Intent editServerSettingsIntent = incoming ? AccountSetupIncoming.intentActionEditIncomingSettings(context, account) : AccountSetupOutgoing.intentActionEditOutgoingSettings(context, account); return PendingIntent.getActivity(context, account.getAccountNumber(), editServerSettingsIntent, PendingIntent.FLAG_UPDATE_CURRENT); } private NotificationManagerCompat getNotificationManager() { return controller.getNotificationManager(); } }