diff --git a/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java index 61afa6585a..2a30c4d8b5 100644 --- a/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java +++ b/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; +import android.util.Log; import org.whispersystems.textsecure.crypto.MasterSecret; import org.thoughtcrime.securesms.database.DatabaseFactory; @@ -18,9 +19,11 @@ public class MarkReadReceiver extends BroadcastReceiver { if (!intent.getAction().equals(CLEAR_ACTION)) return; + final long[] threadIds = intent.getLongArrayExtra("thread_ids"); final MasterSecret masterSecret = intent.getParcelableExtra("master_secret"); - if (masterSecret != null) { + if (threadIds != null && masterSecret != null) { + Log.w("MarkReadReceiver", "threadIds length: " + threadIds.length); ((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE)) .cancel(MessageNotifier.NOTIFICATION_ID); @@ -28,7 +31,10 @@ public class MarkReadReceiver extends BroadcastReceiver { new AsyncTask() { @Override protected Void doInBackground(Void... params) { - DatabaseFactory.getThreadDatabase(context).setAllThreadsRead(); + for (long threadId : threadIds) { + Log.w("MarkReadReceiver", "Marking as read: " + threadId); + DatabaseFactory.getThreadDatabase(context).setRead(threadId); + } MessageNotifier.updateNotification(context, masterSecret); return null; diff --git a/src/org/thoughtcrime/securesms/notifications/NotificationItem.java b/src/org/thoughtcrime/securesms/notifications/NotificationItem.java index fc52ac1b76..3b64f4e0db 100644 --- a/src/org/thoughtcrime/securesms/notifications/NotificationItem.java +++ b/src/org/thoughtcrime/securesms/notifications/NotificationItem.java @@ -72,6 +72,7 @@ public class NotificationItem { if (recipients != null) { intent.putExtra("recipients", recipients); + intent.putExtra("thread_id", threadId); } intent.setData((Uri.parse("custom://"+System.currentTimeMillis()))); diff --git a/src/org/thoughtcrime/securesms/notifications/NotificationState.java b/src/org/thoughtcrime/securesms/notifications/NotificationState.java index 5d189f0b1a..fe94d63549 100644 --- a/src/org/thoughtcrime/securesms/notifications/NotificationState.java +++ b/src/org/thoughtcrime/securesms/notifications/NotificationState.java @@ -4,6 +4,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.util.Log; import org.whispersystems.textsecure.crypto.MasterSecret; @@ -42,10 +43,25 @@ public class NotificationState { } public PendingIntent getMarkAsReadIntent(Context context, MasterSecret masterSecret) { + long[] threadArray = new long[threads.size()]; + int index = 0; + + for (long thread : threads) { + Log.w("NotificationState", "Added thread: " + thread); + threadArray[index++] = thread; + } + Intent intent = new Intent(MarkReadReceiver.CLEAR_ACTION); + intent.putExtra("thread_ids", threadArray); intent.putExtra("master_secret", masterSecret); intent.setPackage(context.getPackageName()); + // XXX : This is an Android bug. If we don't pull off the extra + // once before handing off the PendingIntent, the array will be + // truncated to one element when the PendingIntent fires. Thanks guys! + Log.w("NotificationState", "Pending array off intent length: " + + intent.getLongArrayExtra("thread_ids").length); + return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } }