package com.fsck.k9.controller;
import android.content.Context;
import timber.log.Timber;
import com.fsck.k9.Account;
import com.fsck.k9.K9;
import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock;
import com.fsck.k9.mail.Folder;
import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.PushReceiver;
import com.fsck.k9.mailstore.LocalFolder;
import com.fsck.k9.mailstore.LocalStore;
import com.fsck.k9.service.SleepService;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class MessagingControllerPushReceiver implements PushReceiver {
final Account account;
final MessagingController controller;
final Context context;
public MessagingControllerPushReceiver(Context context, Account nAccount, MessagingController nController) {
account = nAccount;
controller = nController;
this.context = context;
}
public void messagesFlagsChanged(Folder folder,
List<Message> messages) {
controller.messagesArrived(account, folder, messages, true);
}
public void messagesArrived(Folder folder, List<Message> messages) {
controller.messagesArrived(account, folder, messages, false);
}
public void messagesRemoved(Folder folder, List<Message> messages) {
controller.messagesArrived(account, folder, messages, true);
}
public void syncFolder(Folder folder) {
Timber.v("syncFolder(%s)", folder.getName());
final CountDownLatch latch = new CountDownLatch(1);
controller.synchronizeMailbox(account, folder.getName(), new SimpleMessagingListener() {
@Override
public void synchronizeMailboxFinished(Account account, String folder,
int totalMessagesInMailbox, int numNewMessages) {
latch.countDown();
}
@Override
public void synchronizeMailboxFailed(Account account, String folder,
String message) {
latch.countDown();
}
}, folder);
Timber.v("syncFolder(%s) about to await latch release", folder.getName());
try {
latch.await();
Timber.v("syncFolder(%s) got latch release", folder.getName());
} catch (Exception e) {
Timber.e(e, "Interrupted while awaiting latch release");
}
}
@Override
public void sleep(TracingWakeLock wakeLock, long millis) {
SleepService.sleep(context, millis, wakeLock, K9.PUSH_WAKE_LOCK_TIMEOUT);
}
public void pushError(String errorMessage, Exception e) {
String errMess = errorMessage;
controller.notifyUserIfCertificateProblem(account, e, true);
if (errMess == null && e != null) {
errMess = e.getMessage();
}
controller.addErrorMessage(account, errMess, e);
}
@Override
public void authenticationFailed() {
controller.handleAuthenticationFailure(account, true);
}
public String getPushState(String folderName) {
LocalFolder localFolder = null;
try {
LocalStore localStore = account.getLocalStore();
localFolder = localStore.getFolder(folderName);
localFolder.open(Folder.OPEN_MODE_RW);
return localFolder.getPushState();
} catch (Exception e) {
Timber.e(e, "Unable to get push state from account %s, folder %s", account.getDescription(), folderName);
return null;
} finally {
if (localFolder != null) {
localFolder.close();
}
}
}
public void setPushActive(String folderName, boolean enabled) {
for (MessagingListener l : controller.getListeners()) {
l.setPushActive(account, folderName, enabled);
}
}
@Override
public Context getContext() {
return context;
}
}