On Sun, Jun 05, 2011 at 02:27:35AM -0700, Steven Luo wrote:
> v2:
> * If there's a new message notification, keep showing the "New messages
>   in" content text, even after a disconnect notification.
> * Handle the case of a channel/query name duplicated between two or more
>   connections more gracefully in new message notifications
> * Fix a race in updating notifications

For those who want a diff against the last revision of this patch:

diff --git a/application/src/org/yaaic/activity/ConversationActivity.java 
b/application/src/org/yaaic/activity/ConversationActivity.java
index cb8ae78..015f124 100644
--- a/application/src/org/yaaic/activity/ConversationActivity.java
+++ b/application/src/org/yaaic/activity/ConversationActivity.java
@@ -319,6 +319,7 @@ public class ConversationActivity extends Activity 
implements ServiceConnection,
             if (conversation.getStatus() == Conversation.STATUS_SELECTED && 
conversation.getNewMentions() > 0) {
                 Intent ackIntent = new Intent(this, IRCService.class);
                 ackIntent.setAction(IRCService.ACTION_ACK_NEW_MENTIONS);
+                ackIntent.putExtra(IRCService.EXTRA_ACK_SERVERID, serverId);
                 ackIntent.putExtra(IRCService.EXTRA_ACK_CONVTITLE, 
conversation.getName());
                 startService(ackIntent);
             }
diff --git a/application/src/org/yaaic/irc/IRCConnection.java 
b/application/src/org/yaaic/irc/IRCConnection.java
index f744c4b..f8fe944 100644
--- a/application/src/org/yaaic/irc/IRCConnection.java
+++ b/application/src/org/yaaic/irc/IRCConnection.java
@@ -248,6 +248,7 @@ public class IRCConnection extends PircBot
         if (mentioned || target.equals(this.getNick())) {
             if (conversation.getStatus() != Conversation.STATUS_SELECTED || 
!server.getIsForeground()) {
                 service.addNewMention(
+                    server.getId(),
                     conversation,
                     conversation.getName() + ": " + sender + " " + action,
                     service.getSettings().isVibrateHighlightEnabled(),
@@ -423,6 +424,7 @@ public class IRCConnection extends PircBot
             message.setColor(Message.COLOR_RED);
             if (conversation.getStatus() != Conversation.STATUS_SELECTED || 
!server.getIsForeground()) {
                 service.addNewMention(
+                    server.getId(),
                     conversation,
                     target + ": <" + sender + "> " + text,
                     service.getSettings().isVibrateHighlightEnabled(),
@@ -632,6 +634,7 @@ public class IRCConnection extends PircBot
 
         if (conversation.getStatus() != Conversation.STATUS_SELECTED || 
!server.getIsForeground()) {
             service.addNewMention(
+                server.getId(),
                 conversation,
                 "<" + sender + "> " + text,
                 service.getSettings().isVibrateHighlightEnabled(),
diff --git a/application/src/org/yaaic/irc/IRCService.java 
b/application/src/org/yaaic/irc/IRCService.java
index 4da5799..29daabc 100644
--- a/application/src/org/yaaic/irc/IRCService.java
+++ b/application/src/org/yaaic/irc/IRCService.java
@@ -70,6 +70,7 @@ public class IRCService extends Service
     public static final String ACTION_FOREGROUND = 
"org.yaaic.service.foreground";
     public static final String ACTION_BACKGROUND = 
"org.yaaic.service.background";
     public static final String ACTION_ACK_NEW_MENTIONS = 
"org.yaaic.service.ack_new_mentions";
+    public static final String EXTRA_ACK_SERVERID = 
"org.yaaic.service.ack_serverid";
     public static final String EXTRA_ACK_CONVTITLE = 
"org.yaaic.service.ack_convtitle";
 
     private NotificationManager notificationManager;
@@ -191,7 +192,7 @@ public class IRCService extends Service
         } else if (ACTION_BACKGROUND.equals(intent.getAction()) && 
!foreground) {
             stopForegroundCompat(FOREGROUND_NOTIFICATION);
         } else if (ACTION_ACK_NEW_MENTIONS.equals(intent.getAction())) {
-            ackNewMentions(intent.getStringExtra(EXTRA_ACK_CONVTITLE));
+            ackNewMentions(intent.getIntExtra(EXTRA_ACK_SERVERID, -1), 
intent.getStringExtra(EXTRA_ACK_CONVTITLE));
         }
     }
 
@@ -212,7 +213,13 @@ public class IRCService extends Service
             PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
notifyIntent, 0);
 
             if (contentText == null) {
-                if (!connectedServerTitles.isEmpty()) {
+                if (newMentions >= 1) {
+                    StringBuilder sb = new StringBuilder();
+                    for (Conversation conv : mentions.values()) {
+                        sb.append(conv.getName() + " (" + 
conv.getNewMentions() + "), ");
+                    }
+                    contentText = getString(R.string.notification_mentions, 
sb.substring(0, sb.length()-2));
+                } else if (!connectedServerTitles.isEmpty()) {
                     StringBuilder sb = new StringBuilder();
                     for (String title : connectedServerTitles) {
                         sb.append(title + ", ");
@@ -240,23 +247,10 @@ public class IRCService extends Service
     }
 
     /**
-     * Update the status bar notification for a new mention
+     * Generates a string uniquely identifying a conversation.
      */
-    private void notifyMention(String msg, boolean vibrate, boolean sound)
-    {
-        String contentText = null;
-
-        if (newMentions == 1 && msg != null) {
-            contentText = msg;
-        } else if (newMentions >= 1) {
-            StringBuilder sb = new StringBuilder();
-            for (Conversation conv : mentions.values()) {
-                sb.append(conv.getName() + " (" + conv.getNewMentions() + "), 
");
-            }
-            contentText = getString(R.string.notification_mentions, 
sb.substring(0, sb.length()-2));
-        }
-
-        updateNotification(msg, contentText, vibrate, sound);
+    public String getConversationId(int serverId, String title) {
+        return "" + serverId + ":" + title;
     }
 
     /**
@@ -267,20 +261,23 @@ public class IRCService extends Service
      * @param vibrate Whether the notification should include vibration
      * @param sound Whether the notification should include sound
      */
-    public void addNewMention(Conversation conversation, String msg, boolean 
vibrate, boolean sound)
+    public synchronized void addNewMention(int serverId, Conversation 
conversation, String msg, boolean vibrate, boolean sound)
     {
         if (conversation == null)
             return;
 
-        String convTitle = conversation.getName();
-
         conversation.addNewMention();
         ++newMentions;
-        if (!mentions.containsKey(convTitle)) {
-            mentions.put(convTitle, conversation);
+        String convId = getConversationId(serverId, conversation.getName());
+        if (!mentions.containsKey(convId)) {
+            mentions.put(convId, conversation);
         }
 
-        notifyMention(msg, vibrate, sound);
+        if (newMentions == 1) {
+            updateNotification(msg, msg, vibrate, sound);
+        } else {
+            updateNotification(msg, null, vibrate, sound);
+        }
     }
 
     /**
@@ -288,12 +285,12 @@ public class IRCService extends Service
      *
      * @param convTitle The title of the conversation whose new mentions have 
been read
      */
-    public void ackNewMentions(String convTitle)
+    public synchronized void ackNewMentions(int serverId, String convTitle)
     {
         if (convTitle == null)
             return;
 
-        Conversation conversation = mentions.remove(convTitle);
+        Conversation conversation = 
mentions.remove(getConversationId(serverId, convTitle));
         if (conversation == null)
             return;
         newMentions -= conversation.getNewMentions();
@@ -301,7 +298,7 @@ public class IRCService extends Service
         if (newMentions < 0)
             newMentions = 0;
 
-        notifyMention(null, false, false);
+        updateNotification(null, null, false, false);
     }
 
     /**
@@ -309,7 +306,7 @@ public class IRCService extends Service
      *
      * @param title The title of the newly connected server
      */
-    public void notifyConnected(String title)
+    public synchronized void notifyConnected(String title)
     {
         connectedServerTitles.add(title);
         updateNotification(getString(R.string.notification_connected, title), 
null, false, false);
@@ -320,7 +317,7 @@ public class IRCService extends Service
      *
      * @param title The title of the disconnected server
      */
-    public void notifyDisconnected(String title)
+    public synchronized void notifyDisconnected(String title)
     {
         connectedServerTitles.remove(title);
         updateNotification(getString(R.string.notification_disconnected, 
title), null, false, false);
diff --git 
a/application/src/org/yaaic/listener/ConversationSelectedListener.java 
b/application/src/org/yaaic/listener/ConversationSelectedListener.java
index 5a83a93..7497891 100644
--- a/application/src/org/yaaic/listener/ConversationSelectedListener.java
+++ b/application/src/org/yaaic/listener/ConversationSelectedListener.java
@@ -88,6 +88,7 @@ public class ConversationSelectedListener implements 
OnItemSelectedListener
             if (conversation.getNewMentions() > 0) {
                 Intent i = new Intent(ctx, IRCService.class);
                 i.setAction(IRCService.ACTION_ACK_NEW_MENTIONS);
+                i.putExtra(IRCService.EXTRA_ACK_SERVERID, server.getId());
                 i.putExtra(IRCService.EXTRA_ACK_CONVTITLE, 
conversation.getName());
                 ctx.startService(i);
             }

Reply via email to