more improvments for new notification service
This commit is contained in:
parent
bff23c2e23
commit
87010e6094
|
@ -65,12 +65,10 @@
|
||||||
android:layout_width="?attr/TextSizeInfo"
|
android:layout_width="?attr/TextSizeInfo"
|
||||||
android:layout_height="?attr/TextSizeInfo"
|
android:layout_height="?attr/TextSizeInfo"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:src="@drawable/ic_secure_indicator"
|
|
||||||
android:layout_marginRight="4sp"
|
android:layout_marginRight="4sp"
|
||||||
android:alpha="0.54"/>
|
android:alpha="0.54"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:src="@drawable/ic_secure_indicator" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/message_time"
|
android:id="@+id/message_time"
|
||||||
|
|
|
@ -68,22 +68,20 @@
|
||||||
android:layout_width="?attr/TextSizeInfo"
|
android:layout_width="?attr/TextSizeInfo"
|
||||||
android:layout_height="?attr/TextSizeInfo"
|
android:layout_height="?attr/TextSizeInfo"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:src="@drawable/ic_secure_indicator"
|
|
||||||
android:layout_marginLeft="4sp"
|
android:layout_marginLeft="4sp"
|
||||||
android:alpha="0.54"/>
|
android:alpha="0.54"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:src="@drawable/ic_secure_indicator" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/indicator_received"
|
android:id="@+id/indicator_received"
|
||||||
android:layout_width="?attr/TextSizeInfo"
|
android:layout_width="?attr/TextSizeInfo"
|
||||||
android:layout_height="?attr/TextSizeInfo"
|
android:layout_height="?attr/TextSizeInfo"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:src="@drawable/ic_received_indicator"
|
|
||||||
android:layout_marginLeft="4sp"
|
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>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
<item>8 ordu</item>
|
<item>8 ordu</item>
|
||||||
<item>abisatu arte</item>
|
<item>abisatu arte</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<integer-array name="mute_options_durations">
|
<integer-array name="mute_options_durations">
|
||||||
<item>1800</item>
|
<item>1800</item>
|
||||||
<item>3600</item>
|
<item>3600</item>
|
||||||
|
|
|
@ -52,15 +52,9 @@
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:dependency="show_notification"
|
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:summary="@string/pref_conference_notifications_summary"
|
||||||
android:title="@string/pref_conference_notifications" />
|
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>
|
||||||
<PreferenceCategory android:title="@string/pref_ui_options" >
|
<PreferenceCategory android:title="@string/pref_ui_options" >
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
|
|
|
@ -8,6 +8,7 @@ import eu.siacs.conversations.entities.Account;
|
||||||
import eu.siacs.conversations.entities.Contact;
|
import eu.siacs.conversations.entities.Contact;
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.Message;
|
import eu.siacs.conversations.entities.Message;
|
||||||
|
import eu.siacs.conversations.services.NotificationService;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService;
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
import eu.siacs.conversations.utils.CryptoHelper;
|
import eu.siacs.conversations.utils.CryptoHelper;
|
||||||
import eu.siacs.conversations.xml.Element;
|
import eu.siacs.conversations.xml.Element;
|
||||||
|
@ -386,11 +387,13 @@ public class MessageParser extends AbstractParser implements
|
||||||
@Override
|
@Override
|
||||||
public void onMessagePacketReceived(Account account, MessagePacket packet) {
|
public void onMessagePacketReceived(Account account, MessagePacket packet) {
|
||||||
Message message = null;
|
Message message = null;
|
||||||
boolean notify = true;
|
boolean notify = mXmppConnectionService.getPreferences().getBoolean(
|
||||||
if (mXmppConnectionService.getPreferences().getBoolean(
|
"show_notification", true);
|
||||||
"notification_grace_period_after_carbon_received", true)) {
|
notify = notify
|
||||||
notify = (SystemClock.elapsedRealtime() - lastCarbonMessageReceived) > (Config.CARBON_GRACE_PERIOD * 1000);
|
&& (SystemClock.elapsedRealtime() - lastCarbonMessageReceived) > (Config.CARBON_GRACE_PERIOD * 1000);
|
||||||
}
|
boolean alwaysNotifyInConference = notify
|
||||||
|
&& mXmppConnectionService.getPreferences().getBoolean(
|
||||||
|
"always_notify_in_conference", false);
|
||||||
|
|
||||||
this.parseNick(packet, account);
|
this.parseNick(packet, account);
|
||||||
|
|
||||||
|
@ -427,8 +430,11 @@ public class MessageParser extends AbstractParser implements
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
if (message.getStatus() == Message.STATUS_RECEIVED) {
|
if (message.getStatus() == Message.STATUS_RECEIVED) {
|
||||||
message.markUnread();
|
message.markUnread();
|
||||||
|
notify = alwaysNotifyInConference
|
||||||
|
|| NotificationService
|
||||||
|
.wasHighlightedOrPrivate(message);
|
||||||
} else {
|
} else {
|
||||||
message.getConversation().markRead();
|
mXmppConnectionService.markRead(message.getConversation());
|
||||||
lastCarbonMessageReceived = SystemClock.elapsedRealtime();
|
lastCarbonMessageReceived = SystemClock.elapsedRealtime();
|
||||||
notify = false;
|
notify = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,9 @@ package eu.siacs.conversations.services;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
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.Notification;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
|
@ -162,4 +165,22 @@ public class NotificationService {
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
return resultPendingIntent;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,11 @@ import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.regex.Matcher;
|
|
||||||
|
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.Account;
|
import eu.siacs.conversations.entities.Account;
|
||||||
import eu.siacs.conversations.entities.Contact;
|
import eu.siacs.conversations.entities.Contact;
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.Message;
|
|
||||||
import eu.siacs.conversations.entities.MucOptions.User;
|
import eu.siacs.conversations.entities.MucOptions.User;
|
||||||
import eu.siacs.conversations.ui.ConversationActivity;
|
import eu.siacs.conversations.ui.ConversationActivity;
|
||||||
import eu.siacs.conversations.ui.ManageAccountActivity;
|
import eu.siacs.conversations.ui.ManageAccountActivity;
|
||||||
|
@ -27,7 +25,6 @@ import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.DialogInterface.OnClickListener;
|
import android.content.DialogInterface.OnClickListener;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
@ -35,13 +32,11 @@ import android.graphics.Paint;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.provider.ContactsContract.Contacts;
|
import android.provider.ContactsContract.Contacts;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.support.v4.app.TaskStackBuilder;
|
import android.support.v4.app.TaskStackBuilder;
|
||||||
import android.text.format.DateFormat;
|
import android.text.format.DateFormat;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.text.Html;
|
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -331,177 +326,6 @@ public class UIHelper {
|
||||||
mNotificationManager.notify(1111, notification);
|
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,
|
public static void prepareContactBadge(final Activity activity,
|
||||||
QuickContactBadge badge, final Contact contact, Context context) {
|
QuickContactBadge badge, final Contact contact, Context context) {
|
||||||
if (contact.getSystemAccount() != null) {
|
if (contact.getSystemAccount() != null) {
|
||||||
|
|
Loading…
Reference in a new issue