mirror of
https://github.com/moparisthebest/k-9
synced 2025-02-17 07:30:16 -05:00
Add actions to notifications.
- If there's only a single message in the notification, add 'Reply' and 'Read' (marks as read) buttons. - If there's more than one message pending, add only 'Read'.
This commit is contained in:
parent
694a46c6c1
commit
8cee3ee18d
@ -360,6 +360,11 @@ otherwise it would make K-9 start at the wrong time
|
||||
android:enabled="true"
|
||||
>
|
||||
</service>
|
||||
<service
|
||||
android:name=".service.NotificationActionService"
|
||||
android:enabled="true"
|
||||
>
|
||||
</service>
|
||||
<service
|
||||
android:name=".service.PushService"
|
||||
android:enabled="true"
|
||||
|
@ -218,6 +218,9 @@ Please submit bug reports, contribute new features and ask questions at
|
||||
<string name="notification_new_one_account_fmt"><xliff:g id="unread_message_count">%d</xliff:g> Unread (<xliff:g id="account">%s</xliff:g>)</string> <!-- 279 Unread (someone@google.com) -->
|
||||
<string name="notification_additional_messages">+ <xliff:g id="additional_messages">%d</xliff:g> more on <xliff:g id="account">%s</xliff:g></string>
|
||||
|
||||
<string name="notification_action_reply">Reply</string>
|
||||
<string name="notification_action_read">Read</string>
|
||||
|
||||
<string name="notification_bg_sync_ticker">Checking mail: <xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g></string>
|
||||
<string name="notification_bg_sync_title">Checking mail</string>
|
||||
<string name="notification_bg_send_ticker">Sending mail: <xliff:g id="account">%s</xliff:g></string>
|
||||
|
@ -389,6 +389,32 @@ public class MessageCompose extends K9Activity implements OnClickListener {
|
||||
context.startActivity(i);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get intent for composing a new message as a reply to the given message. If replyAll is true
|
||||
* the function is reply all instead of simply reply.
|
||||
* @param context
|
||||
* @param account
|
||||
* @param message
|
||||
* @param replyAll
|
||||
* @param messageBody optional, for decrypted messages, null if it should be grabbed from the given message
|
||||
*/
|
||||
public static Intent getActionReplyIntent(
|
||||
Context context,
|
||||
Account account,
|
||||
Message message,
|
||||
boolean replyAll,
|
||||
String messageBody) {
|
||||
Intent i = new Intent(context, MessageCompose.class);
|
||||
i.putExtra(EXTRA_MESSAGE_BODY, messageBody);
|
||||
i.putExtra(EXTRA_MESSAGE_REFERENCE, message.makeMessageReference());
|
||||
if (replyAll) {
|
||||
i.setAction(ACTION_REPLY_ALL);
|
||||
} else {
|
||||
i.setAction(ACTION_REPLY);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compose a new message as a reply to the given message. If replyAll is true the function
|
||||
* is reply all instead of simply reply.
|
||||
@ -404,15 +430,7 @@ public class MessageCompose extends K9Activity implements OnClickListener {
|
||||
Message message,
|
||||
boolean replyAll,
|
||||
String messageBody) {
|
||||
Intent i = new Intent(context, MessageCompose.class);
|
||||
i.putExtra(EXTRA_MESSAGE_BODY, messageBody);
|
||||
i.putExtra(EXTRA_MESSAGE_REFERENCE, message.makeMessageReference());
|
||||
if (replyAll) {
|
||||
i.setAction(ACTION_REPLY_ALL);
|
||||
} else {
|
||||
i.setAction(ACTION_REPLY);
|
||||
}
|
||||
context.startActivity(i);
|
||||
context.startActivity(getActionReplyIntent(context, account, message, replyAll, messageBody));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -81,6 +81,7 @@ import com.fsck.k9.search.LocalSearch;
|
||||
import com.fsck.k9.search.SearchAccount;
|
||||
import com.fsck.k9.search.SearchSpecification;
|
||||
import com.fsck.k9.search.SqlQueryBuilder;
|
||||
import com.fsck.k9.service.NotificationActionService;
|
||||
|
||||
|
||||
/**
|
||||
@ -4615,7 +4616,14 @@ public class MessagingController implements Runnable {
|
||||
builder.setSubText(accountDescr);
|
||||
builder.setContentTitle(sender);
|
||||
builder.setStyle(style);
|
||||
|
||||
builder.addAction(R.drawable.ic_action_single_message_options_dark,
|
||||
context.getString(R.string.notification_action_reply),
|
||||
NotificationActionService.getReplyIntent(context, account, message));
|
||||
}
|
||||
builder.addAction(R.drawable.ic_action_mark_as_read_dark,
|
||||
context.getString(R.string.notification_action_read),
|
||||
NotificationActionService.getReadAllMessagesIntent(context, account, data.messages));
|
||||
} else {
|
||||
String accountNotice = context.getString(R.string.notification_new_one_account_fmt,
|
||||
unreadCount, accountDescr);
|
||||
|
102
src/com/fsck/k9/service/NotificationActionService.java
Normal file
102
src/com/fsck/k9/service/NotificationActionService.java
Normal file
@ -0,0 +1,102 @@
|
||||
package com.fsck.k9.service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.fsck.k9.Account;
|
||||
import com.fsck.k9.K9;
|
||||
import com.fsck.k9.Preferences;
|
||||
import com.fsck.k9.activity.MessageCompose;
|
||||
import com.fsck.k9.activity.MessageReference;
|
||||
import com.fsck.k9.controller.MessagingController;
|
||||
import com.fsck.k9.mail.Flag;
|
||||
import com.fsck.k9.mail.Folder;
|
||||
import com.fsck.k9.mail.Message;
|
||||
import com.fsck.k9.mail.MessagingException;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
public class NotificationActionService extends CoreService {
|
||||
private final static String REPLY_ACTION = "com.fsck.k9.service.NotificationActionService.REPLY_ACTION";
|
||||
private final static String READ_ALL_ACTION = "com.fsck.k9.service.NotificationActionService.READ_ALL_ACTION";
|
||||
|
||||
private final static String EXTRA_ACCOUNT = "account";
|
||||
private final static String EXTRA_MESSAGE = "message";
|
||||
private final static String EXTRA_MESSAGE_IDS = "message_ids";
|
||||
|
||||
public static PendingIntent getReplyIntent(Context context, final Account account, final Message message) {
|
||||
Intent i = new Intent(context, NotificationActionService.class);
|
||||
i.putExtra(EXTRA_ACCOUNT, account.getUuid());
|
||||
i.putExtra(EXTRA_MESSAGE, message.makeMessageReference());
|
||||
i.setAction(REPLY_ACTION);
|
||||
|
||||
return PendingIntent.getService(context, account.getAccountNumber(), i, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
|
||||
public static PendingIntent getReadAllMessagesIntent(Context context, final Account account, final Collection<Message> messages) {
|
||||
ArrayList<Long> messageIds = new ArrayList<Long>();
|
||||
|
||||
for (Message m : messages) {
|
||||
messageIds.add(m.getId());
|
||||
}
|
||||
|
||||
Intent i = new Intent(context, NotificationActionService.class);
|
||||
i.putExtra(EXTRA_ACCOUNT, account.getUuid());
|
||||
i.putExtra(EXTRA_MESSAGE_IDS, messageIds);
|
||||
i.setAction(READ_ALL_ACTION);
|
||||
|
||||
return PendingIntent.getService(context, account.getAccountNumber(), i, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int startService(Intent intent, int startId) {
|
||||
if (K9.DEBUG)
|
||||
Log.i(K9.LOG_TAG, "NotificationActionService started with startId = " + startId);
|
||||
final Preferences preferences = Preferences.getPreferences(this);
|
||||
final MessagingController controller = MessagingController.getInstance(getApplication());
|
||||
final Account account = preferences.getAccount(intent.getStringExtra(EXTRA_ACCOUNT));
|
||||
|
||||
if (account != null) {
|
||||
if (READ_ALL_ACTION.equals(intent.getAction())) {
|
||||
if (K9.DEBUG)
|
||||
Log.i(K9.LOG_TAG, "NotificationActionService marking messages as read");
|
||||
|
||||
ArrayList<Long> messageIds = (ArrayList<Long>) intent.getSerializableExtra(EXTRA_MESSAGE_IDS);
|
||||
|
||||
controller.setFlag(account, messageIds, Flag.SEEN, true, false);
|
||||
} else if (REPLY_ACTION.equals(intent.getAction())) {
|
||||
if (K9.DEBUG)
|
||||
Log.i(K9.LOG_TAG, "NotificationActionService initiating reply");
|
||||
|
||||
try {
|
||||
MessageReference ref = (MessageReference) intent.getParcelableExtra(EXTRA_MESSAGE);
|
||||
Folder folder = account.getLocalStore().getFolder(ref.folderName);
|
||||
if (folder != null) {
|
||||
Message message = folder.getMessage(ref.uid);
|
||||
if (message != null) {
|
||||
Intent i = MessageCompose.getActionReplyIntent(this, account, message, false, null);
|
||||
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(i);
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Could not find message for notification action.");
|
||||
}
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Could not find folder for notification action.");
|
||||
}
|
||||
} catch (MessagingException e) {
|
||||
Log.w(K9.LOG_TAG, "Could not execute reply action.", e);
|
||||
}
|
||||
}
|
||||
|
||||
/* there's no point in keeping the notification after the user clicked on it */
|
||||
controller.notifyAccountCancel(this, account);
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Could not find account for notification action.");
|
||||
}
|
||||
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user