From 87010e6094cc35ece98d3beadbbfbc59ea0a25b3 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 28 Sep 2014 16:33:25 +0200 Subject: [PATCH] more improvments for new notification service --- res/layout/message_received.xml | 10 +- res/layout/message_sent.xml | 20 +- res/values-eu/arrays.xml | 7 +- res/values-eu/strings.xml | 4 +- res/xml/preferences.xml | 8 +- .../conversations/parser/MessageParser.java | 18 +- .../services/NotificationService.java | 21 +++ .../siacs/conversations/utils/UIHelper.java | 176 ------------------ 8 files changed, 53 insertions(+), 211 deletions(-) diff --git a/res/layout/message_received.xml b/res/layout/message_received.xml index 28c04a707..730d00d53 100644 --- a/res/layout/message_received.xml +++ b/res/layout/message_received.xml @@ -54,7 +54,7 @@ android:text="@string/download_image" android:visibility="gone" /> - - - + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_secure_indicator" /> - - + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_secure_indicator" /> + - - + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_received_indicator" /> @@ -99,4 +97,4 @@ android:scaleType="fitXY" android:src="@drawable/ic_profile" /> - + \ No newline at end of file diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml index cb1c20fd7..a34d3c6a9 100644 --- a/res/values-eu/arrays.xml +++ b/res/values-eu/arrays.xml @@ -26,8 +26,9 @@ 2 ordu 8 ordu abisatu arte - - + + + 1800 3600 7200 @@ -35,4 +36,4 @@ -1 - + \ No newline at end of file diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 727372849..4d3522fd4 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -256,5 +256,5 @@ Letra tamaina handiagoa erabili aplikazio osoan zehar Bidaltze botoiak egoera adierazten du Bidaltze botoia koloreztatu kontaktu baten egoera adierazteko - - + + \ No newline at end of file diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 024335f15..5af789c0d 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -52,15 +52,9 @@ - (Config.CARBON_GRACE_PERIOD * 1000); - } + boolean notify = mXmppConnectionService.getPreferences().getBoolean( + "show_notification", true); + notify = notify + && (SystemClock.elapsedRealtime() - lastCarbonMessageReceived) > (Config.CARBON_GRACE_PERIOD * 1000); + boolean alwaysNotifyInConference = notify + && mXmppConnectionService.getPreferences().getBoolean( + "always_notify_in_conference", false); this.parseNick(packet, account); @@ -427,8 +430,11 @@ public class MessageParser extends AbstractParser implements if (message != null) { if (message.getStatus() == Message.STATUS_RECEIVED) { message.markUnread(); + notify = alwaysNotifyInConference + || NotificationService + .wasHighlightedOrPrivate(message); } else { - message.getConversation().markRead(); + mXmppConnectionService.markRead(message.getConversation()); lastCarbonMessageReceived = SystemClock.elapsedRealtime(); notify = false; } diff --git a/src/eu/siacs/conversations/services/NotificationService.java b/src/eu/siacs/conversations/services/NotificationService.java index b004d1c58..656e16f36 100644 --- a/src/eu/siacs/conversations/services/NotificationService.java +++ b/src/eu/siacs/conversations/services/NotificationService.java @@ -2,6 +2,9 @@ package eu.siacs.conversations.services; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import android.app.Notification; import android.app.NotificationManager; @@ -162,4 +165,22 @@ public class NotificationService { PendingIntent.FLAG_UPDATE_CURRENT); return resultPendingIntent; } + + public static boolean wasHighlightedOrPrivate(Message message) { + String nick = message.getConversation().getMucOptions().getActualNick(); + Pattern highlight = generateNickHighlightPattern(nick); + Matcher m = highlight.matcher(message.getBody()); + return (m.find() || message.getType() == Message.TYPE_PRIVATE); + } + + private static Pattern generateNickHighlightPattern(String nick) { + // We expect a word boundary, i.e. space or start of string, followed by + // the + // nick (matched in case-insensitive manner), followed by optional + // punctuation (for example "bob: i disagree" or "how are you alice?"), + // followed by another word boundary. + return Pattern.compile("\\b" + nick + "\\p{Punct}?\\b", + Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); + } + } diff --git a/src/eu/siacs/conversations/utils/UIHelper.java b/src/eu/siacs/conversations/utils/UIHelper.java index ed11a6359..671e66d5b 100644 --- a/src/eu/siacs/conversations/utils/UIHelper.java +++ b/src/eu/siacs/conversations/utils/UIHelper.java @@ -7,13 +7,11 @@ import java.util.Date; import java.util.List; import java.util.Locale; import java.util.regex.Pattern; -import java.util.regex.Matcher; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; -import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.MucOptions.User; import eu.siacs.conversations.ui.ConversationActivity; import eu.siacs.conversations.ui.ManageAccountActivity; @@ -27,7 +25,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -35,13 +32,11 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; import android.net.Uri; -import android.preference.PreferenceManager; import android.provider.ContactsContract.Contacts; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import android.text.format.DateFormat; import android.text.format.DateUtils; -import android.text.Html; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; @@ -331,177 +326,6 @@ public class UIHelper { mNotificationManager.notify(1111, notification); } - private static Pattern generateNickHighlightPattern(String nick) { - // We expect a word boundary, i.e. space or start of string, followed by - // the - // nick (matched in case-insensitive manner), followed by optional - // punctuation (for example "bob: i disagree" or "how are you alice?"), - // followed by another word boundary. - return Pattern.compile("\\b" + nick + "\\p{Punct}?\\b", - Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); - } - - private static void updateNotification(Context context, - List conversations, Conversation currentCon, - boolean notify) { - NotificationManager mNotificationManager = (NotificationManager) context - .getSystemService(Context.NOTIFICATION_SERVICE); - - SharedPreferences preferences = PreferenceManager - .getDefaultSharedPreferences(context); - boolean showNofifications = preferences.getBoolean("show_notification", - true); - boolean vibrate = preferences.getBoolean("vibrate_on_notification", - true); - boolean alwaysNotify = preferences.getBoolean( - "notify_in_conversation_when_highlighted", false); - - if (!showNofifications) { - mNotificationManager.cancel(2342); - return; - } - - String targetUuid = ""; - - if ((currentCon != null) - && (currentCon.getMode() == Conversation.MODE_MULTI) - && (!alwaysNotify) && notify) { - String nick = currentCon.getMucOptions().getActualNick(); - Pattern highlight = generateNickHighlightPattern(nick); - Matcher m = highlight.matcher(currentCon.getLatestMessage() - .getBody()); - notify = m.find() - || (currentCon.getLatestMessage().getType() == Message.TYPE_PRIVATE); - } - - List unread = new ArrayList(); - for (Conversation conversation : conversations) { - if (conversation.getMode() == Conversation.MODE_MULTI) { - if ((!conversation.isRead()) - && ((wasHighlightedOrPrivate(conversation) || (alwaysNotify)))) { - unread.add(conversation); - } - } else { - if (!conversation.isRead()) { - unread.add(conversation); - } - } - } - String ringtone = preferences.getString("notification_ringtone", null); - - NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( - context); - if (unread.size() == 0) { - mNotificationManager.cancel(2342); - return; - } else if (unread.size() == 1) { - Conversation conversation = unread.get(0); - targetUuid = conversation.getUuid(); - mBuilder.setLargeIcon(conversation.getImage(context, 64)); - mBuilder.setContentTitle(conversation.getName()); - if (notify) { - mBuilder.setTicker(conversation.getLatestMessage() - .getReadableBody(context)); - } - StringBuilder bigText = new StringBuilder(); - List messages = conversation.getMessages(); - String firstLine = ""; - for (int i = messages.size() - 1; i >= 0; --i) { - if (!messages.get(i).isRead()) { - if (i == messages.size() - 1) { - firstLine = messages.get(i).getReadableBody(context); - bigText.append(firstLine); - } else { - firstLine = messages.get(i).getReadableBody(context); - bigText.insert(0, firstLine + "\n"); - } - } else { - break; - } - } - mBuilder.setContentText(firstLine); - mBuilder.setStyle(new NotificationCompat.BigTextStyle() - .bigText(bigText.toString())); - } else { - NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle(); - style.setBigContentTitle(unread.size() + " " - + context.getString(R.string.unread_conversations)); - StringBuilder names = new StringBuilder(); - for (int i = 0; i < unread.size(); ++i) { - targetUuid = unread.get(i).getUuid(); - if (i < unread.size() - 1) { - names.append(unread.get(i).getName() + ", "); - } else { - names.append(unread.get(i).getName()); - } - style.addLine(Html.fromHtml("" - + unread.get(i).getName() - + " " - + unread.get(i).getLatestMessage() - .getReadableBody(context))); - } - mBuilder.setContentTitle(unread.size() + " " - + context.getString(R.string.unread_conversations)); - mBuilder.setContentText(names.toString()); - mBuilder.setStyle(style); - } - if ((currentCon != null) && (notify)) { - targetUuid = currentCon.getUuid(); - } - if (unread.size() != 0) { - mBuilder.setSmallIcon(R.drawable.ic_notification); - if (notify) { - if (vibrate) { - int dat = 70; - long[] pattern = { 0, 3 * dat, dat, dat }; - mBuilder.setVibrate(pattern); - } - mBuilder.setLights(0xffffffff, 2000, 4000); - if (ringtone != null) { - mBuilder.setSound(Uri.parse(ringtone)); - } - } - - TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); - stackBuilder.addParentStack(ConversationActivity.class); - - Intent viewConversationIntent = new Intent(context, - ConversationActivity.class); - viewConversationIntent.setAction(Intent.ACTION_VIEW); - viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, - targetUuid); - viewConversationIntent - .setType(ConversationActivity.VIEW_CONVERSATION); - - stackBuilder.addNextIntent(viewConversationIntent); - - PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( - 0, PendingIntent.FLAG_UPDATE_CURRENT); - - mBuilder.setContentIntent(resultPendingIntent); - Notification notification = mBuilder.build(); - mNotificationManager.notify(2342, notification); - } - } - - private static boolean wasHighlightedOrPrivate(Conversation conversation) { - List messages = conversation.getMessages(); - String nick = conversation.getMucOptions().getActualNick(); - Pattern highlight = generateNickHighlightPattern(nick); - for (int i = messages.size() - 1; i >= 0; --i) { - if (messages.get(i).isRead()) { - break; - } else { - Matcher m = highlight.matcher(messages.get(i).getBody()); - if (m.find() - || messages.get(i).getType() == Message.TYPE_PRIVATE) { - return true; - } - } - } - return false; - } - public static void prepareContactBadge(final Activity activity, QuickContactBadge badge, final Contact contact, Context context) { if (contact.getSystemAccount() != null) {