diff --git a/briar-android/res/drawable-hdpi/message_notification_icon.png b/briar-android/res/drawable-hdpi/message_notification_icon.png new file mode 100644 index 000000000..082c1000a Binary files /dev/null and b/briar-android/res/drawable-hdpi/message_notification_icon.png differ diff --git a/briar-android/res/drawable-hdpi/notification_icon.png b/briar-android/res/drawable-hdpi/ongoing_notification_icon.png similarity index 100% rename from briar-android/res/drawable-hdpi/notification_icon.png rename to briar-android/res/drawable-hdpi/ongoing_notification_icon.png diff --git a/briar-android/res/drawable-ldpi/message_notification_icon.png b/briar-android/res/drawable-ldpi/message_notification_icon.png new file mode 100644 index 000000000..a88b8f561 Binary files /dev/null and b/briar-android/res/drawable-ldpi/message_notification_icon.png differ diff --git a/briar-android/res/drawable-ldpi/notification_icon.png b/briar-android/res/drawable-ldpi/ongoing_notification_icon.png similarity index 100% rename from briar-android/res/drawable-ldpi/notification_icon.png rename to briar-android/res/drawable-ldpi/ongoing_notification_icon.png diff --git a/briar-android/res/drawable-mdpi/message_notification_icon.png b/briar-android/res/drawable-mdpi/message_notification_icon.png new file mode 100644 index 000000000..e2d666cc7 Binary files /dev/null and b/briar-android/res/drawable-mdpi/message_notification_icon.png differ diff --git a/briar-android/res/drawable-mdpi/notification_icon.png b/briar-android/res/drawable-mdpi/ongoing_notification_icon.png similarity index 100% rename from briar-android/res/drawable-mdpi/notification_icon.png rename to briar-android/res/drawable-mdpi/ongoing_notification_icon.png diff --git a/briar-android/res/drawable-xhdpi/message_notification_icon.png b/briar-android/res/drawable-xhdpi/message_notification_icon.png new file mode 100644 index 000000000..b965d9320 Binary files /dev/null and b/briar-android/res/drawable-xhdpi/message_notification_icon.png differ diff --git a/briar-android/res/drawable-xhdpi/notification_icon.png b/briar-android/res/drawable-xhdpi/ongoing_notification_icon.png similarity index 100% rename from briar-android/res/drawable-xhdpi/notification_icon.png rename to briar-android/res/drawable-xhdpi/ongoing_notification_icon.png diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 9920a9194..f620adeef 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -1,8 +1,8 @@ Briar - Briar is running - Touch to show the home screen. + Briar is running + Touch to show the home screen. Briar Setup Choose your nickname: Choose your password: @@ -91,4 +91,8 @@ Message sent Post sent Not implemented yet! + New private message + Touch to show. + New forum post + Touch to show. \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java index f0a82a053..96de8c079 100644 --- a/briar-android/src/org/briarproject/android/BriarService.java +++ b/briar-android/src/org/briarproject/android/BriarService.java @@ -1,9 +1,11 @@ package org.briarproject.android; +import static android.app.Notification.DEFAULT_ALL; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP; import static java.util.logging.Level.INFO; +import static java.util.logging.Level.WARNING; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -13,27 +15,36 @@ import java.util.logging.Logger; import javax.inject.Inject; import org.briarproject.R; +import org.briarproject.android.contact.ContactListActivity; +import org.briarproject.android.groups.GroupListActivity; +import org.briarproject.api.ContactId; import org.briarproject.api.android.AndroidExecutor; import org.briarproject.api.android.DatabaseUiExecutor; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseConfig; +import org.briarproject.api.db.DbException; +import org.briarproject.api.event.Event; +import org.briarproject.api.event.EventListener; +import org.briarproject.api.event.MessageAddedEvent; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.messaging.GroupId; import roboguice.service.RoboService; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Binder; import android.os.IBinder; import android.support.v4.app.NotificationCompat; -public class BriarService extends RoboService { +public class BriarService extends RoboService implements EventListener { private static final int ONGOING_NOTIFICATION_ID = 1; private static final int FAILURE_NOTIFICATION_ID = 2; + private static final int PRIVATE_MESSAGE_NOTIFICATION_ID = 3; + private static final int GROUP_POST_NOTIFICATION_ID = 4; private static final Logger LOG = Logger.getLogger(BriarService.class.getName()); @@ -66,9 +77,9 @@ public class BriarService extends RoboService { } // Show an ongoing notification that the service is running NotificationCompat.Builder b = new NotificationCompat.Builder(this); - b.setSmallIcon(R.drawable.notification_icon); - b.setContentTitle(getText(R.string.notification_title)); - b.setContentText(getText(R.string.notification_text)); + b.setSmallIcon(R.drawable.ongoing_notification_icon); + b.setContentTitle(getText(R.string.ongoing_notification_title)); + b.setContentText(getText(R.string.ongoing_notification_text)); b.setWhen(0); // Don't show the time b.setOngoing(true); Intent i = new Intent(this, HomeScreenActivity.class); @@ -81,6 +92,7 @@ public class BriarService extends RoboService { @Override public void run() { if(lifecycleManager.startServices()) { + db.addListener(BriarService.this); started = true; } else { if(LOG.isLoggable(INFO)) LOG.info("Startup failed"); @@ -99,7 +111,7 @@ public class BriarService extends RoboService { Intent i = new Intent(this, HomeScreenActivity.class); i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP); b.setContentIntent(PendingIntent.getActivity(this, 0, i, 0)); - Object o = getSystemService(Context.NOTIFICATION_SERVICE); + Object o = getSystemService(NOTIFICATION_SERVICE); NotificationManager nm = (NotificationManager) o; nm.notify(FAILURE_NOTIFICATION_ID, b.build()); // Bring HomeScreenActivity to the front to clear all other activities @@ -130,11 +142,73 @@ public class BriarService extends RoboService { @Override public void run() { androidExecutor.shutdown(); - if(started) lifecycleManager.stopServices(); + if(started) { + db.removeListener(BriarService.this); + lifecycleManager.stopServices(); + } } }.start(); } + public void eventOccurred(Event e) { + if(e instanceof MessageAddedEvent) { + MessageAddedEvent m = (MessageAddedEvent) e; + GroupId g = m.getGroup().getId(); + ContactId c = m.getContactId(); + if(c != null) showMessageNotification(g, c); + } + } + + private void showMessageNotification(final GroupId g, final ContactId c) { + dbUiExecutor.execute(new Runnable() { + public void run() { + try { + lifecycleManager.waitForDatabase(); + if(g.equals(db.getInboxGroupId(c))) + showPrivateMessageNotification(); + else showGroupPostNotification(); + } catch(DbException e) { + if(LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } catch(InterruptedException e) { + if(LOG.isLoggable(INFO)) + LOG.info("Interruped while waiting for database"); + Thread.currentThread().interrupt(); + } + } + }); + } + + private void showPrivateMessageNotification() { + NotificationCompat.Builder b = new NotificationCompat.Builder(this); + b.setSmallIcon(R.drawable.message_notification_icon); + b.setContentTitle(getText(R.string.private_message_notification_title)); + b.setContentText(getText(R.string.private_message_notification_text)); + b.setAutoCancel(true); + b.setDefaults(DEFAULT_ALL); + Intent i = new Intent(this, ContactListActivity.class); + i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP); + b.setContentIntent(PendingIntent.getActivity(this, 0, i, 0)); + Object o = getSystemService(NOTIFICATION_SERVICE); + NotificationManager nm = (NotificationManager) o; + nm.notify(PRIVATE_MESSAGE_NOTIFICATION_ID, b.build()); + } + + private void showGroupPostNotification() { + NotificationCompat.Builder b = new NotificationCompat.Builder(this); + b.setSmallIcon(R.drawable.message_notification_icon); + b.setContentTitle(getText(R.string.group_post_notification_title)); + b.setContentText(getText(R.string.group_post_notification_text)); + b.setAutoCancel(true); + b.setDefaults(DEFAULT_ALL); + Intent i = new Intent(this, GroupListActivity.class); + i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP); + b.setContentIntent(PendingIntent.getActivity(this, 0, i, 0)); + Object o = getSystemService(NOTIFICATION_SERVICE); + NotificationManager nm = (NotificationManager) o; + nm.notify(GROUP_POST_NOTIFICATION_ID, b.build()); + } + /** Waits for the database to be opened before returning. */ public void waitForDatabase() throws InterruptedException { lifecycleManager.waitForDatabase(); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index ded5cf3cd..b2d4ea85b 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -185,7 +185,6 @@ implements EventListener, OnClickListener, OnItemClickListener { super.onActivityResult(request, result, data); if(request == REQUEST_READ_MESSAGE && result == RESULT_PREV_NEXT) { int position = data.getIntExtra("briar.POSITION", -1); - if(position == -1) throw new IllegalStateException(); if(position >= 0 && position < adapter.getCount()) displayMessage(position); } diff --git a/briar-android/src/org/briarproject/android/groups/GroupActivity.java b/briar-android/src/org/briarproject/android/groups/GroupActivity.java index 506f16a52..ff9970b7c 100644 --- a/briar-android/src/org/briarproject/android/groups/GroupActivity.java +++ b/briar-android/src/org/briarproject/android/groups/GroupActivity.java @@ -173,7 +173,6 @@ OnClickListener, OnItemClickListener { super.onActivityResult(request, result, data); if(request == REQUEST_READ_POST && result == RESULT_PREV_NEXT) { int position = data.getIntExtra("briar.POSITION", -1); - if(position == -1) throw new IllegalStateException(); if(position >= 0 && position < adapter.getCount()) displayMessage(position); }