diff --git a/res/values/strings.xml b/res/values/strings.xml index 340801f..ef56cbd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -41,6 +41,11 @@ Folder is empty Folder does not exist + + One new email + %d new emails + + Queued Sending Sent %1$d of %2$d diff --git a/src/i2p/bote/android/service/BoteService.java b/src/i2p/bote/android/service/BoteService.java index 1177421..e54a2de 100644 --- a/src/i2p/bote/android/service/BoteService.java +++ b/src/i2p/bote/android/service/BoteService.java @@ -1,18 +1,35 @@ package i2p.bote.android.service; +import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; +import javax.mail.MessagingException; + import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.RouterLaunch; import i2p.bote.I2PBote; +import i2p.bote.android.EmailListActivity; +import i2p.bote.android.R; +import i2p.bote.android.ViewEmailActivity; import i2p.bote.android.service.Init.RouterChoice; +import i2p.bote.android.util.BoteHelper; +import i2p.bote.email.Email; +import i2p.bote.fileencryption.PasswordException; +import i2p.bote.folder.EmailFolder; +import i2p.bote.folder.FolderListener; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.os.IBinder; +import android.support.v4.app.NotificationCompat; -public class BoteService extends Service { +public class BoteService extends Service implements FolderListener { public static final String ROUTER_CHOICE = "router_choice"; + public static final int NOTIF_ID_NEW_EMAIL = 80739047; RouterChoice mRouterChoice; RouterContext mRouterContext; @@ -22,7 +39,11 @@ public class BoteService extends Service { mRouterChoice = (RouterChoice) intent.getSerializableExtra(ROUTER_CHOICE); if (mRouterChoice == RouterChoice.INTERNAL) new Thread(new RouterStarter()).start(); + I2PBote.getInstance().startUp(); + + I2PBote.getInstance().getInbox().addFolderListener(this); + return START_REDELIVER_INTENT; } @@ -33,7 +54,10 @@ public class BoteService extends Service { @Override public void onDestroy() { + I2PBote.getInstance().getInbox().removeFolderListener(this); + I2PBote.getInstance().shutDown(); + if (mRouterChoice == RouterChoice.INTERNAL) new Thread(new RouterStopper()).start(); } @@ -59,4 +83,87 @@ public class BoteService extends Service { ctx.router().shutdown(Router.EXIT_HARD); } } + + // FolderListener + + @Override + public void elementAdded() { + notifyUnread(); + } + + @Override + public void elementUpdated() { + notifyUnread(); + } + + @Override + public void elementRemoved() { + notifyUnread(); + } + + private void notifyUnread() { + NotificationManager nm = (NotificationManager) getSystemService( + Context.NOTIFICATION_SERVICE); + + NotificationCompat.Builder b = + new NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.ic_launcher) + .setAutoCancel(true); + + try { + EmailFolder inbox = I2PBote.getInstance().getInbox(); + List newEmails = BoteHelper.getNewEmails(inbox); + int numNew = newEmails.size(); + switch (numNew) { + case 0: + nm.cancel(NOTIF_ID_NEW_EMAIL); + return; + + case 1: + Email email = newEmails.get(0); + b.setContentTitle(BoteHelper.getNameAndShortDestination( + email.getOneFromAddress())); + b.setContentText(email.getSubject()); + + Intent vei = new Intent(this, ViewEmailActivity.class); + vei.putExtra(ViewEmailActivity.FOLDER_NAME, inbox.getName()); + vei.putExtra(ViewEmailActivity.MESSAGE_ID, email.getMessageID()); + vei.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + PendingIntent pvei = PendingIntent.getActivity(this, 0, vei, PendingIntent.FLAG_UPDATE_CURRENT); + b.setContentIntent(pvei); + break; + + default: + b.setContentTitle(getResources().getQuantityString( + R.plurals.n_new_emails, numNew, numNew)); + + String bigText = ""; + for (Email ne : newEmails) { + bigText += BoteHelper.getNameAndShortDestination( + ne.getOneFromAddress()); + bigText += ": " + ne.getSubject() + "\n"; + } + b.setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)); + + Intent eli = new Intent(this, EmailListActivity.class); + eli.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + PendingIntent peli = PendingIntent.getActivity(this, 0, eli, PendingIntent.FLAG_UPDATE_CURRENT); + b.setContentIntent(peli); + } + } catch (PasswordException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (MessagingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (GeneralSecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + nm.notify(NOTIF_ID_NEW_EMAIL, b.build()); + } } diff --git a/src/i2p/bote/android/util/BoteHelper.java b/src/i2p/bote/android/util/BoteHelper.java index e02bfe8..dbf1937 100644 --- a/src/i2p/bote/android/util/BoteHelper.java +++ b/src/i2p/bote/android/util/BoteHelper.java @@ -3,6 +3,8 @@ package i2p.bote.android.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import java.util.Iterator; +import java.util.List; import javax.mail.Address; import javax.mail.MessagingException; @@ -206,4 +208,15 @@ public class BoteHelper extends GeneralHelper { public static boolean isOutbox(String folderName) { return "Outbox".equalsIgnoreCase(folderName); } + + public static List getNewEmails(EmailFolder folder) throws PasswordException { + List emails = folder.getElements(); + Iterator iter = emails.iterator(); + while (iter.hasNext()) { + Email email = iter.next(); + if (!email.isUnread()) + iter.remove(); + } + return emails; + } }