notify only after image has been received over http. introduced mini grace for catching up with SM or offline messages

This commit is contained in:
iNPUTmice 2014-10-24 13:29:18 +02:00
parent d73a77643d
commit cbc3d9bd6f
6 changed files with 64 additions and 33 deletions

View file

@ -11,6 +11,7 @@ public final class Config {
public static final int PING_TIMEOUT = 10; public static final int PING_TIMEOUT = 10;
public static final int CONNECT_TIMEOUT = 90; public static final int CONNECT_TIMEOUT = 90;
public static final int CARBON_GRACE_PERIOD = 60; 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 int AVATAR_SIZE = 192;
public static final Bitmap.CompressFormat AVATAR_FORMAT = Bitmap.CompressFormat.WEBP; public static final Bitmap.CompressFormat AVATAR_FORMAT = Bitmap.CompressFormat.WEBP;

View file

@ -5,9 +5,7 @@ import java.net.URL;
import java.util.Arrays; import java.util.Arrays;
import eu.siacs.conversations.Config; import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
public class Message extends AbstractEntity { public class Message extends AbstractEntity {
@ -145,19 +143,6 @@ public class Message extends AbstractEntity {
return body; 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() { public long getTimeSent() {
return timeSent; return timeSent;
} }

View file

@ -36,6 +36,7 @@ public class HttpConnection implements Downloadable {
private Message message; private Message message;
private DownloadableFile file; private DownloadableFile file;
private int mStatus = Downloadable.STATUS_UNKNOWN; private int mStatus = Downloadable.STATUS_UNKNOWN;
private boolean acceptedAutomatically = false;
public HttpConnection(HttpConnectionManager manager) { public HttpConnection(HttpConnectionManager manager) {
this.mHttpConnectionManager = manager; this.mHttpConnectionManager = manager;
@ -99,6 +100,9 @@ public class HttpConnection implements Downloadable {
message.setDownloadable(null); message.setDownloadable(null);
mHttpConnectionManager.finishConnection(this); mHttpConnectionManager.finishConnection(this);
mXmppConnectionService.updateConversationUi(); mXmppConnectionService.updateConversationUi();
if (acceptedAutomatically) {
mXmppConnectionService.getNotificationService().push(message);
}
} }
private void changeStatus(int status) { private void changeStatus(int status) {
@ -151,6 +155,8 @@ public class HttpConnection implements Downloadable {
size = retrieveFileSize(); size = retrieveFileSize();
} catch (SSLHandshakeException e) { } catch (SSLHandshakeException e) {
changeStatus(STATUS_OFFER_CHECK_FILESIZE); changeStatus(STATUS_OFFER_CHECK_FILESIZE);
HttpConnection.this.acceptedAutomatically = false;
HttpConnection.this.mXmppConnectionService.getNotificationService().push(message);
return; return;
} catch (IOException e) { } catch (IOException e) {
cancel(); cancel();
@ -158,9 +164,12 @@ public class HttpConnection implements Downloadable {
} }
file.setExpectedSize(size); file.setExpectedSize(size);
if (size <= mHttpConnectionManager.getAutoAcceptFileSize()) { if (size <= mHttpConnectionManager.getAutoAcceptFileSize()) {
HttpConnection.this.acceptedAutomatically = true;
new Thread(new FileDownloader(interactive)).start(); new Thread(new FileDownloader(interactive)).start();
} else { } else {
changeStatus(STATUS_OFFER); changeStatus(STATUS_OFFER);
HttpConnection.this.acceptedAutomatically = false;
HttpConnection.this.mXmppConnectionService.getNotificationService().push(message);
} }
} }

View file

@ -487,6 +487,7 @@ public class MessageParser extends AbstractParser implements
if (message.bodyContainsDownloadable()) { if (message.bodyContainsDownloadable()) {
this.mXmppConnectionService.getHttpConnectionManager() this.mXmppConnectionService.getHttpConnectionManager()
.createNewConnection(message); .createNewConnection(message);
notify = false;
} }
notify = notify && !conversation.isMuted(); notify = notify && !conversation.isMuted();
if (notify) { if (notify) {

View file

@ -13,14 +13,17 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemClock;
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.Html; import android.text.Html;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import eu.siacs.conversations.Config;
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.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Downloadable;
import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.ui.ConversationActivity; import eu.siacs.conversations.ui.ConversationActivity;
@ -30,9 +33,10 @@ public class NotificationService {
private LinkedHashMap<String, ArrayList<Message>> notifications = new LinkedHashMap<String, ArrayList<Message>>(); 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 Conversation mOpenConversation;
private boolean mIsInForeground; private boolean mIsInForeground;
private long mLastNotification;
public NotificationService(XmppConnectionService service) { public NotificationService(XmppConnectionService service) {
this.mXmppConnectionService = service; this.mXmppConnectionService = service;
@ -58,7 +62,8 @@ public class NotificationService {
} }
Account account = message.getConversation().getAccount(); Account account = message.getConversation().getAccount();
updateNotification((!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn) 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) { if (notifications.size() == 0) {
notificationManager.cancel(NOTIFICATION_ID); notificationManager.cancel(NOTIFICATION_ID);
} else { } else {
if (notify) {
this.markLastNotification();
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
mXmppConnectionService); mXmppConnectionService);
mBuilder.setSmallIcon(R.drawable.ic_notification); mBuilder.setSmallIcon(R.drawable.ic_notification);
@ -103,19 +111,17 @@ public class NotificationService {
mBuilder.setContentTitle(conversation.getName()); mBuilder.setContentTitle(conversation.getName());
StringBuilder text = new StringBuilder(); StringBuilder text = new StringBuilder();
for (int i = 0; i < messages.size(); ++i) { for (int i = 0; i < messages.size(); ++i) {
text.append(messages.get(i).getReadableBody( text.append(getReadableBody(messages.get(i)));
mXmppConnectionService));
if (i != messages.size() - 1) { if (i != messages.size() - 1) {
text.append("\n"); text.append("\n");
} }
} }
mBuilder.setStyle(new NotificationCompat.BigTextStyle() mBuilder.setStyle(new NotificationCompat.BigTextStyle()
.bigText(text.toString())); .bigText(text.toString()));
mBuilder.setContentText(messages.get(0).getReadableBody( mBuilder.setContentText(getReadableBody(messages.get(0)));
mXmppConnectionService));
if (notify) { if (notify) {
mBuilder.setTicker(messages.get(messages.size() - 1) mBuilder.setTicker(getReadableBody(messages
.getReadableBody(mXmppConnectionService)); .get(messages.size() - 1)));
} }
mBuilder.setContentIntent(createContentIntent(conversation mBuilder.setContentIntent(createContentIntent(conversation
.getUuid())); .getUuid()));
@ -135,11 +141,8 @@ public class NotificationService {
if (messages.size() > 0) { if (messages.size() > 0) {
conversation = messages.get(0).getConversation(); conversation = messages.get(0).getConversation();
String name = conversation.getName(); String name = conversation.getName();
style.addLine(Html.fromHtml("<b>" style.addLine(Html.fromHtml("<b>" + name + "</b> "
+ name + getReadableBody(messages.get(0))));
+ "</b> "
+ messages.get(0).getReadableBody(
mXmppConnectionService)));
names.append(name); names.append(name);
names.append(", "); 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) { private PendingIntent createContentIntent(String conversationUuid) {
TaskStackBuilder stackBuilder = TaskStackBuilder TaskStackBuilder stackBuilder = TaskStackBuilder
.create(mXmppConnectionService); .create(mXmppConnectionService);
@ -234,4 +257,14 @@ public class NotificationService {
.getDisplayMetrics(); .getDisplayMetrics();
return ((int) (dp * metrics.density)); 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);
}
} }

View file

@ -78,14 +78,14 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
if (message.getType() == Message.TYPE_IMAGE if (message.getType() == Message.TYPE_IMAGE
|| message.getDownloadable() != null) { || message.getDownloadable() != null) {
Downloadable d = message.getDownloadable(); Downloadable d = message.getDownloadable();
if (conversation.isRead()) {
mLastMessage.setTypeface(null, Typeface.ITALIC);
} else {
mLastMessage.setTypeface(null, Typeface.BOLD_ITALIC);
}
if (d != null) { if (d != null) {
mLastMessage.setVisibility(View.VISIBLE); mLastMessage.setVisibility(View.VISIBLE);
imagePreview.setVisibility(View.GONE); 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) { if (d.getStatus() == Downloadable.STATUS_CHECKING) {
mLastMessage.setText(R.string.checking_image); mLastMessage.setText(R.string.checking_image);
} else if (d.getStatus() == Downloadable.STATUS_DOWNLOADING) { } else if (d.getStatus() == Downloadable.STATUS_DOWNLOADING) {
@ -99,6 +99,8 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
} else { } else {
mLastMessage.setText(""); mLastMessage.setText("");
} }
} else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
mLastMessage.setText(R.string.encrypted_message_received);
} else { } else {
mLastMessage.setVisibility(View.GONE); mLastMessage.setVisibility(View.GONE);
imagePreview.setVisibility(View.VISIBLE); imagePreview.setVisibility(View.VISIBLE);