aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authoriNPUTmice <daniel@gultsch.de>2014-10-24 13:29:18 +0200
committeriNPUTmice <daniel@gultsch.de>2014-10-24 13:29:18 +0200
commitcbc3d9bd6f275984b390eb4dae48f8eed669fe7a (patch)
tree41833ad63e232ef255566b964e8e770520c4efbf /src
parentd73a77643d7923cae0789c5ed9f6a2a4cf41385f (diff)
notify only after image has been received over http. introduced mini grace for catching up with SM or offline messages
Diffstat (limited to 'src')
-rw-r--r--src/eu/siacs/conversations/Config.java1
-rw-r--r--src/eu/siacs/conversations/entities/Message.java15
-rw-r--r--src/eu/siacs/conversations/http/HttpConnection.java9
-rw-r--r--src/eu/siacs/conversations/parser/MessageParser.java1
-rw-r--r--src/eu/siacs/conversations/services/NotificationService.java59
-rw-r--r--src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java12
6 files changed, 64 insertions, 33 deletions
diff --git a/src/eu/siacs/conversations/Config.java b/src/eu/siacs/conversations/Config.java
index 1725eca69..7dd5a7995 100644
--- a/src/eu/siacs/conversations/Config.java
+++ b/src/eu/siacs/conversations/Config.java
@@ -11,6 +11,7 @@ public final class Config {
public static final int PING_TIMEOUT = 10;
public static final int CONNECT_TIMEOUT = 90;
public static final int CARBON_GRACE_PERIOD = 60;
+ public static final int MINI_GRACE_PERIOD = 750;
public static final int AVATAR_SIZE = 192;
public static final Bitmap.CompressFormat AVATAR_FORMAT = Bitmap.CompressFormat.WEBP;
diff --git a/src/eu/siacs/conversations/entities/Message.java b/src/eu/siacs/conversations/entities/Message.java
index 5fa16460c..68a71d4ae 100644
--- a/src/eu/siacs/conversations/entities/Message.java
+++ b/src/eu/siacs/conversations/entities/Message.java
@@ -5,9 +5,7 @@ import java.net.URL;
import java.util.Arrays;
import eu.siacs.conversations.Config;
-import eu.siacs.conversations.R;
import android.content.ContentValues;
-import android.content.Context;
import android.database.Cursor;
public class Message extends AbstractEntity {
@@ -145,19 +143,6 @@ public class Message extends AbstractEntity {
return body;
}
- public String getReadableBody(Context context) {
- if (encryption == ENCRYPTION_PGP) {
- return context.getText(R.string.encrypted_message_received)
- .toString();
- } else if (encryption == ENCRYPTION_DECRYPTION_FAILED) {
- return context.getText(R.string.decryption_failed).toString();
- } else if (type == TYPE_IMAGE) {
- return context.getText(R.string.image_file).toString();
- } else {
- return body.trim();
- }
- }
-
public long getTimeSent() {
return timeSent;
}
diff --git a/src/eu/siacs/conversations/http/HttpConnection.java b/src/eu/siacs/conversations/http/HttpConnection.java
index b8ce5ed23..9b04deccc 100644
--- a/src/eu/siacs/conversations/http/HttpConnection.java
+++ b/src/eu/siacs/conversations/http/HttpConnection.java
@@ -36,6 +36,7 @@ public class HttpConnection implements Downloadable {
private Message message;
private DownloadableFile file;
private int mStatus = Downloadable.STATUS_UNKNOWN;
+ private boolean acceptedAutomatically = false;
public HttpConnection(HttpConnectionManager manager) {
this.mHttpConnectionManager = manager;
@@ -99,6 +100,9 @@ public class HttpConnection implements Downloadable {
message.setDownloadable(null);
mHttpConnectionManager.finishConnection(this);
mXmppConnectionService.updateConversationUi();
+ if (acceptedAutomatically) {
+ mXmppConnectionService.getNotificationService().push(message);
+ }
}
private void changeStatus(int status) {
@@ -151,6 +155,8 @@ public class HttpConnection implements Downloadable {
size = retrieveFileSize();
} catch (SSLHandshakeException e) {
changeStatus(STATUS_OFFER_CHECK_FILESIZE);
+ HttpConnection.this.acceptedAutomatically = false;
+ HttpConnection.this.mXmppConnectionService.getNotificationService().push(message);
return;
} catch (IOException e) {
cancel();
@@ -158,9 +164,12 @@ public class HttpConnection implements Downloadable {
}
file.setExpectedSize(size);
if (size <= mHttpConnectionManager.getAutoAcceptFileSize()) {
+ HttpConnection.this.acceptedAutomatically = true;
new Thread(new FileDownloader(interactive)).start();
} else {
changeStatus(STATUS_OFFER);
+ HttpConnection.this.acceptedAutomatically = false;
+ HttpConnection.this.mXmppConnectionService.getNotificationService().push(message);
}
}
diff --git a/src/eu/siacs/conversations/parser/MessageParser.java b/src/eu/siacs/conversations/parser/MessageParser.java
index b5e14305a..26841f435 100644
--- a/src/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/eu/siacs/conversations/parser/MessageParser.java
@@ -487,6 +487,7 @@ public class MessageParser extends AbstractParser implements
if (message.bodyContainsDownloadable()) {
this.mXmppConnectionService.getHttpConnectionManager()
.createNewConnection(message);
+ notify = false;
}
notify = notify && !conversation.isMuted();
if (notify) {
diff --git a/src/eu/siacs/conversations/services/NotificationService.java b/src/eu/siacs/conversations/services/NotificationService.java
index 00765deb7..2dff736b1 100644
--- a/src/eu/siacs/conversations/services/NotificationService.java
+++ b/src/eu/siacs/conversations/services/NotificationService.java
@@ -13,14 +13,17 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.PowerManager;
+import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.text.Html;
import android.util.DisplayMetrics;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Downloadable;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.ui.ConversationActivity;
@@ -30,9 +33,10 @@ public class NotificationService {
private LinkedHashMap<String, ArrayList<Message>> notifications = new LinkedHashMap<String, ArrayList<Message>>();
- public int NOTIFICATION_ID = 0x2342;
+ public static int NOTIFICATION_ID = 0x2342;
private Conversation mOpenConversation;
private boolean mIsInForeground;
+ private long mLastNotification;
public NotificationService(XmppConnectionService service) {
this.mXmppConnectionService = service;
@@ -58,7 +62,8 @@ public class NotificationService {
}
Account account = message.getConversation().getAccount();
updateNotification((!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn)
- && !account.inGracePeriod());
+ && !account.inGracePeriod()
+ && !this.inMiniGracePeriod(account));
}
}
@@ -89,6 +94,9 @@ public class NotificationService {
if (notifications.size() == 0) {
notificationManager.cancel(NOTIFICATION_ID);
} else {
+ if (notify) {
+ this.markLastNotification();
+ }
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
mXmppConnectionService);
mBuilder.setSmallIcon(R.drawable.ic_notification);
@@ -103,19 +111,17 @@ public class NotificationService {
mBuilder.setContentTitle(conversation.getName());
StringBuilder text = new StringBuilder();
for (int i = 0; i < messages.size(); ++i) {
- text.append(messages.get(i).getReadableBody(
- mXmppConnectionService));
+ text.append(getReadableBody(messages.get(i)));
if (i != messages.size() - 1) {
text.append("\n");
}
}
mBuilder.setStyle(new NotificationCompat.BigTextStyle()
.bigText(text.toString()));
- mBuilder.setContentText(messages.get(0).getReadableBody(
- mXmppConnectionService));
+ mBuilder.setContentText(getReadableBody(messages.get(0)));
if (notify) {
- mBuilder.setTicker(messages.get(messages.size() - 1)
- .getReadableBody(mXmppConnectionService));
+ mBuilder.setTicker(getReadableBody(messages
+ .get(messages.size() - 1)));
}
mBuilder.setContentIntent(createContentIntent(conversation
.getUuid()));
@@ -135,11 +141,8 @@ public class NotificationService {
if (messages.size() > 0) {
conversation = messages.get(0).getConversation();
String name = conversation.getName();
- style.addLine(Html.fromHtml("<b>"
- + name
- + "</b> "
- + messages.get(0).getReadableBody(
- mXmppConnectionService)));
+ style.addLine(Html.fromHtml("<b>" + name + "</b> "
+ + getReadableBody(messages.get(0))));
names.append(name);
names.append(", ");
}
@@ -175,6 +178,26 @@ public class NotificationService {
}
}
+ private String getReadableBody(Message message) {
+ if (message.getDownloadable() != null
+ && (message.getDownloadable().getStatus() == Downloadable.STATUS_OFFER || message
+ .getDownloadable().getStatus() == Downloadable.STATUS_OFFER_CHECK_FILESIZE)) {
+ return mXmppConnectionService.getText(
+ R.string.image_offered_for_download).toString();
+ } else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
+ return mXmppConnectionService.getText(
+ R.string.encrypted_message_received).toString();
+ } else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
+ return mXmppConnectionService.getText(R.string.decryption_failed)
+ .toString();
+ } else if (message.getType() == Message.TYPE_IMAGE) {
+ return mXmppConnectionService.getText(R.string.image_file)
+ .toString();
+ } else {
+ return message.getBody().trim();
+ }
+ }
+
private PendingIntent createContentIntent(String conversationUuid) {
TaskStackBuilder stackBuilder = TaskStackBuilder
.create(mXmppConnectionService);
@@ -234,4 +257,14 @@ public class NotificationService {
.getDisplayMetrics();
return ((int) (dp * metrics.density));
}
+
+ private void markLastNotification() {
+ this.mLastNotification = SystemClock.elapsedRealtime();
+ }
+
+ private boolean inMiniGracePeriod(Account account) {
+ int miniGrace = account.getStatus() == Account.STATUS_ONLINE ? Config.MINI_GRACE_PERIOD
+ : Config.MINI_GRACE_PERIOD * 2;
+ return SystemClock.elapsedRealtime() < (this.mLastNotification + miniGrace);
+ }
}
diff --git a/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
index 183c89fad..0c294e7e7 100644
--- a/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
+++ b/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
@@ -78,14 +78,14 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
if (message.getType() == Message.TYPE_IMAGE
|| message.getDownloadable() != null) {
Downloadable d = message.getDownloadable();
+ if (conversation.isRead()) {
+ mLastMessage.setTypeface(null, Typeface.ITALIC);
+ } else {
+ mLastMessage.setTypeface(null, Typeface.BOLD_ITALIC);
+ }
if (d != null) {
mLastMessage.setVisibility(View.VISIBLE);
imagePreview.setVisibility(View.GONE);
- if (conversation.isRead()) {
- mLastMessage.setTypeface(null, Typeface.ITALIC);
- } else {
- mLastMessage.setTypeface(null, Typeface.BOLD_ITALIC);
- }
if (d.getStatus() == Downloadable.STATUS_CHECKING) {
mLastMessage.setText(R.string.checking_image);
} else if (d.getStatus() == Downloadable.STATUS_DOWNLOADING) {
@@ -99,6 +99,8 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
} else {
mLastMessage.setText("");
}
+ } else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
+ mLastMessage.setText(R.string.encrypted_message_received);
} else {
mLastMessage.setVisibility(View.GONE);
imagePreview.setVisibility(View.VISIBLE);