diff options
author | Daniel Gultsch <daniel@gultsch.de> | 2014-09-28 16:33:25 +0200 |
---|---|---|
committer | Daniel Gultsch <daniel@gultsch.de> | 2014-09-28 16:33:25 +0200 |
commit | 87010e6094cc35ece98d3beadbbfbc59ea0a25b3 (patch) | |
tree | 08aaa1cbc7a3acab4246e5f516ff8125d99760fd | |
parent | bff23c2e232e8f9a4e64553215130079b7fc5a4f (diff) |
more improvments for new notification service
-rw-r--r-- | res/layout/message_received.xml | 10 | ||||
-rw-r--r-- | res/layout/message_sent.xml | 20 | ||||
-rw-r--r-- | res/values-eu/arrays.xml | 7 | ||||
-rw-r--r-- | res/values-eu/strings.xml | 4 | ||||
-rw-r--r-- | res/xml/preferences.xml | 8 | ||||
-rw-r--r-- | src/eu/siacs/conversations/parser/MessageParser.java | 18 | ||||
-rw-r--r-- | src/eu/siacs/conversations/services/NotificationService.java | 21 | ||||
-rw-r--r-- | src/eu/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" /> - <LinearLayout + <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" @@ -65,12 +65,10 @@ android:layout_width="?attr/TextSizeInfo" android:layout_height="?attr/TextSizeInfo" android:layout_gravity="center_vertical" - android:gravity="center_vertical" - android:src="@drawable/ic_secure_indicator" android:layout_marginRight="4sp" - android:alpha="0.54"/> - - + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_secure_indicator" /> <TextView android:id="@+id/message_time" diff --git a/res/layout/message_sent.xml b/res/layout/message_sent.xml index 9167012a7..28f3ddc63 100644 --- a/res/layout/message_sent.xml +++ b/res/layout/message_sent.xml @@ -63,27 +63,25 @@ android:textColor="@color/secondarytext" android:textSize="?attr/TextSizeInfo" /> - <ImageView + <ImageView android:id="@+id/security_indicator" android:layout_width="?attr/TextSizeInfo" android:layout_height="?attr/TextSizeInfo" android:layout_gravity="center_vertical" - android:gravity="center_vertical" - android:src="@drawable/ic_secure_indicator" android:layout_marginLeft="4sp" - android:alpha="0.54"/> - + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_secure_indicator" /> + <ImageView android:id="@+id/indicator_received" android:layout_width="?attr/TextSizeInfo" android:layout_height="?attr/TextSizeInfo" android:layout_gravity="center_vertical" - android:gravity="center_vertical" - android:src="@drawable/ic_received_indicator" android:layout_marginLeft="4sp" - android:alpha="0.54"/> - - + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_received_indicator" /> </LinearLayout> </LinearLayout> </LinearLayout> @@ -99,4 +97,4 @@ android:scaleType="fitXY" android:src="@drawable/ic_profile" /> -</RelativeLayout> +</RelativeLayout>
\ 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 @@ <item>2 ordu</item> <item>8 ordu</item> <item>abisatu arte</item> - </string-array> - <integer-array name="mute_options_durations"> + </string-array> + + <integer-array name="mute_options_durations"> <item>1800</item> <item>3600</item> <item>7200</item> @@ -35,4 +36,4 @@ <item>-1</item> </integer-array> -</resources> +</resources>
\ 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 @@ <string name="pref_use_larger_font_summary">Letra tamaina handiagoa erabili aplikazio osoan zehar</string> <string name="pref_use_send_button_to_indicate_status">Bidaltze botoiak egoera adierazten du</string> <string name="pref_use_send_button_to_indicate_status_summary">Bidaltze botoia koloreztatu kontaktu baten egoera adierazteko</string> - -</resources> + +</resources>
\ 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 @@ <CheckBoxPreference android:dependency="show_notification" - android:key="notify_in_conversation_when_highlighted" + android:key="always_notify_in_conference" android:summary="@string/pref_conference_notifications_summary" android:title="@string/pref_conference_notifications" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="show_notification" - android:key="notification_grace_period_after_carbon_received" - android:summary="@string/pref_notification_grace_period_summary" - android:title="@string/pref_notification_grace_period" /> </PreferenceCategory> <PreferenceCategory android:title="@string/pref_ui_options" > <CheckBoxPreference diff --git a/src/eu/siacs/conversations/parser/MessageParser.java b/src/eu/siacs/conversations/parser/MessageParser.java index 3891ebf7c..d1964b8c9 100644 --- a/src/eu/siacs/conversations/parser/MessageParser.java +++ b/src/eu/siacs/conversations/parser/MessageParser.java @@ -8,6 +8,7 @@ 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.services.NotificationService; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.xml.Element; @@ -386,11 +387,13 @@ public class MessageParser extends AbstractParser implements @Override public void onMessagePacketReceived(Account account, MessagePacket packet) { Message message = null; - boolean notify = true; - if (mXmppConnectionService.getPreferences().getBoolean( - "notification_grace_period_after_carbon_received", true)) { - notify = (SystemClock.elapsedRealtime() - lastCarbonMessageReceived) > (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<Conversation> 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<Conversation> unread = new ArrayList<Conversation>(); - 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<Message> 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("<b>" - + unread.get(i).getName() - + "</b> " - + 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<Message> 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) { |