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;
+ }
}