package com.fsck.k9.notification; import java.util.ArrayList; import android.app.Notification; import android.app.PendingIntent; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.WearableExtender; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.R; import com.fsck.k9.activity.MessageReference; import com.fsck.k9.controller.MessagingController; class WearNotifications extends BaseNotifications { public WearNotifications(NotificationController controller, NotificationActionCreator actionCreator) { super(controller, actionCreator); } public Notification buildStackedNotification(Account account, NotificationHolder holder) { int notificationId = holder.notificationId; NotificationContent content = holder.content; NotificationCompat.Builder builder = createBigTextStyleNotification(account, holder, notificationId); PendingIntent deletePendingIntent = actionCreator.createDismissMessagePendingIntent( context, content.messageReference, holder.notificationId); builder.setDeleteIntent(deletePendingIntent); addActions(builder, account, holder); return builder.build(); } public void addSummaryActions(Builder builder, NotificationData notificationData) { NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender(); addMarkAllAsReadAction(wearableExtender, notificationData); if (isDeleteActionAvailableForWear()) { addDeleteAllAction(wearableExtender, notificationData); } Account account = notificationData.getAccount(); if (isArchiveActionAvailableForWear(account)) { addArchiveAllAction(wearableExtender, notificationData); } builder.extend(wearableExtender); } private void addMarkAllAsReadAction(WearableExtender wearableExtender, NotificationData notificationData) { int icon = R.drawable.ic_action_mark_as_read_dark; String title = context.getString(R.string.notification_action_mark_all_as_read); Account account = notificationData.getAccount(); ArrayList<MessageReference> messageReferences = notificationData.getAllMessageReferences(); int notificationId = NotificationIds.getNewMailSummaryNotificationId(account); PendingIntent action = actionCreator.getMarkAllAsReadPendingIntent(account, messageReferences, notificationId); NotificationCompat.Action markAsReadAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(markAsReadAction); } private void addDeleteAllAction(WearableExtender wearableExtender, NotificationData notificationData) { int icon = R.drawable.ic_action_delete_dark; String title = context.getString(R.string.notification_action_delete_all); Account account = notificationData.getAccount(); ArrayList<MessageReference> messageReferences = notificationData.getAllMessageReferences(); int notificationId = NotificationIds.getNewMailSummaryNotificationId(account); PendingIntent action = actionCreator.getDeleteAllPendingIntent(account, messageReferences, notificationId); NotificationCompat.Action deleteAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(deleteAction); } private void addArchiveAllAction(WearableExtender wearableExtender, NotificationData notificationData) { int icon = R.drawable.ic_action_archive_dark; String title = context.getString(R.string.notification_action_archive_all); Account account = notificationData.getAccount(); ArrayList<MessageReference> messageReferences = notificationData.getAllMessageReferences(); int notificationId = NotificationIds.getNewMailSummaryNotificationId(account); PendingIntent action = actionCreator.createArchiveAllPendingIntent(account, messageReferences, notificationId); NotificationCompat.Action archiveAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(archiveAction); } private void addActions(Builder builder, Account account, NotificationHolder holder) { addDeviceActions(builder, holder); addWearActions(builder, account, holder); } private void addDeviceActions(Builder builder, NotificationHolder holder) { addDeviceReplyAction(builder, holder); addDeviceMarkAsReadAction(builder, holder); addDeviceDeleteAction(builder, holder); } private void addDeviceReplyAction(Builder builder, NotificationHolder holder) { int icon = R.drawable.notification_action_mark_as_read; String title = context.getString(R.string.notification_action_reply); NotificationContent content = holder.content; MessageReference messageReference = content.messageReference; PendingIntent replyToMessagePendingIntent = actionCreator.createReplyPendingIntent(messageReference, holder.notificationId); builder.addAction(icon, title, replyToMessagePendingIntent); } private void addDeviceMarkAsReadAction(Builder builder, NotificationHolder holder) { int icon = R.drawable.notification_action_mark_as_read; String title = context.getString(R.string.notification_action_mark_as_read); NotificationContent content = holder.content; int notificationId = holder.notificationId; MessageReference messageReference = content.messageReference; PendingIntent action = actionCreator.createMarkMessageAsReadPendingIntent(messageReference, notificationId); builder.addAction(icon, title, action); } private void addDeviceDeleteAction(Builder builder, NotificationHolder holder) { if (!isDeleteActionEnabled()) { return; } int icon = R.drawable.notification_action_delete; String title = context.getString(R.string.notification_action_delete); NotificationContent content = holder.content; int notificationId = holder.notificationId; MessageReference messageReference = content.messageReference; PendingIntent action = actionCreator.createDeleteMessagePendingIntent(messageReference, notificationId); builder.addAction(icon, title, action); } private void addWearActions(Builder builder, Account account, NotificationHolder holder) { NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender(); addReplyAction(wearableExtender, holder); addMarkAsReadAction(wearableExtender, holder); if (isDeleteActionAvailableForWear()) { addDeleteAction(wearableExtender, holder); } if (isArchiveActionAvailableForWear(account)) { addArchiveAction(wearableExtender, holder); } if (isSpamActionAvailableForWear(account)) { addMarkAsSpamAction(wearableExtender, holder); } builder.extend(wearableExtender); } private void addReplyAction(WearableExtender wearableExtender, NotificationHolder holder) { int icon = R.drawable.ic_action_single_message_options_dark; String title = context.getString(R.string.notification_action_reply); MessageReference messageReference = holder.content.messageReference; int notificationId = holder.notificationId; PendingIntent action = actionCreator.createReplyPendingIntent(messageReference, notificationId); NotificationCompat.Action replyAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(replyAction); } private void addMarkAsReadAction(WearableExtender wearableExtender, NotificationHolder holder) { int icon = R.drawable.ic_action_mark_as_read_dark; String title = context.getString(R.string.notification_action_mark_as_read); MessageReference messageReference = holder.content.messageReference; int notificationId = holder.notificationId; PendingIntent action = actionCreator.createMarkMessageAsReadPendingIntent(messageReference, notificationId); NotificationCompat.Action markAsReadAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(markAsReadAction); } private void addDeleteAction(WearableExtender wearableExtender, NotificationHolder holder) { int icon = R.drawable.ic_action_delete_dark; String title = context.getString(R.string.notification_action_delete); MessageReference messageReference = holder.content.messageReference; int notificationId = holder.notificationId; PendingIntent action = actionCreator.createDeleteMessagePendingIntent(messageReference, notificationId); NotificationCompat.Action deleteAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(deleteAction); } private void addArchiveAction(WearableExtender wearableExtender, NotificationHolder holder) { int icon = R.drawable.ic_action_archive_dark; String title = context.getString(R.string.notification_action_archive); MessageReference messageReference = holder.content.messageReference; int notificationId = holder.notificationId; PendingIntent action = actionCreator.createArchiveMessagePendingIntent(messageReference, notificationId); NotificationCompat.Action archiveAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(archiveAction); } private void addMarkAsSpamAction(WearableExtender wearableExtender, NotificationHolder holder) { int icon = R.drawable.ic_action_spam_dark; String title = context.getString(R.string.notification_action_spam); MessageReference messageReference = holder.content.messageReference; int notificationId = holder.notificationId; PendingIntent action = actionCreator.createMarkMessageAsSpamPendingIntent(messageReference, notificationId); NotificationCompat.Action spamAction = new NotificationCompat.Action.Builder(icon, title, action).build(); wearableExtender.addAction(spamAction); } private boolean isDeleteActionAvailableForWear() { return isDeleteActionEnabled() && !K9.confirmDeleteFromNotification(); } private boolean isArchiveActionAvailableForWear(Account account) { String archiveFolderName = account.getArchiveFolderName(); return archiveFolderName != null && isMovePossible(account, archiveFolderName); } private boolean isSpamActionAvailableForWear(Account account) { String spamFolderName = account.getSpamFolderName(); return spamFolderName != null && !K9.confirmSpam() && isMovePossible(account, spamFolderName); } private boolean isMovePossible(Account account, String destinationFolderName) { if (K9.FOLDER_NONE.equalsIgnoreCase(destinationFolderName)) { return false; } MessagingController controller = createMessagingController(); return controller.isMoveCapable(account); } MessagingController createMessagingController() { return MessagingController.getInstance(context); } }