aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/services
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/services')
-rw-r--r--src/main/java/eu/siacs/conversations/services/NotificationService.java43
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java39
2 files changed, 73 insertions, 9 deletions
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java
index ea1a663b..f6b6ce00 100644
--- a/src/main/java/eu/siacs/conversations/services/NotificationService.java
+++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java
@@ -13,6 +13,7 @@ import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.BigPictureStyle;
import android.support.v4.app.NotificationCompat.Builder;
+import android.support.v4.app.RemoteInput;
import android.support.v4.app.TaskStackBuilder;
import android.text.Html;
import android.util.DisplayMetrics;
@@ -118,6 +119,13 @@ public class NotificationService {
}
}
+ public void pushFromDirectReply(final Message message) {
+ synchronized (notifications) {
+ pushToStack(message);
+ updateNotification(false);
+ }
+ }
+
public void finishBacklog(boolean notify) {
synchronized (notifications) {
mXmppConnectionService.updateUnreadCountBadge();
@@ -170,6 +178,8 @@ public class NotificationService {
public void clear(final Conversation conversation) {
synchronized (notifications) {
notifications.remove(conversation.getUuid());
+ final NotificationManager nm = (NotificationManager) mXmppConnectionService.getSystemService(Context.NOTIFICATION_SERVICE);
+ nm.cancel(conversation.getUuid(), NOTIFICATION_ID);
updateNotification(false);
}
}
@@ -190,7 +200,7 @@ public class NotificationService {
this.markLastNotification();
}
final Builder mBuilder;
- if (notifications.size() == 1) {
+ if (notifications.size() == 1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
mBuilder = buildSingleConversations(notifications.values().iterator().next());
modifyForSoundVibrationAndLight(mBuilder, notify, preferences);
notificationManager.notify(NOTIFICATION_ID, mBuilder.build());
@@ -202,7 +212,7 @@ public class NotificationService {
Builder singleBuilder = buildSingleConversations(entry.getValue());
singleBuilder.setGroup(CONVERSATIONS_GROUP);
modifyForSoundVibrationAndLight(singleBuilder,notify,preferences);
- notificationManager.notify(entry.getKey().hashCode() % 435301 ,singleBuilder.build());
+ notificationManager.notify(entry.getKey(), NOTIFICATION_ID ,singleBuilder.build());
}
}
}
@@ -294,6 +304,10 @@ public class NotificationService {
} else {
modifyForTextOnly(mBuilder, messages);
}
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ RemoteInput remoteInput = new RemoteInput.Builder("text_reply").setLabel(UIHelper.getMessageHint(mXmppConnectionService, conversation)).build();
+ NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_send_text_offline, "Reply", createReplyIntent(conversation)).addRemoteInput(remoteInput).build();
+ mBuilder.addAction(action);
if ((message = getFirstDownloadableMessage(messages)) != null) {
mBuilder.addAction(
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ?
@@ -303,6 +317,7 @@ public class NotificationService {
createDownloadIntent(message)
);
}
+ }
if ((message = getFirstLocationMessage(messages)) != null) {
mBuilder.addAction(R.drawable.ic_room_white_24dp,
mXmppConnectionService.getString(R.string.show_location),
@@ -332,8 +347,9 @@ public class NotificationService {
final BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
bigPictureStyle.bigPicture(bitmap);
if (tmp.size() > 0) {
- bigPictureStyle.setSummaryText(getMergedBodies(tmp));
- builder.setContentText(UIHelper.getMessagePreview(mXmppConnectionService, tmp.get(0)).first);
+ CharSequence text = getMergedBodies(tmp);
+ bigPictureStyle.setSummaryText(text);
+ builder.setContentText(text);
} else {
builder.setContentText(mXmppConnectionService.getString(
R.string.received_x_file,
@@ -354,7 +370,7 @@ public class NotificationService {
}
for (Message message : messages) {
String sender = message.getStatus() == Message.STATUS_RECEIVED ? UIHelper.getMessageDisplayName(message) : null;
- messagingStyle.addMessage(message.getBody().trim(), message.getTimeSent(), sender);
+ messagingStyle.addMessage(UIHelper.getMessagePreview(mXmppConnectionService,message).first, message.getTimeSent(), sender);
}
builder.setStyle(messagingStyle);
} else {
@@ -364,15 +380,19 @@ public class NotificationService {
}
private Message getImage(final Iterable<Message> messages) {
+ Message image = null;
for (final Message message : messages) {
+ if (message.getStatus() != Message.STATUS_RECEIVED) {
+ return null;
+ }
if (message.getType() != Message.TYPE_TEXT
&& message.getTransferable() == null
&& message.getEncryption() != Message.ENCRYPTION_PGP
&& message.getFileParams().height > 0) {
- return message;
+ image = message;
}
}
- return null;
+ return image;
}
private Message getFirstDownloadableMessage(final Iterable<Message> messages) {
@@ -448,11 +468,18 @@ public class NotificationService {
intent.setAction(XmppConnectionService.ACTION_CLEAR_NOTIFICATION);
if (conversation != null) {
intent.putExtra("uuid", conversation.getUuid());
- return PendingIntent.getService(mXmppConnectionService, conversation.getUuid().hashCode() % 47528, intent, 0);
+ return PendingIntent.getService(mXmppConnectionService, conversation.getUuid().hashCode() % 247527, intent, 0);
}
return PendingIntent.getService(mXmppConnectionService, 0, intent, 0);
}
+ private PendingIntent createReplyIntent(Conversation conversation) {
+ final Intent intent = new Intent(mXmppConnectionService, XmppConnectionService.class);
+ intent.setAction(XmppConnectionService.ACTION_REPLY_TO_CONVERSATION);
+ intent.putExtra("uuid",conversation.getUuid());
+ return PendingIntent.getService(mXmppConnectionService, conversation.getUuid().hashCode() % 402361, intent, 0);
+ }
+
private PendingIntent createDisableForeground() {
final Intent intent = new Intent(mXmppConnectionService,
XmppConnectionService.class);
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index 2719c59a..d57176e4 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -26,6 +26,7 @@ import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.security.KeyChain;
+import android.support.v4.app.RemoteInput;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.LruCache;
@@ -128,6 +129,7 @@ import me.leolin.shortcutbadger.ShortcutBadger;
public class XmppConnectionService extends Service {
+ public static final String ACTION_REPLY_TO_CONVERSATION = "reply_to_conversations";
public static final String ACTION_CLEAR_NOTIFICATION = "clear_notification";
public static final String ACTION_DISABLE_FOREGROUND = "disable_foreground";
public static final String ACTION_TRY_AGAIN = "try_again";
@@ -526,6 +528,7 @@ public class XmppConnectionService extends Service {
final String action = intent == null ? null : intent.getAction();
boolean interactive = false;
if (action != null) {
+ final Conversation c = findConversationByUuid(intent.getStringExtra("uuid"));
switch (action) {
case ConnectivityManager.CONNECTIVITY_ACTION:
if (hasInternetConnection() && Config.RESET_ATTEMPT_COUNT_ON_NETWORK_CHANGE) {
@@ -541,7 +544,6 @@ public class XmppConnectionService extends Service {
logoutAndSave(true);
return START_NOT_STICKY;
case ACTION_CLEAR_NOTIFICATION:
- final Conversation c = findConversationByUuid(intent.getStringExtra("uuid"));
if (c != null) {
mNotificationService.clear(c);
} else {
@@ -568,6 +570,14 @@ public class XmppConnectionService extends Service {
break;
}
break;
+ case ACTION_REPLY_TO_CONVERSATION:
+ Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
+ if (remoteInput != null && c != null) {
+
+ String body = remoteInput.getString("text_reply");
+ directReply(c,body);
+ }
+ break;
case AudioManager.RINGER_MODE_CHANGED_ACTION:
if (xaOnSilentMode()) {
refreshAllPresences();
@@ -687,6 +697,33 @@ public class XmppConnectionService extends Service {
return START_STICKY;
}
+ private void directReply(Conversation conversation, String body) {
+ Message message = new Message(conversation,body,conversation.getNextEncryption());
+ if (message.getEncryption() == Message.ENCRYPTION_PGP) {
+ getPgpEngine().encrypt(message, new UiCallback<Message>() {
+ @Override
+ public void success(Message message) {
+ message.setEncryption(Message.ENCRYPTION_DECRYPTED);
+ sendMessage(message);
+ mNotificationService.pushFromDirectReply(message);
+ }
+
+ @Override
+ public void error(int errorCode, Message object) {
+
+ }
+
+ @Override
+ public void userInputRequried(PendingIntent pi, Message object) {
+
+ }
+ });
+ } else {
+ sendMessage(message);
+ mNotificationService.pushFromDirectReply(message);
+ }
+ }
+
private boolean xaOnSilentMode() {
return getPreferences().getBoolean("xa_on_silent_mode", false);
}