package org.thoughtcrime.SMP.notifications; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; import android.util.Log; import org.thoughtcrime.SMP.crypto.MasterSecret; import org.thoughtcrime.SMP.database.RecipientPreferenceDatabase.VibrateState; import org.thoughtcrime.SMP.recipients.Recipients; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; public class NotificationState { private final LinkedList<NotificationItem> notifications = new LinkedList<>(); private final Set<Long> threads = new HashSet<>(); private int notificationCount = 0; public void addNotification(NotificationItem item) { notifications.addFirst(item); threads.add(item.getThreadId()); notificationCount++; } public @Nullable Uri getRingtone() { if (!notifications.isEmpty()) { Recipients recipients = notifications.getFirst().getRecipients(); if (recipients != null) { return recipients.getRingtone(); } } return null; } public VibrateState getVibrate() { if (!notifications.isEmpty()) { Recipients recipients = notifications.getFirst().getRecipients(); if (recipients != null) { return recipients.getVibrate(); } } return VibrateState.DEFAULT; } public boolean hasMultipleThreads() { return threads.size() > 1; } public int getThreadCount() { return threads.size(); } public int getMessageCount() { return notificationCount; } public List<NotificationItem> getNotifications() { return notifications; } 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); } }